Arduino roboty - kroužek

Arduino

  1. https://www.arduino.cc/ 
  2. Průvodce světem Arduina - kniha volně ke stažení v češtině
  3. Hardware
  4. Software - Arduino IDE - jazyk Wiring (vychází z C++)
    • download + instalace
    • napojení Arduina přes USB, kontrola portu
    • program - setup, loop, nastavení vstupů/výstupů, knihovny funkcí
    • kontrola syntaxe, kompilace, přenos do Arduina
    • další SW - simulace TinkerCAD, tvorba dokumentace Fritzing
  5. Další zdroje - Zdroje (Arduino, robotický fotbal)

Arduino - vybavení ve škole

Úkoly s robotickým autem (MyBot)

  1. Popis - robotické auto - krokové motory, drivery, Arduino Uno, membránová klávesnice 4x4, kola, spojky, vytisknuté plastové díly, šrouby M3x10 a matice M3
  2. Sestavení auta - postup v obrázku, zapojení Arduina
  3. ZŠ + kroužek - Auto s programováním 16 tlačítky (A/B - dopředu/dozadu + vzdálenost v cm (do 100), C/D - vpravo/vlevo systém tank + úhel ve stupních do 359°, * - Start, # - Reset, 0 - přerušení programu)
    • zjištění přesnosti pohybu (pozor na rozdílné natočení vpravo/vlevo při stejném úhlu)
    • nacvičení - dopředu, dozadu, zatočit, dopředu, dozadu
    • Playground1 - shození kostek domina, návrat do garáže
    • možno zapojit serial monitor a sledovat zadávané hodnoty, také čas doby programu
    • možno poslat program do Arduina přes sériový monitor (napsat program + Pošli, pak na autě kód D500 + *)
  4. Další možnosti pro kroužek
    • rozbor programu
    • monitorování v Putty
    • přidání zvukového signálu
    • přidání LED
    • dálkové ovládání IR
    • dálkové ovládání Bluetooth
    • digitální kompas - zpětná vazba pro přesné natočení
  5. Auto se snímačem čáry - zapnutí režimu zvoleným kódem (laskarduino - dokumentace snímače, hw kitchen - popis snímače, arduino-shop - příklad - použít analogový vstup?)
    • Montáž snímače, zapojení na A4 nebo A5
    • 1. Pohyb dokud je auto na černé čáře (start na černé)
    • 2. Sledování čáry (start na černé?)
    • 3. Start z bílé, nalezení čáry, sledování
    • 4. Sekačka na trávu (robot vysavač) – pohyb uvnitř uzavřené čáry, při nalezení čáry stop, zpět, otočení a další pohyb
    • 5. Sekačka – vyzkoušet černé překážky v ploše
    • 6. Sekačka – změna chování – u překážky otočení o náhodný úhel
  6. Auto s ultrazvukovým snímačem
  7. Auto s IR snímačem překážky
  8. Fotbalový robot
    • 1. Detekce míče (míč vkládán mezi čelisti)
    • 2. Kopací mechanismus při detekci míče
    • 3. Pohyb po čáře a na konci kopnutí na branku (míč vkládán předtím na určenou pozici)
    • 4. Hledání míče na ploše Robotická ruka

_

0-0

Komponenty:

a1 Propojit podle schématu (kratší nožka LED se zapojuje na GND) - obr.
a2 Propojit Arduino s PC USB kabelem
a3 Pokračovat v Arduino IDE:
nastavit typ Arduina (Nástroje - Vývojová deska),
nastavit port (Nástroje - Port),
otestovat dostupnost Arduina (Nástroje - Získat informace o desce)
a4 Základy syntaxe - komentáře, funkce, proměnné lokální/globální, typy dat
a5 Kostra programu pro Arduino:
void setup() {//provede se jednou po zapnutí}
void loop() {//provádí se opakovaně do vypnutí}
a6 Dále zapisovat program do nového programu:
nastavení výstupního pinu před setup():
// čísla pinů pro digitální výstupy
cconst int ledPin = 8;
a7 Do setup() vložit:
// inicializace digitálních výstupů
pinMode(ledPin, OUTPUT);
a8 Do loop() vložit blikání LED:
// loop se opakuje pořád dokola
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
a9 Uložte projekt do složky c:\Temp jako led_test.ino - vytvoří se i nová složka
a10 Zkontrolujte a zkompilujte program (první ikona nebo Ctrl+R)
a11 Přeneste program do Arduina (druhá ikona nebo Ctrl+U) a ověřte funkčnost

_

1-2

Cvičení 1 - krokový motor, membránová klávesnice

a) Krokový motor - komponenty:

a1 Propojit podle schématu - obr.
a2 Propojit Arduino s PC USB kabelem
a3 Arduino IDE - Nástroje - ověřit port
a4 Základy syntaxe - komentáře, funkce, proměnné lokální/globální, typy dat
a5 Kostra programu pro Arduino:
void setup() {//provede se jednou po zapnutí}
void loop() {//provádí se opakovaně do vypnutí}
a6 Nastavení výstupních pinů před setup():
// čísla pinů pro digitální výstupy
const int in1a = 8;
const int in2a = 9;
const int in3a = 10;
const int in4a = 11;
a7 Do setup() vložit:
// inicializace digitálních výstupů
pinMode(in1a, OUTPUT);
pinMode(in2a, OUTPUT);
pinMode(in3a, OUTPUT);
pinMode(in4a, OUTPUT);
a8 Funkce pro kroky motoru:
// každý krok obsahuje výrobcem dané pořadí
// pro správné spínání motoru a následnou
// pauzu, kterou určujeme rychlost otáčení
void krok1(){ digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); delay(rychlost); }
void krok2(){ digitalWrite(in1, HIGH); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, LOW); delay(rychlost); }
void krok3(){ digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, LOW); delay(rychlost); }
void krok4(){ digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); delay(rychlost); }
void krok5(){ digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); delay(rychlost); }
void krok6(){ digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, HIGH); delay(rychlost); }
void krok7(){ digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); delay(rychlost); }
void krok8(){ digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); delay(rychlost); }
a9 Funkce otáčení motoru = posloupnost kroků:
void rotacePoSmeru() { krok1(); krok2(); krok3(); krok4(); krok5(); krok6(); krok7(); krok8(); }
a10 Rotace o 360° = 512 kroků (dáno konstrukcí motoru) - vložit do loop():
for(int i=0;i<512;i++){ rotacePoSmeru(); }
// pauza po dobu 1 vteřiny
ddelay(1000);
a11 Uložte projekt do složky c:\Temp jako krokovy_motor_test.ino - vytvoří se i nová složka
a12 Zkontrolujte a zkompilujte program (první ikona nebo Ctrl+R) - objeví se chyba - proměnná rychlost
a13 Globální proměnná pro nastavení rychlosti:
// proměnná pro nastavení rychlosti, se zvětšujícím se číslem se rychlost zmenšuje

int rychlost = 1;
a14 Zkontrolujte a zkompilujte program, přeneste program do Arduina (druhá ikona nebo Ctrl+U) a ověřte funkčnost
a15 Vytvořte funkci rotaceProtiSmeru() s opačným pořadím kroků a volejte ji z loopu() po pauze (motor se bude točit tam a zpět)

b) Membránová klávesnice 4x4 - komponenty kromě Arduina:

b1 Propojit podle schématu - obr.
b2 Propojit Arduino s PC USB kabelem
b3 stáhnout klavesnice-test-naserver.ino a knihovnu keypad.zip z Výuka\Škrla\arduino
Arduino IDE - Projekt - Přidat knihovnu - Přidat ZIP knihovnu
Manažer knihoven - Projekt - Přidat knihovnu - Spravovat knihovny
b4 Otevřít projekt klavesnice-test.ino
b5 Analýza kódu - připojení knihovny pomocí #include <Keypad.h>
b6 Vytvoření proměnných klávesnice
b7 Setup() - přidání kounikace přes sériový monitor:
// komunikace přes sériovou linku rychlostí 9600 baud
Serial.begin(9600);
Serial.println("Mackej klavesy");
b8 Loop() - do if {} přidat:
Serial.println(klavesa);
b9 Po kompilaci a nahrání do Arduina otestovat klávesnici v otevřeném okně sériového monitoru (ikona úplně vpravo)
b10 Příklad akce podle zmáčknuté klávesy - bude vloženo v if {}:
switch (klavesa) {
case '0': /*zmáčknuta 0*/ break;
case '1': /*zmáčknuta 1*/ break;
default: /*zmáčknuta jiná klávesa*/ break;
}

_

3-4

Cvičení 2 - ultrazvukový snímač vzdálenosti

a) Měření vzdálenosti ultrazvukem

Teorie:

Komponenty:

c1 Propojit podle schématu - obr.
Trig je vysílač zvuku = zapojený na výstup Arduina (output), Echo je přijímač = zapojujeme na vstup (input) - bude nadefinováno v setupu()
c2 Spustit Arduino IDE - nový projekt uložit jako ultrazvuk.ino
Připojit Arduino k PC přes USB
c3 vložit před setup() - místo otazníků doplnit aktuální piny podle zapojení
// piny pro připojení Trig a Echo z modulu (celé číslo -32768 až 32767)
int pTrig = ?;
int pEcho = ?;
// inicializace proměnných, do kterých se uloží data (celé číslo na 4 byty = rozsah -2 147 483 648 až 2 147 483 647)
long odezva, vzdalenost;
c4 Vložit do setup():
// nastavení pinů modulu jako výstup a vstup
pinMode(pTrig, OUTPUT);
pinMode(pEcho, INPUT);
// komunikace přes sériovou linku rychlostí 9600 baud
Serial.begin(9600);
c5 Vložit do loop() - doplnit místo otazníku rychlost zvuku z přípravy výše a tisk výsledku do sériového monitoru (před poslední delay):
// nastavíme na 2 mikrosekundy výstup na GND (pro jistotu)
// poté nastavíme na 5 mikrosekund výstup rovný napájení a poté opět na GND
digitalWrite(pTrig, LOW);
delayMicroseconds(2);
digitalWrite(pTrig, HIGH);
delayMicroseconds(5);
digitalWrite(pTrig, LOW);
// pomocí funkce pulseIn získáme následně délku pulzu v mikrosekundách (us)
odezva = pulseIn(pEcho, HIGH);
// přepočet získaného času na vzdálenost v cm
vzdalenost = ? * odezva/2;
// pauza 0.5 s pro přehledné čtení
delay(500);
c6 Zkontrolujte a zkompilujte program, přeneste program do Arduina (druhá ikona nebo Ctrl+U) a ověřte tisk vzdálenosti - zjistěte max. měřenou vzdálenost

b) Detekce překážky u chytrého auta

d1 Propojit ultrazvukový snímač s vodiči auta podle barev (žlutý Vcc, zelený GND, modrý Echo, oranžový Trig)
d2 Namontovat ultrazvukový snímač dopředu na auto pomocí držáku a šroubků/matic M3
d3 stáhnout krokovemotory-ultrazvuk-naserver.ino z Výuka\Škrla\arduino
a otevřít v Arduino IDE
d4 Do funkce long ZmerVzdalenost(), která vrací vzdálenost změřenou ultrazvukovým snímačem (return vzdalenost;) doplňte měření vzdálenosti - použijte jádro z loop() výše bez posledního delay()
d5 Do loop() doplňte logiku řízení auta podle zelené nápovědy výše
d6 Zkontrolujte a zkompilujte program, přeneste program do Arduina a ověřte funkčnost auta

_

5-6

Cvičení 3 - optický (infračervený) snímač

a) Test optického snímače

Teorie:

Provedení snímače - odkaz

Úkolem je

e1 Propojit podle schématu - obr.
e2 Spustit Arduino IDE - nový projekt uložit jako snimaccary.ino
Připojit Arduino k PC přes USB
e3 vložit před setup() - místo otazníků doplnit aktuální piny podle zapojení:
// čísla pinu připojeného analogového a digitálního vstupu
const int a0 = ?;
const int d0 = ?;
// proměnná pro čtení hodnoty vstupu
int sensorValue = 0;
e4 vložit do setup() a doplňte inicializaci sériového monitoru:
// inicializace obou vstupů
pinMode(?, INPUT);
pinMode(?, INPUT);
e5 do loop() vložte a doplňte výpis hodnot na monitor:
sensorValue = analogRead(a0);
//doplnte tisk hodnoty (svetlost)
sensorValue = digitalRead(d0);
//doplnte tisk hodnoty (pritomnost predmetu)
delay(1000);
e6 Zkontrolujte a zkompilujte program, přeneste program do Arduina (druhá ikona nebo Ctrl+U) a ověřte hodnoty při přiblížení předmětu
e7 Zapište si analogové hodnoty pro bílý a černý povrch papírové předlohy (min/max)

b) Jízda auta po čáře

f1 Připevnit šroubkem a matičkou optický snímač na držák zespodu auta
f2 Napojit vodiče na snímač:
žlutý Vcc, zelený GND, oranžový DO, modrý AO
f3 stáhnout krokovemotory-snimaccary-naserver.ino z Výuka\Škrla\arduino
a otevřít v Arduino IDE
f4 Do loop() doplňte načtení analogové hodnoty snímače a logiku řízení auta podle zelené nápovědy výše
f5 Zkontrolujte a zkompilujte program, přeneste program do Arduina a ověřte funkčnost auta na papírové předloze s černou čarou

_

7-8

Cvičení 4 - serva

a) Programové řízení serva

Teorie:

Komponenty

Cvičení - úkolem je zapojit servo a otáčet s ním od 0 do 180° a zpátky 

g1 Propojit servo a Arduinem podle schématu (červený 5V, hnědý na GND, oranžový na 9) - obr.
g2 Spustit Arduino IDE - nový projekt uložit jako servo.ino
Připojit Arduino k PC přes USB
g3 vložit před setup() - místo otazníků doplnit aktuální piny podle zapojení:
/#include <Servo.h> //knihovna pro ovladani servo motoru
Servo myservo; //kazde servo svou instanci tridy Servo
g4 vložit do setup() a doplnit pin:
myservo.attach(?); //tento motor je připojen na pin ...
g5 vložit do loop() a doplnit smyčku pro změnu úhlu od 0 do 180 a zpátky (hodnota v delay ovlivňuje rychlost pohybu):
myservo.write(uhel); //natočení motoru na aktuální úhel
delay(15);
g6 Zkontrolujte a zkompilujte program, přeneste program do Arduina (druhá ikona nebo Ctrl+U) a ověřte funkci serva

b) Ovládání serva potenciometrem + oddělené napájení

Úkolem je táhnutím potenciometru měnit polohu serva (poloha jezdce potencimetru = poloze hřídele serva)

Další komponenty:

h1 Propojit podle schématu (červený vodič +, černý vodič -) - obr.
- ověřit nastavení výstupního napětí nap. modulu - propojení jumperem na 5V
- do napájecího modulu napojit napájecí zdroj,
- Arduino připojit k PC přes USB
h2 V Arduino IDE upravit předchozí projekt servo.ino
h3 vložit před setup()
int potpin = A0; //pin ke kterému je připojen potenciometr
h4 odstranit předchozí kód v loopu a vložit do loop() - přidat definici proměnných:
napeti = analogRead(potpin); //napětí na potenciometru (0 až 1023)
uhel = map(napeti, 0, 1023, 0, 180); //převod z 0 až 1023 na 0 až 180
myservo.write(uhel); //nastavení polohy podle potenciometru
delay(50); //chvilka čekání než se motor natočí
h5 Zkontrolujte a zkompilujte program, přeneste program do Arduina (druhá ikona nebo Ctrl+U) a ověřte funkci potenciometru a serva - napájecí modul zapínejte jeho vestavěným  vypínačem

c) Pan tilt držák pro otáčení/naklápění ve 2 osách

Úkolem je jedním potenciometrem ovládat natočení a druhým potenciometrem naklopení pan/tilt držáku

Další komponenty

i1 Sešroubovat pan/tilt držák a serva
i2 Vodiči připojit serva na Arduino piny 9 a 10 a potenciometry na A0, A1, napájení připojit přes nepájivé pole
i3 V Arduino IDE upravit předchozí projekt servo.ino pro druhé servo a potenciometr
i4 Ověřit funkčnost posunem potenciometrů

Doplněk - test držáku s IP kamerou:

i5 Přišroubovat IP kameru na držák a zapojit u kamery LAN + napájení
i6 zprovoznění IP kamery - ve VLC playeru otevřít Média - síťový proud a zadat rtsp://192.168.5.101:554/user=admin&password=image147&channel=0&stream=0.sdp? a Přehrát
i7 Ověřit funkčnost posunem potenciometrů

d) Joystick

= 2 otočné potenciometry ovládané páčkou (na analogové vstupy) + tlačítko (na digitální vstup)

Komponenty:

Úkolem je zjistit vracené hodnoty při pohybu páčky joysticku

k1 joystick_test

e) Joystick + pan/tilt se servy

Úkolem je ovládat joystickem obě serva - experimentem nutno ověřit a omezit rozsah natočení serv (pro vyhnutí se kolize s konstrukcí držáku)

m1 joystick_servo

_

x-x

Cvičení 5 - Robotická ruka

Komponenty:

Základem je program pro pan/tilt s 2 servy a joystickem

a) Test knihovny

n1 Zapojit serva do PWM shieldu
n2 robotarm.ino

_

x-x

Cvičení 6 - Web server

Cílem je otestovat činnost web serveru

Komponenty:

Příprava:

Pořadí IP MAC
1 192,168,5,220 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x01
2 192,168,5,221 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x02
3 192,168,5,222 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x03
4 192,168,5,223 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x04
5 192,168,5,224 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x05
6 192,168,5,225 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x06
7 192,168,5,226 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x07
8 192,168,5,227 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x08
9 192,168,5,228 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x09
10 192,168,5,229 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x10
11 192,168,5,90 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x11
12 192,168,5,91 0xD4, 0xAD, 0xBE, 0xEF, 0xFE, 0x12

Cvičení 6a - generování odpovědi web serveru:

a1 Nasadit shield na Arduino (pozor na ohnutí pinů/nožiček)
a2 Propojit shield síťovým kabelem se switchem
a3 Připojit Arduino k PC přes USB
a4 Pokračovat v Arduino IDE - nastavit vývojovou desku (Nástroje - Vývojová deska), nastavit port (Nástroje - Port), otestovat dostupnost Arduina (Nástroje - Získat informace o desce)
a5 Otevřít web_server_naserver.ino - analyzovat kód
a6 V kódu změnit IP adresu, MAC adresu a port web serveru
a7 Doplnit kód pro generování webové stránky <html>...</html>
a8 Přeložit a nahrát program do Arduina
a9 Otestovat dostupnost Arduina po síti přes ping
a10 Otestovat v www prohlížeči funkčnost web serveru (dotaz na zadanou IP adresu)

Cvičení 6b - analýza dotazu prohlížeče:

b1 Uložit předchozí stránku v prohlížeči do souboru html a editovat v PsPadu - analyzovat konce řádků
b2  V Arduino IDE do web_server_naserver.ino přidat řádky (před </body>) pro zrcadlení HTTP dotazu z prohlížeče:
client.print("<p>Delka prectenych dat: ");
client.print(myBufferLength);
client.print("</p><p>Nasleduji prectena data:</p><pre>");
for (int i = 0; i < myBufferLength; i++) { client.print(myBuffer[i]); }
client.print("</pre><p>Konec dat</p>");
b3 Otestovat v www prohlížeči funkčnost a analyzovat data na stránce
b4 Otestovat v jiném prohlížeči

Cvičení 6c - přenos dat z prohlížeče pomocí adresního řádku

c1 V prohlížeči přidejte za stejnou IP adresu Arduino web serveru /?1 a analyzujte vygenerovanou stránku (příkaz GET)
Pozn. Správně by se měl použít způsob HTTP metody get, umožňující přenos více hodnot - např. /?led1=1&led2=1 (tak jak hodnoty předávají serveru formuláře)
c2 V Arduino IDE do web_server_naserver.ino doplňte kód pro simulaci zapnutí/vypnutí LED a ověřte funkčnost:
if(myBuffer[5] == '?'){
switch (myBuffer[6]) {
case '0': client.println("<p>LED Vypnuta</p>"); break;
case '1': client.println("<p>LED Zapnuta</p>"); break;
default: client.println("<p>Chyba: Stav LED neurcen</p>");
} }
c3 Vylepšení - upravte kód, aby v hlavičce stránky byl parametr kódování UTF-8:
<meta charset='utf-8'>

Cvičení 6d - zapnutí/vypnutí LED z prohlížeče:

d1 Podle Cvičení 0 výše zapojte do Arduina LEDku s rezistorem na pin 8
d2 V Arduino IDE do web_server_naserver.ino doplňte kód pro skutečné zapnutí a vypnutí LEDky (použijte příkazy z Cvičení 0) - ověřte funkčnost
d3 Vylepšení - umístěte na stránku odkazy "LED zapnout" a "LED vypnout" a upravte kód, aby odkazy fungovaly (LED se zapne/vypne proklikem odkazu)
d4 Vylepšení - LED se zapne/vypne kliknutím na formulářové zaškrtávátko (inspirace viz www)

Další cvičení:

e1 Automatické obnovování a čas od spuštění podle příkladu v popisu shieldu
e2 Příklad zobrazení analogové hodnoty graficky pomocí AJAX - www

Další:

_

x-x

Auto s DC motory (vyšší rychlost)

Funduino