Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Arduino - zliczanie impulsów

1,154 views
Skip to first unread message

Michal M. Lechanski

unread,
Jul 7, 2017, 6:01:02 AM7/7/17
to
Ja po prośbie do doświadczonych bardziej niż ja...

Otóż próbuję zliczać obroty koła.

Pomiar 1 (jeden impuls/1 obrót koła):
Czujnik IR TCRT5000 osłonięty po bokach, w odległości ok 10-15mm od
odbijającej powierzchni koła, na której przylepiona jest czarna taśma o
długości ok 10cm. Pomiar na analogowym pinie pokazuje ok 400 gdy przed
czujnikiem jest powierzchnia odbijająca i ok 27 gdy przed czujnikiem
jest taśma.

Pomiar 2 (10 impulsów na 1 obrót koła):
na kole umocowanych jest 10 silnych magnesów (10mm średnica, 5mm
wysokość, materiał N52) odległość miedzy magnesami ok 10cm. CZujnik -
miniaturowy kontaktron. Odległość od magnesu do kontaktronu 3-4mm
(sprawdzone - kontaktron zwiera się już przy odległości ok 15mm od magnesu).

Pomiar 3:
jak pomiar 2 ale zamiast kontaktronu jest czujnik Halla - odległość od
magnesu ok 4-5mm.

pomiar 4 i 5 tak jak 2 i 3, ale ilość magnesów zredukowana do 5

Płytka Arduino UNO R3 ATmega328P (CH340T), nieoryginalne, skrypty bądź z
podręcznika Arduino bądź z instrukcji do czujnika Halla.

Spostrzeżenie - przy wolnych obrotach wszystko działa jak powinno i
impulsy zliczane są poprawnie. Jednak przy nieco większej szybkości w
każdej z powyższych konfiguracji "gubione" są impulsy, czyli zliczonych
jest mniej niż powinno być.
Prędkość przy której impulsy zaczynają być gubione szacuję na 15-20km/h.

Gdyby impulsów zliczane było więcej niż powinno, to w przypadku
kontaktronu zwaliłbym to na wibrację styków... ale tu nie ma znaczenia
jaki czujnik jest zastosowany.
Ja tego nie rozumiem - przecież częstotliwość pracy Arduino jest o wiele
wyższa niż częstotliwość zliczanych impulsów. Czy możliwe jest że płytka
Arduino nie działa poprawnie? A jeśli to nie to, to w czym jest problem?

Z góry dziękuję za jakiekolwiek sugestie.

--
Michał

Zenek Kapelinder

unread,
Jul 7, 2017, 6:05:36 AM7/7/17
to
Kup za 20 zlotych licznik do roweru. Bedzie dzialal i jeszcze bedzie mial bezcenna czesc. Bedzie mial ladna obudowe.

Cezar

unread,
Jul 7, 2017, 6:06:22 AM7/7/17
to
On 07/07/2017 11:01, Michal M. Lechanski wrote:
>
> Z góry dziękuję za jakiekolwiek sugestie.
>

Pokaż kod. Uzywasz przerwań?

c.



Michal M. Lechanski

unread,
Jul 7, 2017, 6:09:31 AM7/7/17
to
W dniu 07/07/2017 o 11:05, Zenek Kapelinder pisze:
> Kup za 20 zlotych licznik do roweru. Bedzie dzialal i jeszcze bedzie mial bezcenna czesc. Bedzie mial ladna obudowe.
>
Już kupiłem.
Nadal jednak próbuję to zrozumieć.

--
Michał

Michal M. Lechanski

unread,
Jul 7, 2017, 6:24:18 AM7/7/17
to
W dniu 07/07/2017 o 11:06, Cezar pisze:
> On 07/07/2017 11:01, Michal M. Lechanski wrote:
>>
>> Z góry dziękuję za jakiekolwiek sugestie.
>>
>
> Pokaż kod. Uzywasz przerwań?

Żadnych przerwań. "Kod" dla czujnika IR jak poniżej. Dla innych
czujników poziom "skomplikowania" taki sam.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int val0;
int irPin0 = 1;
int licznik;

void setup()
{
lcd.begin(16, 2);
licznik=0;
val0=0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("val0 = ");
lcd.setCursor(0, 1);
lcd.print("licznik = ");
}

void loop()
{
val0 = analogRead(irPin0);
if (val0 > 100)
{
licznik++;
}
lcd.setCursor(8, 0);
lcd.print(val0);
lcd.setCursor(10, 1);
lcd.print(licznik);
}

P.S. Przepraszam - w pierwszym poście powinno być:
"Pomiar na analogowym pinie pokazuje ok 27 gdy przed
czujnikiem jest powierzchnia odbijająca i ok 400 gdy przed czujnikiem
jest taśma."

--
Michał

Nifhelm

unread,
Jul 7, 2017, 6:40:33 AM7/7/17
to
W dniu 07.07.2017 o 12:24, Michal M. Lechanski pisze:
Witam.
Czas konwersji wartości analogowej na cyfrową w Atmedze 328 może sięgać
260us Do tego dochodzi komunikacja z wyświetlaczem. Może po prostu
pomiar trafia przed i za czarną taśmą i stąd gubienie impulsów. Swoją
drogą dziwię się, że przy wolnych obrotach nie zlicza po dwa, trzy i
więcej impulsów na obrót.

Pozdrawiam.

Cezar

unread,
Jul 7, 2017, 6:44:12 AM7/7/17
to
W powyzszym kodzie jesli impuls przyjdzie podczas gdy piszesz do LCD,
konsoli lub CPU wykonuje cokolwiek innego to zostanie pominięty.


c.

Piotr Gałka

unread,
Jul 7, 2017, 6:45:20 AM7/7/17
to
W dniu 2017-07-07 o 12:24, Michal M. Lechanski pisze:
> void loop()
> {
> val0 = analogRead(irPin0);
> if (val0 > 100)
> {
> licznik++;
> }
> lcd.setCursor(8, 0);
> lcd.print(val0);
> lcd.setCursor(10, 1);
> lcd.print(licznik);
> }
>

Nigdy nic nie pisałem na mikrokontroler.
Nie rozumiem tego programu.
Jeśli to loop() jest jakoś wołane w pętli to przy zatrzymanym kole w
pozycji gdy odczyt analogowy daje >100 licznik będzie ciągle wzrastał.

A zakładając, że to jednak jakoś działa to przypuszczam, że obsługa lcd
zabiera dużo czasu.

Spróbuj wypisywać co 10-ty wynik i zobacz czy prędkość graniczna nie
wzrośnie 10 razy.
P.G.

Michal M. Lechanski

unread,
Jul 7, 2017, 6:53:42 AM7/7/17
to
W dniu 07/07/2017 o 11:40, Nifhelm pisze:

> Swoją
> drogą dziwię się, że przy wolnych obrotach nie zlicza po dwa, trzy i
> więcej impulsów na obrót.

Taki efekt zaobserwowałem z magnesami i kontaktronem - zliczane były
impulsy gdy kontaktron "najeżdzał" nad magnes i gdy się od magnesu
oddalał. Czyli licznik zliczał dwa razy więcej impulsów niż było
magnesów. Zmniejszenie odległości kontaktronu od magnesu usunęło ten efekt.

--
Michał

Cezar

unread,
Jul 7, 2017, 6:54:40 AM7/7/17
to

wyguglaj "arduino analog comparator interrupt count pulses"
Kilka pierwszych stron da Ci gotowce.

c.

Michal M. Lechanski

unread,
Jul 7, 2017, 6:56:44 AM7/7/17
to
W dniu 07/07/2017 o 11:01, Michal M. Lechanski pisze:

> Ja po prośbie do doświadczonych bardziej niż ja...

Panowie, dziękuję bardzo - spróbuję najpierw wyeliminować wpływ opóźnień
związanych z obsługą LCD.

Pozdrawiam

--
Michał

Cezar

unread,
Jul 7, 2017, 6:58:37 AM7/7/17
to
Ale w dalszym ciągu możesz dostać złe dane. Przez odsunięcie magnesów
skróciłeś długośc impulsów. Musisz zliczać *zbocza* a nie stany.

c.

Cezar

unread,
Jul 7, 2017, 7:00:34 AM7/7/17
to
to jest (nie) rozwiązanie problemu od dupy strony :-)

c.

Nifhelm

unread,
Jul 7, 2017, 7:04:03 AM7/7/17
to
W dniu 07.07.2017 o 12:53, Michal M. Lechanski pisze:
Funkcja loop() wykonuje się ciągle od nowa. Za każdym przejściem
dokonywane jest sprawdzenie wartości na pinie analogowym i za każdym
razem gdy wykrywana jest taśma stan jest zwiększany. Przy każdym
przejściu zapisywane są też dane d wyświetlacza LCD. Efektem jest długi
czas przejścia pętli oraz to, że jeśli nastąpi dwukrotne sprawdzenie
wejścia analogowego za jednym przejściem taśmy przed czujnikiem, to
zliczone zostaną dwa impulsy.
Po pierwsze zrezygnuj z pomiaru analogowego, bo jest zbyt wolny. Dodaj
komparator i wynik na wejście cyfrowe.
Po drugie zrezygnuj z zapisu LCD jeśli nie zmienia się wartość licznika.
Po trzecie zastosuj wykrywanie przejścia z koła na taśmę, a nie
wykrywanie taśmy (zmiana sygnału a nie jego stan).
A najlepiej zastosuj przerwania.
Pozdrawiam.

Pcimol

unread,
Jul 7, 2017, 7:42:29 AM7/7/17
to
Do zliczania impulsów najprosciej skonfigurować licznik TCNT1 by zliczał
z wejścia T1.

Osobiście jednak trzymam się z dala od kompilatorów typu Arduino, więc
nie wiem jak to dokładnie się robi w tym czymś kompilatoropodobnym.
Natomiast w dowolnym C robi się to bez problemu.

J.F.

unread,
Jul 7, 2017, 7:45:32 AM7/7/17
to
Użytkownik "Michal M. Lechanski" napisał w wiadomości grup
dyskusyjnych:ojnp7k$c2c$1$mic...@news.chmurka.net...
Tu nam moze program to filtrowac.
Wylapujemy pierwsze zwarcie, wyswietlamy cos na ekranie, czas mija,
odczytujemy pin ponownie ... i z powodu minietego czasu drgan juz nie
ma ..

J.

Nifhelm

unread,
Jul 7, 2017, 8:03:57 AM7/7/17
to
W dniu 07.07.2017 o 13:42, Pcimol pisze:
W sumie dość prosto.
Trzeba podłączyć sygnał do wejścia D2 lub D3 w Arduino, uruchomić
przerwania zewnętrzne na tym wejściu i napisać procedurę obsługi
przerwania która będzie zwiększać wartość licznika o 1 o ile od
poprzedniej zmiany minął określony czas (likwidacja drgań). I sprawa
załatwiona.
Pozdrawiam.

J.F.

unread,
Jul 7, 2017, 8:19:12 AM7/7/17
to
Użytkownik "Pcimol" napisał w wiadomości grup
dyskusyjnych:ojns34$tgg$1...@mx1.internetia.pl...
On 2017-07-07 12:09, Michal M. Lechanski wrote:
>Do zliczania impulsów najprosciej skonfigurować licznik TCNT1 by
>zliczał z wejścia T1.

Ale wtedy bedzie wszystkie drgania zliczal.

I trzeba zmienic koncepcje, albo dodac na plytce uklad eliminujacy
drgania :-)


Wiec zmieniajac watek ... no nie, tu sie z Piotrem zgodze, ze to zaden
przyklad, bo o drganiach to w kazdej ksiazce pisza, wiec projektant
powinien od poczatku dobrze zaprojektowac.

P.S. te optyczne uklady chyba maja jakas histereze ... wiec zachodzi
potrzeba rozpoznania bojem czy wystarczajaca.
Aaa ... tu mamy jakis "analogowy", to histerezy nie ma, a bój sie
komplikuje :-)

Summa summarum - moze kolega dobrze zrobil, ze pod DAC podpial, tylko
teraz trzeba bedzie dobry program napisac :-)


J.

Marek

unread,
Jul 7, 2017, 11:22:18 AM7/7/17
to
On Fri, 7 Jul 2017 13:42:16 +0200, Pcimol <a...@b.com> wrote:
> nie wiem jak to dokładnie się robi w tym czymś kompilatoropodobnym.

Akurat Arduino to opakowany avr-gcc więcć trudno to nazwać
kompilatoropodobnym...

--
Marek

sczy...@gmail.com

unread,
Jul 7, 2017, 4:19:34 PM7/7/17
to
W dniu piątek, 7 lipca 2017 12:01:02 UTC+2 użytkownik Michal M. Lechanski napisał:
> Ja po prośbie do doświadczonych bardziej niż ja...
>
> Otóż próbuję zliczać obroty koła.
>
(...)
> Z góry dziękuję za jakiekolwiek sugestie.
>


Zacząc nalezy od tego że wykrywasz poziom zamiast zmiany stanu.

Zmien program na dwa sposoby:
po pierwsze wykrywaj zmiane stanu. Czyli jak czujnik przechodzi ze stanu 0 do 1 i odwrotnie to zliczaj te zmiany.
Po drugie zmien program tak aby szybko ustalał jaki jest stan czujnika.

Po trzecie musisz pamietac że styki mogą podskakiwać więc musisz to też oprogramować.

Moja sugestia:
Korzystaj z kontaktronu o ile tenże kontaktron pozwala na tak szybkie zmierzenie stanu.
W przypadku koła o średnicy 28 cali masz obwód 223cm.
Przy prędkości 30km/h (8m/sek) to daje około 4 obroty na sekunde. I do tego czas styku kontaktronu to pi*oko 1/100 z tej ćwiartki sekundy.

Musisz upewnic się że ten kontaktron potrafi sie otwoerać i zamykać te 5-10x na sekunde.
Warto to zmierzyć np. przepuszczając przez niego sygnał dzwiekowy i nagrac przez karte muzyczna jesli nie masz oscyloskopu.

Tak zobaczysz czy ten kontaktron po pierwsze potrafi sie tak często rozłączać i łączyć oraz jak mocno mu styki podskakują.

Program napisz tak aby procedura działała na przerwaniach zegarowych. Odczytuj status kontaktronu około 500-1000-2000x na sekunde i wynik pomiaru wkładaj do zmiennej jako pojedynczy bit i przesuwaj bity w lewo (zwiekszasz wartośc zmiennej) w sytuacji kiedy masz w zmiennej odpowiednio wysoką wartość wiesz ze styk jest trwale zwarty.
Zgodnie z tym ustawiasz sobie wartosci globalnych zmiennej w rodzaju "styk_zwarty".

Jest jeszcze pare alternatyw ale jak zrobisz powyższe to raczej będzie najprościej o ile całośc sie uda (kontaktron nadąży sie zamykać itp.).

Kolejny krok to zbudowac sobie układ z histerezą i nim wywoływać przerwanie.

slawek

unread,
Jul 7, 2017, 6:43:34 PM7/7/17
to
Arduino jest traktowane 16 MHz, ale masz blokujący print, przez który
nie nadąża z odczytami.

slawek

unread,
Jul 7, 2017, 6:47:17 PM7/7/17
to
On Fri, 7 Jul 2017 11:58:36 +0100, Cezar <cez...@BEZtlen.pl.invalid>
wrote:
> skróciłeś długośc impulsów. Musisz zliczać *zbocza* a nie stany.

Niekoniecznie. Tylko trzeba to robić starannie, wiedzieć co i
dlaczego.

slawek

unread,
Jul 7, 2017, 6:52:38 PM7/7/17
to
On Fri, 7 Jul 2017 11:44:11 +0100, Cezar <cez...@BEZtlen.pl.invalid>
wrote:
> W powyzszym kodzie jesli impuls przyjdzie podczas gdy piszesz do
LCD,
> konsoli lub CPU wykonuje cokolwiek innego to zostanie pominięty.

Właśnie tak. A że wszystko to trwa długo...

Klasyka.

slawek

unread,
Jul 7, 2017, 6:57:39 PM7/7/17
to
On Fri, 7 Jul 2017 11:56:43 +0100, "Michal M. Lechanski"
<mic...@doriath.eu> wrote:
> Panowie, dziękuję bardzo - spróbuję najpierw wyeliminować wpływ
opóźnień
> związanych z obsługą LCD.

PRZERWANIA

I ew. bufor na wejściu.

slawek

unread,
Jul 8, 2017, 4:23:16 AM7/8/17
to
On Fri, 7 Jul 2017 13:19:33 -0700 (PDT), sczy...@gmail.com wrote:
> Korzystaj z kontaktronu

Kontaktron ma mechaniczne styki, czyli ograniczoną żywotność.

Janusz

unread,
Jul 8, 2017, 5:28:22 AM7/8/17
to
W dniu 2017-07-07 o 12:56, Michal M. Lechanski pisze:
> W dniu 07/07/2017 o 11:01, Michal M. Lechanski pisze:
>
>> Ja po prośbie do doświadczonych bardziej niż ja...
>
> Panowie, dziękuję bardzo - spróbuję najpierw wyeliminować wpływ opóźnień
> związanych z obsługą LCD.
Nic Ci to nie da, nadal będziesz miał przypadkowe odczyty,, pamiętaj że
if nie czeka tylko sprawdza warunek i idzie dalej.
Musisz zamiast if dać while które będzie czekać aż warunek się zmieni
np: zamiast
if (val0 > 100)
{
licznik++;
}

daj
while (val0 > 100); // czeka na impuls
licznik++;

i zastosuj 1 czujnik (1 pomiar wg twojego opisu) najwolniejszy wtedy
będzie dość czasu na wyświetlanie.

--
Pozdr
Janusz

Piotr Gałka

unread,
Jul 8, 2017, 6:01:19 AM7/8/17
to
W dniu 2017-07-08 o 11:28, Janusz pisze:
> daj
> while (val0 > 100); // czeka na impuls
> licznik++;
>

Pętla while się kręci dopóki val0>100. Jak pojawi się val0 mniejsze od
100 to zwiększy się licznik, coś tam się zrobi i program wróci do tego
while.

A co będzie jak nadal val0 jest jeszcze mniejsze od 100?
Pętla while się nie wykona ani razu licznik się zwiększy itd.

Przy stojącym kole zliczona liczba obrotów będzie rosła.
P.G.

slawek

unread,
Jul 8, 2017, 3:35:02 PM7/8/17
to
On Sat, 8 Jul 2017 11:28:19 +0200, Janusz <janu...@o2.pl> wrote:
> > Panowie, dziękuję bardzo - spróbuję najpierw wyeliminować wpływ
opóźnień
> > związanych z obsługą LCD.
> Nic Ci to nie da, nadal będziesz miał przypadkowe

De facto są dwa zadania do realizacji: obserwacja czujnika w czasie
rzeczywistym i pokazywanie przeliczonych wyników na wyświetlaczu.

Pierwsze zadanie wymaga pełnej dyspozycyjności. CPU nie może "na
chwilę zająć się czymś innym".

Drugie jest czasochłonne (LCD jest dość powolne) i może być blokujące
(jeżeli nie wiadomo jak długo trzeba będzie np. czekać na przesłanie
tych danych gdzieś jakoś).

Jest jeden CPU, jeden rdzeń. Jedyna sensowna możliwość to obsługa
czujnika w przerwaniu. Przecież Atmega 328 ma przerwania i nikt nie
broni mieć "gorącą linię" z czujnika wprost do CPU.

Oczywiście w tym momencie program robi się "dwuwątkowy". Czyli trzeba
trochę ogarnąć np. możliwość jednoczesnego dostępu do zmiennej i
takie tam. Nic drastycznie trudnego.

Alternatywą jest najpierw tylko mierzyć, potem pokazać wynik itd.

Dobrze byłoby sprawdzić jak działa biblioteka do LCD - czy np. nie
używa sama przerwań itp.

Nigdzie nie używać delay.

Jeszcze mały drobiazg: Arduino obsługuje transmisję szeregową w
głównej pętli, tj. wywołuje na przemian loop() i coś tam jeszcze.
Czyli pomiędzy kolejnymi wejściami do loop() może upłynąć bliżej
nieokreślony czas. Można się tego pozbyć, ale przestanie np. działać
monitor na porcie szeregowym.

Janusz

unread,
Jul 8, 2017, 3:55:16 PM7/8/17
to
W dniu 2017-07-08 o 12:01, Piotr Gałka pisze:
> W dniu 2017-07-08 o 11:28, Janusz pisze:
>> daj
>> while (val0 > 100); // czeka na impuls
>> licznik++;
>>
>
> Pętla while się kręci dopóki val0>100. Jak pojawi się val0 mniejsze od
> 100 to zwiększy się licznik, coś tam się zrobi i program wróci do tego
> while.
Wiadomo co będzie, to jest najprostrza wersja, juz mu nie chciałem mącić
drugą pętlą. To juzż mu będzie lepiej chodzić od tego co napisał.



--
Pozdr
Janusz

Janusz

unread,
Jul 8, 2017, 4:00:00 PM7/8/17
to
W dniu 2017-07-08 o 21:34, slawek pisze:
> On Sat, 8 Jul 2017 11:28:19 +0200, Janusz <janu...@o2.pl> wrote:
>> > Panowie, dziękuję bardzo - spróbuję najpierw wyeliminować wpływ
> opóźnień
>> > związanych z obsługą LCD.
>> Nic Ci to nie da, nadal będziesz miał przypadkowe
>
> De facto są dwa zadania do realizacji: obserwacja czujnika w czasie
> rzeczywistym i pokazywanie przeliczonych wyników na wyświetlaczu.
>
> Pierwsze zadanie wymaga pełnej dyspozycyjności. CPU nie może "na chwilę
> zająć się czymś innym".
>
> Drugie jest czasochłonne (LCD jest dość powolne) i może być blokujące
> (jeżeli nie wiadomo jak długo trzeba będzie np. czekać na przesłanie
> tych danych gdzieś jakoś).
>
> Jest jeden CPU, jeden rdzeń. Jedyna sensowna możliwość to obsługa
> czujnika w przerwaniu. Przecież Atmega 328 ma przerwania i nikt nie
> broni mieć "gorącą linię" z czujnika wprost do CPU.
Masz rację, my byśmy tak to napisali ale autor jeszcze nie wie co to są
przerwania i po co.
Co do czasochłonności to się mylisz, przy czujniku z taśmą czyli impuls
na obrót ma dość czasu na wyświetlanie do tych 40km/h


--
Pozdr
Janusz

Zenek Kapelinder

unread,
Jul 8, 2017, 4:50:10 PM7/8/17
to
Teraz dolozyles do pieca sa takie co maja 200 milionow zadzian. I to nie jest jakas super produkcja dla NASA.

Michal M. Lechanski

unread,
Jul 8, 2017, 5:07:30 PM7/8/17
to
W dniu 08/07/2017 o 20:59, Janusz pisze:

> autor jeszcze nie wie co to są
> przerwania i po co.

O to, to! ważne spostrzeżenie.
Ale się uczy i, miejmy nadzieję, wkrótce już będzie wiedział. :-)

Bardzo dziękuję za wszystkie odpowiedzi - nie zdawałem sobie sprawy, że
banalny licznik obrotów może w istocie być wcale nie taki banalny...

Pozdrawiam

--
Michał

slawek

unread,
Jul 9, 2017, 2:05:29 AM7/9/17
to
On Sat, 8 Jul 2017 21:59:56 +0200, Janusz <janu...@o2.pl> wrote:
> Co do czasochłonności

W sensie np. przesyłania 32 bajtów przy 9600 bodów - nie zależy od
taktowania CPU i nie da się przyspieszyć. A jak jeszcze będzie
czekanie na gotowość do transmisji... to czas może być dowolnie
długi.

slawek

unread,
Jul 9, 2017, 8:03:33 AM7/9/17
to
Policzmy. 1000 razy na sekundę w czasie jednej godziny to 3600 000.
Te 200 milionów zadziałań podzielone przez 3.6 miliona daje około 60
godzin, czyli nawet nie trzy dni.

Czyli przy 1000 impulsach na sekundę po trzech dniach jest spora
szansa na awarię (50%?). Przy 10 impulsach na sekundę układ może
wytrzyma rok zanim padnie. Pomijam kwestię jaka jest moc mechaniczna
pobierana z koła - te styki pracują, skąś biorą na to energię ;)

Moim zdaniem są niezłe przy pracy raz na parę minut, zwłaszcza jeżeli
służą jako przekaźniki. Ale jako czujniki (pole magnetyczne) to
hallotrony chyba są lepsze.

Zenek Kapelinder

unread,
Jul 9, 2017, 10:06:49 AM7/9/17
to
Szybko by musial pomykac na rowerze. Tak 3600 km/h, troche wiecej niz polowa pierwszej predkosci kosmicznej dla Ksiezyca.

sczy...@gmail.com

unread,
Jul 9, 2017, 11:43:01 AM7/9/17
to
Namęczyłes sie niepotrzebnie.
Jedno zadziałanie jest na około 2m pokonanego dystansu.
Nawet jak wytrzyma nędzne 1 000 000 razy to jest 20 mln metrów czyli 20 000km.
I wtedy się może okazać że trzeba wylutować i załozyc nowy.

Jak na prosty układ do nauki - imho starczy.

Oczywiscie czujnik halla sporo lepszy ale troche utrudnia zadanie...

Michal M. Lechanski

unread,
Jul 9, 2017, 2:45:38 PM7/9/17
to
W dniu 07/07/2017 o 12:04, Nifhelm pisze:
> A najlepiej zastosuj przerwania.

Przy pomocy googla takie coś wyskrobałem i zdaje się to działać poprawnie:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 7, 6);

int licznik;

void setup()
{
lcd.begin(16, 2);
pinMode(2, INPUT_PULLUP);
attachInterrupt(0, zliczanie, FALLING);
licznik=0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("licznik = ");
}

void loop()
{
lcd.setCursor(8, 0);
lcd.print(licznik);
}

zliczanie(){
static unsigned long lastTime;
unsigned long timeNow = millis();
if (timeNow - lastTime < 50)
return;
licznik++;
lastTime = timeNow;
}

I teraz mam dwa kolejne pytania,

1. a gdybym chciał zliczyć impulsy z innego koła, to co powinienem
zrobić? Chodzi mi o to że może wystąpić sytuacja że przerwania będą
wywołane w tym samym czasie?
2. Powyższy kod działa mi z kontaktronem. Ani czujnik Halla ani
podczerwieni nie dają odpowiednich poziomów napięcia na wyjściu. Czy
trzeba zastosować jakiś zewnętrzny układ dopasowujący czy da się to
zrealizować na samym Arduino?

Jeszcze raz bardzo dziękuję za wszystkie odpowiedzi.

--
Michał

Cezar

unread,
Jul 10, 2017, 4:52:28 AM7/10/17
to
On 09/07/2017 19:45, Michal M. Lechanski wrote:

> I teraz mam dwa kolejne pytania,
>
> 1. a gdybym chciał zliczyć impulsy z innego koła, to co powinienem
> zrobić? Chodzi mi o to że może wystąpić sytuacja że przerwania będą
> wywołane w tym samym czasie?
Atmega 328 ma dwa przerwania INT0 i INT1 (piny 2 i 3)

> 2. Powyższy kod działa mi z kontaktronem. Ani czujnik Halla ani
> podczerwieni nie dają odpowiednich poziomów napięcia na wyjściu. Czy
> trzeba zastosować jakiś zewnętrzny układ dopasowujący czy da się to
> zrealizować na samym Arduino?
>
> Jeszcze raz bardzo dziękuję za wszystkie odpowiedzi.
>

Przytocze jeszcze raz... wyguglaj "Arduino Analog Comparator Interrupt"

c.


Nifhelm

unread,
Jul 10, 2017, 10:14:37 AM7/10/17
to
W dniu 09.07.2017 o 20:45, Michal M. Lechanski pisze:
> W dniu 07/07/2017 o 12:04, Nifhelm pisze:
>> A najlepiej zastosuj przerwania.
>
> Przy pomocy googla takie coś wyskrobałem i zdaje się to działać poprawnie:
>
> #include <LiquidCrystal.h>
> LiquidCrystal lcd(12, 11, 5, 4, 7, 6);
>
> int licznik;

Bezpieczniej użyć:

volatile int licznik;

W arduino zmienne modyfikowane w trakcie przerwań powinny być tak
definiowane.

[...]
> I teraz mam dwa kolejne pytania,
>
> 1. a gdybym chciał zliczyć impulsy z innego koła, to co powinienem
> zrobić? Chodzi mi o to że może wystąpić sytuacja że przerwania będą
> wywołane w tym samym czasie?

Wystarczy użyć drugiego przerwania.

> 2. Powyższy kod działa mi z kontaktronem. Ani czujnik Halla ani
> podczerwieni nie dają odpowiednich poziomów napięcia na wyjściu. Czy
> trzeba zastosować jakiś zewnętrzny układ dopasowujący czy da się to
> zrealizować na samym Arduino?
>
> Jeszcze raz bardzo dziękuję za wszystkie odpowiedzi.
>
Arduino na wejściach cyfrowych ma określone poziomy odpowiadające
stanowi wysokiemu i niskiemu. Sygnały wejściowe muszą być więc
dopasowane do tych poziomów, albo wejście nie będzie reagować/zacznie
szaleć.
Najprościej wstawić komparator. Można też kupić gotowe moduły z
czujnikiem odbiciowym i komparatorem. Widywałem takie nawet po 2.50zł.
Mają one od razu wyjście cyfrowe i potencjometr do regulacji czułości.
Pozdrawiam.
0 new messages