Wojny robotów („kanapka”) + problem: BT + serwo

Wojny robotów: problem – serwa i Bluetooth (BT)

Pan Rafał oprogramowywał sterowanie swojej „kanapki” z wykorzystaniem modułu BT. Nie jest to może najlepsze rozwiązanie sterowania, ale szybkie i bezproblemowe (jasne, jasne – czytaj dalej). Proste, po włączamy dwie standardowe biblioteki Servo.h oraz SoftwareSerial.h i piszemy prosty kod.

#include <Servo.h>
#include <SoftwareSerial.h>

SoftwareSerial bt(8, 9);//RxD, TxD
Servo silnik;

void setup() {
  Serial.begin(9600);
  bt.begin(9600);
  silnik.attach(3);
  Serial.println("start!");
}

void loop() {
  if (bt.available()){
    char komenda=bt.readString());
    Serial.print("odebrano= ");
    Serial.println(komenda);//dla sprawdzenia

    switch (komenda){
      case 'W': silnik.writeMicroseconds(1000); break;  //przod
      case 'S': silnik.writeMicroseconds(2000); break;  //tyl
      case 'X': silnik.writeMicroseconds(1500); break;  //stop
    }//switch
}

A tu klops! Ilekroć przesyłane są dane przez moduł BT, to serwa „wariują”, zachowują się zupełnie nieoczekiwanie. Można to sprawdzić powyższym kodem gdzie przesyłamy 'W’ przez Bluetooth i silnik kręci się na maksa do przodu, a następnie wysyłamy z apki kolejne, nic nie znaczące znaczki (wciskamy inne, zdefiniowane przyciski, np. 'A’, 'D’ itd). Te komendy powinny zostać zignorowane (brak odpowiednich instrukcji w switch-u), a serwo powinno utrzymywać swój dotychczasowy ruch. Tak się jednak nie dzieje…

Jak zawsze najpierw należało sprawdzić przewody połączeniowe, ale to nie one okazały się przyczyną problemów. Grzebanie w internecie okazało się sukcesem – biblioteka SoftwareSerial.h korzysta z tego samego układu czasowego (timera) w Artudino co biblioteka Servo.h, do sterowania PWM. Chodzi o to, ze Arduino (a dokładniej ATmega 328P) posiada trzy niezależne timery: dwa 8-bitowe oraz jeden 16-to bitowy. Właśnie z tego ostatniego korzystają dwie wspomniane biblioteki i powstaje konflikt!

Rozwiązaniem może być alternatywna biblioteka do obsłui serw: ServoTimer2. Już sama nazwa wskazuje, że korzysta ona z drugiego timera – nie powinno być więc konfliktu z SoftwareSerial.h. Lekko zamieniamy kod programiku i sprawdzamy zachowanie serw podczas przesyłania danych z BT. Klops: jednak nie pomogło.

Jeśli nie biblioteka serw, to szukamy zamiennika do drugiej biblioteki – komunikacji szeregowej. Tutaj trafiamy na AltSoftSerial i nasze nadzieje nie gasną 😉 Ponownie modyfikujemy kod (uwaga: pinami do komunikacji są „na sztywno” pin 9 oraz 10 – nie ma możliwości wyboru, jak w przypadku biblioteki SoftwareSerial.h).

Nie poddajemy się i stosujemy dwa zamienniki bibliotek jednocześnie – bum! mamy to! działa!

#include <ServoTimer2.h>
#include <AltSoftSerial.h>

AltSoftSerial bt;//Arduino UNO -> RxD=9, TxD=10, nie ma wyboru!
ServoTimer2 silnik;

void setup() {
  Serial.begin(9600);
  bt.begin(9600);
  silnik.attach(3);
  Serial.println("start!");
}

void loop() {
  if (bt.available()){
    char komenda=bt.readString());
    Serial.print("odebrano= ");
    Serial.println(komenda);//dla sprawdzenia

    switch (komenda){
      case 'W': silnik.write(1000); break;  //przod
      case 'S': silnik.write(2000); break;  //tyl
      case 'X': silnik.write(1500); break;  //stop
    }//switch
}

Niewielkie zmiany, ale istotne. Warto zwrócić uwagę, że funkcja write() dla obiekty ServoTimer2 zapisuje mikrosekundy wypełnienia, czyli dokładnie to co robi funkcja writeMicroseconds() z obiekty Servo (biblioteka Servo.h), co jest trochę mylące. Wystarczy mieć to na uwadze i będzie OK.

Jeszcze jedno: wspomniany problem nie występuje na starszych wersjach środowiska i bibliotek Arduino IDE. Warto sprawdzić.

Wojny robotów: trzecia „kanapka” i korki (przymyślenia).

Pan Kacper buduje trzeci pojazd „kanapka”. Mamy nowe, trochę zmodyfikowane tymczasowe koła – choć drukarka 3D pracuje powoli, to i tak trzeba się natrudzić przy składaniu całej konstrukcji (jakieś 3h?).

Trzeci pojazd. Nowe koła. Ba(k)teria na ścisk!

Myślałem, że wykorzystanie korków od wina jest oryginalne – a tu się okazało, że takie zabiegi były znane i (zapewne) stosowane przynajmniej od roku 1200+. Źródła historyczne donoszą, że prawdziwy podróżnik awanturnik na szlaku musiał posiadać zestaw korków – pewnie w celach majsterkowania, bo po cóż innego miał on je w swoim ekwipunku?

Ekwipunek Geralta: korki to podstawa! Witcher 3, CDPR

Wojny robotów: szybkość obrotowa (RPM) silczka

Pan Tomasz z kolei zawziął się na zbadaniu prędkości obrotej kół (RPM = Revolutions Per Minute). Prosty układ pomiarowy (tymczasowy) pozwolił mu zmierzyć tą prędkość. Układ składa się z potencjometru do sterowania prędkością serwa Feetech FT90R (z prawej strony), oraz czujki szczelinowej (umieszczonej na – oczywiście – korku do wina) wraz z przymocowanym kołem zębatym (druk 3D).

Pomiar prędkości obrotowej serwa.

Pan Tomasz wykorzystał przerwania z Arduino UNO (a dokładniej jedno, ze zboczem narastającym). cdn…

Maskotka

BB zakończył prace nad płytą główną do Maskotki – aktualnie przygotowywane jest lepsze sterowanie prędkością kół – kontroler PID.

Kolejne spotkanie: czwartek 15:00

Podcasty? Wojny robotów („kanapka”) + Maskotka

Podcasty?

Rusza Uniwersyteckie Centrum Podcastów „Na końcu świata” – nowa inicjatywa na naszym Uniwersytecie. Dostaliśmy propozycję prowadzenia takiej cyklicznej audycji. Tematyka w naszych rękach, ale z racji specjalności Fizyka gier komputerowych i robotów same narzucają się gry komputerowe, sprzęt komputerowy, sprzęt do programowania elektroniki oraz nowinki robotyczne/IT. Myślę, że w zależności od poruszanej kwestii może to być audycja 30-to minutowa (dłuższa temat do omówienia) ale także krótsza (15 min na „nowinki”). W kilka osób będzie łatwiej prowadzić takie audycje, więc zachęcam do zastanowienia się i zgłoszenia po Świętach.

Wojny robotów: „kanapka”.

Ulepszamy nasze konstrukcje, montujemy lepsze mocowania silniczków. Sporo pracy manualnej… ale projekt idzie do przodu!

W pracach nad drugą konstrukcją wykorzystaliśmy korek od wina – jest wytrzymały, świetnie się modeluje (przycina, docina) a także łączy i dzieli! Brawo Pan RŁ!

Prace trwają… ale już koniec tego etapu!

Maskotka

BB pracuje nad płytą główną do Maskotki – jest już moduł uporządkowujący przewody + integrujący moduł nRF24L. Fajnie!

Nowy moduł Pana Bartka – ten „zielony” shield 😉

Kolejne spotkanie: czwartek 15:00

Wojny robotów („kanapka”) + Maskotka

Wojny robotów: „kanapka”.

Budujemy drugie podwozie (ciągle w wersji v0.1) – chodzi o to, aby na Święta mieć dwa, a może nawet trzy egzemplarze pojazdów rozdysponowane po zainteresowanych Studentach. To powinno przyspieszyć pracę nad projektem 😉

W pracach nad drugą konstrukcją wykorzystaliśmy korek od wina – jest wytrzymały, świetnie się modeluje (przycina, docina) a także łączy i dzieli! Brawo Pan RŁ!

Drugie podwozie i niezastąpiony materiał „konstruktora amatora” – korek od wina 😉

Pan Tomasz w międzyczasie przypomniał sobie komunikację Bluetooth i wykorzystał nową apkę ze sklepu Androida – Arduino RC. Zaletą jest prostota i wystarczająca funkcjonalność!

Maskotka

BB pracuje nad płytą główną do Maskotki…

Kolejne spotkanie

Proponuję czwartek, godz. 11:00. Zapraszam!

Wojny robotów („kanapka”) + Maskotka

Wojny robotów: „kanapka”.

Budujemy podwozie v0.1.

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:

Projekt „trzymaka” koła i silniczka: wykorzystujemy oryginalny orczyk z silniczka, który wtapia się w konstrukcję trzymaka. Trzy otwory 3mm, oddalone od środka o 10mm – pełna profeska 😉

Wydruk 2 sztuk to ~30min pracy drukarki. Efekt poniżej.

Koło Tamiya 70111 z „trzymakiem” – po co 3 śrubki, skoro i na 2 się trzyma? 😉

Napęd to dwa serwa pracy ciągłej – Feetech FT90R.

Serwo pracy ciągłej z zamocowanymi kołami.

Finalnie wszystko wygląda tak:

Kanapka v0.1: czyli pojazd w pełnej krasie 😉 Zasilanie (aku 9V) na polnym pokładzie. W planach kolejny pokład z programowalnymi LED-ami RGB.

Mocowanie silników do podwozia – chwilowo trtytkami. Jednak jest to NAJSŁABSZY element tej konstrukcji. Ale wydawał się wystarczający do sprawdzenia, jak działa.

Pierwsze próby autonomicznej jazdy!

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 😉

Do sterowania podwoziem Maskotki wykorzystujemy… cztero-kołowy pojazd z JOY shieldem! Po prostu nie chciało się rozbierać/rozkręcać gotowej już konstrukcji…

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ć.

Nowy semestr – plan pracy

Wojny robotów

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:

  1. Konstrukcja mechaniczna.
  2. Programowanie:
    1. sterowanie pojazdem z „kabla”
    2. sterowanie bezprzewodowe (bluetooth)
    3. czujka pola magnetycznego
    4. kolorowe LEDy – sygnalizacja energii, paliwa…
  3. Różne scenariusze zabawy:
    1. „bij zabij” – każdy na każdego
    2. „zając” – jeden ucieka, inni go gonią
    3. …zobaczymy
  4. 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.

koła Tamiya 70111

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.

Serwo pracy ciągłej – podstawa napędu.

Trzeba „tylko” wykombinować połączenie silniczka z tymi kołami… Tym zajmiemy się za tydzień.

Forbot.pl — nowy konkurs z nagrodami pieniężnymi

Portal forbotl.pl ponownie organizuje konkurs, do którego można zgłaszać artykuły dotyczące szeroko pojętej elektroniki. Może ktoś z Państwa będzie zainteresowany udziałem w tej akcji? Mile widziane są teksty dotyczące m.in.: Arduino, Raspberry Pi, ESP, STM32, FPGA, Raspberry Pi Pico, MicroPython, Grafana, MQTT, TensorFlow, AI, TinyML, RISC-V, Arduino CLI, Arduino Pro, Node-RED, ESP32, LoRa, Home Assistant, Processing, Firebase (w kontekście IoT). Do wygrania są karty podarunkowe Allegro o wartości 2000 zł, 1000 zł ale nagrodzonych zostanie aż 7 osób. Więcej info na https://forbot.pl/blog/

(c) K. G. 2021

 

Podstawy: programowalne LED-y ws2812b

Wojny robotów

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.

Zadanie z zajęć: kontrolować liczbę świecących LEDów potencjometrm.

Podstawy: Bluetooth + mikroserwa

Podstawy Arduino

Tym razem poznajemy coś konkretnego – moduł Bluetooth XM-15B. Umożliwi on komunikację z naszym smartfonem i sterowanie wieżtyczką (zbudowaną z 2 mikroserw, jak na poprzednich zajęciach).

Komunikacja z Bluetoothem z wykorzystaniem SoftwareSerial-a.

Poznaliśmy obiekt SoftwareSerial pomocny w komunikacji z dwoma urządzeniami działającymi przez UART, a (niestety) Arduino UNO ma tylko jeden Serial… Wykorzystaliśmy darmową apkę z AndroidStore „Bluetooth control 8 lap” która sterowała wieżyczką. Brawo Studenci!

Wieżyczka z 2x mikroserwo sterowana przez Bluetooth.

Ta apka jest dobra na początek, można poszukać czegoś lepszego w sklepie ale… dlaczego nie stworzyć własnej? To naprawdę proste – z odpowiednim środowiskiem, czyli (polecam) MIT App Inventor

MIT App Inventor – tworzenie pod Androida z bloczków/klocku jak w Scrachu!

Maskotka

Prace trwają: BB poprawia łącza i soft, KG wierci i kręci 😛 A co z tego wyszło? Skrzypi, ale jeździ jak wariat 😀

Podstawy: odczytywanie sygnałów (analogowo i cyfrowo)

Podstawy Arduino

Dalej ćwiczymy funckję analogRead() – tym razem z fajnym modułem, mianowicie czujnikiem pola magnetycznego SS49E. Podłączamy zasilanie a sygnał wychodzi z 3-ciej nóżki, jak na rysunku poniżej:

Czujka i opis nóżek (PIN-outy).

Warte podkreślenia jest, że ta czujka odróżnia dwa bieguny magnesów i dlatego jest warta zakupu. Przy tej okazji przekonaliśmy, że Arduino IDE wyposażone jest w automatyczne rysowanie wykresów dzięki Kreślarce – trzeba tylko wysyłać na port szeregowy liczby w postaci napisów (gdy chcemy dwie krzywe na wykresie – liczby muszą być podane w jednej linii, oddzielnone spacjami). Proste, a jakie użyteczne!

Skoro mamy przećwiczone analogRead() to powracamy do mniej widowiskowego digitalRead(): podłączamy moduł przycisku

Moduł przycisku tact-switch.

W kolejnym kroku podłączyliśmy moduł czujnika drgań:

Moduł czujnika drgań.

Ponownie wykorzystaliśmy Kreślarkę by rysować drgania czujnika, razem z wykresem pola magnetycznego – proste, ale cieszy 😉

Maskotka

Prace trwają: BB z PP rozkładają pojazd, programują i… stwierdzają zgon jednego z dwóch Arduino! Przyczyna? no właśnie… dochodzenie trwa…

Podstawy: odczyt analogowy – moduł JOY + wieżyczka

Podstawy Arduino

Poznajemy funckję analogRead() – podłączamy potencjometr i sprawdzamy odczyty napięcia (porównujemy ze wskazaniami multimetru). Natrafiliśmy na „pułapkę informatyka”: dzielenie całkowite! W celu odczytania wartości napięcia nie można było napisać analogRead(A0)*5/1024, zamiast tego należało rzutować typy lub wymuisić obliczenia w arytmetyce liczb rzeczywistej, przez napisanie liczby 5 jako liczba rzeczywista: analogRead(A0)*5.0/1024. Teraz już wszystko działa, więc podłączamy dwa potencjometry ale… w module popularnej gałki JOY-sticka:

Moduł gałki JOY-a (czyli dwa potencjometry).

Moduł wykorzystaliśmy do rozbudowy zabawy z mikroserwami z poprzenich zajęć – tym razem mamy do dyspozycji wieżyczkę sterowanych dwoma mikrosilniczkami.

Wieżyczka sterowana JOY-em.
Należy podkreślić, że zasilanie dwóch takich silniczków bezpośrednio z Arduino nie jest mądrym pomysłem, dlatego warto użyć zewnętrznego zasilania.

Maskotka

Prace trwają: BB z PP rozkładają pojazd i montują profesjonalne uchwyty montażowe do zasilania 😉

Wydrukowane „trzymaki” do akumulatora (oczywiście autorstwa BB).
Trzymaki w akcji 😉

Widać, że podwozie Maskotki nadaje się już do wymiany – paskudne te otwory… Wynika to z różnych koncepcji systemu kół, które wymusiły docinanie otworów „na szybko”. Kolejnym krokiem będzie przygotowanie nowej płyty…