Arduino - zliczanie impulsów

Arduino jest traktowane 16 MHz, ale masz blokujący print, przez który nie nadąża z odczytami.

Reply to
slawek
Loading thread data ...

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

Reply to
slawek

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

Klasyka.

Reply to
slawek

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

Reply to
slawek

W dniu 2017-07-07 o 12:56, Michal M. Lechanski pisze:

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.

Reply to
Janusz

W dniu 2017-07-08 o 11:28, Janusz pisze:

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.

Reply to
Piotr Gałka

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.

Reply to
slawek

W dniu 2017-07-08 o 12:01, Piotr Gałka pisze:

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

Reply to
Janusz

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

Reply to
Janusz

Teraz dolozyles do pieca sa takie co maja 200 milionow zadzian. I to nie jest jakas super produkcja dla NASA.

Reply to
Zenek Kapelinder

W dniu 08/07/2017 o 20:59, Janusz pisze:

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

Reply to
Michal M. Lechanski

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.

Reply to
slawek

to nie jest jakas super produkcja dla NASA.

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.

Reply to
slawek

Szybko by musial pomykac na rowerze. Tak 3600 km/h, troche wiecej niz polowa pierwszej predkosci kosmicznej dla Ksiezyca.

Reply to
Zenek Kapelinder

W dniu niedziela, 9 lipca 2017 14:03:33 UTC+2 użytkownik slawek napisał:

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

Reply to
sczygiel

W dniu 07/07/2017 o 12:04, Nifhelm pisze:

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.

Reply to
Michal M. Lechanski

Atmega 328 ma dwa przerwania INT0 i INT1 (piny 2 i 3)

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

c.

Reply to
Cezar

W dniu 09.07.2017 o 20:45, Michal M. Lechanski pisze:

Bezpieczniej użyć:

volatile int licznik;

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

[...]

Wystarczy użyć drugiego przerwania.

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.

Reply to
Nifhelm

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.