Projekty/koncepty/usprawnienia

Wakacje się kończą, ale to już nasze drugie spotkanie w trakcie wolnego czasu! Brawo dla uczestników. Dziś prace koncentrowały się wokół trzech tematów.

Tuning przeszła Maskotka, dostając czwarte koło (zapobieganie przewracaniu się przy nagłej zmianie kierunku ruchu), nie trzeba już kombinować z przeciwwagą 😉

Koło z przodu, dystans 3 mm z płyty pilśniowej (precyzyjnie wyciętej, co widać na zdjęciu).

Pan Bartek zaprezentował finalnie swój mini-pad, więcej na stronie projektu

Mini-pad autorstwa BB.

No i ciągle rozmawiamy o wojnach robotów. Najważniejsze, że nowe koncepty zostały zaakceptowane i wydają się obiecujące. Czas pokaże, co z tego wyjdzie.

Prace koncepcyjne – jak mają wyglądać walczące roboty?

(c) K.G. 2021

GARY – PAD „drewniak”

Pan Rafał kontynuuje prace nad Wojnami Robotów. Po udoskonaleniu sterowania kołami zrobił kontroler z płyt pilśniowych i korków do wina – powstał PAD drewniak o nazwie GARY.

GARY – PAD „drewniak”.

Jak się okazuje, ulepszone sterowanie + PAD umożliwiają działanie pojazdu jako… Line Follower 😉 Więcej na stronie projektu.

Ręcznie sterowany Line Follower??? Czego to ludzie nie wymyślą…

Serwa

Pan Tomasz zbadał kolejne serwa. Poniżej wyniki:

Cztery nowe serwa (jedna „partia”, a nie losowe z roku czy dwóch) a jakie rozrzuty! Widać, że

  • obroty w lewo != prawo

Szeryf v0.2

No i mamy nową, świecką tradycję – wchodząc na zajęcia MUSISZ OBOWIĄZKOWO zagrać w Szeryfa 😉 Nowa wersja (v0.2) nie powaliła moich beta-testerów na kolana, trzeba więc dalej pracować, udoskonalać…

Szeryf v0.2 w (obowiązkowym) działaniu – na zdjęciu zwycięzca starcia #2.

A punktacja (czasami dwie rozgrywki, pokazujące progress) : RŁ: 3819, TK: 1337, 3225, P: 0, BB: 799, 1371. Pan Paweł nie ustrzelił wszystkich 4 rzutek jednym magazynkiem (7 pocisków) i dlatego zero punktów – dość deprymujące, muszę to zmienić. Ponownie wygrał Pan Rafał! przypadek? czy mamy w grupie prawdziwego Szeryfa? 😉

(c) K.G. 2021

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…

Maskotka, Line Follower oraz podstawy

Pracujemy w trzech płaszczyznach (3D? hmmmm)

joyshield + stringi + nRF24

Dziś nowy gadget:

czyli joy-shield. Co to ten „shield”? To rozszerzenie, z różnymi modułami, które nadrukowane są na płytkę PCB i nie wymagają płytki stykowej i masy przewodów. Taką płytkę „wtyka” się w piny Arduino, tworząc „kanapkę”. Ten shield ma „gierkowe” przeznaczenie – choć my go wykorzystamy do sterowania pojazdem, ale są też inne (do internetu przez kabel eRJotkę, przez sieć bezprzewodową, z kartą SD do zapisu danych, z obsługą silników i inne). Warto łapać okazję na allegro lub podobnych, bo ja swój shield kupiłem za 25 zł! A co on ma w sobie?

  • Joystick (dwie osie + przycisk)
  • cztery przyciski z kolorowymi klawiszami
  • dwa dodatkowe przyciski microswich
  • złącze dla modułów transmisji radiowych:
    — nRF24xx
    —  xbee
    — APC200
  • stabilizator napięcie 3.3V (do zasilania układów radiowych)

Oczywiście moduł (=shield) przeznaczony do współpracy z płytkami Arduino UNO, MEGA, LEONARDO itp. Warto zwrócić uwagę na jakość wykonania – mój ma fajne opisy w łatwo dostępnych miejscach.

Obsługa joysticka – shielda

Okazuje się banalnie prosta. Czytamy położenie dwóch osi (x i y) – czyli porty analogowe A0 i A1 (cóż, ten shield je sobie „rezerwuje” i nie mamy ich możliwosci wykorzystywania). Wszystko ładnie opisane na płytce. Podobnie z przyciskami.

void setup() {
Serial.begin(9600);
}
int x,y;
void loop() {
  x=analogRead(A0);
  y=analogRead(A1);
  Serial.print(x);
  Serial.print("  ");
  Serial.print(y);
  if (digitalRead(5)==1)
    Serial.print(" niebieski");
  if (digitalRead(4)==1)
    Serial.print(" bialy");
  if (digitalRead(3)==1)
    Serial.print(" czerwony");
//i tak dalej
  Serial.println();
  delay(100);
}

Zwracam uwagę na „sprytne” granie metodą print oraz println wraz ze spacjami tak, aby wszystko mieściło się w jednej linii i nie było „pozlepiane”.

A odczytywanie przycisków – skoro używam funkcji digitalRead(pin) to dlaczego nie ma wcześniej pinMode(pin, INPUT)? Otóż domyślnie piny ustawione są w trybie INPUT, dlatego właśnie nic nie dopisywałem. Jesto to warte zapamiętania, co powino nie być trudne – w końcu dla wejść analogowych nie ustawialiśmy w tryb INPUT, czyli z wejściami cyfrowymi jest tak samo.

Stringi = napisy

Temat rzeka… trzeba zacząć, czym są tablice w C. Zauwazyłem, że godnym polecenia jest artykuł na oficjalnej stronie Arduino. Ja dołączam „zrzut ekranu” z zajęć.

Jak zmienić nasz poprzedni kod, aby działał na napisach?

void setup() {
   Serial.begin(9600);
}

String napis;
void loop() {
  napis=String(analogRead(A0));
  napis = napis + "  ";
  napis = napis + String(analogRead(A1));
  if (digitalRead(5)==1)
    napis = napis + String(" niebieski");
  if (digitalRead(4)==1)
    napis += String(" bialy");
  if (digitalRead(3)==1)
    napis += String(" czerwony");
  //i tak dalej
  Serial.println(napis);
  delay(100);
}

Oczywiście nic tutaj nie zyskaliśmy, a nawet gorzej – obsługa klasy String w Arduino jest zasobożerna – czyli mocno powiększa nasz kod, ale tym się jeszcze nie przejmujemy. Na uwagę zasługuje łatwe dodawanie (łączenie) ze sobą napisów – realizuje to zwykły operator + (plus)

Joyshield + nRF24L01+

Łączymy poznane dziś rzeczy z poprzednimi zajęciami i nadajemy to, co robimy na naszym kontrolerze. Właśnie dlatego użyliśmy wersji Stringowej kodu do joysticka, bo radyjko nadawało właśnie napisy – a nawet napisy z maksymalną długością 32 znaków (bajtów). Poniżej kod:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <printf.h>

RF24 radio(9, 10);//CE, CS

uint8_t rxAddr[6] = "grzyb";

void setup(){
  Serial.begin(9600);
  Serial.print("nRF24 INIT=");
  bool ok=radio.begin();
  Serial.println(ok);
  printf_begin;
  radio.printDetails();
  radio.setRetries(15, 15);
  radio.openWritingPipe(rxAddr);
  
  radio.stopListening();
}

String napis;

void loop(){
  napis = String("Heniek "); 
  napis += String(analogRead(A0));
  napis += " ";
  napis += String(analogRead(A1));
  if (digitalRead(5)==1)
    napis += String(" niebieski");
  if (digitalRead(4)==1)
    napis += String(" bialy");
  if (digitalRead(3)==1) 
    napis += String(" czerwony");
  //i tak dalej<br>
  radio.write(napis.c_str(), napis.length());
  Serial.println(napis);
  delay(100);
}

Na uwagę zasługuje linia nr 37, gdzie musiałem użyć nowej metody klasy String o nazwie c_str(), której zadaniem jest stworzenie napisu w stylu języka C (nieobiektowego). Wymuszone jest to przez metodę write() klasy radio. Dodatkowo, długość napisu w klasie String uzyskujemy za pomocą metody length() – a nie sizeof(napis), gdyż to by zwróciło tylko rozmiar obiektu (a nie danych wewnątrz tego obiektu).

Z kolei w linii 26 rozpocząłem nasz napis imieniem (fikcyjnym) uczestnika koła Fi-BOT tak, aby uruchomiony przeze mnie program odbiornika nRF mógł łatwo zidentyfikować kto mi nadaje (Tosiek, Heniek czy Ziuta — także fikcyjne imiona).

Co dalej?

Wydawać by się mogło, że trzeba teraz tak przygotowany kod uruchomić do sterowania pojazdem. Nieprawda. Było by to baaaardzo kłopotliwe. Problem polega na tym, że trzeba odczytać napis w odbiorniku nRF umieszczonym w pojeździe, a potem odczytać aktualne wychylenie osi X i Y joya, i przyciski. Ale to trudne! Nawet przy pomocy funkcji toInt() zamieniającej napis na liczbę całkowitą – bo najpier należało by podzielić nasz napis na części – może przecinkami, jakoś tak:

123,512,czerwony,zielony

Czyli wówczas przecinek (kropka, myślnik – cokolwiek) by nam oddzielał jedną informację od drugiej, co by było do wykorzystania w połączeniu z metodą indexOf() z klasy String. Cała procedura mogła by wyglądać jakoś tak:

  • odczytujemy napis w pojeździe, przesłany przez joyshield (z przecinkami)
  • skupiamy się na pierwszej części napisu, aż do pierwszego przecinka – wiemy, że ma to być pozycja na osi X – funkcja StringSubstring() i/lub wspomniana indexOf()
  • zamieniamy ten krótki podciąg (od zera do 4 znaków) na liczbę całkowitą – metoda toInt() – i mamy już oś X
  • kasujemy/wyrzucamy z napisu pierwszą część do przcinka, przechodzimy do pozycji na osi Y
  • robimy podobnie, a potem
  • jeśli napis nie jest jeszcze pusty (bo ciągle kasowaliśmy informację o osi X i Y), to znaczy, że mamy jakieś przyciski
  • jeśli jest przecinek, to znaczy, że są nawet dwa (lub więcej) wciśniętych przycisków
  • tworzymy pierwszy podciąg aż do pierwszego przecinka, porównujemy czy jest to „zielony”, „czerwony” itd…
  • po odczytaniu przycisku kasujemy z napisu tą informację
  • jeśli napis niepusty, to są kolejne przyciski…

Proszę zwrócić uwagę, jakie to zagmatfane! Dlatego na kolejnych zajęciach będziemy wysyłać z nadajnika nie napisy (Stringi), ale bajty z informacjami. Dwa bajty wystarczą do podania osi X, kolejne dwa do osi Y, a jeszcze jeden – tylko jeden – do podania stanu wszystkich 7 przycisków na naszym shieldzie. Stworzymy własny protokół danych – podobny do tego, jakiego używaliśmy przy omawianiu oscyloskopu. Dlatego zachęcam do ponownego wczytania się w tamten wpis i opis protokołu danych. Właśnie to nas czeka na następnych zajęciach! Ekscytujące, nieprawdaż? 😉

Przypominam o spotkaniu w ten piątek 19-maja o 14:15 w sprawie XV Festiwalu, a kolejne zajęcia we wtorek 23 maja o godz. 16:15. Nie wiem, czy będziemy mieć siły na 22 więc od razu uprzedzam, że w poniedziałek 22 maja, podczas imprezy Festiwalowej, ustalimy termin kolejnego spotkania Fi-BOTa. Zapraszam!