Skocz do zawartości
Ważne ogłoszenie » Kliknij i sprawdź informacje o nowym forum! Czytaj dalej... ×
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Recommended Posts

html_mig_img
W poprzednich częściach kursu zajmowaliśmy się odczytywaniem sygnałów cyfrowych. Dzięki temu mogliśmy np.: sprawdzić, czy przycisk został wciśnięty. Świat, który nas otacza nie jest jednak cyfrowy, czasami 2 stany (1/0)  to za mało. Dlatego tym razem zajmiemy się przetwornikiem analogowo-cyfrowym, w skrócie ADC.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Udostępnij ten post


Link to post
Share on other sites

Ta rozbudowana instrukcja warunkowa może być zastąpiona nie tyle "switch'em", który de facto niewiele zmieni, a np. pętlą for:

for (int i = 0; i < 5; ++i)
  digitalWrite(i + 8, sensorValue == i + 1);

Udostępnij ten post


Link to post
Share on other sites
Ta rozbudowana instrukcja warunkowa może być zastąpiona nie tyle "switch'em", który de facto niewiele zmieni, a np. pętlą for:
for (int i = 0; i < 5; ++i)
  digitalWrite(i + 8, sensorValue == i + 1);

Tak, tylko postinkrementacja licznika i będzie git. A jeszcze ładniej było by do takiego rozwiązania użyć tablic stałych :) Ale kurs jest początkujących więc rozwiązanie autora jest czytelniejsze. Świetny artykuł.

PS. Zasłaniamy fotorezystor a nie potencjometr ;) (tak tylko mówie).

Pozdrawiam.

Udostępnij ten post


Link to post
Share on other sites

Dzięki za kolejny odcinek kursu.

PS.

Nareszcie zakupione rok temu elementy w Botlandzie znajdą dzięki wam praktyczne zastosowanie. Mam też cichą nadzieję, że w jednej z odsłon kursu znajdzie się coś na temat sterowania silnikami przy pomocy pilota z wykorzystaniem biblioteki IRremonte. h- Chciałbym zbudować w przyszłości robota sterowanego właśnie w ten sposób.

Pozdrawiam hob_bit :)

Udostępnij ten post


Link to post
Share on other sites
Ta rozbudowana instrukcja warunkowa może być zastąpiona nie tyle "switch'em", który de facto niewiele zmieni, a np. pętlą for:

Pierwotnie chciałem rozwiązać to w podobny sposób, jednak wydaje mi się, że może to być mylące dla początkujących. Na razie staram się używać tylko najprostszych elementów języka, bo zdaje sobie sprawę, że dla wielu osób jest to pierwsze spotkanie z mikrokontrolerami i nie chce im niepotrzebnie mieszać w głowie.

Nareszcie zakupione rok temu elementy w Botlandzie znajdą dzięki wam praktyczne zastosowanie. Mam też cichą nadzieję, że w jednej z odsłon kursu znajdzie się coś na temat sterowania silnikami przy pomocy pilota z wykorzystaniem biblioteki IRremonte. h- Chciałbym zbudować w przyszłości robota sterowanego właśnie w ten sposób.

Niestety obecne zestawy, na których bazuje kurs, nie przewidują takich rzeczy. Może w kontynuacji 🙂

PS. Zasłaniamy fotorezystor a nie potencjometr (tak tylko mówie).

Dzięki - poprawione.

Udostępnij ten post


Link to post
Share on other sites

Dzięki za odpowiedź :) Cóż, napewno coś sobie "wyklikam" w sieci, na temat ;)

Udostępnij ten post


Link to post
Share on other sites

Dzięki za artykuł, jest super :) Ale następny będzie najciekawszy - od czasu kiedy zakupiłem zestaw do tego kursu myślę tylko o wykorzystaniu tego "silniczka" czy tam serwomechanizmu :D proszę, proszę Treker wrzuć następną część jak najszybciej!

Udostępnij ten post


Link to post
Share on other sites

htfhere, zgadza się następny powinien być jeszcze ciekawszy, ponieważ będziemy mogli sterować zarówno serwomechanizmem, zwykłym silnikiem (w teorii) oraz regulować jasność świecenia LEDów 🙂 Jak będzie duuużo zainteresowanych, to może artykuł taki pojawi się wcześniej, kto wie 🙂

Na ten moment mogę zachęcić wszystkich do rozpowszechniania informacji o kursie wśród znajomych!

Udostępnij ten post


Link to post
Share on other sites

4.4

int wartoscA5 = 0;
int prog = 0;
boolean wyslano = false;

void setup() {
 pinMode(8, OUTPUT);
 Serial.begin(9600);
}

void loop() {
 wartoscA5 = analogRead(A5);
 prog = analogRead(A4);

 if (wartoscA5 < prog) {
   digitalWrite(8, HIGH);
   if (wyslano == false) {
   Serial.println(wartoscA5);
   wyslano = true;
   }
 }
 else {
   digitalWrite(8, LOW);
   wyslano = false;
 }
 delay(100);
}

Da się jakoś bez tworzenia zmiennej "wyslano"?

4.5

// Przypisanie pinów.
#define led_zolta 8
#define led_zielona 7
#define led_czerwona 9
#define przycisk 5
#define pin_odczyt A4

int odczyt = 0; // odczyt z potencjometru
String podana_liczba = 0; // liczba podana przez gracza
int podana_liczba_int = 0; // liczba podana przez gracza przekształcona na zmienną int
byte proby = 2; // ilość prób jakie pozostały do końca gry
boolean od_nowa = true; // czy gramy od nowa, czy kontynuujemy grę

void setup() {
 pinMode(przycisk, INPUT_PULLUP);
 pinMode(led_czerwona, OUTPUT);
 pinMode(led_zielona, OUTPUT);
 pinMode(led_zolta, OUTPUT);
 Serial.begin(9600);
}

void loop() {

 if (od_nowa == true) { // jeśli rozpoczynamy grę lub gramy od nowa
   proby = 2;
   digitalWrite(led_zielona, LOW);
   digitalWrite(led_zolta, LOW);
   digitalWrite(led_czerwona, LOW);

   while(!Serial) delay(10); // czekamy na otwarcie serial monitora
   Serial.println("Przekrec potencjometr i nacisnij przycisk.");

   while (digitalRead(przycisk) ==LOW) delay(20); // czekamy na zwolnienie przycisku po wznowieniu gry
   while (digitalRead(przycisk) == HIGH) delay(20); // czekamy na wciśnięcie przycisku
   odczyt = analogRead(pin_odczyt); // sczytujemy ustawienie potencjometru
   Serial.println("Podaj liczbe z zakresu 0 - 1023.");
 }

 while (Serial.available() == 0); // czekamy na podanie liczby

 podana_liczba = Serial.readStringUntil('\n');
 podana_liczba_int = podana_liczba.toInt(); // zamieniamy zmienną string na int

 if (odczyt - podana_liczba_int <= 50 && odczyt - podana_liczba_int >= -50) { // jeśli podana liczba jest +-50 równa odczytowi
   Serial.println("Udalo Ci sie trafic! Brawo.");
   digitalWrite(led_zielona, HIGH);
   digitalWrite(led_zolta, LOW);
   od_nowa = true;
   Serial.println("Jesli chcesz zagrac ponownie - nacisnij przycisk.");
   while (digitalRead(przycisk) == HIGH) delay(20); // czekamy na naciśnięcie przycisku
 }
 else { // jeśli podana liczba nie jest +-50 równa odczytowi

   if (proby > 0) { // jeśli mamy jeszcze próby
     od_nowa = false; // nie rozpoczynamy od nowa
     digitalWrite(led_zolta, HIGH);
     Serial.print("Nie trafiles. Pozostalo prob: ");
     Serial.println(proby);
     Serial.println("Podaj kolejna liczbe:");
     proby --; // odejmujemy jedną próbę
     while(Serial.available() == 0); // czekamy na podanie kolejnej liczby
   }
   else { // nie mamy już prób
     digitalWrite(led_czerwona, HIGH);
     digitalWrite(led_zolta, LOW);
     Serial.println("Przegrales. Jesli chcesz zagrac ponownie - nacisnij przycisk.");
     od_nowa = true; // rozpoczynamy następną grę od nowa
     while (digitalRead(przycisk) == HIGH) delay(20); // czekamy na naciśnięcie przycisku
   }
 } 
 delay(5);   
}

Tu też nie wiem czy optymalnie to napisałem...

Udostępnij ten post


Link to post
Share on other sites
Da się jakoś bez tworzenia zmiennej "wyslano"?

Pewnie się da, ale tak jest bardzo dobrze. Jedynie proponowałbym nazywać inaczej zmienne:

  wartoscA5 = analogRead(A5); 

Taki zapis nie mówi zbyt dużo, lepiej nazwać zmienną jako "czujnikSwiatla", czyli tak, aby wskazywać wykorzystanie zmiennej. To, że jest tam trzymana wartość odczytana z A5 jest mało pomocne.

Dlaczego w drugim kodzie napisałeś takie dwie linijki?

    while (digitalRead(przycisk) ==LOW) delay(20); // czekamy na zwolnienie przycisku po wznowieniu gry 
   while (digitalRead(przycisk) == HIGH) delay(20); // czekamy na wciśnięcie przycisku 

Udostępnij ten post


Link to post
Share on other sites

W związku z wyjątkowo krótkim tygodniem i długim weekendem zmianie uległ harmonogram publikacji kolejnych części kursów. Tym razem kolejny odcinek jednego z kursów (Arduino/elektronika) pojawi się w czwartek, a drugiego w piątek. Mam nadzieję, że pozwoli to zainteresowanym na spokojne, weekendowe studiowanie materiału 😉

Udostępnij ten post


Link to post
Share on other sites

Witam,
zniecierpliwiony oczekiwaniem na kolejne części kursu, poszperawszy trochę w internecie udało mi się zbudować swojego pierwszego omijacza przeszkód. Myślę, że teraz czas na jakiegoś prostego LF :) ale i tak oczekuję kolejnego artykułu o arduino, bardzo ciekawy temat.

Pozdrawiam.

Udostępnij ten post


Link to post
Share on other sites

MateuszW, super, może pochwalisz się na forum swoim robotem 🙂?

Udostępnij ten post


Link to post
Share on other sites

MateuszW, dobra robota! Jakie plany na przyszłość?

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

×