Tym razem zajmiemy się projektem, do którego wprowadzimy platformę robota Magician Chasis oraz czujnik odległości. Na bazie tej platformy zbudujemy kilka wersji robota: z czujnikiem odległości, sterowanego pilotem na podczerwień oraz sterowanego poprzez Bluetooth i aplikację na telefon komórkowy.
Jeżeli nigdy dotąd nie miałeś styczności z ideą Arduino, to odsyłam na oficjalną stronę Arduino.cc, gdzie w dziale Getting Started with Arduino on Windows dowiesz się, krok po kroku, od czego zacząć. Również w języku ojczystym jest wiele stron, na których znajdziesz pomoc, jak np. w tym miejscu: http://majsterkowo.pl/od-czego-zaczac-zabawe-z-arduino/.
Będziesz też potrzebował bibliotekę dla Adafruit Motor Shield, pomoc znajdziesz na stronie producenta Adafruit, a samą bibliotekę tutaj >>.
W Internecie można znaleźć mnóstwo opisów podobnego robota, ale kiedy przychodziło co do czego, to efekt nie spełniał moich oczekiwań. Moim celem był jak najbardziej prosty sketch, zrozumiały nawet dla takiego laika, jak ja sam. Metodą prób i błędów doszedłem w końcu do rozwiązania, które prezentuję poniżej.
PODZESPOŁY.
1. Magician Chassis - Platforma dla robota2. Arduino Uno R3 (compatibile)
3. Arduino Motor Shield L293D
4. Pojemnik na jedną baterię 6F22 (9V) z wyłącznikiem
5. Ultradźwiękowy miernik odległości HC-SR04
6. Listwa żeńska 1x10 pin 10.5 mm
7. Listwa żeńska 1x8 pin 10.5 mm (2 szt.)
8. Przewody czarne 10 szt. ARE 0009
9. Listwa kołkowa 1x40 pin kątowa symetryczna
Celem, jaki sobie postawiłem, była budowa robota omijającego przeszkody przy pomocy sonaru HC-SR04. Poniżej rzut:
Ażeby móc sterować dwoma silnikami DC potrzebny jest kontroler silników. Tu również mamy do wyboru różne rozwiązania, od podstawowych (mostek H L293D), poprzez moduły, aż do tzw. Shieldów czyli rozszerzeń, które wpina się bezpośrednio w płytkę Arduino Uno R3. Ja skorzystałem z ARDUINO MOTOR SHIELD L293D DO SILNIKÓW KROKOWYCH I DC. Powodów jest kilka, jest tani (cena ok. 30.00 PLN, dostępny w www.electropark.pl), obsługuje aż 4 silniki DC (lub 2 silniki krokowe) oraz dwa serwomechanizmy:
W Adafruit Motor Shield ze względu na ilość obsługiwanych silników DC (4 szt. lub 2 silników krokowych) oraz dwóch serwomechanizmów, które zajmują wszystkie piny cyfrowe (poza 2 i 13), nie przewidziano "przelotek". Wiedząc, że w kolejnych projektach będę używał tego rozwiązania, dokupiłem jeszcze ScrewShield x2 - złącza śrubowe dla Arduino:
W kolejnych projektach z pewnością się przyda.
Do całości potrzebujemy jeszcze ultradźwiękowego czujnika odległości HC-SR04.
Budowę robota zaczynamy od zmontowania platformy dla robota (poz. 1). Razem z zestawem otrzymujemy dokładną instrukcję "step by step", tak więc nie powinno to stanowić dla nas większego problemu.
Następnym krokiem jest przymocowanie płytki Arduino Uno R3 (poz. 2) do naszego podwozia, przy pomocy słupków dystansowych (poz. 10 w instrukcji - L10 spacer 4PCS), które znajdziemy w zestawie montażowym podwozia. Na zdjęciu widać koszyczek na cztery baterie 1.5 V, ale osobiście polecam taki, jak w wykazie czyli 9V, ważne żeby miał wyłącznik (poz. 4).
W omawianym przeze mnie przykładzie posłużyłem się rozwiązaniem "tańszym", ale niekoniecznie praktycznym, wykorzystałem listwy żeńskie (goldpin poz. 7 i 8) oraz listwą kołkową symetryczną (poz. 9 spisu na wstępie). Do obsługi sonara HC-SR04 potrzebujemy, poza trzema pinami wpiętymi do Servo 2 AdaFruit Motor Shield, jeszcze jeden dodatkowy pin Echo (A1) i dlatego zmuszeni jesteśmy pomóc sobie w pokazany poniżej sposób.
No, chyba że potrafisz lutować, na tę okoliczność producent przewidział miejsca, gdzie możesz wlutować Pin 2 oraz Piny od A0 do A5. Do tak przygotowanej płytki Arduino dodajemy Adafruit Motor Shield. Na fotografii poniżej znajdziesz dokładny sposób, jak podłączyć silniki (M2 i M3) do terminalblocków, oraz przewody sonara (Trigger, + i - ) do Servo2, przewód Echo łączymy z pinem wyprowadzonym wcześniej na płytce Arduino Uno R3 (Pin A1).
Uwaga: silniki mają dwa przewody: czarny (GND) i czerwony (V+), w naszym przypadku kolor czerwony skierowany jest w kierunku przodu robota.
Opis pinów w Arduino Motor Shield:
MOTORLATCH 12
MOTORCLK 4
MOTORENABLE 7
MOTORDATA 8
MOTOR1_A 2
MOTOR1_B 3
MOTOR1_PWM 11
MOTOR2_A 1
MOTOR2_B 4
MOTOR2_PWM 3
MOTOR3_A 5
MOTOR3_B 7
MOTOR3_PWM 6
MOTOR4_A 0
MOTOR4B_ 6
MOTOR4_PWM 5
SERVO1_PWM 10
SERVO2_PWM 9
I to właściwie już wszystko. Oczywiście pozostało jeszcze wgrać nasz sketch/program. Poniżej - pomiędzy liniami - sketch:
--------------------------------------------------------------------------------------------------------------------------
/*W sketchu wykorzystałem Demo Code ze strony:
http://www.electrodragon.com/w/index.php?title=HC-SR04_Ultrasonic_sensor
*/
#include <AFMotor.h>
AF_DCMotor motor1(3); //M3 - motor lewy
AF_DCMotor motor2(2); //M2 - motor prawy
#define echoPin A1 // Echo Pin = Analog Pin A1
#define trigPin 9 // Trigger Pin = Digital Pin 9 - Servo 2
#define LEDPin 13 // Onboard LED
long duration; // Duration used to calculate distance
long HR_dist=0; // Calculated Distance
int minimumRange=5; //Minimum Sonar range
int maximumRange=200; //Maximum Sonar Range
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
motor1.setSpeed(250);//prędkość silnika lewego
motor1.run(FORWARD);//silnik lewy domyślnie do przodu
motor2.setSpeed(255);//prędkość silnika prawego
motor2.run(FORWARD);//silnik prawy domyślnie do przodu
}
void loop() {
motor1.run(FORWARD); //silnik lewy M3 do przodu
motor2.run(FORWARD);//silnik prawy M2 do przodu
getDistance();
void getDistance(){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
HR_dist = duration/58.2;
if (HR_dist >= maximumRange || HR_dist <= minimumRange){
Serial.println("0");
digitalWrite(LEDPin, HIGH);
} else {
Serial.println(HR_dist);
digitalWrite(LEDPin, LOW);
if (HR_dist <=30 ){//jeżeli robot jest w odległości od przeszkody <=30
motor1.run(RELEASE);//silnik lewy bieg jałowy
motor2.run(RELEASE);//silnik prawy bieg jałowy
delay (500);//przez pół sekundy
motor1.run(BACKWARD);//silnik lewy do tyłu
motor2.run(BACKWARD);//silnik prawy do tyłu
delay (700);//przez 0,7 sekundy
motor1.run(RELEASE);// silnik lewy bieg jałowy
motor2.run(RELEASE);// silnik prawy bieg jałowy
delay(500); //przez pół sekundy
motor1.run(FORWARD);//silnik lewy do przodu |robot skręca w prawo
motor2.run(RELEASE);//silnik prawy bieg jałowy |
delay (500);//przez pół sekundy
}
}
}
--------------------------------------------------------------------
I gotowy robocik:
Na bazie tego robota opiszę, jak zbudować robot sterowany pilotem na podczerwień.
UWAGA: jeżeli robot wykonuje różne dziwne ruchy, to nie wiń mnie, tylko dociśnij AFM (Adafruit Motor Shield) i listwy żeńskie do płytki Arduino. Niestety zdarza się, że ze względu na niski koszt produkcji, listwy nie łącza w sposób trwały naszych podzespołów.