KURS Dodatkowe materiaÅ‚y na CD/FTP Kurs Arduino (5) ObsÅ‚uga moduÅ‚u manipulatora W EP 6/2011 wÅ›ród miniprojektów opisaliÅ›my moduÅ‚ joysticka dla AVTduino. Może on posÅ‚użyć do budowy manipulatora lub aparatury do zdalnego sterowania modelem czy jakimÅ› urzÄ…dzeniem. W tym artykule zaprezentujemy sposób, w jaki można wykonać program odczytujÄ…cy pozycjÄ™ potencjometrów joysticka, stany przycisków oraz sterujÄ…cy 3 serwomechanizmami modelarskimi. PrzykÅ‚adowy program obsÅ‚ugujÄ…cy mo- duÅ‚ zamieszczono na listingu 1. Jak wspo- mniano, program umożliwia sterowanie 3 serwomechanizmami za pomocÄ… joysticka Dodatkowe materiaÅ‚y na CD/FTP: i przycisków. Serwomechanizm nr 1 porusza pod kÄ…tami z zakresu 0...180°. Do regulacji ftp://ep.com.pl, user: 12040, pass: 15735862 siÄ™ przy pochylaniu joysticka w prawo/lewo, poÅ‚ożenia sÅ‚uży wejÅ›ciowy przebieg PWM. " poprzednie części kursu serwomechanizm nr 2 góra/dół, natomiast W przykÅ‚adowym programie (listingu 1) przyciski SW1 i SW2 umożliwiajÄ… sterowa- w pierwszej kolejnoÅ›ci sÄ… deklarowane 3 nie serwomechanizmem nr 3. zmienne do obsÅ‚ugi serwomechanizmów tj.: do których doÅ‚Ä…czono przyciski oraz diody Po naciÅ›niÄ™ciu przycisku joysticka na- Servo servo1; LED. Porty z doÅ‚Ä…czonymi przyciskami majÄ… stÄ™puje zamiana sposobu regulacji poÅ‚ożenia Servo servo2; zaÅ‚Ä…czone rezystory zasilajÄ…ce ustalajÄ…ce do- serwomechanizmów nr 1 i nr 2. Teraz pochy- Servo servo3; myÅ›lny poziom wysoki na liniach I/O pracu- lanie joysticka na boki powoduje dziaÅ‚anie Za pomocÄ… komendy attach() w proce- jÄ…cych jako wejÅ›ciowe. Za pomocÄ… komendy serwomechanizmu nr 2, natomiast do przo- durze konfiguracyjnej setup() do tych zmien- servo3.write(0) serwomechanizm nr 3 jest du i do tyÅ‚u serwomechanizmu nr 1. nych zostaÅ‚y przypisane piny mikrokontrole- ustawiany w wychyleniu 0°. W pÄ™tli głównej NaciÅ›niÄ™cie przycisku SW1 ustawia ser- ra, do których doÅ‚Ä…czono serwomechanizmy programu za pomocÄ… komend: womechanizm nr 3 w pozycji 0° i powodu- (wyprowadzenia nr 8, 9 i 10): temp1 = analogRead(A0); je zaÅ›wiecenie siÄ™ diody LED1. NaciÅ›niÄ™cie servo1.attach(8); temp2 = analogRead(A1); przycisku SW2 ustawia serwomechanizm servo2.attach(9); jest odczytywana wartość analogowa poÅ‚o- nr 3 w pozycji 180 stopni i jest zaÅ›wiecana servo3.attach(10); żenia joysticka skÅ‚adajÄ…cego siÄ™ z dwóch po- dioda LED2. W tej procedurze również sÄ… konfiguro- tencjometrów, osobnego dla kierunku prawo/ W Å›rodowisku Arduino do obsÅ‚ugi ser- wane parametry portów I/O mikrokontrolera, lewo i góra/dół. WartoÅ›ci poÅ‚ożenia joysticka womechanizmów modelarskich jest prze- Tabela 1. Komedy do obsÅ‚ugi serwomechanizmów modelarskich za pomocÄ… Ardu- znaczona biblioteka o nazwie servo.h. Ma ino ona możliwość jednoczesnej obsÅ‚ugi do 12 Komenda Opis serwomechanizmów, co umożliwia budowÄ™ attach(pin) Konfiguruje wyprowadzenie, do którego doÅ‚Ä…czono serwomechanizm. nawet skomplikowanych ukÅ‚adów mecha- Ustala wychylenie serwomechanizmu o kÄ…t podany jako argument nicznych sÅ‚użących np. do poruszania noga- write(kÄ…t) wywoÅ‚ania funkcji. mi robota kroczÄ…cego. Komendy sÅ‚użące do Umożliwia sterowanie wychyleniem serwomechanizmu za pomocÄ… sterowania serwomechanizmami zamiesz- writeMicroseconds(czas) czasu jako argumentu (czas ms). czono w tabeli 1. Odczytuje spodziewane poÅ‚ożenie serwomechanizmu (zwracany jest read() Zazwyczaj serwomechanizmy modelar- kÄ…t). skie majÄ… wbudowane ukÅ‚ady elektroniczne, Umożliwia sprawdzenie, czy zmienna do obsÅ‚ugi serwomechanizmu attached() jest przypisana do pinu mikrokontrolera. które precyzyjnie ustalajÄ… poÅ‚ożenie ukÅ‚adu mechanicznego z wÅ‚asnym silniczkiem na- OdÅ‚Ä…cza zmiennÄ… do obsÅ‚ugi serwomechanizmu od przypisanego pinu detach() mikrokontrolera. pÄ™dowym. Zwykle mogÄ… one być ustawiane 88 ELEKTRONIKA PRAKTYCZNA 8/2011 Kurs Arduino sÄ… zapisywane do zmiennych temp1 i temp2. sposób jest realizowana funkcjonalność strukcja powoduje oczekiwanie na puszcze- NastÄ™pnie za pomocÄ… komend: zmiany sposobu dziaÅ‚ania joysticka, o której nie przycisku joysticka. temp1 = map(temp1, 0, 1023, 0, 179); pisano wczeÅ›niej. Kolejne instrukcje dotyczÄ… obsÅ‚ugi przy- temp2 = map(temp2, 0, 1023, 0, 179); WartoÅ›ciami podawanymi jako argumen- cisku SW1. Jego naciÅ›niÄ™cie powoduje zapa- wartoÅ›ci odczytane z joysticka z zakresu od ty funkcji ustalajÄ…cych poÅ‚ożenia serwome- lenie diody LED1, ustawienie serwomecha- 0 do 1023 sÄ… przeliczane na poÅ‚ożenia kÄ…- chanizmów sÄ… wartoÅ›ci liczbowe kÄ…tów ich nizmu nr 3 w pozycji 0° i zgaszenie LED2. towe z zakresu 0...179°, które bÄ™dÄ… ustalać poÅ‚ożenia. Instrukcje: Natomiast przyciÅ›niÄ™cie przycisku SW2 wychylenia serwomechanizmów. W dalszej if (digitalRead(SWJ) == LOW) spowoduje wykonanie instrukcji zaÅ›wieca- części programu, jeÅ›li zmienna flaga jest { jÄ…cych LED2, ustawiajÄ…cych poÅ‚ożenie ser- równa 0, wykonywane sÄ… instrukcje: flaga=!flaga; womechanizmu nr 3 na kÄ…t 180° i zgasze- servo1.write(temp1); while(digitalRead(SWJ) == LOW nie LED1. WiÄ™cej informacji o komendach servo2.write(temp2);. } dostÄ™pnych w bibliotece servo.h można JeÅ›li zmienna flaga bÄ™dzie różna od 0, do obsÅ‚ugujÄ… przycisk joysticka i powodujÄ… znalezć w kodach zródÅ‚owych samych bi- serwomechanizmu 1 zostanie wpisana war- po każdym jego naciÅ›niÄ™ciu zmianÄ™ stanu bliotek. tość z temp2, a do serwa 2 z temp1. W ten zmiennej flaga na odwrotny. Ostatnia in- Podsumowanie Listing 1. PrzykÅ‚adowy program obsÅ‚ugi moduÅ‚u AVTduino JOY DziaÅ‚anie przykÅ‚adowego programu dla /* PrzykÅ‚ad obsÅ‚ugi komponentów, jakie zawiera moduÅ‚ sterowania serw joystickiem. Program zawiera przykÅ‚ad konfigurowania i obsÅ‚ugi: moduÅ‚u AVTduino JOY pokazuje możli- - joysticka sterujÄ…cego dwoma serwami, woÅ›ci i prostotÄ™ obsÅ‚ugi takich elementów, - przycisk SW1 zapala LED1 oraz ustawia serwo 3 w pozycji 0°, - przycisk SW2 zapala LED2 oraz ustawia serwo 3 w pozycji 180°. jak joystick czy serwomechanizm. Za jego Przycisk joysticka zamienia dziaÅ‚anie serwa 1 i 2 */ pomocÄ… można wykonać sterujÄ…ce robota- #include //biblioteka obsÅ‚ugi serw mi czy kamerami z możliwoÅ›ciÄ… obracania. Servo servo1; // objekt serwo 1 Servo servo2; // objekt serwo 2 Elementy przykÅ‚adowego programu obsÅ‚ugi Servo servo3; // objekt serwo 3 elementów moduÅ‚u JOY niewÄ…tpliwie bÄ™- const int Led1 = 6; //przypisanie aliasów do pinów portów dzie można wykorzystać we wÅ‚asnych pro- const int Led2 = 5; jektach. const int SW1 = 3; const int SW2 = 4; Marcin WiÄ…zania const int SWJ = 2; int temp1; // zmienne pomocnicze marcin.wiazania@ep.com.pl int temp2; byte flaga = 0; //zmienna flaga void setup() //pÄ™tla konfiguracyjna programu { servo1.attach(8); // konfigurowanie pinu serwa 1 servo2.attach(9); // konfigurowanie pinu dla serwa 2 servo3.attach(10); // konfigurowanie pinu dla serwa 3 pinMode(SW1, INPUT); //konfigurowanie linii, do których sÄ… doÅ‚Ä…czone przyciski jako wejÅ›cia pinMode(SW2, INPUT); pinMode(SWJ, INPUT); digitalWrite(SW1, HIGH); //doÅ‚Ä…czenie do linii, do których sÄ… doÅ‚Ä…czone przyciski rezystorów podciÄ…gajÄ…cych co wymusi na nich domyÅ›lnie stan wysoki digitalWrite(SW2, HIGH); digitalWrite(SWJ, HIGH); pinMode(Led1, OUTPUT); //konfigurowanie linii, do których sÄ… doÅ‚Ä…czone diody jako wyjÅ›cia pinMode(Led2, OUTPUT); digitalWrite(Led1, LOW); //domyÅ›lne ustawienie stanu diod LED digitalWrite(Led2, HIGH); servo3.write(0); //ustawienie serwa 3 w pozycji 0 stopni } void loop() //petla glowna programu { temp1 = analogRead(A0); //odczyt napiÄ™cia z joysticka lewo/prawo temp2 = analogRead(A1); //odczyt napiÄ™cia z joysticka góra/dół temp1 = map(temp1, 0, 1023, 0, 179); //zamiana napiÄ™cia na kÄ…t 0 do 180° temp2 = map(temp2, 0, 1023, 0, 179); //zamiana napiÄ™cia na kÄ…t 0 do 180° if (flaga==0) //jeÅ›li zmienna flaga równa 0 to { servo1.write(temp1); //ustawienie serwa 1 wartoÅ›ciÄ… w temp1 servo2.write(temp2); //ustawienie serwa 2 wartoÅ›ciÄ… w temp2 } else //w przeciwnym razie { servo1.write(temp2); //ustawienie serwa 1 wartoÅ›ciÄ… w temp2 servo2.write(temp1); //ustawienie serwa 2 wartoÅ›ciÄ… w temp1 } delay(15); //opóznienie 15 ms if (digitalRead(SWJ) == LOW) { //sprawdzenie, czy naciÅ›niety przycisk SWJ flaga=!flaga; //odwrócenie stanu flagi flaga while(digitalRead(SWJ) == LOW); //oczekiwanie na zwolnienie przycisku S1 } if (digitalRead(SW1) == LOW) { //sprawdzenie, czy naciÅ›niety przycisk S1 digitalWrite(Led1, LOW); //zaÅ›wiecenie LED1 digitalWrite(Led2, HIGH); //zgaszenie LED2 servo3.write(0); //ustawienie pozycji serwa 3 while(digitalRead(SW1) == LOW); //oczekiwanie na zwolnienie przycisku S1 } if (digitalRead(SW2) == LOW) { //sprawdzenie, czy naciÅ›niÄ™ty przycisk S2 digitalWrite(Led1, HIGH); //zgaszenie LED1 digitalWrite(Led2, LOW); //zaÅ›wiecenie LED2 servo3.write(180); // ustawienie pozycji serwa 3 while(digitalRead(SW2) == LOW); //oczekiwanie na zwolnienie przycisku S1 } } ELEKTRONIKA PRAKTYCZNA 8/2011 89