Skocz do zawartości

Arduino - dziwne zachowanie


RaV-uino

Pomocna odpowiedź

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

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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ą.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Tu po sugestji Elvisa, http://w907.wrzuta.pl/film/9n7sUclB31f/video0009

proces rzutu kostką został totalnie zautomatyzowany

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/

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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"

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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ł.

Link do komentarza
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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij 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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.