Skocz do zawartości

Arduino - dziwne zachowanie


Pomocna odpowiedź

Napisano

Witam,
niedawno rozpocząłem przygodę z programowanie i sterowaniem różnymi serwami i silniczkami. Po poczytaniu trochę w sieci, zdecydowałem się na początek wybrać Arduino.

Ale do rzeczy, jakiś czas temu, przy okazji kolejnych zabaw z automatycznym włączaniem się diód, natknąłem się na dziwne (jak dla mnie) zjawisko.

Mianowicie, napisany program miał zapalać i gasić kolejne diody, coś źle napisałem w kodzie - niestety nie wiem co, tworząc takie coś - dwie z trzech diód paliły się non-stop, a jedna zapalała się po zbliżeniu palca w okolicę pinów podłączeniowych lub prawej strony ATMegi. Zjawisko ilustruje filmik zamieszczony poniżej.

Dodam, że jest to prosty układ - 3 diody podłączone przez oporniki 200ohm do różnych cyfrowych wyjść Arduino oraz do GND.

Nie znam się na elektronice, a zjawisko mnie zainteresowało i ciekaw jestem dlaczego działo się tak, a nie inaczej. Może ktoś z Was zna odpowiedź?

Przecież Arduino nie ma żadnych czujników zbliżeniowych (chyba)...

W najbliższym czasie postaram się spróbować powtórzyć to doświadczenie i zobaczę co z tego wyjdzie.

Link do filmiku

http://w418.wrzuta.pl/film/3cSNUivVKk8/cuda_arduino#none

Pozdrawiam

jak dla mnie bardzo możliwe że twój program za szybko przełącza diody i oko postrzega to jako permanentne świecenie. W rzeczywistości może się zmieniać. Zwiększ opóźnienie lub przeskaluj przerwanie w zależności z czego korzystasz no a efekt diody niebieskiej? może problem ze stykaniem przewodu, chociaż ja pamiętam podobne zjawisko w innym procesorze i niestety jak się później okazało był uszkodzony. Nie znaczy to jednak że u ciebie może być to samo, może inni członkowie forum będą wiedzieć coś na temat dziwnego zachowania diody nr 3

Moim zdaniem odczytujesz stan linii która nie jest do niczego podłączona.

Pin "wisi" w powietrzu i zbiera różne śmieci. Na palcu masz ładunek i jak zbliżasz do pinu indukuje się na nim napięcie. Domyślam się, że program odczytuje coś z takiej linii i steruje diodą.

RaV-uino jeśli możesz to wkej fragment kodu (szczególnie początek gdzie konfigurujesz pod jakie piny są podpięte diody i jakie spełniają one fukcje).

Przy programowaniu w Arduino ustalasz czy dany pin ma pracować jako wejście czy wyjście

Jak powinno wyglądać podłączenie diody i przykładowy program by migała masz oczywiście tutaj

const int ledPin = 13; // pod pin 13 podpięta dioda

int ledState = LOW; // początkowy stan dla diody (LOW czyli nie świeci)

pinMode(ledPin, OUTPUT); // PIN 13 jako wyjście

reszta kodu to juz zapalanie i gaszenie diody w utalonym interwale czasu.

Pozdrawiam

Viper

Dzięki za posty, sprawiły, że poważnie zacząłem się zastanawiać nad swoimi umiejętnościami manualno-elektronicznymi 😉

viper_dp, niestety już nie mam tamtego kodu, ale tym razem się przygotowałem...

Zrobiłem kostkę do gry.

I znów cuda - nie muszę wciskać przycisku aby kostka działała, wystarczy dotknąć kabelek i działa. Baa powiem więcej wystarczy usiąść przy biurku i działa.

A żeby nie było, że to przez luźny kabelek, to dotykając przewód kombinerkami nic się nie dzieje...

Tu filmik: http://w49.wrzuta.pl/film/6wY43g0p9VL/video0006

Tu zdjęcia układu:

http://w49.wrzuta.pl/obraz/5oVUKNIIaG5/imgp6001

http://w49.wrzuta.pl/obraz/6nG4GvyFLVn/imgp6002

http://w49.wrzuta.pl/obraz/4FpzCxKcgHf/imgp6003

A tu cały kod:

int pinLeds1 = 10;
int pinLeds2 = 9;
int pinLeds3 = 8;
int pinLed4 = 7;
int buttonPin = 6;
int buttonState;
int ran;
int time = 2000;

void setup ()
{
 pinMode (pinLeds1, OUTPUT);
 pinMode (pinLeds2, OUTPUT);
 pinMode (pinLeds3, OUTPUT);
 pinMode (pinLed4, OUTPUT);
 pinMode (buttonPin, INPUT);
 randomSeed(analogRead(0));
}

void loop()
{
 buttonState = digitalRead(buttonPin);
 if (buttonState == HIGH){
   digitalWrite (pinLeds1,HIGH);
   delay (100);
   digitalWrite (pinLeds2,HIGH);
   delay (100);
   digitalWrite (pinLeds3,HIGH);
   delay (100);
   digitalWrite (pinLed4,HIGH);
   delay (100);
    digitalWrite (pinLeds1,LOW);
   delay (100);
   digitalWrite (pinLeds2,LOW);
   delay (100);
   digitalWrite (pinLeds3,LOW);
   delay (100);
   digitalWrite (pinLed4,LOW);
   delay (100);



   ran = random(1, 7);
   if (ran == 1){
     digitalWrite (pinLed4, HIGH);
     delay (time);
   }
   if (ran == 2){
     digitalWrite (pinLeds1, HIGH);
     delay (time);
   }
   if (ran == 3){
     digitalWrite (pinLeds3, HIGH);
     digitalWrite (pinLed4, HIGH);
     delay (time);
   }
   if (ran == 4){
     digitalWrite (pinLeds1, HIGH);
     digitalWrite (pinLeds3, HIGH);
     delay (time);
   }
   if (ran == 5){
     digitalWrite (pinLeds1, HIGH);
     digitalWrite (pinLeds3, HIGH);
     digitalWrite (pinLed4, HIGH);
     delay (time);
  }
  if (ran == 6){
     digitalWrite (pinLeds1, HIGH);
     digitalWrite (pinLeds2, HIGH);
     digitalWrite (pinLeds3, HIGH);
     delay (time);
  }
 }
 digitalWrite (pinLeds1, LOW);
 digitalWrite (pinLeds2, LOW);
 digitalWrite (pinLeds3, LOW);
 digitalWrite (pinLed4, LOW);
}

Jakieś pomysły?

Pozdrawaim

Dodaj do funkcji setup():

digitalWrite (buttonPin,HIGH); 

[ Dodano: 11 Maj 10 07:57 ]

Żeby nie było, że to magia - nie dałeś pullup-a. Można go włączyć w procesorze, ale jeśli nie dasz go na zewnątrz, a nie nie włączysz w procesorze, to pin "wisi" w powietrzu.

Działa wtedy jak antena i zbiera zakłócenia.

do pinu 6 oraz do 5V

"Źle". Podepnij odwrotnie - pushbutton do gndi do pinu. Wywal ten zewnętrzny pull-down, daj może równolegle też kondensator niewielki i zastosuj wstawkę elvisa :] Aha, i zmień program tak, żeby losowanie odbywało się po otrzymaniu 0.

Schemat zgrubny:

diody LE są podłączone przez oprniki 220ohm do wyjść cyfrowych 7 do 10.

pushbutton do pinu 6 oraz do 5V i przez opornik 2,2kOhm do GND

tak jak opisano tu: http://www.instructables.com/id/Arduino-Led-Dice/step3/Schematic-Intro/

Przecież na podanym schemacie pushbutton jest przez 10kohm do masy.

Wiec jeśli budujesz coś ze "wzoru" to wzoruj się w miarę dokładnie.

Program podany dalej w linku jaki podajesz działa OK.

A przy tym co masz to w pętli setup powinno być

digitalWrite (buttonPin, LOW);

czyli stan początkowy klawisza "niski"

viper_dp, źle mówisz. Ten setup pushbuttona na wysoki miał być, bo włączał wewn. pullupa. RaV-uino musi zmienić żeby program włączał losowanie gdy dostanie "LOW", a nie "HIGH" jak jest teraz. Wtedy będzie mógł wyrzucić zewn. pull-downa i włączyć wewn. pull-upa - przejrzyściej.

no to sorka , ale się pogubiłem co wkońcu zastosował, czy propozycje Elvisa (pull-up) czy to co było w tutorialu (pull-down).

Teraz ('automatyczne losowanie') wywoływane jest tym, że zastosował oba rozwiązania :> Wewnętrzny pull-up (Elvis) i zewnętrzny pull-down (instructables).

W sumie to cały temat nie ma zbyt wiele wspólnego z robotyką, ale jedna rzecz jest ciekawa i pouczająca.

Przykład z tutoriala arduino jest błędny - rezystor 10k jest wpięty nie tam gdzie powinien.

W tutorialu to połączenie +5V z GND przez rezystor 10k nic nie daje, tylko prąd pobiera.

To nawet nie jest pull-down. Prawdopodobnie miał być, ale "wyszło" po złej stronie przełącznika. Jak przełącznik jest rozwarty, to tylko wbudowany pull-up może uratować sytuację.

Wniosek jest ważny: nie można bezkrytycznie ufać temu co się w sieci wyczyta.

Swoją drogą warto byłoby do autora tutoriala jakiegoś maila napisać, żeby to poprawił.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...