ROBOTICKÉ RAMENO

Vlastimil Vágner

Po delší době jsem se rozhodl sestavit kdysi zakoupenou stavebnici robotnického ramene, jde o stavebnici „4DoF akrylová robotická ruka bez serv“ se čtyřmi servy. Ke stavebnici není dodáván stavební návod na  ALEGRO.CZ v sekci s těmito robotnickými rameny je u uvedeného modelu soubor PDF kde jsou fotografie s postupem sestavení. Na ovládání jsem si napsal program na odzkoušení ovládání serv ramen po sestavení, tak program pro ovládání ramen v automatu, kdy se ramena včetně čelistí na uchopení pohybují dle zadaných hodnot, nebo je možnost ovládání potenciometry. Programy je možné si individuálně upravovat dle potřeby.

STRUČNÝ POPIS STAVEBNICE

Stavebnice obsahuje všechny potřebné díly na sestavení robotnického ramene včetně spojovacího materiálu, pouze je nutné dokoupit čtyři kusy MIKRO SERV SG90. Dále je nutné dokoupit řídící jednotku já jsem použil domácí zásoby ARDUINO NANO a pro něho pak modul ARDUINO NANO IO SHIELD pro jednoduchost zapojení. Díly pro sestavení ramene jdou dobře tzv. vylamovat „vypadávají skoro sami. K servům pokud použijete nové tak doporučuji je před montáží odzkoušet zda jsou funkční v plném rozsahu tj. od 0° do 180°, po namontování a zjištění že servo nefunguje to pak opravdu dost zahýbá s nervy.

POPIS SESTAVENÍ

Po vyjmutí dílů z desky se kterými budeme konkrétně hned pracovat, jako první pokud bude v tomto dílu zašroubován šroubek tak na pracovní ploše, pomocí šroubku opatrně v tomto dílu vyřízneme závit. „Jde to velice dobře ale je lepší nespěchat“ A AŽ POTÉ ODSTRANÍME PAPÍROVÉ KRYTÍ DÍLU, tím zabráníme poškrábání povrchu. Použité délky šroubků jsou dobře popsány v uvedeném souboru PDF  který je dostupný u uvedené stavebnice. Uvedená serva mají označení „servo na otáčení podesty s rameny je označené jako č.1, servo na levé straně ramene má označení servo č.2, (servo jsem si při programování označil jako zadní rameno) servo na pravé straně má označení servo č.3 (servo jsem si při programování označil jako přední rameno) a servo pohybující čelistmi má označení servo č.4. Po vyjmutí všech dílů z desek tyto hned nevyhazujte určitě je použijete jako já, po osazení serva je lepší vždy pořádně zkontrolovat zda se servo hýbe správným směrem. A nakreslit si k tvaru serva s jeho číslem páčku v jaké pozici má hodnotu 0° a hodnotu 180°, vždy je lepší osadit páčku na hřídelku serva a zjistit si správný pohyb tak jak má být v ramenu. Pro toto zkoušení je vhodné si nahrát do ARDUINA program TEST OVLÁDÁNÍ  SERV.INO a na počítači spustit program pro počítač „sériový terminál“ s názvem ARDUINO.EXE. Namontované servo do dílu otestujeme tak že jej připojíme na datový PIN D2 to je PIN který ovládá servo č.1 na desce ARDUINO IO SHIELDU. Ve spuštěném programu ARDUINO.EXE na počítači pak zadáme hodnotu pro hodnotu 180° tj. 180,0,0,0 a odešleme do ARDUINA a servo se vychýlí do zadané hodnoty, poté zadáme hodnoty 0,0,0,0 (stačí myší přepsat hodnotu 180 na hodnotu 0 a opět odešleme do ARDUINA servo se přesune do polohy 0. Takto postupně odzkoušíme všechny namontovaná serva na dílech, u serva č.4 při zadaní hodnoty 180° se musí čelisti otevřít a při zadané hodnotě 160° se musí čelisti zavřít. Tyto hodnoty jak pro otevření tak zavření je nutné odzkoušet pro hodnotu otevření pak stačí hodnota 170°, hodnotu pro zavření postupně snižujeme od hodnoty 170° až dostaneme  čelisti k sobě. Pokud by jsme pro hodnotu zavření čelistí zadali malou hodnotu tak časem zničíme servo, protože servo nemůže tuto hodnotu nikdy dosáhnout když jsou čelisti u sebe. Při hodnotě zavření například 160° a zadaná hodnota by byla například 40°. Po dokončení robotického ramene jsem byl nucen opět demontovat otočnou podestu ramen namontovanou na hřídelce serva č.1, z důvodu velkých výkyvů ramen a nestability celku čímž by došlo k brzkému zničení serva č.1 a pohyb ramen byl nestabilní. Po demontáži jsem ze zbytků od použitých dílů ramene odřízl čtyři kusy plastových proužků upravil dle potřebné délky a tyto nalepil pomocí EPOXYDU  na podestu s namontovaným servem č.1, po vytvrzení lepidla jsem tyto dodatečné díly jemným pilníkem zarovnal tak aby pohyblivý díl nesoucí ramena po nasazení na hřídelku serva č.1 při otáčení nedrhnul, úprava je vyfocena zde v popisu. Vyrobené robotické rameno může být ovládáno ve dvou možnostech pro ovládání pouze v režimu automat tzv. vykonává pohyby pouze v naprogramovaném módu tak jak si jej naprogramujete, nebo může být řídící jednotka osazena společně s potenciometry a pak můžeme s použitým programem ovládat robotické rameno jak v módu automat tak v módu ručně kdy ovládáme ramena a čelisti pomocí potenciometrů. Připojení serv a potenciometrů je na přiložených obrázcích, vzhledem k tomu že je v pohybu vždy pouze jedno servo postačuje napájení serv z desky ARDUINO NANO která je napájena z regulovatelného zdroje napětím  DC 9V/1A.  

POPIS PROGRAMŮ

Programy jsou uloženy v adresáři PROGRAMY pro ARDUINO jsou celkem tři s názvy „ROBOTICKÉ RAMENO_AUT_RUČ, TEST_OVLÁDÁNÍ_SERV a AUTOMAT_ROBOTICKÉ_RAMENO“. Pro počítač je program ARDUINO.EXE jde o terminálový program pro komunikaci s mikroprocesory. Jde o velice jednoduché programy pro ovládání robotického ramene, všechny programy pro ARUINO NANO (UNO) při inicializaci nastavují servo č.1, servo č.2, servo č.3 do počáteční hodnoty 90° servo č.4 je nastaveno do polohy 170° otevřené čelisti. Program ROBOTICKÉ RAMENO_AUT_RUČ je určen dle volby vypínače automat – ručně na ovládání ramene tuto volíme před zapnutím napájení elektroniky, program AUTOMAT_ROBOTICKÉ_RAMENO ovládá rameno dle naprogramovaného režimu. Program TEST_OVLÁDÁNÍ_SERV je určen k oživení ramene a zjištění hodnot serv do kterých se mohou MAXIMÁLNĚ POHYBOVAT SERVA, součástí programu pro počítač ARDUINO.EXE je v adresáři i soubor PDF s popisem ovládání a zadávání hodnot. Ke stažení je na konci článku – SERIOVY_TERMINAL.

OŽIVENÍ ROBOTICKÉHO RAMENE

Do ARDUINA nahrajeme program TEST_OVLÁDÁNÍ_SERV  připojíme serva dle nákresu zde v popisu, servo č.1 připojíme na datový PIN D2, servo č.2 připojíme na datový PIN D5, servo č.3 připojíme na datový PIN D3 a servo č.4 připojíme na datový PIN D4. Pokud máme osazeny i potenciometry pro ruční ovládání TYTO ZATÍM NEPŘIPOJUJEME K ARDUINO IO SHIELDU, na počítači spustíme program ARDUINO.EXE dle návodu zadáme parametry komunikační sériový port COM, komunikační rychlost pokud je jiná než 9600Bd a spustíme komunikaci. Nyní zapneme napájení ARDUINA a serva č.1, č.2, č.3 se po inicializaci nastaví sama do výchozích poloh 90° a servo čelistí do polohy 180° čelisti otevřeny. Nyní v textovém okně sériového terminálu Arduino.exe pro odesílání dat zadáme hodnoty 90,100,100,180 a kliknutím na tlačítko odeslat je odešleme do ARDUINA servo č.1 zůstane v poloze 90, servo č.2 se přesune do polohy 100, servo č.3 se také přesune do polohy 100, a servo č.4 zůstane ve stejné poloze. V okně příjem dat textového editoru se postupně zobrazí zadané hodnoty, hodnoty odeslané tak přijaté je možné si uložit pro pozdější zadání hodnot v programech ROBOTICKÉ RAMENO_AUT_RUČ, i v programu AUTOMAT_ROBOTICKÉ:RAMENO pokud již zadané hodnoty poloh serv bude nutno upravit dle hodnot zjištěných při oživování. Hodnoty v pořadí ovládají serva první zadaná hodnota ovládá servo č.1 podesta ramene, druhá  hodnota ovládá servo č.2 „zadní rameno“, třetí zadaná hodnota ovládá servo č.3 „přední rameno“ a čtvrtá hodnota ovládá servo č.4 otvírání – zavírání čelistí. Postupným zadáváním hodnot zjistíme krajní polohy všech serv HODNOTY PRO SERVA ZADÁVÁME V MENŠÍCH HODNOTÁCH PROTOŽE SE SERVA POHYBUJÍ RYCHLE. Stejně postupujeme při zadávání jiných hodnot pro automatický režim což je pak již programování robotického ramene. Po odzkoušení funkčnosti ramene vypneme napájení ramene ukončíme program na počítači ARDUINO.EXE  a k ARDUINO IO SHIELDU připojíme potenciometry u kterých pak otočíme hřídelky do ¼ od krajního vývodu „G“. Do ARDUINA nahrajeme program ROBOTICKÉ RAMENO_AUT_RUČ a přepnutí vypínače do polohy ručně, můžeme pomalým otáčením hřídelek potenciometrů ovládat serva. Potenciometr č.1 je připojen ke vstupu A0 a ovládá servo č.1 otáčení podesty, potenciometr č.2 je připojen ke vstupu A1 a ovládá servo č.2 zadní rameno, potenciometr č.3 je připojen ke vstupu A2 a ovládá servo č.3 přední rameno a potenciometr č.4 je připojen ke vstupu A3 a ovládá servo č.4 čelisti. Pokud není potřeba měnit parametry krajních poloh serv v části programu ROBOTICKÉ RAMENO_AUT_RUČ pro automatický režim a je možné rameno provozovat s již zadanými hodnotami pak vypneme napájení ARDUINA a vypínač volby automat – ručně přepneme do polohy automat a odzkoušíme i tuto funkci tím je oživení ukončeno a další provoz je již individuální.

Díly stevebnice:

díly se zašroubovanými šroubky
pohyblivý díl s rameny
spodní díl podesty s nalepenými proužky proti výkyvům pohyblivého dílu
detail nalepených proužků na spodním dílu
spodní díl podesty se základnou
pohon zadního ramene servo č.2
pohon předního ramene servo č.3
detail smontovaných čelistí pohled ze spodu
rameno s namontovaným servem čelistí
osazená řídící deska ARDUINO IO SHIELD s ARDUINO NANO na desce
připojené napájení do řídící jednotky
sestavený model robotického ramene

SOFTWARE

/* Program pro ovladani serv  
 * stavebnice robotickeho ramene 
 * s automatickym chodem
 * mojeelektronika.mzf.cz
 * vagnervlastimil@seznam.cz
*/ 

#include <Servo.h>                           // prihrani knihovny pro ovladani serv
Servo Servo1;                                // nadefinovani jmen serv ovladajicich rameno
Servo Servo2;                                // nadefinovani jmen serv ovladajicich rameno
Servo Servo3;                                // nadefinovani jmen serv ovladajicich rameno
Servo Servo4;                                // nadefinovani jmen serv ovladajicich rameno
int pozice1=90,pozice2=90,pozice3=90,pozice4=170; // promenne pro hodnoty pozic serva1,serva2,serva3,serva4
                                            
void setup(){                                // zacatek funkce Setup
Servo1.attach(2);                            // Servo1 pripojeno na datovy pin D2
Servo2.attach(5);                            // Servo2 pripojeno na datovy pin D5
Servo3.attach(3);                            // Servo3 pripojeno na datovy pin D3
Servo4.attach(4);                            // Servo4 pripojeno na datovy pin D4
Servo1.write(pozice1);                       // nastaveni pocatecni pozice serva1
delay(50);                                   // casova prodleva
Servo2.write(pozice2);                       // nastaveni pocatecni pozice serva2
delay(50);                                   // casova prodleva
Servo3.write(pozice3);                       // nastaveni pocatecni pozice serva3
delay(50);                                   // casova prodleva
Servo4.write(pozice4);                       // nastaveni pocatecni pozice serva4
delay(50);                                   // casova prodleva
}                                            // konec funkce setup

void loop(){                                 // zacatek hlavni funkce programu
automat();                                   // funkce automat 
}                                            // konec hlavni funkce programu

void automat(){                              // zacatek funkce automat
for(pozice1=90;pozice1>40;pozice1--){        // pohyb serva1 podesta robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo1.write(pozice1);}                      // prikaz pro pohyb serva
for(pozice2=90;pozice2>70;pozice2--){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva
for(pozice2=70;pozice2>55;pozice2--){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva2
for(pozice3=90;pozice3<100;pozice3++){       // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice3=100;pozice3<130;pozice3++){      // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice4=170;pozice4>150;pozice4--){      // pohyb serva4 zavreni celisti 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo4.write(pozice4);}                      // prikaz pro pohyb serva4
delay(1000);                                 // casova prodleva mezi pohyby serv   
// pohyb serv do vychozi polohy 90stupnu
for(pozice3=130;pozice3>90;pozice3--){       // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice2=70;pozice2<90;pozice2++){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomalypohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva2
for(pozice1=40;pozice1<90;pozice1++){        // pohyb serva1 podesta robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo1.write(pozice1);}                      // prikaz pro pohyb serva rameno vychozi poloha
delay(1000);
// rameno vychozi poloha ramen serva2 a serva3 90stupnu nyni pohyb ramen dolu
for(pozice2=90;pozice2>70;pozice2--){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva
for(pozice2=70;pozice2>55;pozice2--){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva2
for(pozice3=90;pozice3<100;pozice3++){       // pohyb serva3 prednirameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice3=100;pozice3<130;pozice3++){      // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice4=150;pozice4<170;pozice4++){      // pohyb serva4 otevreni celisti 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo4.write(pozice4);}                      // prikaz pro pohyb serva4
// ramena dole otevrene celisti nasleduje pohyb serva2 a serva3 zpet do poloh 90stupnu
for(pozice3=130;pozice3>100;pozice3--){      // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice3=100;pozice3>90;pozice3--){       // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice2=55;pozice2<70;pozice2++){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva2
for(pozice2=70;pozice2<90;pozice2++){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva
delay(1000);                                 // casova prodleva clekove ukonceni pohybu ramene
}                                            // konec funkce automat
/* Program pro ovladani serv  
* stavebnice robotickeho ramene 
* s automatickym chodem, program
* pripraven pro rozsireni na
* ovladani serv pomoci 
* potenciometru staci odremovat
* zaremovane radky 
* mojeelektronika.mzf.cz
* vagnervlastimil@seznam.cz
*/ 
#include <Servo.h>                           // prihrani knihovny pro ovladani serv
Servo Servo1;                                // nadefinovani jmen serv ovladajicich rameno
Servo Servo2;                                // nadefinovani jmen serv ovladajicich rameno
Servo Servo3;                                // nadefinovani jmen serv ovladajicich rameno
Servo Servo4;                                // nadefinovani jmen serv ovladajicich rameno
int pozice1=90,pozice2=90,pozice3=90,pozice4=170; // promenne pro hodnoty pozic serva1,serva2,serva3,serva4
int pot1=A0,pot2=A1,pot3=A2,pot4=A3;         // pripojeni ovladacich potenciometru ke vstupum A0-A3   
byte volba=6;                                // pripojeni prepinace automat rucne k pinu D6
void setup(){                                // zacatek funkce Setup
pinMode(pot1,INPUT);                         // nastaveni vstupu PINU A0
pinMode(pot2,INPUT);                         // nastaveni vstupu PINU A1
pinMode(pot3,INPUT);                         // nastaveni vstupu PINU A2
pinMode(pot4,INPUT);                         // nastaveni vstupu PINU A3
pinMode(volba,INPUT);                        // nastaveni pinu D6 na vstup  
Servo1.attach(2);                            // Servo1 pripojeno na datovy pin D2
Servo2.attach(5);                            // Servo2 pripojeno na datovy pin D5
Servo3.attach(3);                            // Servo3 pripojeno na datovy pin D3
Servo4.attach(4);                            // Servo4 pripojeno na datovy pin D4
Servo1.write(pozice1);                       // nastaveni pocatecni pozice serva1
delay(50);                                   // casova prodleva
Servo2.write(pozice2);                       // nastaveni pocatecni pozice serva2
delay(50);                                   // casova prodleva
Servo3.write(pozice3);                       // nastaveni pocatecni pozice serva3
delay(50);                                   // casova prodleva
Servo4.write(pozice4);                       // nastaveni pocatecni pozice serva4
delay(50);                                   // casova prodleva
}                                            // konec funkce setup
void loop(){                                 // zacatek hlavni funkce programu
automat();                                   // funkce automat pri pouzivani rucne-automat radek smazat 
/*                                           // zacatek zaremovanych radku pro volbu automat-rucne
if (volba==0){                               // test pinu D6 zda je rovno "0" pokud ano tak automat
automat();                                   // funkce automat  
}                                            // konec testu tlacitka pinD6 roven "0"
if (volba==1){                               // test ponu D6 zda je rovno "1" pokud ano tak rucne                        
rucne();                                     // funkce rucne
}                                            // konec testu tlacitka pinD6 roven "1"
// konec zaremovanych radku pro volbu automat-rucne
*/
}                                            // konec hlavni funkce programu
void automat(){                              // zacatek funkce automat
for(pozice1=90;pozice1>40;pozice1--){        // pohyb serva1 podesta robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo1.write(pozice1);}                      // prikaz pro pohyb serva
for(pozice2=90;pozice2>70;pozice2--){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva
for(pozice2=70;pozice2>55;pozice2--){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva2
for(pozice3=90;pozice3<100;pozice3++){       // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice3=100;pozice3<130;pozice3++){      // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice4=170;pozice4>150;pozice4--){      // pohyb serva4 zavreni celisti 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo4.write(pozice4);}                      // prikaz pro pohyb serva4
delay(1000);                                 // casova prodleva mezi pohyby serv   
// pohyb serv do vychozi polohy 90stupnu
for(pozice3=130;pozice3>90;pozice3--){       // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice2=70;pozice2<90;pozice2++){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva2
for(pozice1=40;pozice1<90;pozice1++){        // pohyb serva1 podesta robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo1.write(pozice1);}                      // prikaz pro pohyb serva rameno vychozi poloha
delay(1000);                                 // casova prodleva pred dalsim pohybem
// rameno vychozi poloha ramen serva2 a serva3 90stupnu nyni pohyb ramen dolu
for(pozice2=90;pozice2>70;pozice2--){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva
for(pozice2=70;pozice2>55;pozice2--){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva2
for(pozice3=90;pozice3<100;pozice3++){       // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice3=100;pozice3<130;pozice3++){      // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice4=150;pozice4<170;pozice4++){      // pohyb serva4 otevreni celisti 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo4.write(pozice4);}                      // prikaz pro pohyb serva4
// ramena dole otevrene celisti nasleduje pohyb serva2 a serva3 zpet do poloh 90stupnu
for(pozice3=130;pozice3>100;pozice3--){      // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice3=100;pozice3>90;pozice3--){       // pohyb serva3 predni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo3.write(pozice3);}                      // prikaz pro pohyb serva3
for(pozice2=55;pozice2<70;pozice2++){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva2
for(pozice2=70;pozice2<90;pozice2++){        // pohyb serva2 zadni rameno robota 
delay(20);                                   // casova prodleva pro pomaly pohyb serva 
Servo2.write(pozice2);}                      // prikaz pro pohyb serva
delay(1000);                                 // casova prodleva clekove ukonceni pohybu ramene
}                                            // konec funkce automat
/*                                           // zacatek zaremovane funkce rucne pri pouziti funkce odremovat
void rucne(){                                // zacatek funkce rucne
pot1=analogRead(pot1);                       // nacteni hodnoty potenciometru vstupu A0 
pot1=map(pot1,0,1023,0,180);                 // vypocet polohy serva1
Servo1.write(pot1);                          // nastaveni pozice serva1 dle vypoctu
delay(10);                                   // casova prodleva
pot1=0;                                      // prirazeni hodnoty "0" do pot1
// Servo cislo 2
pot2=analogRead(pot2);                       // nacteni hodnoty potenciometru vstupu A1  
pot2=map(pot2,0,1023,0,180);                 // vypocet polohy serva2
Servo2.write(pot2);                          // nastaveni pozice serva2 dle vypoctu
delay(10);                                   // casova prodleva
pot2=0;                                      // prirazeni hodnoty "0" do pot2     
// Servo cislo 3
pot3=analogRead(pot3);                       // nacteni hodnoty potenciometru vstupu A2 
pot3=map(pot3,0,1023,0,180);                 // vypocet polohy serva3
Servo3.write(pot3);                          // nastaveni pozice serva3 dle vypoctu
delay(10);                                   // casova prodleva
pot3=0;                                      // prirazeni hodnoty "0" do pot3   
// Servo cislo 4
pot4=analogRead(pot4);                       // nacteni hodnoty potenciometru vstupu A3 
pot4=map(pot4,0,1023,0,180);                 // vypocet polohy serva4
Servo4.write(pot4);                          // nastaveni pozice serva4 dle vypoctu
delay(10);                                   // casova prodleva
pot4=0;                                      // prirazeni hodnoty "0" do pot4  
}                                            // konec funkce volby rucne
// konec zaremovaneho radku funkce rucne pri pouziti funkce odremovat
*/
/* Program na odzkoseni ovladani serv 
* robotickeho ramene a zjisteni hodnot 
* pro pohyb serv.
* mojeelektronika.mzf.cz
* vagnervlastimil@seznam.cz
*/
#include <Servo.h>                        // prihrani knihovny pro ovladani serv
Servo Servo1,Servo2,Servo3,Servo4;        // nadefinovani jmen a poctu serv 
int pozice1=90;                           // promenna pro hodnotu pozice serva1
int pozice2=90;                           // promenna pro hodnotu pozice serva2
int pozice3=90;                           // promenna pro hodnotu pozice serva3
int pozice4=180;                          // promenna pro hodnotu pozice serva4
void setup(){                             // Setup
Serial.begin(9600);                       // nastaveni komunikacni rychlosti
Servo1.attach(2);                         // Servo1 pripojeno na datovy pin D2
Servo2.attach(5);                         // Servo2 pripojeno na datovy pin D5
Servo3.attach(3);                         // Servo3 pripojeno na datovy pin D3
Servo4.attach(4);                         // Servo4 pripojeno na datovy pin D4
Servo1.write(pozice1);                    // odeslani hodnoty pozice1 do serva1
delay(50);                                // casova prodleva
Servo2.write(pozice2);                    // odeslani hodnoty pozice2 do serva2
delay(50);                                // casova prodleva
Servo3.write(pozice3);                    // odeslani hodnoty pozice3 do serva3
delay(50);                                // casova prodleva
Servo4.write(pozice4);                    // odeslani hodnoty pozice4 do serva4
delay(50);                                // casova prodleva
}                                         // konec funkce Setup
void loop(){                              // zacatek hlavni smycky programu
if (Serial.available()>0){                // testuje se vstup zda prisli data
pozice1 = Serial.parseInt();              // prvni nactena hodnota se ulozi do pozice1
pozice2 = Serial.parseInt();              // druha nactena hodnota se ulozi do pozice2
pozice3 = Serial.parseInt();              // treti nactena hodnota se ulozi do pozice3
pozice4 = Serial.parseInt();              // ctvrta nactena hodnota se ulozi do pozice4 
delay(20);                                // casova prodleva
Servo1.write(pozice1);                    // odeslani nactene hodnoty do serva1
delay(50);                                // casova prodleva
Servo2.write(pozice2);                    // odeslani nactene hodnoty do serva2  
delay(50);                                // casova prodleva
Servo3.write(pozice3);                    // odeslani nactene hodnoty do serva3  
delay(50);                                // casova prodleva
Servo4.write(pozice4);                    // odeslani nactene hodnoty do serva4
delay(50);                                // casova prodleva  
Serial.print("Pozice serva_1 = ");        // zobrazeni popisu pozice serva_1 na PC
Serial.println(pozice1);                  // zobrazeni nactene hodnoty pozice1 na PC
Serial.print("Pozice serva_2 = ");        // zobrazeni popisu pozice serva_2 na PC
Serial.println(pozice2);                  // zobrazeni nactene hodnoty pozice2 na PC           
Serial.print("Pozice serva_3 = ");        // zobrazeni popisu pozice serva_3 na PC
Serial.println(pozice3);                  // zobrazeni nactene hodnoty pozice3 na PC  
Serial.print("Pozice serva_4 = ");        // zobrazeni popisu pozice serva_4 na PC 
Serial.println(pozice4);                  // zobrazeni nactene hodnoty pozice4 na PC  
}                                         // konec smycky IF
delay(3000);                              // casova prodleva pred dalsim nacitanim a pohybem serv
}                                         // konec hlavni smycky

Sdílet článek

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Mohlo by se také líbit

Nejčtenější články