Mieliśmy robić coś prowizorycznego, jednak do montażu kół wykorzystaliśmy przygotowane mocowanie – zaprojektowane i wydrukowane na Wydziałowej drukarce 3D Zoltrax M200. Prosty projekt w Blenderze:
Wydruk 2 sztuk to ~30min pracy drukarki. Efekt poniżej.
Napęd to dwa serwa pracy ciągłej – Feetech FT90R.
Finalnie wszystko wygląda tak:
Mocowanie silników do podwozia – chwilowotrtytkami. Jednak jest to NAJSŁABSZY element tej konstrukcji. Ale wydawał się wystarczający do sprawdzenia, jak działa.
Miało być szybko i minimalistycznie, jednak trzeba wrócić do mocowania silniczków – trytytki należy zmienić na „dedykowane” trzymaki do serw (ponownie projekt 3D i druk na Zoltraxie M200). Liczymy, że dzięki temu pojazd będzie jeździć prosto!
Maskotka
Pan Bartek wraca do projektu Maskotki i zamierza tam wgrać PID-a do lepszego sterowania kołami. Na razie odgrzebał projekt, połączył przewody (sfajczył jedno Arduino UNO – ale jak, tego nikt nie wie) no i projekt jeździ! Z braku swojego kontrolera wykombinował takie oto zabawnie wyglądające cudo 😉
Słychać ten „piękny” pisk podczas zakrętów? Oj słychać… ale jego źródło zostało już zlokalizowane! To nie silniki (jak nam się pierwotnie wydawało), a… trzecie koło! Będzie trzeba coś z tym zrobić.
Poprzedni semetr zakończyliśmy poznaniem niezbędnych elementów, jakie zamierzamy wykorzystać nad naszym projektem. Teraz przyszedł czas na zebranie tego w całość. Powstał taki oto plan:
Konstrukcja mechaniczna.
Programowanie:
sterowanie pojazdem z „kabla”
sterowanie bezprzewodowe (bluetooth)
czujka pola magnetycznego
kolorowe LEDy – sygnalizacja energii, paliwa…
Różne scenariusze zabawy:
„bij zabij” – każdy na każdego
„zając” – jeden ucieka, inni go gonią
…zobaczymy
Finalizacja projektu, część i chwała, nagrody prezydenta RP i sukces finansowy 😉
Punkt pierwszy jest kluczowy i zarazem problematyczny – zamierzamy zrobić coś prowizorycznego, ze sklejki, gumki recepturki i papieru toaletowego (oraz inne rzeczy „spod ręki” – liczy się kreatywność, i na tym polega problematyczność). Przyświecać nam będzie główny cel – podwozie ma być (w miarę) stabilne i gotowe do realizacji kolejnych punktów. W przyszłości (za semestr?) studenci poznają tajniki druku 3D i stworzą piękne pojazdy, na razie będzie prowizorka.
Rzeczy „spod ręki” nie są takie ubogie – w szafie pracowni znalazł się zestaw kół sportowych o średnicy 56 mm i szerokości 25 mm.
Napęd bazować będzie na dwóch serwach pracy ciągłej – Feetech FT90R. Wybór podyktowany był tym, że nie musimy montować sterownika do silników DC (mostek H) gdyż te mikro-serwa mają sterowanie wbudowane w sobie.
Trzeba „tylko” wykombinować połączenie silniczka z tymi kołami… Tym zajmiemy się za tydzień.
Pracujemy nad ostatnim elementem składowym projektu Wojny robotów – kolorowych wyświetlaczy (do przedstawiania poziomu „życia”, „paliwa” itd). Wszystko okazuje się dziecinnie proste – a to za sprawą gotowych bibliotek dla Arduino (był to właśnie pretekst do poznania instalacji bibliotek w Arduino IDE). Pracowaliśmy ze wcześniejszym materiałem z fi-bot’a – zajrzyj.
Kolejne spotkanie z kolorowymi paskami LEDów WS2812B – tym razem sterowane potencjometrem.
UWAGA: TinkerCAD (czyli „wirtualne Arduino”) został wzbogacony właśnie o omawiane moduły RGB. Trzeba przyznać, że działają całkiem fajnie — dlatego zachęcam do zabawy nawet dla osób, które nie mają ich w realu!
Zadanie do wykonania
Zaświecić LEDem o numerze zgodnym z ustawioną wartością na potencjometrze. Inne LEDy mają być wyłączone. Kręcimy potencjometrem – „przesuwamy” LEDa. Kolor LEDa? Twój ulubiony 😉
Pozycję potencjometru odczytujemy przez funkcję analogRead(A0) – o ile środkowy pin potencjometru został podłączony do pinu A0 właśnie. W potencjometrze podłączone są także piny do GND i 5V w Arduino – zgodnie z powyższym rysunkiem.
Numer LEDa – dzielenie całkowite!
analogRead(a) zwraca wartość z przedziału 0..1023, natomiast my mamy tylko (aż?) 16 LEDów. Należy więc przeliczyć wartość a analogRead() na numer pinu… w prosty sposób:
nr = analogRead(A0)*16/1024; //dobrze!
Ważna jest tutaj kolejność obliczeń, bo gdy napiszemy
nr = 16/1024*analogRead(A0); //źle :-(
to choć z matematycznego punktu widzenia oba wyrażenia są równoważne, to jednak w drugim przypadku najpierw wykonuje się dzielenie – a jest tutaj dzielenie całkowite (bo zarówno 16 jak i 1024 są liczbami całkowitymi) więc wynosi zero. A zero mnożone przez cokolwiek da zawsze zero. Pierwszy wzorek jest poprawny, bo najpierw wykonamy mnożenie analogRead(A0)*16 a dopiero potem wynik tego iloczynu dzielimy (dzielenie całkowite, ale teraz nie przeszkadza) – i otrzymujemy liczbę z przedziału 0..15.
Dyskoteka – czyli efekt stroboskopu
Skoro mamy już ustalony numer LEDa, to teraz możemy zgasić wszystkie inne, a potem zaświecić tego konkretnego – o numerze nr właśnie. Ale ale… za chwilkę ponownie ustalimy położenie potencjometru, ponownie wyliczmy nr LEDa i co – ponownie zgasimy wszystkie, aby włączyć ten o numerze nr? Obawiam się, że w związku z wyłączaniem i włączaniem otrzymamy efekt „dyskoteka” (stroboskopu). Poza tym to nieprofesjonalne 😛
Powyższy kod rozwiązuje efekt stroboskopu – dzięki dodatkowej zmiennej poprzedni zapamiętujemy, który LED był ostatnio włączony. W głównej pętli programu ustalamy numer LEDa zgodnego z ustawieniami potencjometru, ale „akcja” dzieje się tylko wówczas, gdy zmieniliśmy ustawienia potencjometra. Dobrze dodać wypisywanie na monitor szeregowy informacji tylko wóczas, gdy dzieje się „akcja” – dzięki temu mamy pewność, że napisy (a tym samym i sama „akcja”) wykonuje się jedynie w przypadku zmian ustawień potencjometru.
Uwaga #1 – int VS float
Proszę zwrócić uwagę, że zarówno zmienna nr jak i zmienna poprzedni są zadeklarowane jako int, co w zupełności wystarczy – nie ma potrzeby używać arytmetyki liczb rzeczywistych (powolnych, szczególnie na Arduino).
Uwaga #2 – być bardziej PRO 😛
Zwróć uwagę, że wywołuję funkcję pixels.show() tylko wówczas, gdy coś się zmieniło – niby po co miałbym wołać tą funkcję za każdym razem w loop()-ie, niezależnie od tego, czy coś się zmieniło czy nie? W końcu pixels.show() programuje LEDy zgodnie ze wcześniejszymi ustawieniami pixels.setPixelColor(), więc nie ma senesu wołać ją bez potrzeby.
Zadanie #2 (także tinkercad)
Zmienić kod tak, by świeciły się LEDy od pierwszego do tego konkretnego, zgodnego z ustawieniami potencjometru. Unikać efektu „dysko”.
Zadanie #3
Joystick to dwa potencjometry – można tu go wykorzystać i oprogramować tak, by ruch na osi X zmieniał numer LEDa (jak dotychczas), a ruch na osi Y zmieniał kolor – w jakiś zabawny sposób (może tęcza?). Proszę się pochwalić wynikami!
Otrzymaliśmy zaproszenie do uczestnictwa w szkoleniach dla studentów – PZU oferuje bilety PKP oraz jeden ciepły posiłek.
Dni Otwartego Biznesu trwają od 2 do 13 grudnia 2019 r. Każdy dzień poświęcony jest innemu zagadnieniu. Tematy omawiane na szkoleniach to m.in. robotyka, DevOps, sprytne utrzymanie aplikacji i wiele więcej. Obejrzyj załącznik z wszystkimi tematami warsztatów, opisami i datami.
Każdy ma możliwość zapisania się na wszystkie warsztaty jednak otrzyma zaproszenie tylko na jeden dzień szkoleń.
Szkolenia odbywają się w Warszawie w siedzibie Grupy PZU (około 10-15 min od dworca PKP). Organizator zapewnia każdemu uczestnikowi bilety PKP oraz ciepły posiłek w czasie warsztatów. Szkolenia odbywają się w godzinach 10-17.
Każdy z uczestników otrzymuje certyfikat potwierdzający zdobycie nowych kwalifikacji. Szkolenia prowadzone są przez menadżerów co najmniej średniego szczebla.
Kolejne spotkanie z kolorowymi paskami LEDów WS2812B zapętlonymi w koło – sterowane potencjometrem. Dla nowych studentów to fajna zabawa – odczytujemy napięcie funkcją analogRead() a efekt przekładamy na wędrujący w kole piksel… Prace trwają 😉
Dwie strony naszego kółka wyświetlają różne kolory – rozpoczynamy od góry kółka, gdzie kolejne piksele zapalają się co zadany interwał czasu, a po „dotarciu” do środka kółka – piksele wracają (gaszą się). Ale… lewa strona jest cztery razy szybsza niż prawa strona. Na dodatek nie można używać funkcji delay()!
D E M O
Brawo dla Pana Łukasza!
Monster – moduł sterownika silnika DC
Mocny sterownik do silników DC – prąc pracy 12A (chwilowy 30A), napięcie pracy 16 V – bije na głowę poczciwego L293x i dlatego jest MONSTEREM 😉 12A to brzmi dumnie, ale w postaci BEZ RADIATORA to możemy pracować do 6A.
Układ nazywa się VNH2SP30 i jest warty polecenia, ale uwaga – w wielu sklepach (nawet tych renomowanych) można kupić uszkodzone sterowniki, które kręcą kółkami tylko w jedną stronę! Sprzedawcy wymieniają wadliwe sztuki, ale piszę to w celu zaoszczędzenia nerwów – gdy coś nie działa a powinno.
Generalnie wszystko jest proste: 5V, GND do odpowiednich na Arduino, INA oraz INB do dowlonych pinów w Arduino, którymi chcemy sterować silniczkiem (tak samo jak w L293x), ale pin PWM musi być podłączony do Arduino – w przeciwnym razie sterowanie odbywa się z ZERO procent mocy. Pin EN (enabled) może być podłączony do 5V w Arduino, choć i tak jest w stanie wysokim, więc układ jest włączony, pin CS to diagnostyczny, na razie pomijamy (odczytuje prąd pracy układu, temperaturę…). Silnik podłączamy do OUTA oraz OUTB, natomiast zasilanie do + (plus) oraz – (minus) po przeciwnej stronie modułu – uwaga na właściwą polaryzację! Tutaj ważne jest ten plus i minus, oby nie odwrotnie!
No i ostatnia ISOTONA kwestia: zasilanie musi być przynajmniej 5.5V, nie może być mniej!
Kolejne spotkanie z kolorowymi paskami LEDów WS2812B – tym razem zapętlone w koło, więc efekt fajny!
Efekty mogą być fajne, ale… programując tylko takie „kółeczka” nie martwimy się używaniem funkcji delay(). To dobrze w tym prostym przypadku. Ale czy zawsze tak można?
Zadanie do wykonania
migać pierwszym LEDem co 1 sek (włączać na 1 sek, wyłączać na 1 sek), migać drugim LEDem co 30 sek — wszystko bez użycia funkcji delay() ! Po co to nam? A chodzi o to, że efekty świetlne mają pojawiać się niezależnie od innych rzeczy dziejących się w „międzyczasie”, nie chcemy ich stopować delay()em. W naszym przypadku zamierzamy jeździć pojazdami, które sterowane będą bezprzewodowo przez moduły radiowe nRF24L więc nie chcemy zatrzymywać odbioru sterowania wyświetlając efekty na kolorowych kółkach. Jak to zrobić?
Liczniki czasu – funkcja millis()
Powiedzmy, że chcemy wykonać pewne instrukcje co interwał czasu (może być 150 ms, może być 3777 ms albo dowolnie).
unsigned long int interwal = 3777;
unsigned long int t1,t2;
unsigned long int licznik = 0;
void loop(){
t1 = millis();
//
//rozne operacje, ktorych nie chcemy zatrzymywac
//
t2 = millis();
licznik += (t2 - t1);
if (licznik >= interwal){
//wykonaj zadania co dany interwal
licznik = 0;
}
}//loop
Powyższy kod to szkic postępowania w celu uzyskania „wielozadaniowości” na platformie Arduino 😉 Na początku pętli loop() zapisujemy aktualny czasu do zmiennej t1, wykonujemy wszystkie potrzebne instrukcje, których nie chcemy przerywać, na koniec ponownie zapisujemy czas do zmiennej t2. Zwiększamy licznik czasu (zmienna licznik) właśnie o czas wykonania pętli loop(), czyli różnicę t2-t1. Następnie sprawdzamy czy licznik „napełnił się” do zadanego interwału – jeśli tak, wykonujemy zadania i zerujemy licznik. Oczywiście możemy mieć wiele liczników, jak też i różne interwały…
Niby niewiele – dwa przyciski włączające oba układy Arduino (niezależne od siebie) – a tu sporo pracy! Ponownie trzeba było pobawić się korkoborem 🙂 a także i nożykiem do papieru – górna podstawa okazała się być lekko za duża, więc zamiast piłować podstawę, ucięliśmy trochę kartonowego korpusu… To rozwiązanie zadziałało, ale w perspektywie jest upgrade obudowy a’la Trabant (dla niewtajemniczonych niemieckimi autami dołączam link z wyjaśnieniem) na wypas blachę i będą schody…
A tak to wszystko teraz wygląda w środku:
Pierwsza płytka Arduino UNO steruje silnikami (2x Monster VNH2P30) oraz odbiera komunikację z modułu Bluetooth (XM-15B).
Druga płytka Arduino UNO steruje oświetleniem (ledy WS2812b). Obie połączone są ze sobą (2x piny cyfrowe) – wybór efektu dla LEDów podaje pierwsza płytka (aktualnie tylko 2 piny, ale może więcej w przyszłości).
Na drugim Arduino zamocowany jest shield (wykonanie P. Bartek) sterujący ledami z „pro” konektorami 😉
W perspektywie jest wymiana drugiego UNO na Mega, bo jest chęć dołożenia przycisków – choć można zawsze pobawić się multiplekserem i nie wymieniać na Mega (zobaczymy).
Dodanie „ukrytych przycisków” do sterowania efektami oświetlenia bez aplikacji AndroidRC – to uniezależni Maskotkę od pierwszego Arduino UNO i zwiększy jej walory demonstracyjne (a także na wypadek jakiejś awarii pierwszego układu).
Aktualnie sterowanie odbywa się przez Bluetooth (moduł XM-15B) i apkę AndroidRC (bo najprościej i działa). W planach jest zrobienie kontrolera i wykorzystanie modułu radiowego nRF24L01 2.4GHz (który znamy i lubimy).
Aku trzeba przymocować „pasami” (na rzep).
Upgrade obudowy (aluminiowa, pomalowana z podkładem).
Więcej efektów świetlnych?
Wyszła spora plątanina przewodów… nieelegancko więc będzie trzeba nad tym popracować (zebrac wszystko na płytę główną).
Wentylacja (w sieć grafenu z drukarki 3D? kto wie…).
Głośniczek i prosta komunikacja?
Głowa robota – kask? nadmuchiwany ludek?
Komunikacja – LCD? OLED?
Testy wykonane, Maskotka „śmiga” i świeci, więc wszem i wobec ogłaszamy, że ten etap zakończyliśmy pomyślnie. Gratuluję wszystkim zaangażowanym!
Pan Bartek zaprezentował swoje demo – wersja 0.2beta 😉 Niebawem ujawni szczegóły programowania i synchronizacji (5 pasków LEDów programuje niezależnie) ale trzeba przyznać, że efekt wygląda bardzo obiecująco – a zmieniać zawsze można ile się chce… ile dusza artystyczna pozwoli 😉
Trzeba zaznaczyć, że Pan Bartek zrobił to „na sucho” – właściwie w głowie, bez podłączenia tych wszystkich LEDów do prądu (brak odpowiedniego zasilacza w domu) – próba generalna „synchronów” odbyła się dopiero na kole Fi-BOT!
Wspólnie z Panem Leszkiem oraz z Panem Łukaszem polepszono konstrukcję Maskotki (gwozdki, profesjonalne podkładki i „korkobor” – hit!), a następnie Pan Bartek przymocował paski do obudowy – efekt okazał się wart zachodu!
Trzeba pochwalić też Pana Mateusza – jego soft z testowego pojazdu wgrany do Maskotki zadziałał! Wiadomo, nie od razu, ale tak zawsze jest gdy się robi coś konkretnego. Teraz pozostało skomunikować jedno Arduino odpowiedzialne za efekty świetlne z płytką Arduino od podwozia i sterowania. Na początek będzie więc maksymalnie 3 efekty, czyli wystarczą dwa piny cyfrowe łączące obie płytki – jedna włącza sekwencję LOW i HIGH, druga ją odczytuje i wyświetla dany efekt. W przyszłości może będą 3 piny, a tym samym 7 efektów – może każdy uczestnik Fi-BOTa zaprogramuje swój własny? taka „personalizacja” 😉
Backstage
Warto przedstawić co się dzieje „za kulisami” 😉 A tu jeszcze wszystko w powijakach, bez płytki dystrybucyjnej, brak profesjonalnych łączy i chyba stabilizatora 5V (bo zasilanie będzie z żelowego akumulatora 6V lub 12V).
Korpus pomalowany – spray (matowy GOLDCAR) zdał egzamin 😉 Pan Bartek wytrwale lutuje moduły ws2812b ze sobą, poświęcając temu zajęciu dużo uwagi – gratuluję wytrwałości! Grecka litera fi powali wszystkich na kolana 😀
Pan Przemek i Łukasz wytrwale świecą LEDami, tym razem sterując nimi przez UART z Monitora Portu Szeregowego – na kolejnych zajęciach zastąpimy ten monitor apką z Androida i modułem Bluetooth. Brawo!
Pan Leszek łączy środowisko Unity z elektroniką – mając swoja grę (napisaną właśnie w Unity) chce zbudować własny kontroler – aby gra była ciekawsze. Świetny pomysł – okazało się jednak, że sama umiejętność odczytania przycisku nie wystarczyła… problem zrobił się bardziej softwarowy, ale więcej szczegółów niebawem.