Skocz do zawartości
htfhere

"Arduino w akcji" pierwszy projekt

Pomocna odpowiedź

Witam. Mam pytanie do osób, które czytały i wykonywały projekty z książki "arduino w akcji". Czy udało wam się zmontować poprawnie działający "miernik refleksu" z drugiego działu? Jak poradziliście sobie z problemem odbijania styków?

Udostępnij ten post


Link to post
Share on other sites

To ja może sam sobie odpowiem, dla innych, którzy mając ten sam problem będą szukali rozwiązania w internecie -> otóż w kodzie programu zapisanym w książce w funkcji przerwania jest linijka

state = state++;

z jakiegoś powodu ( ktoś, kto lepiej zna się na arduino pewno będzie wiedział ) linijka ta nie inkrementuje wartości state. Po zamienieniu jej na:

state = state + 1;

wszystko działa poprawnie 🙂

PONADTO

W następnym podpunkcie książki pokazywany jest sposób jak przy pomocy szeregowego monitora zmierzyć refleks co do milisekundy. Osoby wykorzystujące kod napisany w książce pewno zdziwią się, dlaczego za każdym razem wyświetla im się, że czas reakcji wynosi 0 sekund. Tylko dlaczego do cholery autor książki chce liczyć reakcję człowieka w sekundach? linijkę:

time = (time - start_time); / 1000

zamieniamy na

time = (time - start_time);

i wszystko już działa poprawnie(mierząc i wyświetlając czas reakcji w milisekundach) pozdrawiam

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Dzięki za wyjaśnienie, postawa godna pochwały 🙂

Pamiętajcie, zawsze warto opisać rozwiązanie swojego problemu na forum.

Udostępnij ten post


Link to post
Share on other sites

htfhere, Chyba nasz rozwój idzie tą samą ścieżką, bo właśnie dzisiaj nadziałem się na ten sam problem 😋 Dzięki za rozwiązanie.

W sumie mam jeszcze pytanie do ciebie- czy robiłeś wszystkie kolejne kroki do stworzenia miernika refleksu, czy przeskoczyłeś od razu do właściwego urządzenia? Jeśli robiłeś etapami- czy w momencie gdy do układu diod podłączyłeś przycisk i dodałeś kod z przerywaniem, to w momencie testów układ zachowywał się trochę nieprzewidywalnie? W moim przypadku zadziałała dopiero zmiana

newMillis - lastMillis < 50

na

newMillis - lastMillis < 100

co by sugerowało, że problemem jest dosyć długie odbijanie styków, ale nadal mam wrażenie, że coś mi umknęło.

Edit: może dodam jeszcze parę ważnych kwestii- problem pojawił się zarówno przy kodzie napisanym ręcznie, jak i skopiowanym z książki, więc to nie w nim siedzi problem. Układ w budowie różni się tylko tym, że między przełącznikiem a rezystorem 10k i połączeniem z D2 jest dodatkowe 3cm zworki. Do tego rezystory przy diodach mają 330 Ohmów, a nie 180, bo "przypadkiem" takie miałem 😉

Udostępnij ten post


Link to post
Share on other sites

zly_wieczor Miałem dokładnie tak samo. U mnie zabezpieczenie przed odbijaniem styków działało względnie prawidłowo dopiero przy

newMillis - lastMillis < 150

Dlaczego mówię względnie? Wystarczy, że osoba korzystająca z układu będzie trzymała wciśnięty przycisk przez dłużej niż 150 ms to i tak podczas "odcisku" i tak zostanie wygenerowany szereg fałszywych impulsów, przed którymi zabezpieczenie w kodzie już nie ochroni. Sądzę, że to w tym jest problem, oraz że niezależnie od napisanego kodu ani złożonego układu, te przyciski po prostu będą tak działały :/.

To super, że napisałeś 🙂 Jak będziesz brał się za drugi projekt z książki - pentatoniczną klawiaturę muzyczną to też prosiłbym Cię o ewentualne uwagi 🙂 od razu Ci napiszę - jeśli nigdy nic nie lutowałeś ( tak jak np ja... ) to przed przylutowaniem elektrod do nieosłoniętych piezoelektryków najpierw przeczytaj ten artykuł , ja lutowałem nieprawidłowo i uszkodziłem końcówkę lutownicy...

Ponadto po złożeniu układu głośnik działał nadzwyczaj cicho a sam dźwięk nie był czysty...ciekawi mnie, jak u Ciebie to wyjdzie 🙂

Udostępnij ten post


Link to post
Share on other sites

htfhere, rany boskie, to odbijanie styków potrafi naprawdę dobić człowieka. Wczoraj od momentu kiedy napisałem post, do tak ok. 1 użerałem się z testerem, gdyż ciągle jego zachowanie było nieprzewidywalne. Co pomogło?

newMillis - lastMillis < 500  //!!!!

Dopiero po tej modyfikacji całość zachowuje się dokładnie tak jak powinna.

Myślę, że muszę popróbować z innymi przyciskami, może akurat te które posiadam są aż tak wrażliwe na to zjawisko :/

Będę pisał, chociaż może powinniśmy założyć nowy temat dotyczący po kolei wszystkich projektów z tej książki i uzupełniać/linkować go wraz z postępami, żeby mieć wszystkie doświadczenia dostępne w jednym miejscu pod bardziej ogólną nazwą niż "pierwszy projekt" 😋 Nie widziałem jeszcze tematu dot. tej książki, to myślę że może się tez komuś w przyszłości przydać jeśli będzie się zastanawiał nad kupnem.

Artykuł jest świetny, i chociaż już coś tam kiedyś lutowałem, to powtórka będzie konieczna, gdyż wtedy skończyło się spaleniem tapicerki na łóżku roboczym...

Odezwę się jak już wykonam kolejny projekt 😉

Edit: ciekawostka- gdy próbowałem naprawić problem z nieprzewidywalnym testerem, w momencie desperacji postanowiłem stworzyć dodatkowy szkic i wkleić tam cały kod z książki. Nie działał. W ogóle. Zapalał diodę startową i nic więcej nie robił 😃 Tymczasem mój kod, który był przecież przepisanym kodem z książki (+ modyfikacją pokazaną powyżej) od początku "coś" robił. Nie mam pojęcia skąd ta różnica.

Udostępnij ten post


Link to post
Share on other sites

Moze trzeba napisac przyklady od nowa. To co jest w ksiazce to jakis koszmar.

Udostępnij ten post


Link to post
Share on other sites
otóż w kodzie programu zapisanym w książce w funkcji przerwania jest linijka
state = state++;

z jakiegoś powodu ( ktoś, kto lepiej zna się na arduino pewno będzie wiedział ) linijka ta nie inkrementuje wartości state. Po zamienieniu jej na:

state = state + 1;
Hmm, state = state++; wygląda dość absurdalnie i nie ma większego sensu. Samo state++; wystarczy i jest równoznaczne (w tym prostym przypadku) z Twoją drugą linijką.

I to składnia C/C++ - Arduino nie ma tu akurat nic do gadania. To tak gwoli ścisłości 🙂

Udostępnij ten post


Link to post
Share on other sites

Hmm, state = state++; wygląda dość absurdalnie i nie ma większego sensu. Samo state++; wystarczy i jest równoznaczne (w tym prostym przypadku) z Twoją drugą linijką.

I to składnia C/C++ - Arduino nie ma tu akurat nic do gadania. To tak gwoli ścisłości 🙂

Zgadzam się w zupełności,zapis state = state++ jest faktycznie absurdalny(dawno nie programowałem i nawet nie zwróciłem na to uwagi), jednakże jestem absolutnie pewien, że koniec końców, po wykonaniu takiej instrukcji, wartość state powinna się zwiększyć o 1. Ja kolejność działań po wpisaniu takiego kodu widzę tak:

1. Wartość zmiennej state jest przypisywana wartości zmiennej state

2. Wartość zmiennej state jest zwiększana o 1.

Przy czym, gdybyśmy mieli tutaj preinkrementację to najpierw wykonywałby się punkt drugi a następnie pierwszy 🙂 popraw mnie jeśli się mylę.

Udostępnij ten post


Link to post
Share on other sites

Elvis, wprawdzie kolega Marooned już podał jeden absurd zawarty w kodzie z książki, ale czy możesz jeszcze rozwinąć swoją wypowiedź? Widziałeś jeszcze jakieś koszmary w niej zawarte o których początkujący powinien wiedzieć? 😉

Udostępnij ten post


Link to post
Share on other sites

Pierwsza rzecz, to uzywanie zmiennych zamiast stalych. Do definicji numerow pinow - ktore raczej nie beda zmieniane podczas dzialania programu powinno sie wykorzystac stale.

Programisci C pewnie poleca #define, milosnicy C++ chociaz const int. W kazdym razie warto od poczatku zwracac na to uwage - to co stale powinno w kodzie byc stale. Powodow jest kilka. Po pierwsze stala moze byc przechowywana w pamieci Flash, zamiast w RAM. Kompilator moze optymalizowac kod, wiedzac ze jest to stala. I wreszcie nie pomylimy sie, niechcacy zmieniajac zmienna w ktorej jest zdefiniowany numer pinu.

Natomiast co do tego drgania stykow - mozna program troche przerobic i bedzie dzialal duzo lepiej. Przykladowy kod stara sie liczyc ile razy zwolniono przycisk (zmienna state dziala jak niby licznik). Takie zliczanie jest "trudne" poniewaz pojawiaja sie drgania, i np. zamiast jednego, otrzymamy 2 impulsy i zmianna state przejdzie za daleko.

Program potrzebuje tylko informacji o zwolnieniu przycisku - ta jest latwa do uzyskania, bo pierwszy impuls jest pewny, najwyzej po nim pojawia sie "falszywe". Mozna wiec w przerwaniu tylko zaznaczac "zwolniono przycisk", a glowny program odczytywalby taka flage, nastepnie czekal (i tak czeka) odpowiednia ilosc czasu. Pozniej program zerowalby flage i byl gotowy do czekania na nastepne zwolnienie przycisku.

[ Dodano: 30-04-2015, 15:00 ]

zly_wieczor,

jednakże jestem absolutnie pewien, że koniec końców, po wykonaniu takiej instrukcji, wartość state powinna się zwiększyć o 1

Musze Cie zmartwic, ale niestety wartosc nie powinna zwiekszyc sie o 1.

Kod state++ w rzeczywistosci to kilka instrukcji:

tmp = state

state = state +1

return tmp

Czyli zwracana jest wartosc jaka state mialo przed inkrementacja.

Jesli napiszemy:

state = state++

to kod bedzie dzilal nastepujaco:

tmp = state

state = state + 1

state = tmp

Czyli nawet jesli state ulegnie zmianie to na krotko.

[ Dodano: 30-04-2015, 15:02 ]

A przy okazji - dlatego niektorzy programisci preferuja preinkrementacje, zamiast postinkrementacji - postinkrementacja zawiera tworzenie zmiennej tymczasowej, co moze zabierac czas i pamiec. Oczywiscie o ile kompilator nie bedzie "sprytny" i nie zoptymalizuje kodu

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Elvis, Wprawdzie kwestię czy state=state+1 to to samo co state=state++ poruszył htfhere, ale i tak dziękuję za odpowiedź bo tez mnie to intrygowało 😃

Jeśli chodzi o resztę: to co napisałeś rozjaśniło mi parę rzeczy, za co też dziękuję. Spróbuję zmodyfikować kod w ten sposób.

Trochę szkoda, że w książce napisanej dla początkujących, już w pierwszym projekcie pojawia się:

-błąd w kodzie: state=state++;

-niepotrzebne stosowanie zmiennych za stałe;

-nienajlepsza metoda przerywania: zliczanie zwolnień przycisku;

-w efekcie problem z odbijaniem styków;

Zobaczymy czy dalej będzie lepiej.

Udostępnij ten post


Link to post
Share on other sites

zly_wieczor, przepraszam, oczywiscie o state++ odpowiedz byla do htfhere.

Natomiast co do ksiazki - moze dlatego lepiej poczekac na kurs na Forbocie 😉

Udostępnij ten post


Link to post
Share on other sites

Elvis, Tak jak mówiłem, nie masz za co przepraszać 😉

Dlatego też zamierzam go kontynuować, ale rozbudzonego głodu wiedzy nie da się zaspokoić jednym odcinkiem na dwa tygodnie. Tym bardziej, kiedy płytka leży sobie pod twoim nosem, a ikonka Arduino kontrastuje z kolorem pulpitu 😃

Mam jeszcze alternatywę w postaci "Arduino- 65 praktycznych projektów". Jeśli będzie bardzo źle to zawsze mogę się przerzucić na nią.

Udostępnij ten post


Link to post
Share on other sites

Elvis

Odpal proszę dowolny kompilator cepa i skompiluj taki oto kod:

#include <iostream>
#include <conio.h>
using namespace std;

void main(){

int state = 0;

state = state++;

cout << "wartosc zmiennej to: " << state << endl;

getch();

}

Co się wyświetliło w konsoli? 🙂

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!

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