Skocz do zawartości

Problem z pinami arduino.


polishbeer

Pomocna odpowiedź

Witam wszystkich. Na początku przepraszam, jeśli źle wybrałem dział, ale ciężko było dopasować ten temat do któregoś konkretnego.

Otóż mam pewien problem z moim arduino. Konkretnie chodzi o działanie pinów.

Może wytłumaczę na przykładzie - napisałem prosty program, który wysyła informacje z czujników do komputera po naciśnięciu przycisku.

Napisałem program, jednak problem pojawił się w samym jego działaniu, gdyż w momencie wciśnięcia przycisku (który był wpięty na pin 2) arduino zamiast wysłać informacje jednorazowo zaczynało nią spamować, (to nie była wina kodu, bo po wklejeniu kodów innych użytkowników działo się to samo) lub w ogóle nic nie wysyłał, a czasem nawet pojawiały się losowe ciągi znaków. Problem znikał po zmianie prędkości transmisji z 9600 na 57600 baudów. Niestety tylko pozornie, gdyż nadal komunikacja miała ogromne zniekształcenia. Jedyna różnica była taka, że informacja była wysyłana jednorazowo, a nie bez przerwy.

Z początku myślałem, że to jakiś problem z moim komputerem, z kodem, z konstelacją gwiazd i fazą księżyca, jednak cały problem zniknął gdy przepiąłem guzik na pin 7. Jak ręką odjął, cała komunikacja zaczęła działać bezproblemowo, program działał poprawnie.

Teraz zastanawiam się w czym jest problem. Czy po prostu pin 2 ma jakąś ukrytą funkcje (tak jak 0 i 1), czy może mam uszkodzoną płytkę i jeśli tak - to czy da sie to jakoś naprawić, lepiej zdiagnozować, wykonać jakieś czynności mające sprawdzić, czy pozostałe piny działają normalnie.

Pozdrawiam

Polishbeer.

Link do komentarza
Share on other sites

polishbeer, podczas wciskania przycisku pojawiają się drgania styku - dla człowieka niezauważalne, dla Arduino zamiast 1 klik pojawia się tam ich XX. Więcej informacji na ten temat znajdziesz w artykułach:

Microswitche jako proste czujniki przeszkód

Kurs elektroniki II – #3 – przyciski, diody RGB, kontaktron

Link do komentarza
Share on other sites

@Kaczy Na końcu miałem delay 500, który pełnił rolę takiego zabezpieczenia.

@Treker Ma to sens, tylko w takim razie dlaczego po zmianie pinu przestało się to pojawiać? Gdyby to było związane z drganiem styków to powinno się pojawiać niezależnie od podłączenia.

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

Praktycznie każdy pin ma jakąś funkcję alternatywną. Dopóki nie pokażesz prawdziwego kodu, możemy sobie wróżyć z fusów. Ani nie wiemy co Twój program robi, ani jak używa pinów ani jak wysyła to coś przez Serial. Jak mamy pomagać, gdy podstawą dociekań jest opis słowny? Gdyby wszystko było jak piszesz, pewnie program by działał - mamy więc szukać błędów w Twoim opisie? 😐

Link do komentarza
Share on other sites

@Marek1707 Wstawię kod i wrzucę screeny z monitora szeregowego wieczirem, bo na razie nie mam dostępu do komputera.

[ Dodano: 09-03-2016, 22:10 ]

Ok, a więc - kod:

int swiatlo1 = 0;           //zmienna fotorezystora1
int swiatlo2 = 0;           //zmienna fotorezystora2
int przycisk = 0;           //ilosc nacisnięć przycisku
int potencjometr = 0;       //odczyt z potencjometra

void setup() { 
 Serial.begin(9600);
 pinMode(8, INPUT_PULLUP);
}

void loop() {
   swiatlo1 = analogRead(A4);
   swiatlo2 = analogRead(A3);
   potencjometr = analogRead(A5);

 if(digitalRead(8) == LOW) {
   delay(150);
   przycisk = przycisk + 1;
   Serial.println("");
   Serial.print(" Fotorezystor1: ");
   Serial.print(swiatlo1);
   Serial.print("\t");
   Serial.print(" Fotorezystor2: ");
   Serial.print(swiatlo2);
   Serial.print("\t");
   Serial.print(" Potencjometr: ");
   Serial.print(potencjometr);
   Serial.print("\t");
   Serial.print(" Wcisniecia guzika: ");
   Serial.print(przycisk);
   delay(10);
     }   
     else {
       delay(50);
    }

}

Program odczytuje wartości i podaje je w tabelce po naciśnięciu przycisku.

I teraz:

Dla pinu drugiego, po jednym naciśnięciu guzika:

Leciało tak bez końca, przy 360 wyłączyłem monitor.

Gdy przepiąłem guzik na pin 8 i zmieniłem w kodzie jedynie pinMode(8, INPUT_PULLUP); i if(digitalRead(8) == LOW) to program zachowywał się normalnie i monitor pokazywał:

po trzykrotnym naciśnięciu przycisku

Jedyna różnica była w pinie. W czym siedzi problem?

Link do komentarza
Share on other sites

witam

nie wiem jaki scalak masz wciśnięty w andurino

ale mnie to wygląda ze na analogu sprawdzałeś cyfrowe stany ?

poza tym nie widzę momentu ustalania stanów wyjściowych owych pinów , ani ustawienia portów.

Wyzerowałeś i za iniciowałeś zmienne.

Sprawdź czy wcześniejszy pin jest digital czy analog?

Link do komentarza
Share on other sites

Scalak to atmega 328p-pu. Pin 2 jest na 100% digitalem. A z resztą - posprawdzałem wszystkie piny i tylko z 2 jest taki problem, co więcej - sprawdzałem ten program na arduino znajomego i u niego wszystko działa prawidłowo

Link do komentarza
Share on other sites

skoro zabawileś sie w detektywa to

bym dodał linijke kodu na pin 2 ustawil go na digital.

wyzerował i na przemienie co petle diodował.(LED)

jeśli zadziała znakiem tego gucio

mozliwe ze proc ma uszkodzenie fabryczne

Link do komentarza
Share on other sites

polishbeer, różnica zachowania przy użyciu różnych pinów jest bardzo ciekawa, ale najpierw zobacz jak działa Twój program:

if(digitalRead(8) == LOW) { 
   delay(150); 
   przycisk = przycisk + 1; 
   Serial.println(""); 
   Serial.print(" Fotorezystor1: "); 
...
   delay(10); 
     }    

Instrukcja warunkowa sprawdza, czy pin jest wciśnięty i jeśli tak, wysyła odpowiednie komunikaty. Nie napisałeś jednak kodu, który czekałby na zwolnienie przycisku, albo wykrywał moment przyciśnięcia.

Więc to co uzyskujesz dla pinu 2 jest jak najbardziej prawidłowe - jeśli naciśniesz przycisk, co trochę ponad 150ms otrzymujesz kolejny komunikat.

Raczej zastanawiające jest dlaczego dla pinu 8 efekt jest inny.

[ Dodano: 18-03-2016, 07:03 ]

Może różnica wynikała z innego testowania? Jeśli naciśniesz przycisk na mniej niż 150ms program powinien działać poprawnie na obu pinach.

Link do komentarza
Share on other sites

To wygląda jak uszkodzenie tranzystora odpowiedzialnego za pullup na pinie 2. Po starcie z jakiegoś powodu wejście jest w stanie wysokim ale jednokrotne zwarcie do masy rozładowuje nikłą pojemność linii i wejście zostaje już na stałe w stanie niskim.

Przywracając program do wersji z użyciem pinu 2 sprawdź, czy efekt wykrywania stanu 0 zachodzi gdy dotykasz pinu palcem. Na próbę możesz też podłączyć opornik 5-22k od wejścia do Vcc i sprawdzić, czy się poprawiło. Takie uszkodzenia zdarzają się gdy nie są zachowane zasady ESD. Czasem wystarczy, że chodzisz po dywanie lub pisząc program wiercisz się na plastikowym krześle a potem bierzesz do ręki płytkę i.. pierwszy dotknięty pin umiera.

Na płytce może być też jakiś brud, topnik czy kawałek ciasta, który przywiera lekko do masy. W połączeniu z (dobrze działającym) opornikiem robi dzielnik napięcia dający np. 3V. Za pierwszym razem jest to traktowane jak stan 1 i program "stoi". Przywarcie do masy switchem wczytuje 0, ale gdy napięcie powróci do 3V ten sam poziom nie jest już traktowany jak stan 1 bo przy narastaniu trzeba podjechać wyżej i procesor wciąż widzi logiczne 0. Obejrzyj dokładnie płytkę lub to co do niej podłączyłeś.

Z brudem sobie poradzisz - zmierz woltomierzem napięcie na wejściu w trakcie działania programu z włączonym pullup'em podczas zwartego i rozwartego switcha. Z uszkodzonym trwale pinem też można pracować, trzeba tylko o tym pamiętać. Warto - jak sugerował szrek2003 sprawdzić czy pin w pełni działa jako wyjście. Podłącz diodę LED przez opornik raz do plusa (i pomrugaj) a raz do masy (i znowu pomrugaj). To testuje oba tranzystory wyjściowe i jeśli w obu przypadkach dioda będzie mrugać a pobór prądu procesora nie wzrośnie jakoś dziwnie (zmierz go w trakcie mrugania) to wyjście z pinu jest OK i żaden tranzystor nie jest spalony ani nie zwiera na stałe.

Link do komentarza
Share on other sites

Piszecie bardzo wiele mądrych słów, a ja jestem dopiero uczniem 😃

@Elvis A takiej roli nie pełni if(xxxx)? Jeśli przycisk jest wciśnięty, to wywala komunikat. Jeśli jest puszczony, to warunek if przestaje być spełniony i powinno się zatrzymać. A testowanie było wielokrotne, w różnych wariantach i za każdym razem efekt był taki sam.

@marek1707 Obejrzałem płytkę z każdej strony, jest czyściutka, działająca, (jutro się upewnie miernikiem) a jedyną zmianą podczas testowania było miejsce wpięcia guzika. A co do testów które mam przeprowadzić. Nie do końca rozumiem o co chodzi z opornikiem do Vcc. Mógłbyś wytłumaczyć?

Link do komentarza
Share on other sites

Ten warunek instrukcji if, hie sprawdza momentu wciśnięcia (czyli tylko raz), ale wysyła komunikat ciągle (co 150ms) dopóki trzymasz przyciśnięty przycisk. O ile rozumiem oczekujesz tylko jednego komunikatu, ale ten program właśnie powinien wygenerować ich całe mnóstwo.

Link do komentarza
Share on other sites

Elvis: autor - mimo że jak pisze jest uczniem chyba ogarnia ten przypadek. Rozumie, że if-em nie wykrywa zdarzenia tyko stan i dłuższe wciśnięcie powoduje ciągłe wypisywanie komunikatów, ale testował oba programy w tych samych warunkach i na pewno zauważyłby zatrzymanie po puszczeniu przycisku. A w jednym przypadku mamy trzy komunikaty a w drugim: "Leciało tak bez końca, przy 360 wyłączyłem monitor". Nie podejrzewam, by bez sensu trzymał wciąż wciśnięty przycisk...

polishbeer: weź opornik w granicach 1k do 22k i podłącz go między pin procesora a jego zasilanie Vcc (+5V). To robi to samo co deklaracja INPUT_PULLUP przy definiowaniu wejścia z pinu. Podejrzewam, że wewnętrzny opornik procesora mógł się uszkodzić i nie ma kto robić stanu wysokiego na wejściu. Po jednokrotnym naciśnięciu (zwarciu wejścia do masy) zero logiczne już tam zostaje i dlatego program kręci się bez końca. Normalnie opornik podłączony do plusa "ciągnie" stan pinu do góry i gdy tylko switch rozewrze się, napięcie szybko powraca do stanu wysokiego. Masz woltomierz? Zmierz napięcie na pinie jak prosiłem: podczas pracy programu, w sytuacji wciśniętego i puszczonego przycisku. Zrób to dla obu: dla 2 i 8, i opisz oba przypadki (czyli 4 napięcia).

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.