Skocz do zawartości

Pomocna odpowiedź

Napisano

Cześć,

Jestem nawy na forum i zupełnie zielony jeśli chodzi o programowanie.

Jak w temacie potrzebuję wykonac przycisk na USB, który po naciśnięciu "zgłosi się" w ubuntu 22.04 oraz odtworzy mp3 z folderu Music.

Znalazłem podobny projekt w linku poniżej:

https://www.pjrc.com/teensy/td_digital.html 

Podłaczyłem jak poniżej:

image_2023-05-03_11-25-04.thumb.png.f3045fd63f16987187d24dcb98387fd7.png  photo_2023-05-15_10-57-31.thumb.jpg.c6cdc0c7610a89943a9ea73953844921.jpgphoto_2023-05-15_11-00-57.thumb.jpg.7bc3f706046f3485fd03b2efd607ae05.jpg

ale nie wiem jak go przeprogramować by po naciśnieciu przycisku urządzenie zgłosiło na ttyUSB i wyrzuciło komunikat "pishbutton" w Ubuntu i zagrało mp3 z folderu Music.

Wyczytałem jeszcze że można to zrobić na adapterze USB/UATR, nie ma dla mnie większego znaczenia, który to będzie adapter ważne by zadziałało, jeśli zrobienie tego na UART bezie łatwiejsze to mogę go dokupić.

Proszę o pomoc w przeprogramowaniu i napisaniu kodu pod Ubuntu.

 

Dwie najprostsze możliwości.

Jeśli możesz tak ustawić Ubuntu, że naciśnięcie klawisza "play" na klawiaturze multimedialnej spowoduje pożądaną reakcję reakcję, potrzebujesz płytki która może "udawać" HID (w tym przypadku klawiaturę). Takie najpopularniejsze to Arduino Pro Micro i Raspberry Pico. W przykładach dla obu płytek można znaleźć odpowiedni, wystarczy że płytka zareaguje na wciśnięcie klawisza i i wyśle do komputera sygnał "wciśnmięto PLAY".

Zalety: brak konieczności jakichkolwiek dodatkowych aplikacji na Ubuntu.

Wady: ograniczenie do tego, co można uzyskać wciskając klawisz na zwykłej klawiaturze z przyciskami multimedialnymi.

Druga możliwość to przesłanie informacji przez UART. Potrzebujesz najtańszej płytki wyposażonej w układ UART/USB - może to być wspomniany RPi  Pico, Arduino Nano, Wemos D1 Mini - co tańsze. Tutaj wciśnięcie klawisza wysyła jakąś informację na port SERIAL, konieczna jest jednak jakaś prosta aplikacja, która tę informację odbierze i wykona jakieś polecenie. Podobny kod publikowałem niedawno (dwa klawisze, rozróżnienie krótkiego i długiego wciśnięcia): 

Zalety: możliwość wykonania dowolnego polecenia lub fragmentu kodu

Wady: konieczność napisania kawałka kodu i uruchomienie go np. przez systemd na Ubuntu.

Jest jeszcze kombinacja (płytka symulująca klawiaturę plus odczyt z evdev na Ubuntu), ale do takich prostych zadań raczej niespecjalnie się nadaje (aplikacja na Ubuntu jest dużo bardziej skomplikowana niż w przypadklu odczytu z seriala).

21 godzin temu, pswiton napisał:

Wyczytałem jeszcze że można to zrobić na adapterze USB/UATR

To raczej źle wyczytałeś - potrzebne by było coś, co wrzuci jakąś informację na UART (mikrokontroler).

  • Lubię! 1

Dzięki za odpowiedź.

Wczoraj kupiłem RPi  Pico, jak przyjedzie, polutuje i będe siedział  dalej nad kodem. Jest to tylko i wyłącznie DEMO, i już później profesjonalni programiści zdecydują co zrobią z informacją z RPi  Pico pod Ubuntu. 

Jak narazie udało mi sie napisać kawałek kodu pod RPi  Pico:

import machine
import utime
button = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN)

while True:
    if button.value() == True:
        print('button_pressed')
        utime.sleep(60)

A dla Ubuntu:

# play sound with pygame  
import pygame

#file setup
path = "/home/patw/music/"
sound_files = ["1.mp3", "2.mp3"]

# pygame setup
pygame.mixeer.init()
speaker_volume = 1 # 100% volume
pygame.mixer.music.set_volume(speaker_volume)

for sound_file in sound_files:
    pygame.mixer.music.load(path + sound file)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy() == True:
        continue

 

Brakuje mi jeszcze kodu by po nacisnięciu przycisku ubuntu "wyłapał" wiadomość 'button_pressed' i wykonał sound_demo.py.

No chyba że kody powyżej są źle napisane. 

Nie wiem z jakiego powodu nie wyświetla mi się kod z Twojego postu. 

 

36 minut temu, pswiton napisał:

Nie wiem z jakiego powodu nie wyświetla mi się kod z Twojego postu. 

Bo jest w załączniku w zipie?

36 minut temu, pswiton napisał:

Brakuje mi jeszcze kodu by po nacisnięciu przycisku ubuntu "wyłapał" wiadomość 'button_pressed' i wykonał sound_demo.py

 

37 minut temu, pswiton napisał:

później profesjonalni programiści zdecydują co zrobią z informacją z RPi  Pico pod Ubuntu. 

I przy tym bym został - bo to wcale nie jest takie oczywiste i proste jak się wydaje. PulseAudio ma jednak pewne wymagania jeśli chodzi o źródło dźwięku, a uruchamianie apki z pygame przez demona to coś, co raczej niekoniecznie będzie działać.

Tak w chwili wolnego czasu:

Kod dla RPI Pico:

#include <stdio.h>
#include "pico/stdlib.h"

#define KEY_PIN 15

int main()
{
    uint8_t last_status;
    stdio_init_all();
    gpio_set_function(KEY_PIN, GPIO_FUNC_SIO);
    gpio_set_dir(KEY_PIN, 0);
    gpio_set_pulls(KEY_PIN, 1, 0);
    last_status=gpio_get(KEY_PIN);
    for (;;) {
        uint8_t current_status = gpio_get(KEY_PIN);
        if (current_status != last_status) {
            last_status = current_status;
            printf("#%s\r\n", last_status ? "up": "down");
            busy_wait_us_32(100 * 1000);
        }
    }
    return 0;
}

I skompilowany do wgrania na Pico: onekey.zip

Przycisk do pinu 15 i do GND.

Wgraj, podepnij jakiś monitor seriala (np. gtkterm), ustaw port na /dev/ttyACM0 115200 i zobacz co się będzie działo jak naciśniesz przycisk.

Czasem może być ACM1 zamiast ACM0,

 

 

  • Lubię! 2

RPI Pico przyjechał dopiero dziś rano, wszystko podlutowane i podłaczone - działa jak lależy, wielkie dzięki.

Jak teraz "odebrać" "up" i uruchomić tym poleceniem odtworzenie mp3?

IMG_8647[1].JPG

A tej części nie mieli zrobić programiści od Ubuntu? Bo samo odebranie jest stosunkowo proste, ale odegranie czegokolwiek zależy od sposobu uruchomienia tego "odbieracza", w niektórych przypadkach konieczne może być przekonfigurowanie pulseaudio. Ja tu nie bardzo mogę pomóc, bo mam bardzo mocno nagmerane w moim Ubuntu, co najwyżej mogę napisać kawałek kodu do odbierania sygnału z klawisza (na jutro, bo dzisiaj już jestem poza domem). Daj znać czy tak może być.

Tak mieli i będa robić.

Chcę to zrobić również dla siebie by się trochę podszkolić i miec demo na przyszłość. 

Aplikacja powinna startować razem z systemem działać w tle cały czas; po naciśnięciu przycisku na RPI Pico powinna uruchomić plik 1.mp3 a następnie plik 2.mp3 z folderu /home/patw/Music.

W necie znalazłem coś podobnego może pomoże:

https://stackoverflow.com/questions/74238538/using-gpiozero-play-an-mp3-sound-file-whilst-a-button-is-held-and-an-alternative

Też pytanie czy to odtwarzanie w tle ma być, czy jak. Jest też opcja klawiatury - urządzenia HID, i wtedy skrót klawiszowy można mikrokontrolerem wygenerować, a wtedy Ubuntu może wykonać program (domyślnie może być taka opcja w ustawieniach), skrypt, cokolwiek. Oprócz skryptów sh, Pythona, można też skompilować prosty program w C, a w jego kodzie odpalać wiersze w terminalu poleceniem:

system("nazwa_polecenia_czy_programu");

 

  • Lubię! 1
(edytowany)

@pswiton W ustawieniach Ubuntu możesz przejść do sekcji skróty klawiszowe i przypisać jakiemuś skrótowi akcję:

aplay probka_na_przyklad.wav

To odtworzy wprost (plik dźwiękowy w katalogu home), oczywiście skrypt da większą możliwość co się zadzieje przed czy po. Jedna z opcji, nie jedyna. No i aplay przynajmniej dla Ubuntu 20.04 jest domyślnie składnikiem systemu, nie trzeba instalować. Jak chcesz się podszkolić, to zawsze masz kolejne rozwiązanie w rękawie, też warto próbować. No i z głowy aplikacja czuwająca w tle, bo sam składnik systemu będzie to robił. Nie wiem jak Python szybko na zimno startuje, ale jeśli byś chciał potrenować, to w C też prostą apkę zrobisz - kompilacja prostym:

gcc -o program program.c

Zawsze też da się zmienić głośność, np:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
  system("amixer set Master 100%");
  usleep(100000);
  system("aplay ton.wav");
  return 0;
}

I to co wyjdzie z kompilacji pod skrót podpinasz jako:

./program

 

Edytowano przez matsobdev
10 godzin temu, matsobdev napisał:

ustawieniach Ubuntu możesz przejść do sekcji skróty klawiszowe i przypisać jakiemuś skrótowi akcję:

A to zadziała bez zalogowanego użytkownika?

(edytowany)

@pswiton Można też rozbudować o powiadomienie, jeśli miało być (standardowy popup na belce - dymek):

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
  system("notify-send 'Powiadomienie'");
  system("amixer set Master 100%");
  usleep(100000);
  system("aplay ton.wav");
  return 0;
}

Domyślam się, że można to odtwarzanie/powiadomienia konfigurować. Oczywiście można też podać bezwzględne ścieżki np. do pliku dźwiękowego, czy do tego samego programu, nie musi być w katalogu home.

Plus wsad do Pico: pico.zip

Zapodaje Ctrl + Shift + F13 jak GP0 dostanie 3V3.

Może jeszcze wersja z GND zamiast 3V3, może bezpieczniejsza, bo luzem 3,3 V nie ma i po jednej stronie wystarczy się wlutować/podłączyć: pico_gnd.zip

Edytowano przez matsobdev

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...