Skocz do zawartości

Arduino i drgania styków.


SOYER

Pomocna odpowiedź

Dzięki, umiesz tak poprowadzić, żebym mógł sam dojść 😅 (do rozwiązania problemu 😅 ) 😅

Wracając do meritum, co z tym eliminowaniem drgań? taki sketch będzie to robił?

Pozostaje też pytanie z pierwszego postu:

Niestety nie wiem ile powinno wynosić "i" w pętli for dla powiedzmy 80ms. 2000 wpisałem tak sobie, żeby coś było. Jak to policzyć?

Link do komentarza
Share on other sites

Policzyć jest dość ciężko, bo dużo zależy od kompilatora. W pętli masz tylko zmniejszanie zmiennej, co powinno zajmować jakieś dwa cykle zegara. Do tego porównywanie z zerem i skok warunkowy - wychodzi ok. 4 instrukcji, ale kompilator może równie dobrze wygenerować 10. Gdybyś chciał takie pętle faktycznie liczyć - należałoby napisać ją w asemblerze i wyłączyć optymalizację kodu.

Znacznie łatwiej jest po prostu zmierzyć ile taka pętla zajmuje czasu. Przed rozpoczęciem ustawiasz wybrane wyjście na 1, po zakończeniu na 0 - podłączasz oscyloskop lub analizator logiczny i masz wynik. Oczywiście pod warunkiem że używasz zapisów do rejestru, bo arduino nawet dostęp do pinów ma kiepski.

W rzeczywistości zarówno liczenie czasu wykonywania, jak i mierzenie to złe rozwiązania. Po prostu powinno się do tego używać timera. Najlepiej w połączeniu z przerwaniami od linii IO. Wtedy masz dokładność zapewnianą przez sprzęt, a jednocześnie nie blokujesz całego programu aktywnie czekając (zauważ, że Twój program z eliminacją drgań będzie miał pewną formę funkcji delay - więc cała zabawa z unikaniem tej funkcji i używaniem millis() właśnie poszła do kosza...)

Mój własny komentarz naprowadził mnie na jeszcze jedno rozwiązanie - po prostu użyj funkcji delay() - poczekaj 20ms i tyle. Oczywiście jak napisałem wcześniej program będzie marny, ale chociaż będzie to widać.

Link do komentarza
Share on other sites

nie wiem czy mam rację, ale wydaję mi się, ze dlatego, jak mam delaya np 1000, to mi zrywa połaczenie z netem przez ethernet shield, nie wiem jak będzie przy 20ms...

czyli zrobić to na timerze, timery nie zrywały mi połą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

Zacznij od użycia delay-a, wtedy będziesz miał kontrolę ile ms taki delay wprowadza. Najprościej najpierw go zakomentować, a później stopniowo zwiększać - jeśli to w pewnym momencie wywali komunikację to wiadomo co było przyczyną.

Link do komentarza
Share on other sites

Ok, dobry pomysł... tak popróbuję.

Napisałem tak w miedzyczasie, choć nie wiem czy użycie biblioteki to dobry pomysł....

#include <Timers.h>
Timer wait;
#define PinP 10 
#define led 13 
boolean wcisnieto=false; 
boolean przycisk=false; 
boolean stanled=false; 


void setup() { 
 pinMode(led, OUTPUT); 
 pinMode(PinP, INPUT_PULLUP); 

} 

void loop() { 
 // put your main code here, to run repeatedly: 
deb(); 
} 

void deb(){ 

if(digitalRead(PinP) == LOW){  
 wait.begin(80);
  while(wait.available() != true){}   
  if((wait.available()) &&(digitalRead(PinP) == LOW)){ 
   wcisnieto=true; 
  } 
}
if((wcisnieto==true) && (digitalRead(PinP)== HIGH)){ 
  wait.restart();
  while(wait.available() != true){}
 if((wait.available()) && (wcisnieto==true) && (digitalRead(PinP)== HIGH)){ 
 wcisnieto=false; 
 przycisk=true; 
 wait.begin(STOP);
 } 
}
if(przycisk==true){ 
 digitalWrite(led, stanled); 
 stanled = !stanled; 
 przycisk=false; 
} 
}
Link do komentarza
Share on other sites

Dziwny ten Twój kod i nie rozumiem dlaczego tak kombinujesz.

while(wait.available() != true){}

Za pomocą millis(), z czego korzysta biblioteka Timers zastąpiłeś delay() gdyż w oczekiwaniu na odmierzenie czasu Twój program nic nie robi. W ten sposób marnujesz cenny czas. Zamiast tak "karkołomnej" konstrukcji wystarczyłoby delay() - procesor też nic nie robi przez czas opóźnienia.

Idea tej biblioteki i wykorzystania millis() wydaje mi się, że jest inna. Chodzi o to, by tego czasu nie marnować! Przez ten czas kilkudziesięciu ms oczekiwania na ustabilizowanie styków przycisków naprawdę można wykonać bardzo wiele różnych obliczeń.

W PLIK->PRZYKLADY->DIGITAL->DEBOUNCE znajdziesz przykład eliminacji drgań styków. W menadżerze bibliotek po wpisaniu w przeglądarkę DEBOUNCE także znajdziesz masę rozwiązań tego problemu. Narysuj sobie algorytm działania Twojego programu, zoptymalizuj i przełóż go na kod Arduino. Bo to wygląda tak jakbyś strzelał na oślep 🙂.

Pozdrawiam,

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.