RemoteXY – bardzo fajna obsługa Arduina via smartfon (+Bluetooth)

Dziś tematem naszego spotkania był moduł Bluetooth HC05 – ale nie sam moduł, tylko sposób jego programowania z poziomu Androida. W markecie jest sporo darmowego oprogramowania, ale często nie spełnia naszych oczekiwań – ze względu na brak możliwości pełnej konfiguracji, lub nieatrakcyjność interfejsu. Cóż – nie ma co narzekać jak za darmowe apki, ale… dziś – dzięki uprzejmości Pani Noemi – poznaliśmy płatną apkę RemoteXY do zarządzania Arduinem via moduł Bluetooth (tak, to właśnie Pani Noemi poprowadziła dzisiejsze spotkanie, jako osoba z doświadczeniem z tym programem).

Mowa o RemoteXY, które po zakupie na telefon (tablet, etc) trzeba doinstalować na kompa, gdzie mamy Arduino IDE. Potem wszystko działa według schematu:

i trzeba przyznać, że faktycznie – jest to

  1. proste
  2. intuicyjne
  3. ładne graficznie!

Cóż więcej dodać? Chyba po takiej reklamie już nic nie trzeba 😉

DSC_1104

A tutaj już konkretny przykład Pani Noemi – sterowanie silniczkami oraz LEDami przez smartfon. Dwa przyciski włączają/wyłączają diody, joystik w prawej części ekranu to panel sterowania silniczkami (zmieniamy szybkość i kierunki ruchu oby silników). Na biurku hardware: HC05 oraz Arduino + MotorShiel AdaFruit.

Edit:

stety/niestety znalazłem słaby punkt tej apki. Po jej zakupie tylko my możemy korzystać z przygotowanych layoutów. Nie możemy oddać komuś innemu, nieposiadającemu pełnej wersji naszej zabawki (np. robocika) aby sterował nim z poziomu swego smartfona. Ten ktoś musi posiadać RemoteXY. Cóż.

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!

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 😉

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óż ?

Arduino: TCRT5000 (11-04-2016)

TCRT5000 –  czujnik optyczny odbiciowy

Dioda z układutcrt5000s TCRT5000 emituje światło 950nm – niewidoczne dla ludzkiego oka, ale… nie dla kamery telefonu komórkowego ? Tutaj mamy dwa takie układy (patrz płytka stykowa na stole, obok Arduino), z których tylko jeden jest podłączony i działa. Który – to widać właśnie na ekranie telefonu komórkowego (kolor jasno-fioletowy na to wskazuje; kolor niebieski to dioda wyłączona – porównaj kolory diod na płytce stykowej).

Do czego ten układ? Detekcja linii, czujka zbliżeniowa… zobaczymy, jak my go wykorzystamy.

Arduino: PULL-UP, PULL-DOWN, microswitch (28-03-2016)

PULL-UP, PULL-DOWN, microswitch

Bardzo istotne zagadnienia wprowadzania sygnałów do Arduino z eliminacją stanów nieustalonych. Będziemy wykorzystać microswitche jako „zderzaki” zamontowane na pojeździe, które poinformują o napotkanych przeszkodach, coś w tym stylu:

12417902_10153698956393155_8987875999733465878_n

Arduino: TSOP2236 + IRLib + L298N (21-03-2016)

TSOP2236 + IRLib + L298N

już jeździ!Dziś już bez problemu oprogramowaliśmy ruch do przodu, do tyłu i dwa typu zakręcania – w miejscu (koła naprzemiennie), oraz szeroki-łuk (jedno koło stop, drugie skręca).
Co pozostaje? Jeszcze 1) PWM , 2) omijanie przeszkód oraz 3) sztuczna inteligencja – w końcu do tego dążymy!