Arduino: Przerwania + TCRT5000 do wykrywania szybkości obrotowej koła (04-05-2016)

Warto poczytać: https://www.arduino.cc/en/Reference/AttachInterrupt

oraz zapamiętać:

Płytka Piny cyfrowe pod które możemy podpiąć przerwania
Uno, Nano, Mini, other 328-based 2, 3
Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21
Micro, Leonardo, other 32u4-based 0, 1, 2, 3, 7
Zero wszystkie, za wyjątkiem 4
MKR1000 Rev.1 0 0, 1, 4, 5, 6, 7, 8, 9, A1, A2
Due wszystkie

oraz ,,zdarzenia”, podczas których uaktywni się funkcja przypisana pod dane przerwanie: LOW, CHANGE, RISING, FALLING (HIGH – tylko płytka Due). Krótko: funkcja „podpięta” do przerwania wywoła się wówczas, gdy na tym pinie (tym = zdefiniowanym podczas attachInterrupt) zajdzie konkretne „zdarzenie”, np. LOW. Oczywiście taka funkcja ma być szybka: ustalenie flagi, sterowanie napięciem na pinach – digitalWrite – ale nie delay(ileś-tam).

Przykład: Arduino + przycisk do błyskania diodą #13. Hardware: przycisk (mikroswicz podłączamy do GND a drugą nóżką do pinu #2 w Arduino).

#define PIN 2
bool stan=false;

void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, 0);

pinMode(PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PIN), blysk, LOW);
}

void loop() {
delay(10000);
}

void blysk(){
stan=!stan;
digitalWrite(13, stan); 
}

Gdy nic nie wiemy o przerwaniach, to przyglądając się funkcji loop() można by powiedzieć, że program NIC NIE ROBI! Tylko czeka 10s, a potem znowu czeka 10s, i tak w kółko… Więc skąd się bierze błyskanie diody #13 w momencie klikania przycisku? Otóż wywołanie delay() zatrzymuje działanie programu, ale przerwania ciągle działają. Skoro więc „podpięliśmy” naszą funkcję (o nazwie blysk()) do przerwania, to właśnie ona się wywoła (gdy stan pinu #2 zmieni się na LOW – to wszystko zostało powiedziane w funkcji setup()). Właśnie taki mechanizm wykorzystałem do wykrycia kolizji przez zderzak naszego pojazdu – pisałem o tym w poprzednim poście. UWAGA: powyższy program działa dość dynamicznie, „nerwowo” reagując na wciśnięcie przycisku – oczywiście jest to zjawisko drgania styków (ang. bouncing), o czym mówiliśmy na naszych poprzednich spotkaniach (tutaj, dla przejrzystości kodu nic z tym nie robię, brak jest debouncing-u).

Dodatkowo: zliczanie obrotów koła.

mDSC_1100

podłączyliśmy czujnik optyczny odbiciowy TCRT5000 do obudowy silniczka, a następnie wewnątrz koła umieściliśmy białą kartkę z czarną krechą. Czytamy wartości rejestrowane przez czujnik ale nie na Serial monitorze, ale GRAFICZNIE, za pomocą Processinga.

silniczek

Widzimy wyraźnie moment, gdy czujka mija czarną kreskę. Widać też, że piki zdecydowanie różnią się od „tła”, choć często mają różną wartość w maksimum. Łatwo wykombinować prosty algorytm (czy skuteczny? niedługo się o tym przekonamy) liczący szybkość obrotową koła:

  1.  zapisujemy t1, czyli czas pojawienia się maksimum (funkcja millis())
  2. czekamy na kolejne maksimum, gdy je złapiemy to
  3. zapisujemy t2, czyli czas pojawienia się kolejnego maksimum- wówczas różnica czasów t2 i t1 daje właśnie czas jednego, pełnego obrotu.

Pewnie „diabeł tkwi w szczegółach” ale powinno działać. Jak powiedziałem na zajęciach – więcej kresek (ale z umiarem! powiedzmy 4 na początek) powinny zwiększyć rozdzielczość zliczania liczby obrotów koła.

mDSC_1099

Będziemy to programować na kolejnych zajęciach…

Arduino: software do zderzaków – przerwania

Zmodyfikowana wersja softu ze zderzakami – tym razem użyłem przerwań i w przypadku kliknięcia przeszkody – w przerwaniu zmieniam pomocniczą zmienną informującą o konieczności cofnięcia i zmiany kierunku ruchu. Działa nieźle.

Poprzednia wersja softu prowadziła pojazd w danym kierunku z wykorzystaniem funkcji delay(ileś-tam), a dopiero potem sprawdzała przyciski (mikrostyki) – to powodowało, że gdy zderzenie nastąpiło w czasie jazdy, to takie zdarzenie mogło nie być zarejestrowane (nie zawsze się zdarzało, że przycisk pozostawał wciśnięty po zakończenia delay). Tutaj rozwiązałem to za pomocą dwóch przerwań… wiem – za dużo, już w głowie mam lepszy algorytm, bez przerwań, ale to w następnym odcinku.

Dla bardziej dociekliwych:

#define LEFT_BTN 2
#define RIGHT_BTN 3

(w przypadku Arduino UNO przerwania tylko dla pinów 2 i 3), dalej:

pinMode(LEFT_BTN, INPUT_PULLUP);
pinMode(RIGHT_BTN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(LEFT_BTN), turn_right, LOW);
attachInterrupt(digitalPinToInterrupt(RIGHT_BTN), turn_left, LOW);

to w setup()ie,

a dwie funkcje turn_left() i turn_right() zmieniają pomocnicze zmienne nakazujące zmianę kierunku ruchu (w funkcji loop).

 

Nowe zabawki – sponsorowane przez Parlament Studentcki UwB

Informuję wszystkich robotków z koła Fi-BOT Wydzialu Fizyki UwB, że w dniu dzisiejszym (29-04-2016) przyszła pierwsza paczuszka z podzespołami sponsorowanymi przez Parlament Studencki UwB. Projekt ten złożyła i uzyskała finansowanie Pani Noemi. Mamy 2 mikro-silniczki oraz zestaw mocowań, kół i enkoderów do nich! Niech Was nie zmartwi rozmiar tych silniczków – bo one mają moc! No i do tego jeszcze 4x serwa (też nie byle jakie). Czekam jeszcze na zestawy do komunikacji Bluetooth…

Zapraszam do galerii „unboxing” 😉

DSC_1048

A co kryje w sobie ta paczuszka? może chomika?
DSC_1057

Zawartość w pełnej okazałości. Długopis nie wchodzi w skład zestawu (to mój prywatny i nie oddam!) – służy do zorientowania się w rozmiarach zakupionych gadgetów. Czyli dokładnie czego?

DSC_1052

4x Serwo PowerHD AR-3606HB (praca ciągła)

DSC_1053

wraz z bogatym zestawem orczyków!

DSC_1051

A tutaj mikrosilniki Pololu HP 298:1. Niech nikogo nie zmartwi rozmiar tego silniczka – w tym maluchu drzemie niezła moc!

DSC_1050

Dodatkowo: zestaw kół, mocowań no i enkoderów dedykowanych do Pololu!

DSC_1049

Ponownie wszystko w  całej okazałości.

Firma, w której zamówiłem, dołączyła słodki upominek Pani Noemi – autorki projektu

DSC_1055

cukiereczek czeka do odbioru po długim weekendzie – zapraszam!

Zajęcia nr 3 – komunikacja szeregowa Arduino z PeCe-tem

Na naszych trzecich zajęciach powiedzieliśmy sobie o:

  • dalej o tablicach, bo są ważne!
  • programowanie strukturalne – tworzenie (niemych) funkcji, u nas void błysk(int czas) – jako podstawowych cegiełek, których będziemy często używać
  • poznajemy inne typy danych (czy wiesz, jakie wartości można w nich przechowywać?):
    • bajt (o rozmiarze 1 bajt – no bo niby jak inaczej!),
    • char (czyli znak, też 1 bajt) – przy tej okazji poznajemy ciapki (znaczki pojedynczego apostrofa \’ \’)
    • bool (prawda/fałsz, true/false) – 1 bajt
    • modyfikator unsigned
    • modyfikator long
    • stringi jak tablice znaków, poznajemy też psie uszy – czyli znaki amerykańskiego cytowania \” \”
    • float – do przechowywania liczb rzeczywistych, np. float pi=3.141592; (4 bajty)
  • o komunikacji szeregowej z zamierzchłych czasów PeCetowych – RS232
  • emulator portu RS232 w dzisiejszych kompach – wykorzystujemy port USB (w tym kilka zgryźliwych opinii o oprogramowaniu tego emulatora pod Windowsem – niestety, działa on słabiej niż analogiczne oprogramowanie pod Linuxa)
  • Serial.begin(9600) – rozpoczynamy transmisję szeregową z nasztm PCetem, ale „tracimy” piny #0 (nazwany RX – odbiór danych) i #1 (nazwany TX – transmisja danych) na naszej płytce Arduino (są one zajęte rozmową z PCetem). Dla bardziej dociekliwych dodam, że aby „odzyskać” te piny musimy zakończyć transmisję szeregową poleceniem Serial.end() – informacja dla zaawansowanych
  • Serial.print(„cokolwiek„)  – mówimy do PCeta, aby to usłyszeć, musimy otworzyć Monitor portu szeregowego w Arduino IDE. Trzeba pamiętać o konfiguracji Monitora tak samo, jak to zrobiliśmy od strony Arduino
  • Serial.println(„inny napis„) – napis zakończony przejściem do nowej linii
  • Serial.available() – sprawdzamy, czy są jakieś dane do odebrania przez Arduino
  • Serial.read() – czytamy jeden bajt. Przy tej okazji ćwiczyliśmy różnicę pomiędzy:
byte znak=Serial.read() // oraz

char znak=Serial.read().

Pamiętasz, o co chodziło? Co się wyświetlało w obu przypadkach po wpisaniu jednej literki, np. A? czy przypominasz sobie moją dygresję o znakach ASCII oraz o kodowaniu klawiatury?

  • wczytujemy napis (czyli ciąg znaków, np. wyraz pomidor) z Seriala – no i cóż? literka po literce?? Jak więc wczytać liczbę, powiedzmy 107?
  • Serial.parseInt() jako funkcja czytająca dane nadchodzące do Seriala i zamieniające je na liczbę całkowitą (integer) – czyli wczytując liczbę „107” nie mamy już trzech oddzielnych liczb (tj. 1, 0 i 7) tylko całą liczbę 107

Po tych zajęciach powinieneś znać:

  • umieć rozpoczynać komunikację PCta z Arduino przy pomocy obiektu Serial.begin(szybkość_transmisji)
  • pamiętać o roli pinów RX (#0) i TX (#1) w komunikacji szeregowej UART
  • znać podstawowe funkcje – przynajmniej Serial.println(„cokolwiek„)
  • umieć czytać znaki z klawiatury PCta, a także zamieniać te znaki na liczby

Praca domowa #1

Arduino + LEDy: wczytać numer diody, która ma się zaświecić (podpowiedź: pamiętajmy o ciapkach, czyli '1′, '2′ itd). Dodatkowo: jeśli dioda juz była włączona, to ją zgasić (podpowiedź: użyjmy pomocniczych zmiennych typu bool).

Praca domowa #2

Arduino + LEDy: wczytac liczbę błysków dla wszystkich diód, czyli ile razy mają błysnąć LEDy (a potem nic ma się nie dziać). Podpowiedź: wykorzystać funkcję zamieniającą wczytane znaki na liczbę całkowitą.

A co na kolejnych zajęciach?

wyświetlacz 7-mio segmentowy! a może nawet rejest przesuwny?

 

Arduino: soft do zderzaków + manufaktura nowego podwozia (25-04-2016)

Tym razem działaliśmy na dwa fronty: jeden zespól klecił hardware ? natomiast drugi pracował nad oprogramowaniem zderzaków, zrobionych z mikrostyków (chodzi oczywiście o wykrycie przeszkody –  zareagowanie na klik w przełączniku – i zmianę kierunku jazdy). Oba zespoły wykonały swoją misję. Zdobywają jeden punkt doświadczenia i awansują o  +1L  ?

DSC_1043m

Przy okazji softu: okazuje się, że konieczne są zmiany – pojazd nie zawsze „czuje” zderzenie. Albo wymienimy mikrostyki na bardziej czułe (np. krańcówki typu WK320 z miękkimi blaszkami a więc i dużo bardziej czułymi stykami), albo zmienimy soft tak, by był w stanie wykryć zderzenie gdy realizuje jazdę w danym kierunku. Opcję drugą można rozwiązać na co najmniej dwa sposoby, i tym zajmiemy się na następnym spotkaniu.

WK320

Wyłącznik krańcowy (krańcówka) WK320. Cena około 1zł za sztukę. Zwrócić należy uwagę na otwory do montażu – nie będzie już konieczności używania kleju i ołówków z Leroya 😉

Zajęcia nr 2 – 3 LEDy (7?) i bardzo szybki kurs programowania strukturalnego

Na naszych drugich zajęciach powiedzieliśmy sobie o:

  • czym są zmienne w programie?
  • ile pamięci (SRAM) zajmują zmienne? int = 2 bajty, float = 4 bajty
  • może zamiast deklarować zmienne, użyć #define – czyli słów kilka o preprocesorze
  • operator przypisania i niematematyczna konstrukcja a=a+10
  • skrócone operatory przypisania a+=10 (a także a-=10, a*=10, a/=2)
  • instrukcja warunkowa if 
  • grupowanie wielu instrukcji sterujących nawiasami sześciennymi { }
  • rozbudowana instrukcja warunkowa – if else
  • pętla for
  • tablice oraz operator [ ]
  • definiowanie wartości początkowych dla tablic – ponownie nawiasy sześcienne { } w innym kontekście!

Po tych zajęciach powinieneś znać:

  • orientować się w poruszanych zagadnieniach – dla mnie oczywistym jest, że nie sposób to opanować w 100% na naszych krótkim spotkaniu! tylko praktyka spowoduje, że zrozumiesz to, o czym była mowa (dlatego rozwiąż zadanie domowe)
  • podłączyć 3 (lub więcej) LEDów do Arduino i nimi sterować – nawet, jeśli masz problemy z pętlami (for) to jeszcze się tym nie przejmuj. Z czasem nabierzesz wprawy, o ile będziesz ćwiczyć

Praca domowa

Napisać program w Arduino, który steruje 7-mioma LEDami. Diody mają zapalać się od pierwszej do ostatniej, z odstępem 0.2s między kolejnymi włączeniami. Po zapaleniu wszystkich LEDów, gasimy je w odwrotnej kolejności – z tym samym odstępem czasu. Powodzenia! (Pamiętaj, że możesz mieć wirtualne Arduino u siebie w domu wchodząc na stronkę 123d.circuits.io i tam zapalać/gasić LEDy!)

Arduino: konwerter I2C dla wyświetlacza LCD HD44780 + microswitche ponownie (18-04-2016)

Po raz pierwszy na nasard_microsw_led2x16zym Kole pojawiła się kwestia komunikacji innej niż UART. Podłączyliśmy więc ekranik LCD za pomocą konwertera I2C. Dzięki temu zaoszczędzamy piny mikrokontrolera, które możemy zagospodarować inaczej.

Wróciliśmy też do mikroswiczy, z których budujemy zderzaki dla naszego pojazdu. Liczbę kliknięć (zderzeń) lewego i prawego czujnika (mikroswicza) wypisujemy na LCD w górnym, i dolnym wierszu. Za tydzień pojazd ruszy w swoją pierwszą, autonomiczną podróż ?

Zajęcia nr 1 – co to te Arduino? palimy diody! wirtualne Arduino

Na naszych pierwszych zajęciach powiedzieliśmy sobie o:

  • Arduino – otwarta platforma (open-hardware)
  • serce Arduino – mikrokontroler (uC, MCU), czyli mikrokomputer jednoukładowy (pojedynczy układ scalony zawierający w sobie procesr, pamięć, interfejsy wejścia-wyjścia, kontrolery przerwań…)
  • rodzina platform Arduino (czyli nie tylko UNO!)
  • budowa i parametry Arduino UNO
  • Arduino? Genuino? czyli o przyjaźni założycieli i rejestracji znaków handlowych
  • IDE (Integrated Development Environment) – środowisko programistyczne
  • omówienie (przykładowego) programu Blink wraz z przykładem tego programu w prawdziwym C/C++ (dla zaawansowanych)
  • poznajemy płytkę stykową
  • poznajemy podstawowe elementy elektroniczne – opornik (rezystor), dioda LED
  • dzielnik napięć!
  • wirtualne Arduino: 123d.circuits.io — dla tych, którzy już chcą, ale jeszcze nie zakupili płytki Arduino!
  • pierwszy program sterujący diodą! No i obiecane efekty pirotechniczne – palimy LEDy, zapominając (celowo!) o rezystorach!

Ku pamięci:

plytka_stykowa-schematPlytkaPrototypowa

Po tych zajęciach powinieneś znać:

  • orientować się w budowie platformy Arduino (piny cyfrowe, piny analogowe)
  • rozumieć połączenia na płytce stykowej
  • rozumieć konieczność stosowania rezystorów podczas podłączania LEDów
  • budowę programów dla Arduino, w tym znaczenie funkcji setup() oraz loop()
  • funkcję ustawiającą piny cyfrowe do sterowania napięciem, czyli pinMode
  • funkcję włączającą napięcie 5V (HIGH) lub 0V (LOW) na konkretnym pinie, czyli digitalWrite
  • funkcję zatrzymującą działanie programu na określoną liczbę mikrosekund – czyli delay