Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Arduino Pro Mini] + [RFM01] - Zdalne sterownie - "utknięcie" kodu

arztg 08 Nov 2015 20:07 1617 3
  • #1
    arztg
    Level 8  
    Witam wszystkich,

    Ogólnie rzecz biorąc, chcę sobie zrobić zdalnie sterowanie do bramy garażowej w oparciu o płytki Arduino Pro Mini i moduły radiowe RFM01/RFM02. O dziwo, wykorzystując jedyną dostępną na necie bibliotekę do tych RFMów, przesyłanie danych działa dobrze.

    Problem pojawia się, gdy do samego włączania/wyłączania silnika próbuję dorobić prosty pomiar przeciążenia (w założeniach oparty o jakiś tani konwerter prądu na napięcie, na razie symuluję to podając Vcc na odpowiednie wejście analogowe). Oto główna część kodu:



    Code: c
    Log in, to see the code


    Okazuje się, że funkcja "rf01_receive()" czeka, dopóki jakieś dane nie dotrą z nadajnika, więc dalsza część pętli głównej wykonuje się tylko jeśli dane zostały przesłane. Silnik więc reaguje na stan czujnika przeciążenia tylko tuż po przesłaniu danych - czyli wyłączyć go można tylko ponownym przesłaniem danych (jest to zapisane w niepokazanej tu funkcji "steruj_silnik", ale to mało istotne).

    Zna może ktoś jakiś prosty sposób, żeby procesor próbował wywoływać funkcję "rf01_receive()" przez jakiś określony czas, np. 100ms, a potem ją zignorował i przeszedł do dalszej części pętli głównej? Ewentualnie jakiś inny sposób na to, żeby program nie blokował się na stałe, jeśli dane nie są przesyłane.
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • Helpful post
    #2
    szczywronek
    Level 27  
    Uprzedzam - nie znam się na Arduino ;) Widzę dwie opcje:
    1. Przepisać funkcję receive tak aby nie blokowała programu.
    2. Zostawić funkcję receive w pętli głównej a pozostałe funkcjonalności obsługiwać w przerwaniu (np. od timera).
  • #3
    arztg
    Level 8  
    Trochę długo to trwało, bo miałem na głowie parę innych spraw, ale w końcu coś wyszło :)

    Po paru próbach przeróbki rzeczonej funkcji stwierdziłem, że nie ma co :D Zrobiłem przerwanie od timera co 0.5 sekundy, w najgorszym przypadku sterowany silnik będzie w zwarciu przez 0.5 sekundy, co raczej nie powinno mu wyrządzić krzywdy, ewentualnie później zmniejszę ten czas trochę.

    Także dzięki szczywronek za sugestię :) A jakby komuś się przydało, to wrzucam kody:

    funkcja setup:
    Code: c
    Log in, to see the code


    oczywiście trzeba było użyć timera 1, żeby możliwy był tak długi czas pomiędzy przewaniami

    funkcja wywoływana w przerwaniu:
    Code: c
    Log in, to see the code



    pętla główna:
    Code: c
    Log in, to see the code
  • #4
    arztg
    Level 8  
    Witam ponownie,

    Tym razem mam problem nieco innej kategorii, otóż prawdopodobnie uszkodziłem sobie procesor na płytce. Objawy są takie:
    - cyfrowe wyjścia (piny) 8 i 9 po ustawieniu w stan wysoki dają około 1.6V
    - cyfrowe wyjście 6 nie reaguje na instrukcje ustawcze w funkcji "setup" (samo ustawia się w stan niski mimo ewidentnej komendy, żeby się ustawiło w stan wysoki), dopiero późniejsze komendy zmieniają stan poprawnie
    - transmisja radiowa prawie w ogóle nie działa, układ tylko co jakiś czas odbiera jakieś śmieci z otoczenia i przekazuje dalej, zamierzonych danych nie da się odebrać
    - czasami bezpośrednio po podłączeniu zasilania led na pinie 13 wykonuje taki cykl mrugania: 2 szybkie mrugnięcia - dłuższa przerwa - 2 szybkie mrugnięcie - dłuższa przerwa - 2 szybkie mrugnięcia - dłuższa przerwa, po czym układ przechodzi do dalszej pracy

    Zastanawiają mnie przyczyny tego spustoszenia, bo mam to na stykówce i się bardzo pilnowałem z tymi kablami wszystkimi, żeby nie dotykać, gdzie nie trzeba. Jest możliwe, że uszkodzenia są spowodowane przez jakieś skoki zasilania, bo póki co układ zasilam przez programator podłączony do USB?