Skocz do zawartości

Przycisk na USB pod Ubuntu 22.04


pswiton

Pomocna odpowiedź

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.

 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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. 

 

Link do komentarza
Share on other sites

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ć.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

43 minuty temu, pswiton napisał:

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

 

Owszem, niespecjalnie dobrze. Program na Pico ma reagować na wciśnięcie klawisza (zmianę stanu) a nie bombardować Ubunciaka bez przerwy komunikatami dopóki klawisz jest wciśnięty.

Łap sznurek: https://docs.micropython.org/en/latest/pyboard/tutorial/debounce.html

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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ć.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

@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
Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

@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
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.