Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

nRF24L01 błąd w programie.

02 Kwi 2019 23:40 462 24
  • Poziom 9  
    Witam;
    Mam mały problem z zaprogramowaniem modułów z nRF24L01.
    Potrzebuję uzyskać układ :
    Nadajnik z dwoma przyciskami

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Odbiornik z trzema diodami i przyciskiem
    Dioda LED1 świeci przy wciśnięciu SW1, gaśnie po zwolnieniu SW1
    Dioda LED3 świeci przy wciśnięciu SW2, gaśnie po zwolnieniu SW2
    Dioda LED2 świeci przy wciśnięciu SW1 lub SW2, gaśnie dopiero po wciśnięciu SW6.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pierwsza część działa ok
    "Dioda LED1 świeci przy wciśnięciu SW1, gaśnie po zwolnieniu SW1Dioda LED2 świeci przy wciśnięciu SW1, gaśnie dopiero po wciśnięciu SW6"
    Problem jest przy drugim działaniu
    "Dioda LED3 świeci przy wciśnięciu SW2, gaśnie po zwolnieniu SW2
    Dioda LED2 świeci przy wciśnięciu SW2, gaśnie dopiero po wciśnięciu SW6"
    W odbiorniku nie dzieje się nic mimo iż w monitorze portu szeregowego odbierany jest sygnał 112.
    Proszę o pomoc w poprawieniu programu.

    Moderowany przez Marek_Skalski:

    Proszę używać znaczników syntax. Zapewnia to kolorowanie składni i pozwala szybciej analizować program.

  • Poziom 28  
    Najpierw ustal jak szybko musi być reakcja, częściej niż 50ms nie ma raczej sensu z przyciskami mechanicznymi. Potem zajmij się przyciskami, użyj jakiegoś bounce2, easybutton czy własnego pomysłu na obsługę drgań. Raz w pętli ustal jaki jest stan przycisków aktualnie i wpisz do jednej zmiennej 8bit - zmieścisz lekko licząc 8 "buttonów". Co 50ms wysyłaj jeden komunikat ze stanem wszystkich przycisków, z jednego komunikatu ustaw ledy tak jak potrzebujesz. I nie używaj delay, to podstawa jak program ma być wielozadaniowy.
  • Poziom 9  
    Czy te moje wypociny da się jakoś poprawić w prosty sposób na tych bibliotekach które już są.? Z programowania Arduino jestem noga :cry:
  • Poziom 28  
    To zależy, jak już masz już wstępną serię płytek na stole pod konkretny kod to trzeba by z tym walczyć, a jak się uczysz pisać na Arduino to może lepiej to zmienić. Dodatkowo komunikatu bym nie wysyłał, jeśli poprzedni był taki sam. Można też ustalić jakiś czas kontrolny, że nawet jak nie ma nic nowego to wysyła co 1s by podtrzymać rozmowę i potwierdzić informację, że moduły się widzą.
    Zacznij od przycisków, jak masz takie coś: if (digitalRead(SW2) == HIGH) i wciskasz/puszczasz przycisk to w ciągu kilkudziesięciu ms wysyłasz kilkadziesiąt sprzecznych stanów pinów, a z drugiej strony na odbiorniku jest akurat delay(10) i on losuje co odbierze bo może mu się już bufor przepełnił.
    Zamiast delay() można użyć millis do zarządzeniem czasem zarówno w nadajniku jak i odbiorniku:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    W kodzie idziesz na żywioł, no i właśnie się pogubiłeś, nie lepiej to wszystko układać w funkcjach? Wprowadzić trochę porządku, np. przycisk1- led1, przycisk2-led2 i ta led3 kasowana przyciskiem w odbiorniku? No i masz odczyt radia if (radio.available() wewnątrz innego if (radio.available(), tego nie ma sensu ogarniać.
  • Poziom 9  
    Przyciski SW1 i SW2 są to dwa różne stany chwilowe potwierdzone LED1 i LED3 tylko w czasie ich trwania. Dioda LED2 ma sygnalizowac wystąpienie stanów i trwać po jego zaniku do momentu skasowania przez SW6.
    Tak kasowanie SW6 ma być w odbiorniku.
  • Poziom 28  
    Uporządkuj kod, numeracja przycisków i led jest pomieszana dla mnie, patrzącego z boku. Domyślam się że Ty już masz to tak zafiksowane, że nie ma innej możliwości. Przede wszystkim zacznij porządkowanie od "if (radio.available()) ", nie może być dwa razy w pętli głównej a tym bardziej zagnieżdżone, bo jak raz coś odczytasz to potem już tego nie ma, możesz ze swojego odczytu msg[0] skorzystać X razy, ale nie możesz sięgać do bufora radia X razy bo jest najprawdopodobniej kołowy i raz odczytany zwalnia miejsca dla przylatujących kolejnych danych.
  • Poziom 9  
    Ok. Postaram się to ogarnąć i dam znać.
  • Poziom 9  
    Program poprawiłem i działa tak jak potrzebuję.
    Mam jedno pytanko. Żaden z gotowych programów (tych z sieci) do komunikacji dwukierunkowej nie chce u mnie działać. Programy się wgrywają bez błędów i na tym koniec. Co może być przyczyną? Do testów używam UNO i NANO.
  • Poziom 28  
    No to wklej przykładowy kod nadajnika i odbiornika wraz z informacją jakich bibliotek (skąd) używasz. Nie mam problemu z używaniem tych modułów w Arduino. Na każdym mam dolutowany C 100n, ewentualnie można w setup dodać opcję radio.setPALevel(RF24_PA_LOW);- zminieszy zasięg, ale jakość zasilania będzie miała mniejsze znaczenie. Link
  • Poziom 9  
    Program który próbowałem odpalić i nie działa u mnie to:
    Nadajnik
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Odbiornik

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przykład zapożyczony ze strony : https://create.arduino.cc/projecthub/muhammad...ng-with-arduino-wireless-communication-0c13d4

    Biblioteki ktore posiadam do nRF24L01 to te dostępne w Arduino 1.8.8

    Dodam jeszcze że udało mi się zrobić żeby działał ale po chwili samoczynnie się zawiesza i trzeba resetować kontroler.
  • Poziom 9  
    Czy ktoś może wie czemu program się zawiesza?
  • Poziom 28  
    Na początek spróbuj komunikacji jednokierunkowej:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ten kod u mnie się nie wiesza, jak u Ciebie tak to szukaj przyczyny w sprzęcie.
    Potem dodaj do tekstu licznik wysłanych wiadomości (zmienna++) i zobacz czy nic nie ginie. No i ewentualnie dodaj te 100n do płytek, albo użyj podstawek dla tego modułu z dodatkowym kondensatorem.
  • Poziom 9  
    Z kondensatorami próbowałem (100nF ceramiczny lub 10uF elektrolityczny). Komunikacja jednokierunkowa działa (wieczorem wstawię projekt).
    Jak i gdzie wstawić " licznik wysłanych wiadomości (zmienna++)"
  • Poziom 9  
    Program od Ciebie działa prawidłowo. Odlicza i nic nie gubi.
    Mój program jednokierunkowy też działa ok.
    Wygląda on tak:
    nadajnik
    Kod: c
    Zaloguj się, aby zobaczyć kod


    odbiornik
    Kod: c
    Zaloguj się, aby zobaczyć kod


    czy ciężko by było go przerobić żeby była komunikacja dwukierunkowa?
    Do odbiornika dodać jeden przycisk a nadajnika jeden LED?
  • Poziom 9  
    Mam jeszcze jeden problem.
    Chciałem zaoszczędzić trochę energii i wykorzystać bibliotekę
    Kod: c
    Zaloguj się, aby zobaczyć kod

    W nadajniku udało mi się ogarnąć poprzez zewnętrzne przerwanie i działa tak jak chcę czyli zasypia i budzi się jak trzeba

    Kod: c
    Zaloguj się, aby zobaczyć kod


    problem mam z odbiornikiem :cry: . Chciałem to ogarnąć poprzez wbudowany Watchdog ale chyba mnie to przerosło. Po starcie odbiornik usypia i budzi się jak trzeba do momentu wykrycia sygnału. Po wykryciu sygnału nie wiem jak go uśpić.
    Czy w odbiorniku dało by się zastosować zewnętrzne przerwanie?

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Proszę o ewentualną zmianę programu odbiornika.
  • Poziom 35  
    grzesiekcichy napisał:
    Mam jeszcze jeden problem.
    Chciałem zaoszczędzić trochę energii i wykorzystać bibliotekę

    Czy w odbiorniku dało by się zastosować zewnętrzne przerwanie? (*)


    Ad(*): -w kazdym układzie można stosowac przerwania zewnętrzne.

    Jeżeli w odbiorniku masz którąś z pełnej vesji arduino to nie wiele tej energii zaoszczędzisz.
    Będziesz 'toczył boje' o microAmpery, gdy tymczasem elementy pobierające najwięcej energii pozostaną bez kontroli.
    Temat ten jest zbyt obszerny na jego referowanie w tym miejscu, więc szczegóły doczytaj we własnym zakresie tu:
    Naturalnie doczytaj cały temat z wszystkimi szczegółami....,

    http://www.gammon.com.au/power

    Możesz oczywiście usypiac uC w odbiorniku, a nRF będzie w trybie też obniżonej mocy, dopóki pakiet nie zostanie odebrany. Po otrzymaniu pakietu możesz uruchomic przerwanie , aby obudzić uC, odczytać bufor, wykonać akcję, a następnie wrócić do ponownego uśpienia.

    Przy uśpieniu (power-dn), uC i nRF w trybie gotowości powinien używać około 23uA.

    Niska moc tej skali nie jest możliwa przy pełnym Arduino, ze względu na wszystkie inne elementy zabudowane na płytce (V-reg, USB/UART conv, dioda LED etc). Byłoby to około 35 mA na rzeczywistym Arduino, więc musisz zbudować urządzenie 'bare bone'- processor, albo chociażby zastosowac arduino pro-mini zasilane bezpośrednio ze źródła 3.3V. Jest dostepna taka versja.
    Będzie może troche utrudnione programowanie, ale robisz to jeden raz/( 'finalnie') w końcowej fazie projektu...

    e marcus
  • Poziom 9  
    Posiadam jakiegoś kolna Arduino. W nadajniku zasilanym przez USB (Arduino UNO) udało mi się zejść z 47mA na 27mA podczas uśpienia. Wydaje mi się ze to dość sporo zwłaszcza jak docelowo ma być zasilanie bateryjne. Nie wiem Tylko jak dostosować program do mojego odbiornika :(
  • Poziom 35  
    grzesiekcichy napisał:
    Posiadam jakiegoś kolna Arduino. W nadajniku zasilanym przez USB (Arduino UNO) udało mi się zejść z 47mA na 27mA podczas uśpienia. Wydaje mi się ze to dość sporo zwłaszcza jak docelowo ma być zasilanie bateryjne. Nie wiem Tylko jak dostosować program do mojego odbiornika :(

    No własnie, z uwagi na zasilanie bateryjne, wynik ten powinien byc 1000 razy mniejszy (na poziomie microAmperów zamiast miliAmp.), wtedy bateria będzie trwac nie porównywalnie dluzej....

    Wyglada że nie studiowałes materiału z podesłanego linku.

    e marcus
  • Poziom 9  
    Przeglądałem artykuł i jest dość ciekawy. Oszczędności mogą być naprawdę spore. Na chwilę obecną są dwa ale...
    - nie posiadam gołej kości
    - mój poziom zaawansowania nie pozwala na wykonanie takiego programy :(
  • Poziom 35  
    grzesiekcichy napisał:
    Przeglądałem artykuł i jest dość ciekawy. Oszczędności mogą być naprawdę spore. Na chwilę obecną są dwa ale...
    - nie posiadam gołej kości ...

    Odpuśc sobie tą przeszkodę, bo wkopiesz sie w kolejne problemy z wykonaniem płytki i jej lutowaniem, programowaniem, etc...
    Zamiast tej drogi, wybierz alternatywnie gotową szczególnie tanią (!) płytke Arduino Pro_Mini, jak już wspomniałem o tym poprzednio.

    Po nie wielkiej modyfikacji osiągniesz zamierzony cel, albo będziesz blisko satysfakcji; - poczytaj jeszcze ten artykuł:
    http://www.home-automation-community.com/ardu...n-atmega328p-for-a-year-on-coin-cell-battery/

    e marcus
  • Poziom 9  
    Ok tak zrobię. Powiedz mi jeszcze jakie gniazdo potrzebuję do wgrywania programu do Arduino Pro Min. Czy to coś takiego?
  • Poziom 35  
    grzesiekcichy napisał:
    Ok tak zrobię. Powiedz mi jeszcze jakie gniazdo potrzebuję do wgrywania programu do Arduino Pro Min. Czy to coś takiego?


    Samo gniazdo to absolutnie za mało, aby upload kod do Pro-mini.
    Jest kilka metod na dokonanie tej procedury.
    Najprostsza moim zdaniem, to zastosowanie 6 pinowego adapteru USB/UART (FTDI albo na innym chipie),
    w których nawet łączenie bezpośrednie pinów jest w zgodnej kolejności, na przykład:

    nRF24L01 błąd w programie.

    https://www.youtube.com/watch?v=78HCgaYsA70
    albo inna plytka arduino (pełna versja) w zastosowaniu jako ‘programmer ISP’ jeżeli w Pro-mini jest wgrany bootloader, wykorzystując uklad w podobnej konfiguracji jak wyżej.
    W pozostałej alternatywie jest jeszcze zwyczajny programmer USBasp. Stosując ten ostatni jest szansa na nieopatrznie uszkodzenia bootloadera.... Zależy co faktycznie jest na płytce i w processorze oraz decyzja programisty w zależności czym dysponuje.

    Troche szczegułów tu:
    https://alselectro.wordpress.com/2017/05/14/arduino-pro-mini-how-to-upload-code/

    e marcus
  • Poziom 30  
    emarcus napisał:
    W pozostałej alternatywie jest jeszcze zwyczajny programmer USBasp. Stosując ten ostatni jest szansa na nieopatrznie uszkodzenia bootloadera....

    Nawet nie szansa, ale całkowita pewność. Wgrywanie programów z użyciem USBasp przez ICSP zawsze nadpisuje bootloader w płytce Arduino, za wyjątkiem sytuacji, kiedy się wgrywa sam bootlader :)
    Bootloader nie jest niezbędny do uruchamiania programów, ale do wgrywania nowych przez USB.
  • Poziom 9  
    Kupię adapter ten 5 pinowy. Spróbuję jednak najpierw za pomocą Arduino UNO które posiadam.