Maskotka – kolorki, kolorki…

Trwają prace nad elementami świecącymi do Maskotki – projekt Pana Bartka w realizacji… na razie „na próbę” – obudowa z kartonu. Efekt przed malowaniem i lakierowaniem poniżej 😉

Trzeba pamiętać, że paski kolorowych LEDów (u nas WS2812B) będą jeszcze ciekawie zaprogramowane… to ZWIĘKSZY efekt końcowy! Zapowiada się ciekawy efekt!

Regularne + nowy termin spotkań

U niektórych jeszcze sesja (poprawkowa), więc frekwencja marna – ale nie ma co narzekać, bo dołączył do nasz jeden nowy student. W końcu nie w liczbie a w pomysłowości i intelekcie siła! 😀

To ostatnie zajęcia wtorkowe, terminy spotkań ulegają zmianie i będziemy się widywać w PIĄTKI o godz. 13:00 (sala 1064, Kampus, Wydział Fizyki – wiadomo).

(c) K. G. 2019

Line Follower — własne podwozie

Byłem zmuszony odwołać dzisiejsze zajęcia (natłok pracy przed końcem roku! przepraszam).

Pan Bartek pobawił się w zaprojektowanie podwozia (blender.org) i oto jego rezultaty:

A co to ten wystający „pypeć”? To trzecie koło 😉 taki ślizgacz (z założenia pojazd ma poruszać się równej nawierzchni, stole, podłodze z namalowaną/przyklejoną czarną linią). Pan Bartek nie lubi kręcić (kołami), dlatego je zakleja lub produkuje „pypcie” 😉

Mamy lekkie kłopoty z naszą drukarką Zoltrax Z200, więc wydruk nie wyszedł jak należy… ale ciągle nadaje się do wykorzystania!

Po Świętach zobaczymy, jak to wszystko działa w praktyce! A skoro o Świętach mowa, to życzę Wszystkiego najlepszego każdemu Fi-BOTowiczowi. Do zobaczenia po przerwie (8 styczeń).

(c) K.G. 2018

Maskotka, Line Follower oraz podstawy

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

Pojazd (autonomiczny), refleks (LEDy + przyciski) oraz line follower

Ciągle dwa/trzy niezależne projekty. Wygląda na to, że będą jednak trzy, bo Pan Bartek „atakuje” temat line followera (świetnie!)

1) zespół od pojazdu po sukcesie sterowania pojazdem przez człowieka (bluetooth) poznawał temat czujki odległości HC-SR04. Zamontowali już nawet „trzymak” w pojeździe – bez użycia wkrętaki! zuchy! 😉 Tak, tak – to „oklepany” układ, ale każdy od czegoś zaczyna – prawda? Trzymam więc kciuki za poprawne oprogramowanie go w pojeździe i zrobienie autonomicznego robota (poruszającego się bez ingerencji człowieka, w tym przypadku: wykrywającego kolizje i zmieniającego kierunek ruchu).

2) „refleks” przeszedł w stan rozbudowany i teraz składa się z 3 losowo zapalanych LEDów, i łapaniu reakcji przez 3 przyciski. Układ:

oraz program (+dużo komentarzy):

//piny z podlaczonymi przyciskami
int btn[]={2,4,6};
//piny z podlaczonymi ledami
int led[]={3,5,7};

void setup() {
  Serial.begin(9600);
  for (int i=0; i<3; i++){
    pinMode(btn[i],INPUT_PULLUP);
    pinMode(led[i], OUTPUT);
  }
}

unsigned int i;
unsigned int cr,tstart,tstop;
byte bt1, bt2, bt3, LOS;

void loop() {
  //"dysko-mode" informujace o poczatku rozgrywki
  for(i=0;i<3;i++){
        digitalWrite(led[0], HIGH);
        delay(100);
        digitalWrite(led[1], HIGH);
        digitalWrite(led[0], LOW);
        delay(100);
        digitalWrite(led[2], HIGH);
        digitalWrite(led[1], LOW);
        delay(100);
        digitalWrite(led[2], LOW);
        delay(100);
    }//"dysko-mode"
      
   //(pseudo)losowe czekanie: od 1s do 5s
   delay(random(1000,5000));

   //wybor LEDa do zaswiecenia: 1,2 lub 3
   LOS=random(1,4);
   
   //wersja tylko do testow: wypisywanie na ekran losowania
   Serial.print("LOS=");
   Serial.println(LOS);

   //wlaczenie wylosowanego LEDa     
   //dzieki zapisaniu numerow pin-ow do tablicy jest to teraz bardzo proste!
   digitalWrite(led[LOS-1], HIGH);

   //rozpoczecie mierzenia czasu
   tstart = millis();
       
   //czekanie na rekacje uzytkownika - wcisniecie jednego z trzech pyrzycsikow
   //zapamietujemy w zmiennych, ktore przyciski sa wcisniete
   do{                
       bt1 = digitalRead(btn[0]);
       bt2 = digitalRead(btn[1]);
       bt3 = digitalRead(btn[2]);                
   }while(bt1+bt2+bt3==0); //petla wykonuje sie tak dlugo, az przynajmniej jeden z przyciskow zostanie wcisniety                          

   //zatrzymanie "stopera" skoro cos zostalo wcisniete
   tstop = millis();
   digitalWrite(led[LOS-1], LOW);     

   //okreslenie poprawnosci wcisniecia przycisku:
   //zakladamy, ze zle wcisniety przycisk (tak wygodniej)
   bool ok=false;   //czy wygralem? 

   //sprawdzenie, czy moze jednak zostal wcisniety odpowieni przycisk
   switch(LOS){
      case 1: if ((bt1==1)&&(bt2==0)&&(bt3==0)) ok=true;break;
      case 2: if ((bt2==1)&&(bt1==0)&&(bt3==0)) ok=true;break;
      case 3: if ((bt3==1)&&(bt1==0)&&(bt2==0)) ok=true;break;
    }//swicth

    //jesli wygrales, to stosowny komunikat
    if (ok){    
      cr = tstop-tstart; //cr = "czas rekacji"
      Serial.print("brako! gratulacje! ");    
      Serial.print("czas reakcji:");
      Serial.println(cr);
    }//ok==true
    else{    
      Serial.println("pudło! nie ten przycisk!");    
    }     
    delay(1000);
}//loop
         
        



Można jeszcze popracować nad tym kodem – można dodać kolejny (inny) „dysko-mode” informujące, że się poprawnie wybrało przycisk, albo zaświecić wszystkimi LED-ami, gdy użytkownik „spudłował”. W przyszłości dodamy do układu wyświetlacz LCD aby tam pojawił się stosowny komunikat, a nie na ekranie podłączonego komputera.

3) na bazie TSOP5000 (kiedyś już ją poznawaliśmy) powstanie czujnik do pojazdu typu line follower – praca się właśnie rozpoczyna. Działa już (podwójny) układ czujników, więc teraz rozpoczął się drugi etap: układ 3/4/5? czujek na własnoręcznej płytce prototypowej + pojazd na sterowniku L298.

Dlaczego własnoręcznie robiona czujka, a nie jedna z „kupnych”, jak te ze zdjęć poniżej?

Odpowiedź jest prosta: bo to fajniejsze i mamy więcej zabawy podczas pracy, a o to właśnie chodzi!

 

KG, 2018

Pojazd (Bluetooth) + podstawy (3xLEDy + 3x przycisk)

Rozwija się projekt POJAZDU, a jednocześnie nauczane są podstawy Arduino (i programowania)…

  1. POJAZD
    1. Sterownik Monster vnh2p30 okazał się uszkodzony! Trudno to było wyczuć, bo z jednej strony działał poprawnie kręcąc silniczkiem w jedną stronę, natomiast w stronę przeciwną – albo wcale, albo baaaardzo powoli. Dlatego odsyłamy sterowniki do sklepu i wracamy do L298 i programujemy sterowanie przez Bluetooth. Pamiętamy o tym, aby nie jeździć na maksa bo ten sterownik przeznaczony jest tylko do pracy z prądami <1A. Na kolejnych zajęciach wrócimy do Monstera – bo mamy ich kilka sztuk a nie wszystkie są niesprawne.

  1. Sterowanie Bluetooth przez aplikację  Android RC działa! gratulacje.
  2. Podstawy Arduino/C/C++ pracujemy….

KG, 2018

Pojazd (pierwsze uruchomienie) + podstawy (LEDy + przycisk)

Rozwija się projekt POJAZDU, a jednocześnie nauczane są podstawy Arduino (i programowania)…

  1. POJAZD
    1. praca nad sterowaniem pojazdem: wykorzystujemy sterownik Monster vnh2p30 o bardzo dobrych parametrach (maksymalny prąd nawet 30A! zasilanie 6-18V) i świetnej cenie (~25 zł). Sterowanie podobne jak w przypadku L298 (za pomocą dwóch sygnałów) – konieczne jest podłączenie sygnału PWM (lub innego pinu z Arduino i włączenie go na stałe na HIGH, czyli PWM=100%). Fajna stronka opisująca co i jak podłączyć – polecam.
    2. Można kupić PODWÓJNY sterownik, ale cena (o dziwo) nie jest już aż tak atrakcyjnaZnalezione obrazy dla zapytania monster vnh2p30
  2. PODSTAWY: LEDy + przycisk = REFLEKS. Poznajemy jak odczytać stan przycisku – małe wyzwanie: program REFLEKS: LED zapali się po losowym czasie, naszym zadaniem jest jak najszybsze wciśnięcie przycisku od razu po zaświeceniu LEDa. Mierzymy czas reakcji człowieka.  Ciągle polecam wirtualne Arduino do zabawy w domu!
  3. Poznaliśmy OPTYCZNY czujnik odległości E18-D80NK (5V, zakres 3-80cm, nie dźwiękowy!) – prosty w użyciu, a niedługo do wykorzystania w projekcie Pojazdu.

KG, 2018

Pojazd (mechanika + pierwsze uruchomienie) + podstawy (LEDy)

Rozwija się projekt POJAZDU, a jednocześnie nauczane są podstawy Arduino (i programowania) – jest więc mały chaos…

  1. POJAZD
    1. konstrukcja: podstawa z płyty wiórowej 18mm wymieniona na sklejkę 10mm, czyli cieńszą, aby koła pojazdy miały większy „prześwit”
    2. silniki to Pollolu 37Dx70L z wbudowanym enkoderem – silnik ma przekładnię 70:1 dzięki której na dość małych obrotach (150 obr/min) uzyskuje  moment obrotowy 1,39 Nm (co oznacza 14 kg*cm). Dodatkowo możemy oprogramować enkoder kwadraturowy o rozdzielczości 64 impulsy na obrót (po przełożeniu 4480 impulsów na obrót).
    3. Zasilanie silnika to 6V do 12V – co przekłada się odpowiednio na na obroty: 75 rpm do 150 rpm i na pobór prądu: średniego 250/300mA i maksymalnego 2.5A/5A. Widać, że będziemy potrzebować mocnego sterownika do tych silników (typowy L298 da radę z maksymalnie 1A – tylko!)
    4. Koło do tego silnika to oryginalne Pollolu 12cm
    5. Mocowanie silnika to wydrukowane w 3D na uczelnianej drukarce „chwytaki” (projekt własny):
  2. PODSTAWY: LEDy, czyli poznajemy jak włączać/wyłączać napięcie na pinach Arduino. Polecam wirtualne Arduino do zabawy w domu.

KG, 2018

Transoptor szczelinowy (czujnik szczelinowy)

Słowem wstępu…

Nasz Fi-Bot’owy zespół wciąż pracuje nad swoimi pojazdami. Podzieleni w pary wciąż ulepszamy swoje maszyny dodając kolejne części i klepiąc nowe linijki kodu.

Tym razem przyszedł czas na rozwiązanie problemu zliczania obrotów kół, tak aby można było lepiej sprawdzać i kontrolować prędkość naszego pojazdu.

Z pomocą przyszedł nam właśnie…

Transoptor Szczelinowy

Jak działa to wspaniałe urządzenie? (już wcześniej się bawiliśmy takim modułem – wyznaczając wartość przyspieszenia ziemskiego).

Na samym początku potrzebowaliśmy kółka zębatego (poniżej: wydrukowane w 3D), które ma dokładnie 16 ząbków i które umieszczamy na osi obrotowej naszego koła(silniczek ma wał obrotowy po dwóch stronach). Następnie zamontowaliśmy czujnik szczelinowy tak, aby kółko zębate znajdowało się między nim.

Poniżej wykorzystałem moje ponad przeciętne zdolności artystyczne aby lepiej Wam to zobrazować. Kółko obracając się raz po raz przesłania wiązkę światła emitowanego z transoptora (a dokładniej z diody) i sygnał ten nie trafia do bramki – mamy stan wysoki (logiczną jedynkę), pokazuje to górny rysunek (lewa strona), albo przepuszcza wiązkę i mamy wówczas stan nisko (czyli zero, prawy obrazek). Obracając się mamy szereg stanów wysokich i niskich na wyjściu z transoptora.

Transoptor szczelinowy mówiąc łopatologicznie sprawdza czy między nim coś jest, lub nie ma. Jeżeli nasze koło się obraca, a razem z nim oś wraz z zębatką – czujnik szczelinowy jest w stanie odczytać:

  • czy między nim jest ząbek koła – i zwrócić 1
  • czy też ząbka niema – i zwrócić 0

Łatwo możemy więc wywnioskować że jeden obrót koła to „przejście” transoptora po 16 ząbkach koła zębatego.

Niestety nasze urządzenie nie odczyta zmiany stanów w czujniku w ten sposób:

101010101010101010

ponieważ urządzenie to nadaje nam z prędkością nawet do kilku tysięcy stanów na sekundę (w zależności od modelu), więc Arduino odczytywać będzie to mniej więcej tak:

0000000000011111111111111100000000000000111111111111111111111100000000

gdzie '1′ oczywiście znaczy, że w danej chwili ząbek jest między szczeliną, a '0′ że go nie ma.

Tak więc do zliczania obrotów musieliśmy napisać swój program. Na tym zakończy się teoria a zacznie się…

 

Transoptor w praktyce

Jeżeli chodzi o podłączenie modułu do Arduino to nie sprawia to większych trudności. Zasilanie modułu podpinamy pod pin z napięciem 5V, uziemienie do GND, natomiast ostatni kabelek wędruje pod wybrany przez nas pin cyfrowy. W moim przypadku był to pin z numerem 7.

Przejdźmy więc do pisania kodu 😉

Oczywiście pomysłów na rozwiązanie tego problemu jak i wykonanie i działanie samego programu było kilka, ja zamieszczam pod spodem swoją wersje.

void setup() {
  pinMode(7,INPUT);
  Serial.begin(9600);
}

bool zn;
bool temp=0;
int rotates=0;
int indents=0;

void loop() {
  zn = digitalRead(7);
  if(zn>temp)
  {
    indents++;
    temp=zn;
    Serial.print(rotates);
    Serial.print(" rotates ");
    Serial.print(indents);
    Serial.println(" indents");
  }
  else
  {
    temp=zn;
  }
  if(indents==16)
  {
    rotates++;
    indents=0;
  }
}

Na początku:

  1. w funkcji setup ustawiamy tryb wybranego przez nas pinu na input – czyli tryb wejścia, ponieważ dane będą wchodzić przez niego do naszego Arduino. Robimy to za pomocą funkcji pinMode(7, INPUT)
  2. uruchamiamy komunikacje szeregową z komputerem za pomocą funkcji Serial.begin(9600) – to właśnie na naszym monitorze będziemy odczytywać liczbę obrotów koła

Zanim jeszcze wejdziemy do naszej głównej pętli wprowadziłem potrzebne zmienne:

  1. bool zn – zmienna zn (od słowa znak) będzie przechowywać aktualny stan podawany przez czujnik. Typ zmiennych 'bool’ nadaje się do tego idealnie bo przechowuje On tylko 1 lub 0 – inaczej prawda lub fałsz.
  2. bool temp – zmienna temp (od słowa ang. temporary – tymczasowy) będzie zmienną pomocniczą. Na początku musimy przypisać jej wartość '0′, jednak jej działanie opiszę dokładniej później.
  3. int rotates – zmienna rotates (od słowa ang. rotations – obroty) jak sama nazwa wskazuje będzie przechowywać liczbę aktualnie zliczonych obrotów. Na początku będzie ich oczywiście 0.
  4. int indents – zmienna indents (od słowa ang. indents – wcięcie) będzie przechowywać liczbę zliczonych ząbków.  Na początku będzie ich oczywiście 0.

Przejdźmy więc do głównej funkcji programu – loop.

Na początku do zmiennej zn wczytujemy stan z czujnika – będzie to stan 1 lub 0 w zależności od tego czy w pozycji startu ząbek akurat jest między czujnikiem czy nie (nie ma to żadnego znaczenia). Używamy do tego funkcji digitalRead(7) gdzie '7′ jest oczywiście numerem naszego pinu.

Następnie pojawia się warunek if – jeżeli nasz wczytany stan zn będzie większy od stanu trzymanego w zmiennej pomocniczej temp – czyli będzie równy 1 – wtedy :

  1. indents ++   – zwiększ liczbę zliczonych ząbków o 1
  2. temp = zn   – zmienna temp przyjmuje wartość zn
  3. wypisz policzone obroty i wcięcia

w przeciwnym przypadku, jeżeli będzie mniejszy lub taki sam, wykonuje się tylko przypisanie wartości temp :

  1. temp = zn   – zmienna temp przyjmuje wartość zn

Co tu się właściwie stało? Tak jak pisałem wcześniej Arduino odczytuje stany czujnika w następujący sposób:

000000001111111111000000000000000111111111111110000001111111111111

Można tu wyróżnić sekwencje zer i jedynek. Sekwencja jedynek oznacza że przez tą krótką chwile czujnik odczytał ząbek między widełkami. Kiedy więc będzie można powiedzieć że ząbek przeskoczył przez czujnik? Wtedy i tylko wtedy gdy transoptor wczyta jedynkę po zerze. Zaczyna się wtedy sekwencja jedynek – ząbek jest chwile między widełkami, następnie znowu sekwencja zer – ząbka brak, i znowu sekwencja jedynek, czyli kolejny ząbek.

000000001111111111000000000000000111111111111110000001111111111111

Załóżmy że program zaczyna się od sekwencji zer – podawane stany będą ciągle zerami. Dopóki aktualny stan nie będzie większy od temp czyli nie będzie wynosił 1 (bo temp przyjmuje wartość '0′ na starcie programu), licznik ząbków nie powiększy się.

Kiedy program natrafi na pierwszą jedynkę – licznik ząbków powiększy się o 1, natomiast zmienna temp która do tej pory trzymała 0, przyjmie wartość 1. Gdy do zmiennej zn zostanie wczytana następna jedynka z sekwencji, licznik nie powiększy się ponieważ nie został spełniony warunek:   zn>temp   –   przecież jedynka nie jest większa od jedynki 😀

I tak w kółko dopóki znów nie zacznie się sekwencja zer – oczywiście warunek dalej nie zostanie spełniony bo 0 tym bardziej nie jest większe od 1, ale za to temp przyjmie wartość 0, tak żeby warunek spełnił się na początku kolejnej sekwencji jedynek i licznik ząbków znów powiększył się o 1.

Ostatnia i niezbędna rzecz w naszym programie – warunek   if (indents==16).

Musimy pamiętać że cały czas dodawaliśmy ząbki koła zębatego, a w sumie jest ich 16. Wnioskując logicznie Arduino musi odczytać te 16 ząbków, po czym:

  1. rotates++   – zwiększyć liczbę obrotów o 1
  2. indents=0   – wyzerować aktualnie zliczone ząbki, ponieważ już zatoczyło się pełne koło. Nasz program będzie je teraz dodawał od nowa.

Podsumowanie

Zakładam że połowa osób przysnęła czytając moje wypociny, dlatego zachęcam do samodzielnej zabawy. Na pewno umiejętność używania czujnika szczelinowego przyda się jeszcze nie raz.

Na przyszłych zajęciach będziemy dalej ulepszać nasz pojazd, szczególnie skupimy się na usprawnieniu sterowania 🙂 Zachęcam do bycia na bieżąco.

 

(c) Przemysław Baj 2018

pojazd cz.1

Dziś było więcej mechaniki, niż elektroniki… choć na koniec udało się Wszystkim złożyć swoje pojazdy i uruchomić – gratuluję! Za tydzień sterowanie i pierwsze jazdy próbne 😉

(c) KG 2018