logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Identyfikacja przycisków portu szeregowego w pythonie (pySerial)

doman18 22 Lip 2018 15:10 1527 24
  • #1 17343474
    doman18
    Poziom 17  
    Posty: 539
    Pomógł: 1
    Ocena: 55
    Na wstępie powiem że ogólnie to jestem głównie linuksowcem. Z mikrokontrolerów robiłem jedynie jeden projekt w Arduino z wykorzystaniem czujki DHT11 i bezprzewodowego wł/wył na 433MHz. "Surowego" portu szeregowego jeszcze nie wykorzystywałem. Mam styczność jedynie z prostymi programatorami na USB które wykorzystuje do debugowania routerów (pisze paczki na nie w bashu)

    Dostałem zadanie obsługi przycisków w komputerze przemysłowym w pythonie. Pythona ogarniam bardziej webowo (django). Docelowo chodzi o napisanie prostego API żeby backendowcy mogli sobie je podpiąć pod swoje rzeczy ale nie ja to będę pisał. Ja mam tylko zrobić prosty pythonowy skrypt który wpluwa np. jakieś znaki gdy dany przycisk jest wciśnięty.

    Tu jest schemat panelu 4 przycisków
    Identyfikacja przycisków portu szeregowego w pythonie (pySerial)IMG_201807...141915.jpg (259.16 kB)Musisz być zalogowany, aby pobrać ten załącznik.
    Jak widać to bardzo prosta konstrukcja. Trzeba odczytać jedynie stany z pinów 5,6,7,8 (GPI0,1,2,3). Żadnego przesyłania danych, interpretacji, parsowania czy jakichś innych dziwnych rzeczy o których piszą w internecie.

    Tutaj manual do komputerka z przykładami do portów szeregowych (niestety w Assemblerze którego totalnie nie ogarniam). (Strony 52-54 czyli końcowe)
    https://www.elmark.com.pl/web/uploaded/karty_...9/ms-9a69_instrukcja-uzytkownika-i3-5010u.pdf

    Przykłady inicjacji portów w pySerial
    https://pythonhosted.org/pyserial/shortintro.html

    Z powyższego udało mi się zainicjować port. A przynajmniej tak mi się wydaję bo nie jestem pewien.

    
    $ python -m serial.tools.list_ports
    /dev/ttyS0          
    /dev/ttyS1          
    /dev/ttyS2          
    /dev/ttyS3          
    /dev/ttyS4          
    /dev/ttyS5          
    6 ports found
    


    
    >>> import serial
    >>> ser = serial.Serial('/dev/ttyS0')
    >>> ser
    Serial<id=0x7f4e3ad58290, open=True>(port='/dev/ttyS0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
    


    I teraz kwestia odczytu sygnałów w pętli. Na podstawie różnych strzałów w google dedukuję że chyba trzeba do tego wykorzystać albo metodę raw_input()
    http://www.varesano.net/blog/fabio/serial%20rs232%20connections%20python

    albo metodę read/read_until() z klasy serial
    https://pyserial.readthedocs.io/en/latest/pyserial_api.html

    Ale zupełnie nie wiem jak powiązać to z moimi pinami lub wydedukować coś z kodu Assemblera. Sprawę utrudnia fakt że 99% wyników googla w sprawie zabaw z pythonem z serialem wypluwa Arduino lub RaspberyPi.
    https://raspberrypi.stackexchange.com/questio...-serial-reading-a-usb-arduino-all-i-get-is-0s
    https://arduino.stackexchange.com/questions/34535/reading-pushbutton-status-with-pyserial

    Więc jak to ugryźć?
  • #2 17343496
    Konto nie istnieje
    Konto nie istnieje  
  • #3 17343513
    doman18
    Poziom 17  
    Posty: 539
    Pomógł: 1
    Ocena: 55
    Chodzi o urządzenie typu bankomat/terminal/panel klienta. Mikrokontrolery o ile ładnie będą się programować to nie poradzi sobie z GUI i jego grafikami, animacjami, komunikacją z serwerem, jej szyfrowaniem itp itd.

    Ogólnie osobiście to zamiast klawiatury COM raczej myślałbym o urządzeniu typu HID przez USB. Ale z tego co wiem to ma być to jak najmniej skomplikowane i jak najbardziej bezawaryjne rozwiązanie. Dlatego wybrano COM.
  • #4 17343549
    Konto nie istnieje
    Konto nie istnieje  
  • #5 17343617
    doman18
    Poziom 17  
    Posty: 539
    Pomógł: 1
    Ocena: 55
    Customowej klawiatury na razie nikt nie będzie zamawiał dopóki projekt jest w fazie prototypu. Dlatego narazie jest ta cała "sztukateria".

    A samą klawiaturę - chodzi ci o coś na USB jak to? ...

    https://hackaday.com/2012/06/29/turning-an-arduino-into-a-usb-keyboard/

    Ogólnie być może byłby to jakiś pomysł pod warunkiem że rozwiązanie byłoby odporne na mróz do -30*C.
  • #6 17343890
    Konto nie istnieje
    Konto nie istnieje  
  • #7 17345249
    doman18
    Poziom 17  
    Posty: 539
    Pomógł: 1
    Ocena: 55
    Mój błąd. Nie chodzi o żadną z linii seriala. Na przodzie urządzenia jest gniazdo DIO z wyprowadzeniami do GPIO (manual strona 6).
  • #8 17345256
    Konto nie istnieje
    Konto nie istnieje  
  • #9 17348045
    doman18
    Poziom 17  
    Posty: 539
    Pomógł: 1
    Ocena: 55
    z3planety napisał:

    A w kernelu jest driver do czytania go czy trzeba napisać. Może można zmapować rejestry i jako root nimi machać albo czytać ale to dalej sztukateria. A jak łatwo spalić jak to będzie na ulicy.

    IMO - zrobić na bluepill klawiaturę USB. I używać w prototypie.


    Narazie nie ma opcji żeby przejść na cokolwiek innego. Prototyp ma być na GPIO.

    Co do kernela to kompletnie nie wiem. Obczajam ten kod Assemblerowy bo pierwszy przykład pokazuje status GPI 0, czyli o to co mi chodzi. Ale ledwię kojarzę co tam się dzieję i zupełnie nie wiem jak to przerobić dla GPI 1,2 i 3 oraz zwrócić to jako jakiś znak lub napis typu "Button 1 pressed". Na domiar złego 99,9% materiałów o GPIO i Pythonie/C/C++ odnosi się do Raspberry PI.

    Napisałem do kanadyjskiego oddziału producenta. Może oni coś pomogą.
  • #10 17348091
    Konto nie istnieje
    Konto nie istnieje  
  • #11 17348364
    doman18
    Poziom 17  
    Posty: 539
    Pomógł: 1
    Ocena: 55
    Kodu assemblera z manuala do tego komputerka (2 ostatnie strony). Podałem link do niego wczesniej. Tam są 2 przykłady z wyciąganiem stanu pinu i z ustawianiem stanu pinu.
    https://www.elmark.com.pl/web/uploaded/karty_...9/ms-9a69_instrukcja-uzytkownika-i3-5010u.pdf

    To nie bankomat, to urządzenie sprzedające pewną usługę.

    Sysfsem się bawiłem gdy robiłem obsługę diod na routerach. Właśnie o coś takiego mi chodziło. Jeżeli uda się wyciągnąć przez to wciśnięty przycisk i go odróżnić od innych to dalej już z górki.
  • #12 17348479
    Konto nie istnieje
    Konto nie istnieje  
  • #13 17348561
    doman18
    Poziom 17  
    Posty: 539
    Pomógł: 1
    Ocena: 55
    No własnie wolałbym nie-bezpośrednio. Tylko przez sysfs. Latanie po adresach i rejestrach to dla mnie abstrakcja. W arduino były gotowe biblioteki żeby tego unikąć. W przypadku diod w routerach to była tylko kwestia wysyłania 0 lub czegokolwiek innego niż 0 żeby nimi sterować. Były też gotowe skrypty do jakichś rzeczy typu heartbeat blink, network blink itp itd. Proste rzeczy. Ten panel też jest prosty i sądziłem że to tylko kwestia odczytu urządzeń. Zwykła pętla z identyfikacją skąd jest sygnał i z wyświetleniem komunikatu. Nawet w bashu.

    W tej chwili w /sysc/class/gpio mam tylko export i unexport a cokolwiek chcę echować do esporta wywala Invalid argument.
  • #14 17348575
    Konto nie istnieje
    Konto nie istnieje  
  • #15 17348584
    Konto nie istnieje
    Konto nie istnieje  
  • #16 17348593
    Konto nie istnieje
    Konto nie istnieje  
  • #17 17348857
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1462
    doman18 napisał:

    Co do kernela to kompletnie nie wiem. Obczajam ten kod Assemblerowy bo pierwszy przykład pokazuje status GPI 0, czyli o to co mi chodzi. Ale ledwię kojarzę co tam się dzieję i zupełnie nie wiem jak to przerobić dla GPI 1,2 i 3 oraz zwrócić to jako jakiś znak lub napis typu "Button 1 pressed". Na domiar złego 99,9% materiałów o GPIO i Pythonie/C/C++ odnosi się do Raspberry PI.


    doman18 napisał:
    Na wstępie powiem że ogólnie to jestem głównie linuksowcem. Z mikrokontrolerów robiłem jedynie jeden projekt w Arduino z wykorzystaniem czujki DHT11 i bezprzewodowego wł/wył na 433MHz.


    doman18 napisał:
    No własnie wolałbym nie-bezpośrednio. Tylko przez sysfs. Latanie po adresach i rejestrach to dla mnie abstrakcja. W arduino były gotowe biblioteki żeby tego unikąć.


    Informacje jakie udzielasz, są "lekko niespójne". Jako linuksowiec powienieneś wiedzieć, że Raspberry ~= Linux, a Arduino nie ma z tym nic wspólnego. Tylko zielony kolor płytki. (edit: np dałeś dział mikrokontrolery)
    BTW uważam za wielką krzywdę dla społeczności, jak RPI biblioteka do GPIO czy czegoś podobnego na siłę "emuluje" Arduino. Zbrodnia na umyśle *). Jest pewne, że "invalid argument" to od szeroko rozumianego systemu, doktoryzując się, że od banalnych uprawnień poczynając.
    Było kilka reklam opartych na schemacie: kurort dla bogaczy, wiatr we włosach, kamera odjeżdża, a to gościu przed wentylatorem.

    doman18 napisał:
    ... Latanie po adresach i rejestrach to dla mnie abstrakcja.

    Odczyt jednego bitu jest jakościowo różny od czterech bitów? No powiedzmy pięciu, ile palców. A z jednym, jak zeznajesz, sobie radzisz?

    EDIT2: a ten chip wiodący dla GPIO to jaki? Może się okazać na dwie strony, np ten sam, albo w pierniki inny.

    *) wgląd w kod. Generalnie większość kolegów marnuje cały ten nurt opensursowy, nigdy nie czytając żadnych źródeł.
  • #18 17349430
    doman18
    Poziom 17  
    Posty: 539
    Pomógł: 1
    Ocena: 55
    Cytat:
    Jako linuksowiec powienieneś wiedzieć, że Raspberry ~= Linux

    Tak, wiem ale w Raspberry używają napisanej pod nią biblioteki, która jak mniemam w niczym mi nie pomoże. Dlatego właśnie omijam tutoriale dla malinki.

    Cytat:
    Arduino nie ma z tym nic wspólnego.

    Arduino podałem żeby uzmysłowić na ile "liznąłem" temat.

    Cytat:
    Odczyt jednego bitu jest jakościowo różny od czterech bitów? No powiedzmy pięciu, ile palców. A z jednym, jak zeznajesz, sobie radzisz?

    Jeżeli pijesz do wspomnianej przeze mnie zabawy z LEDami to robi się to naprawdę prosto.
    https://eko.one.pl/?p=openwrt-leds
    Natomiast domyślam się że przy większej ilości trzeba już trzeba się odwoływać do adresów komórek lub coś w tym rodzaju. Właśnie z tym kojarzy mi się ta cała żonglerka w assemblerze (rejestry i adresy). Wskaźniki i operacje na nich w C++ ogarniałem dawno temu i w głowie już niewiele z tego zostało.
  • #19 17349502
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1462
    doman18 napisał:
    Cytat:
    Jako linuksowiec powienieneś wiedzieć, że Raspberry ~= Linux

    Tak, wiem ale w Raspberry używają napisanej pod nią biblioteki, która jak mniemam w niczym mi nie pomoże. Dlatego właśnie omijam tutoriale dla malinki.


    Z których najdłuższa funkcja nie miała więcej niż kilka linii. Mnie bym skręcało w żołądku, jakbym nie zobaczył źródeł (jak powiedziałem ardionopodobne API dało mi pomarańczową migająca lampkę).
    Może się różnicie tylko o nazwę pliku /dev/Xxxxxxxxx

    Sądzisz, ze ta kanadyjska firma da problem na tacy? Że nie będziesz musiał przejrzeć żadnych źródeł?
  • #20 17350694
    Konto nie istnieje
    Konto nie istnieje  
  • #21 17350766
    doman18
    Poziom 17  
    Posty: 539
    Pomógł: 1
    Ocena: 55
    Okazuje się że drivery chyba są, ale na windowsa. Windows zupełnie nie wchodzi w rachubę w naszym zastosowaniu.
  • #22 17350854
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1462
    doman18 napisał:
    ... chyba są...


    chyba
    musi być
    jest niedopuszczalne
    nie kojarzę
    nic mi nie mówi
    nie umiem
    szeregowy
    nie szeregowy

    Od czterech dni firma ci płaci za nic, i nie przybliża się do "sprzedaży pewnej usługi".
    Nikt na górze nie ma pomysłu żeby zapłacić za skuteczne rozwiązanie?
  • #23 17350875
    doman18
    Poziom 17  
    Posty: 539
    Pomógł: 1
    Ocena: 55
    JacekCz napisał:
    doman18 napisał:
    ... chyba są...


    chyba
    musi być
    jest niedopuszczalne
    nie kojarzę
    nic mi nie mówi
    nie umiem
    szeregowy
    nie szeregowy

    Od czterech dni firma ci płaci za nic, i nie przybliża się do "sprzedaży pewnej usługi".
    Nikt na górze nie ma pomysłu żeby zapłacić za skuteczne rozwiązanie?

    Kolega się widzę trochę zapędził. Poprosiłem o pomoc techniczną a nie o troskę na temat strategii wydawanie pieniędzy przez firmę w której pracuję. Tak się składa że to zadanie to tylko jeden z kilku tasków którymi się zajmuję przez te 4 dni więc takie stwierdzenie uderza w moją osobę jakoby nic bym nie robił.
    Sam uważam że to nie do mnie powinno przyjść to zadanie. Ale oprócz mojego "researchu" w temacie równolegle zostały też podjęte inne działania o których nie muszę tutaj pisać i się tłumaczyć.

    Poprosiłem o pomoc techniczną i tego proszę się trzymać.
  • #24 17350946
    Konto nie istnieje
    Konto nie istnieje  
  • #25 17351439
    doman18
    Poziom 17  
    Posty: 539
    Pomógł: 1
    Ocena: 55
    Temat chyba został wyczerpany na tą chwilę. Dziękuje serdecznie wszystkim którzy poświęcili swój czas na udział w nim.

Podsumowanie tematu

✨ Użytkownik, głównie zajmujący się programowaniem w Pythonie i Linuxie, poszukuje pomocy w obsłudze przycisków w komputerze przemysłowym za pomocą portu GPIO. W dyskusji poruszono kwestie związane z trudnościami w odczycie stanów pinów oraz brakiem odpowiednich sterowników dla systemu Linux. Uczestnicy sugerują różne podejścia, w tym użycie mikrokontrolerów, takich jak Arduino, do uproszczenia procesu. Wskazano na problemy z konfiguracją GPIO oraz na konieczność pisania własnych sterowników, jeśli producent nie dostarcza gotowych rozwiązań. Użytkownik wyraża obawy dotyczące trudności w implementacji oraz braku doświadczenia w niskopoziomowym programowaniu.
Wygenerowane przez model językowy.
REKLAMA