Skocz do zawartości
Dejwuch

Arduino UNO - problem z odczytem stanu na pinach

Pomocna odpowiedź

Napisano (edytowany)

Cześć,

Dopiero zacząłem przygodę z Arduino UNO R3 i chciałbym zbudować pewne urządzenie - niestety zatrzymałem się na samym początku.. Czy mógłby mi ktoś pomóc i powiedzieć w czym leży problem i jak go rozwiązać ?

Urządzenie ma służyć do uruchomienia przekaźnika  sygnałem z pinu 3, sprawdzeniu na pinie 7 czy przez badane urządzenie/przedmiot (póki co bez tego przedmiotu) przepływa prąd. Jednocześnie ma sprawdzać czy w tym samym czasie przepływa prąd w połączeniu z + na pin 10, docelowo tutaj też będzie przekaźnik ale póki co mam tylko 1. 

Odbywa się to tak: 

-wysyłam informacje z PC, że chcę sprawdzić pin z przekaźnikiem (case b)

- kontroler odpowiada mi np. 01 - czyli na pierwszym pinie (pin 7) jest stan niski, na drugim (pin 10) wysoki. Dla odpowiedzi 11, to na obydwu pinach są stany wysokie.

Problem jest w tym, że gdy np sprawdzam case a (bez zwierania przekaźnika) to dla pinu 7 (od przekaźnika) losowo wysyła mi informacje o stanie niskim i wysokim..  Mam wrażenie, że gdy nie ma żadnego sygnału nadanego przez arduino na tym 7 pinie to  dobiera sobie dowoli. Próbowałem na wszelkie znane mi sposoby i niestety nie znalazłem rozwiązania. Czy ktoś jest w stanie mi pomóc, albo naprowadzić ? Może kod jest źle napisany ?

Załączam krótki program, który ma symulować takie urządzenie.

Pozdrawiam

Dawid

 

char komenda = 0; // komenda z PC dla case a lub b
int odczyt7 = 0; // odczyt stanu z pinu 7
int odczyt10 = 0; // odczyt stanu z pinu 10

void setup() {

Serial.begin(9600);

pinMode(7,INPUT); // pin do odczytu stanu 0/1 z przekaźnika
pinMode(10,INPUT); // pin do odczytu stanu 0/1 ze stałego połączenia

pinMode(3,OUTPUT); // pin wyjściowy dla przekaźnika 1


digitalWrite(3, LOW);




}

void loop() {




if (Serial.available()>0) // sprawdzenie czy odebrano komunikat
    {
        komenda = Serial.read(); // przypisanie komunikatu do zmiennej

 
        switch (komenda) // wybranie casu w zaleznosci od zmiennej - czy uruchomic przekaznik i sprawdzic stan (b), czy sprawdzic stan ze stalego polaczenia (a)
        {
            case 'a':
                
                odczyt7 = digitalRead(7); // odczyt (0 lub 1) z pinu 7 (przekaźnika) i przypisanie do zmiennej
                odczyt10 = digitalRead(10); //odczyt (0 lub 1) z pinu 10 (stałego łącza)  i przypisanie do zmiennej
                delay(300);
                Serial.print(odczyt7);
                Serial.println(odczyt10); // wysłanie informacji do PC o stanach pinów
                delay(300);
                digitalWrite(3, LOW);
            break;
               

              case 'b':
                digitalWrite(3, HIGH); // po wybraniu b, zalacza się przekaznik i sprawdza jak uprzednio

                delay(300);
                
                odczyt7 = digitalRead(7);
                odczyt10 = digitalRead(10); 
                delay(300);
                Serial.print(odczyt7);
                Serial.println(odczyt10);
                delay(300);

                digitalWrite(3, LOW);
            break;
  
            
         }
   }

}

 

Edytowano przez Dejwuch

Udostępnij ten post


Link to post
Share on other sites

@Dejwuch, witam na forum 🙂

8 godzin temu, Dejwuch napisał:

Problem jest w tym, że gdy np sprawdzam case a (bez zwierania przekaźnika) to dla pinu 7 (od przekaźnika) losowo wysyła mi informacje o stanie niskim i wysokim..  Mam wrażenie, że gdy nie ma żadnego sygnału nadanego przez arduino na tym 7 pinie to  dobiera sobie dowoli. Próbowałem na wszelkie znane mi sposoby i niestety nie znalazłem rozwiązania. Czy ktoś jest w stanie mi pomóc, albo naprowadzić ? Może kod jest źle napisany ?

Nie wiem co to za układ, bo nie podałeś żadnego schematu, ale wygląda jak brak rezystora podciągającego na wejściu. Zerknij tutaj: Kurs Arduino – #2 – podstawy programowania, porty I/O i zainteresuj się tematem INPUT_PULLUP 😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Dziękuję 🙂

Niestety próbowałem również z input_pullup na różne sposoby. Ale już dokładnie opisuje w czym problem, a poniżej uproszczony schemat.

Na pinie 10 cały czas powinienem odbierać sygnał 1, a na pinie 7 zależności czy używam case a lub b. W momencie case a powinienem otrzymywać informacje 11 (pierwsza jedynka to sygnał z 7, a druga to z 10) - i faktycznie tak się dzieje. Problem jest w momencie używania case b. Losowo prawie na przemian dostaje 01, 11, 11, 01, 11, 01 itp. Tak jakby pozostawienie pinu 7 bez sygnału (0 lub 1) powoduje jego losowość. Czy teraz problem jest bardziej zrozumiały ? Czy możliwe, że specyfikacja kontrolera generuje taką losowość ? Czy zastosowanie dodatkowego jakiegoś układu (np z tranzystorem) rozwiązałby ten problem ?

Chcę, żeby w momencie wybrania case a, na pinie 7 zawsze wystąpiło 0 (czyli, że przekaźnik jest otwarty).

Schemat.thumb.JPG.4bb50489fbff8e4b4e238d858a8a83c0.JPG

 

 

EDIT (rozwiązanie):

Doszedłem do wniosku (nie wiem czy słusznego), że Arduino, kiedy nie ma jasno nadanego sygnału 0 lub 1 to będzie losowo wskazywał tą wartość po wywołaniu odczytu. Rozwiązanie dość proste.. zastosować przekaźnik z 2 stanami (NO i NC). Do NC podłączyć GND (aby wskazywał 0 na pinie7 czyli, że przez cewkę nie płynie prąd), a na NO podłączyć 5V i w momencie płynięcia prądu przez przekaźnik dostaniemy informację 1 na pinie7, że prąd płynie,.

 

image.thumb.png.9cf5c8cbf231082d3339a2066f3b610e.png

Edytowano przez Dejwuch

Udostępnij ten post


Link to post
Share on other sites

Ja chyba trochę nadal nie rozumiem tego problemu i nadal będę się upierał, że chodzi o brak rezystora podciągającego na wejściu (lub włączonego INPUT_PULLUP), ale jeśli sobie już poradziłeś to nie będę dalej o to męczył 😉 Zwrócę tylko Twoją uwagę na bardzo zły sposób podłączenia przekaźnika. Brakuje u Ciebie tranzystora oraz (co ważniejsze) diody zabezpieczającej. Zerknij do tego artykułu: Kurs elektroniki – #9 – elementy stykowe, przekaźniki

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
16 godzin temu, Dejwuch napisał:

Doszedłem do wniosku

Nie trzeba dochodzić, wystarczy przeczytać w nocie katalogowej układu.

 

16 godzin temu, Dejwuch napisał:

że Arduino,

Co rozumiesz pod pojęciem Arduino? Jakie Arduino?

 

16 godzin temu, Dejwuch napisał:

kiedy nie ma jasno nadanego sygnału 0 lub 1 to będzie losowo wskazywał tą wartość po wywołaniu odczytu.

Jak każdy układ o dużej rezystancji wejściowej.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

 

Dnia 19.07.2019 o 08:24, InspektorGadzet napisał:

Nie trzeba dochodzić, wystarczy przeczytać w nocie katalogowej układu.

 

Co rozumiesz pod pojęciem Arduino? Jakie Arduino?

Nie wpadłem na to za pierwszym razem, że może to być "naturalne" zjawisko. Tak jak wspomniałem na początku - Arduino UNO R3 🙂

@Treker, dziękuję za wskazówki. Poprawiłem kod zmieniając pin7, tzn:

pinMode(7,INPUT_PULLUP);

Poprawiłem również połączenie z przekaźnikiem. Jednakże mam problem z zabezpieczeniami. Zamieszczam uzupełniony schemat o pozostałe przekaźniki  - w takiej konfiguracji ma pracować ten układ. Przycisk SW1 został dodany symbolicznie jako badane urządzenie (sygnalizując czy przewodzi napięcie 220-240 VAC czy też nie ). 
Cewka przekaźnik K2 będzie sterowana napięciem zmiennym z sieci (przyłącza L i N). 

1. Zastanawiam się nad wykorzystaniem optoizolatorów, aby zabezpieczyć kontroler przed przebiciem 220-240 V.  Czy zastosowanie optoizolatora U1, spełni swoje zadanie ? Tzn np. w przypadku przebicia 220-240V, ulegnie uszkodzeniu U1 zanim uszkodzi się mikrokontroler ? Napięcie 5V byłby dostarczane bezpośrednio z układu Arduino.

2. Mam wątpliwości co do zastosowania optoizolatorów U2 i U3 oraz diod D2 i D3, ponieważ sam to nakreśliłem. Czy jest ktoś w stanie ocenić czy taki układ, szczególnie za przekaźnikiem K2 ma prawo bytu ? Czy ochroni mikrokontroler przed niechcianym uszkodzeniem ? Zastanawiam się również czy zastosowanie U2 w takim połączeniu pozwoli mikrokontrolerowi odczytania tylko 0 w momencie gdy przekaźnik K2  nie płynie prąd (jest w stanie NC).

3. Nie jestem pewny, które rozwiązanie wybrać w celu ochrony przeciwprzepięciowej w przypadku cewki przekaźnika K2 na prąd zmienny. Czym się będzie różnić w tym zastosowaniu wykorzystanie warystora wpiętego równolegle do cewki, a czym rezystora i kondensatora (RC) ? (nie wykorzystano jeszcze na schemacie)

Przypuszczam, że powinno zadziałać, ale proszę o opinie.

Z góry dziękuję za każdą podpowiedź, poradę.

 

image.thumb.png.4a63bb20cfb996245f5822383aa5ea5e.png

Edytowano przez Dejwuch

Udostępnij ten post


Link to post
Share on other sites

Optoizolator i przekaźnik to przesada chyba, że budujesz sprzęt medyczny ale kto chciałby aby jego życie zależało od Arduino? Ja swojego życia nie powierzę ani Arduino ani Windowsowi tak samo jak w kosmos ani Arduino ani Windows nie poleci.

U2 i U3 to jakiś miszmasz. Jak chcesz zabezpieczyć wejście mikrokontrolera przed uszkodzeniem przez 230V włącz rezystor (właściwie dwa) szeregowo z pinem mikrokontrolera.

 

6 godzin temu, Dejwuch napisał:

Czym się będzie różnić w tym zastosowaniu wykorzystanie warystora wpiętego równolegle do cewki, a czym rezystora i kondensatora (RC)

Poczytaj o sposobach zabezpieczenia półprzewodników przed przepięciami powstającymi przy odłączaniu indukcyjności.

Udostępnij ten post


Link to post
Share on other sites
1 godzinę temu, deshipu napisał:

- Informacja dość  lakoniczna.

- Wiki jest tak samo wiarygodna jak wiadomości w TVP1.

- Ile w owym satelicie zostało z Arduino? Może to takie Arduino jak to https://kamami.pl/zestawy-uruchomieniowe-stm32/570384-ka-nucleo-f411cev2-plytka-rozwojowa-z-mikrokontrolerem-stm32f411ce.html?search_query=ka-nucleo&results=9

Jak potrzeć na Arduino przez pryzmat złącza, to wiele projektów na Arduino zrobiłem (żaden nie miał AVR). Jak przez pryzmat bibliotek, to często używam Arduinowych (oczywiście po modyfikacji, inaczej ich możliwości są bardzo kiepskie i w praktyce nadają się do zabawek czy demonstracji).

Dla mnie projekt Arduino to przede wszystkim wykorzystanie Arduinowych bibliotek bez zmian oraz używanie Arduinowego bootloadera bez możliwości sprzętowego debugowania). To są "uroki" Arduino.

Udostępnij ten post


Link to post
Share on other sites
6 godzin temu, InspektorGadzet napisał:

Jak potrzeć na Arduino przez pryzmat złącza,

Arduino to nie tylko Atmega328, i nie tylko płytki z układem złącza UNO, zaczęło się gdzieś w czasach popularności Atmega8, przez najliczniejszą grupę Atmega328 po Arm (ponad 7 lat temu). Aktualnie obsługiwana lista jest nie do ogarnięcia wg mnie, bo oprócz oryginałów (z Intelem) są płytki mające kilkaset MHz, wiele rdzeni i setki kb RAM, są takie o których pewnie niewielu słyszało z wyjściem HDMI, MB RAM i wieloma prockami na laminacie.. I w każdym można zamigać LED używając digitalWrite.

Życząc Panu powodzenia na forum, mistrzowi oftopa, zastanawiałem się ile tym razem uda się Panu utrzymać. Bo po zawartości postów nie sposób Pana nie rozpoznać.

Udostępnij ten post


Link to post
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, aby zacząć 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...