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

Jak ustabilizować stany GPIO przy starcie RPI i zapisać je przed restartem?

psine.pl 19 Kwi 2017 15:00 3984 16
REKLAMA
  • #1 16421967
    psine.pl

    Specjalista Serwis Elektroniki
    Posty: 2342
    Pomógł: 133
    Ocena: 328
    Szukam prostego najlepiej programowego rozwiązania aktywowania pinów GPIO w RPI
    podpięte mam przekaźniki które sterują piecem i alarmem.
    Każdy restart RPI powoduje, że zmieniają się stany podczas ładowania systemu .... i ustawiane są na końcu w stanie niekoniecznie takim jak były przed restartem....
    2 pytania:
    1) jak wyeliminować zmiany stanów podczas ładowania RPI ? i domoticz .... tak aby stan ustalił się raz a nie kilka razy klepał 0,1
    2) zapisać zmiany by po restarcie przywrócone zostały stany GPIO sprzed restartu...

    Pozdrawiam
    Marek
    Konto firmowe:
    PSINE.PL
    ul.Karczówkowska 8A, KIELCE, 25-019 | Strona WWW: https://www.psine.pl
  • REKLAMA
  • #2 16421981
    ditomek
    Poziom 22  
    Posty: 590
    Pomógł: 24
    Ocena: 230
    Ciekawe co piszesz. nigdy się z tym nie spotkałem. Możesz opisać dokładniej warunki w których ma to miejsce? Przez te kilkadziesiąt sekund do startu zanim odpali się skrypt w pythonie (zakładam, że sterujesz przez niego choć oczywiście mogę nie mieć racji) przekaźniki losowo zmieniają swój stan?
  • #3 16421995
    psine.pl

    Specjalista Serwis Elektroniki
    Posty: 2342
    Pomógł: 133
    Ocena: 328
    W zasadzie to losowo jest tu ujęte na wyrost ... każda losowość jest przewidywalna.
    Ogólnie steruję z poziomu domoticza i jego sterowań. Nie używam swoich skryptów.

    Efekt jest taki, że jeżeli nastąpi restart RPI mamy jeden stan (HzI) ergo aktywuje się przekaźnik na płytce którą kupiłem do RPI.
    Po chwili wyłącza się przekaźnik
    Mija chwila i przekaźnik znów robi podobną sekwencję...
    Jak system się odpali to stan jest jednolity na wszystkich wyjściach. A w tym momencie np rozbraja się wcześniej uzbrojony alarm.
    Oczywiście to pykanie także powoduje reakcje urządzeń na wyjściach przekaźników.
    Konto firmowe:
    PSINE.PL
    ul.Karczówkowska 8A, KIELCE, 25-019 | Strona WWW: https://www.psine.pl
  • #4 16422053
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 16422242
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    Piotrus_999 napisał:
    Tak będzie i nie są to zmiany robione przez system. Są one w tym czasie "floating" a RPi dobrze sieje i będziesz miał losowe zmiany. Ludzie dają sobie z tym radę poprzez dodanie słabego podciągnięcia do masy.


    To nie jest prawda. Wewnętrzny pull-up/down są zdefiniowane dla każdego pinu RPI po resecie. Przynajmniej jest tak dla BCM2835.

    @inventco.eu Najlepiej sprawdź oscyloskopem kiedy dochodzi do zmiany na danym pinie. Wypadałoby wiedzieć czy dzieje się to w u-boot (mało prawdopodobne) czy po starcie kernela. Być może będzie trzeba grzebać aż do device tree.
  • #6 16422564
    ditomek
    Poziom 22  
    Posty: 590
    Pomógł: 24
    Ocena: 230
    Sprawdzanie skąd biorą się błędy i ich eliminacja mogą okazać się skomplikowane i zaangażują dużo czasu.
    Może prościej użyć Firmaty. Ma to swoje ogromne plusy...
  • #7 16423866
    psine.pl

    Specjalista Serwis Elektroniki
    Posty: 2342
    Pomógł: 133
    Ocena: 328
    RPI bawię się dopiero z miesiąc...
    Pozwolę się zapytać co to Firmata ? to jakiś shield ?
    Konto firmowe:
    PSINE.PL
    ul.Karczówkowska 8A, KIELCE, 25-019 | Strona WWW: https://www.psine.pl
  • REKLAMA
  • #8 16424173
    ditomek
    Poziom 22  
    Posty: 590
    Pomógł: 24
    Ocena: 230
    Wyobraź sobie, że Twoje arduino podłączone do R-Pi przez kabel USB potrafi udostępnić swoje piny właśnie Raspberry. Oczywiście tak prosto jest w przypadku pinów cyfrowych bo przesyłanie danych analogowych wymaga nieco więcej zachodu. Niemniej jednak wszystko masz gotowe w przykładach. Testuj.
  • #9 18073716
    krawol
    Poziom 2  
    Posty: 3
    Ocena: 3
    Odświeżę temat.
    Jestem kompletnym laikiem ponieważ dopiero zaczynam zabawę.
    Obsługuję dwa przekaźniki przez domoticza.
    Też mam taki sam problem jak kolega. Po restarcie RPi przekaźniki zmieniają stan.
    W momencie dodania pinów do pliku /etc/init.d/domoticz.sh przy każdym starcie systemu RPi załącza je.

    /usr/local/bin/gpio export 4 out
    /usr/local/bin/gpio export 17 out


    Włączanie i wyłączanie jest w skrypcie Xon.py i Xoff.py

    #!/usr/bin/python
    
    import RPi.GPIO as GPIO
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(X, GPIO.OUT)
    GPIO.output(X, GPIO.HIGH)


    Macie jakieś pomysły?
  • #10 18497840
    mariopoz
    Poziom 11  
    Posty: 18
    Ocena: 2
    Mam dokładnie ten sam problem.
    Przekaźniki podłączone do GPIO zmieniają na chwilę stan podczas startu systemu.
    Jest to na tyle problematyczne ze przekaźniki sterują otwarciem bramy, garażu i w przypadku zaniku zasilania i restartu maliny brama otwiera się (impuls symuluje wciśnięcie przycisku otwarcia/zamknięcia). Używam GPIO 26 (pin 37) i 20 (pin 38) które nie są używane do innych funkcji.
    Jeszcze zastanawiam się czy problemem jest rodzaj przekaźników, które sterowane są stanem niskim.
    Musiałem w konfiguracji domoticza zamienić stan wyjścia w konfiguracji /etc/init.d/domoticz.sh:
    /usr/bin/gpio export 20 out #Garaz
    sudo sh -c 'echo 1 > /sys/class/gpio/gpio20/active_low'
    sudo sh -c 'echo high > /sys/class/gpio/gpio20/direction'
    te 2 ostatnie linijki spowodowały że stan przekaźnika był zgodny ze stanem w domoticz
  • #11 18497870
    OliJot86
    Użytkownik obserwowany
    Posty: 28
    Pomógł: 4
    Ocena: 5
    Dodaj kombinację bramek i steruj kilkoma pinami. Gdy dasz AND 4, to cztery piny muszą być w H aby na wyjściu było H. To naturalnie za proste więc dodaj negatory na niektórych liniach, może bramka z większa liczba wejść? Wtedy np tylko kombinacja 100011 uaktywni sterownie bramą.
  • REKLAMA
  • #12 18497996
    mariopoz
    Poziom 11  
    Posty: 18
    Ocena: 2
    Dziękuje za pomysł.
    Myślę że dodatkowy przekaźnik (może nawet z opóźnieniem czasowym) który będzie sterował zasilaniem modułu 4 przekaźników rozwiąże problem. Będzie to chyba najprostsze rozwiązanie. GPIO podczas startu nie są aktywowane równocześnie a sekwencyjnie, a więc nawet gdy pojawi się na chwile stan wysoki na wyjściu to płytka z 4 przekaźnikami nie będzie miała w tej chwili zasilania i cewki przekaźników nie zadziałają. Dopiero po starcie raspberry/domoticz załączę przekaźnik pojedynczy który zasili pozostałe.
    Myślałem że jest jakieś rozwiązanie czysto programowe tego problemu.

    PS. Znalazłem jednak rozwiązanie programowe.
    Ktoś mnie naprowadził że problemem może być biblioteka wiringPI której używałem do obsługi GPIO.
    Odinstaloawłem ją i skasowałem wszystkie wisy dotyczące obsługi w domoticz.sh. Okazało się że samo raspbery nie zmieniał stanów przy starcie systemu a wiec byłem już pewny ze to kwestia samej konfiguracji lub wiringpi.
    Do sterowania wykorzystałem zatem sysfs GPIO, czyli wbudowaną funkcjonalność.
    Aby dany pin skonfigurować jako wyjście dla przekaźników sterowanych stanem niskim musimy
    wpisać linijki jak niżej (domyślnie wyjście steruje stanem wysokim) w pliku domoticz.sh.
    Wchodzimy do edytora nano: sudo nano /etc/init.d/domoticz.sh
    i dopisujemy na końcu:

    echo 26 > /sys/class/gpio/export
    echo high > /sys/class/gpio/gpio26/direction
    echo 1 > /sys/class/gpio/gpio26/active_low #informujemy że załaczenie jest stanem niskim

    Dla przekaźników sterowanych stanem wysokim ustawiamy:
    echo 21 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio21/direction

    Oczywiście 21 czy 26 to przykładowe nr GPIO.

    Dla pinu skonfigurowanego jako wejście:
    echo <nr_BCM> /sys/class/gpio/export

    W samym domoticzu dodajemy nowy Sprzęt: "Generic sysfs GPIO"
    W zakładce urządzenia pojawia się wszystkie skonfigurowane wejścia i wyjścia.
  • #13 18523115
    upiter81
    Poziom 2  
    Posty: 3
    @mariopoz, co zrobiłeś poza odinstalowaniem wiringpi oraz usunięciem wpisów dotyczących GPIO w domoticz.sh (dodanych ręcznie po instalacji wiringpi)?, ja zrobiłem dokładnie to, i nadal wszystkie przekaźniki włączają się przy starcie Pi ...

    Ja steruję stanem wysokim, dlatego użyłem (zgodnie z Twoją sugestią):
    echo 21 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio21/direction

    oraz dodatkowo:
    sudo sh -c "echo '1' >> /sys/class/gpio/gpio21/active_low"
    do odwrócenia logiki wł/wył., ale pierwszy restart był bez ostatniej linijki, i również przekaźniki się włączały...
  • #14 18523599
    mariopoz
    Poziom 11  
    Posty: 18
    Ocena: 2
    Cześć,

    Dla przekaźników sterowanych stanem wysokim wystarczy dać tylko te 2 linijki
    echo 21 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio21/direction

    Natomiast ten zapis
    upiter81 napisał:
    oraz dodatkowo: sudo sh -c "echo '1' >> /sys/class/gpio/gpio21/active_low"
    dotyczy tylko sytuacji gdy odwracamy stany więc go skasuj.
  • #15 18523664
    upiter81
    Poziom 2  
    Posty: 3
    Cześć,

    Pięknie dziękuję - zaskoczyło :)

    I okazuje się jednak że steruję stanami niskimi, a nie wysokimi (w ogóle jak to rozpoznać na płytce z przekaźnikami? - dostawca niestety nie podał tej informacji) ...

    I mam jeszcze pytanko do wejść, co to "nr_BCM", to nie nr GPIO?
  • #16 18523682
    mariopoz
    Poziom 11  
    Posty: 18
    Ocena: 2
    Super.
    Sprawdź na stronie gdzie kupowałeś, zawsze jest podana informacja czy sterowane stanem niskim czy wysokim:
    Spoiler:
    Specyfikacja
    Napięcie zasilania VCC: 5 V
    Załączany stanem wysokim
    Przekaźnik SRD-05VDC-SL-C (dokumentacja)
    Napięcie cewki: 5 V
    Maksymalne napięcie styków: 250 VAC, 110 VDC*
    Maksymalny prąd: 10 A
    Wzmaniacz tranzystorowy w układzie


    Można tez sprawdzić zwierając wejście IN przekaźnika do GND lub do Vcc. jeśli zaskoczy przy GND to masz sterowany stanem niskim, a jeśli do VCC to wysokim.

    Nr BCM to numery GPIO z wyjścia procesora i to nie to samo co numer pinu na wyjściu z raspberry, wygooglaj sobie. Jak ustabilizować stany GPIO przy starcie RPI i zapisać je przed restartem?
  • #17 18523694
    upiter81
    Poziom 2  
    Posty: 3
    I już wszystko jasne :) - jeszcze raz pięknie dziękuję!

Podsumowanie tematu

✨ Użytkownicy dyskutują o problemie niestabilnych stanów pinów GPIO na Raspberry Pi (RPI) podczas uruchamiania systemu, co prowadzi do niepożądanych zmian w działaniu podłączonych przekaźników. Wskazują na konieczność eliminacji "floating" stanów pinów, co można osiągnąć poprzez dodanie podciągnięcia do masy lub użycie odpowiednich skryptów w pliku startowym systemu. Proponowane rozwiązania obejmują wykorzystanie biblioteki Firmata do zarządzania pinami GPIO oraz modyfikację skryptów w Domoticz, aby ustawić stany pinów na początku uruchamiania. Użytkownicy dzielą się również doświadczeniami związanymi z różnymi typami przekaźników, które mogą być sterowane stanem wysokim lub niskim, oraz podają konkretne komendy do konfiguracji GPIO.
Wygenerowane przez model językowy.
REKLAMA