Warto obejrzeć i nabrać inspirację:
Warto obejrzeć i nabrać inspirację:
Dość długie spotkanie (2h) na którym rozdzielaliśmy zadania na naszą imprezę festiwalową. Okazało się, że jest więcej fajnych tematów niż ludzi do ich realizacji!
Przy tej okazji zaprezentowałem wirtualne Arduino ze strony 123d.circuits.io — mam nadzieję, że się przyda naszym Fi-BOTowiczom.
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
Cóż więcej dodać? Chyba po takiej reklamie już nic nie trzeba 😉
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óż.
http://forbot.pl/blog/wiadomosci/robot-szybki-jak-usain-bolt-motywuje-do-biegania-id15017
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).
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.
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:
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.
Będziemy to programować na kolejnych zajęciach…
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).
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” 😉
A co kryje w sobie ta paczuszka? może chomika?
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?
4x Serwo PowerHD AR-3606HB (praca ciągła)
wraz z bogatym zestawem orczyków!
A tutaj mikrosilniki Pololu HP 298:1. Niech nikogo nie zmartwi rozmiar tego silniczka – w tym maluchu drzemie niezła moc!
Dodatkowo: zestaw kół, mocowań no i enkoderów dedykowanych do Pololu!
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
cukiereczek czeka do odbioru po długim weekendzie – zapraszam!
Na naszych trzecich zajęciach powiedzieliśmy sobie o:
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?
Po tych zajęciach powinieneś znać:
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).
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ą.
wyświetlacz 7-mio segmentowy! a może nawet rejest przesuwny?
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 ?
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.
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 😉