Skocz do zawartości

"Arduino w akcji" pierwszy projekt


htfhere

Pomocna odpowiedź

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

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

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 🙂

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

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

Link do komentarza
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ę.

Link do komentarza
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ć? 😉

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

Link do komentarza
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ą.

Link do komentarza
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? 🙂

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.