techfreak_pl_Arduino-Robot_AAR-04_9-15
Robot Arduino AAR-04 to złożony gotowy do użycia elektroniczny pojazd napędzany dwoma kołami którymi można dowolnie sterować. Już Na tym etapie kontroli, użytkownik doznaje wiele przyjemności z tworzenia własnego jeżdżącego robota. Zamontowane na przedzie fototranzystory zwiększają możliwości poruszania się do tego stopnia, że staje się on autonomicznym pojazdem. Robot jest wyposażony w procesor ATmega328P który nie tylko steruje sinikami i odbiera informacje od sensorów ale i posiada wyprowadzenia które można wykorzystać w dowolny sposób. I tu zaczyna się cała zabawa która dzięki prostemu programowaniu przy pomocy platformy Arduino i przykładowym programom stwarza wiele możliwości nawet dla początkujących.

Specyfikacja:

  • 2x silniki 3V
  • Procesor ATmega328P (14 wyjść cyfrowych i 7 analogowych)
  • Układ do komunikacji poprzez USB FT232 IC
  • Układ sterujący silnikami L293D (H-bridge sterowany z procesora ATmega pozwala na zmianę polaryzacji silników)
  • Odomtery zainstalowane przy każdej zębatce napędzającej koło. Można mierzyć np. przebytą drogę na podstawie zliczonych impulsów.
  • Język programowania ARDUINO
  • Zasilanie 4 x baterie AAA (6 Volt)
  • Komunikacja poprzez port USB
  • Moduły rozszerzeń kompatybilne z ASURO (poprzednia generacja Robota jerzdzącego)
  • [*]Wymiary 40 mm x 120 mm x 180 mm

Opis i uruchomienie:

Produkt jest dobrze zabezpieczony przed uszkodzeniem w transporcie a dostawa jak zawsze kurierem. Robot znajdował się w całkiem fajnym pudełku a dodatkowo znajdował się w plastikowym opakowaniu zabezpieczającym. W pudełku znajduje się złożony robot, płyta CD z przykładowymi programami i plikami PDF oraz oprogramowanie Arduino.

techfreak_pl_Arduino-Robot_AAR-04_9-0 techfreak_pl_Arduino-Robot_AAR-04_9-1 techfreak_pl_Arduino-Robot_AAR-04_9-10 techfreak_pl_Arduino-Robot_AAR-04_9-11 techfreak_pl_Arduino-Robot_AAR-04_9-12 techfreak_pl_Arduino-Robot_AAR-04_9-13 techfreak_pl_Arduino-Robot_AAR-04_9-14

Arduino

Robota uruchamia się poprzez podłączenia zasilania (4 baterie AAA) i podłączenie go do komputera poprzez kabel USB który jest w zestawie. Na początku nie jest potrzebne zasilanie z baterii, jeśli użytkownik chce uruchamiać proste programy takie jak np. migająca dioda. Wtedy zasilanie odbywa się poprzez port USB komputera.

Wygląd

Arduino robot AAR-04 to tak naprawdę standardowa płytka Arduino Duemilanove bez regulatora napięcia na 5V, na kółkach. Trzecim przednim kołem jest metalowa kulka która nadaje całości ciężar, stabilizuje i hałasuje. Poniżej można zobaczyć parę fotek z bliska.

techfreak_pl_Arduino-Robot_AAR-04_9-16 techfreak_pl_Arduino-Robot_AAR-04_9-8 techfreak_pl_Arduino-Robot_AAR-04_9-6 techfreak_pl_Arduino-Robot_AAR-04_9-5 techfreak_pl_Arduino-Robot_AAR-04_9-2 techfreak_pl_Arduino-Robot_AAR-04_9-3 techfreak_pl_Arduino-Robot_AAR-04_9-4 techfreak_pl_Arduino-Robot_AAR-04_9-15

Testy

Testy rozpocząłem od przejrzenia CD. Na płycie dostępne są programy testowe i dokumentacja. W folderze Examples zainteresowały mnie dwa katalogi które mówiły same za siebie _04_move i _05_Line_follow. Czyli programy testowe które miały w parę sekund ożywić robota. O ile program move działał. Trzeba było w nim tylko zmienić czasy działania silników na mniejsze, ponieważ nie starczało miejsca w salonie na ruchy robota. To Line_follow w ogóle nie działał. Nie łapał żądnej linii. Linie rysowałem markerem i tworzyłem przy pomocy czarnej taśmy klejącej. Jak na dwa programy z których ten najefektowniejszy nie działa, pomyślałem że to nie dobrze. Nie zastanawiając się długo zamówiłem moduł Bluetooth i czujnik odległości. Razem ok 50 zł.

Przeglądając zawartość płyty znalazłem plik Bluetooth_AAR.apk, program do sterowana Robotem Arduino na Androida. Była to świetna wiadomość ze względu na wcześniejsze zakupy.

Czekając już prawie drugi tydzień na części z chin (bo taniej). Postanowiłem zacząć pisać programy do testów. Nie dawał mi spokoju [B]line follow[/B] który nie działał. A w końcu napisałem go sam. Bardzo pomocny stał się program [B]self_test[/B] w którym wszystkie główne funkcje takie jak wykrywanie czarnego pola lub sterowanie silnikami są podane na tacy, trzeba tylko umieć te funkcje poskładać w jedną całość. Gdy już opanowałem podążanie za linią, pomyślałem że wykrywanie czarnego pola i zawracanie to będzie fajne zajęcie dla robota. Zobaczcie wszystkie trzy programy o których wspomniałem powyżej.

Proste poruszanie się

Podążanie wzdłuż linii

Wykrywanie i zawracanie

Po tych testach byłem zadowolony z efektów bo robot sprawiał frajdę nawet jeśli odpalało się go na parę sekund aby popatrzeć jak podąża za linią. Niby podąża ale mógłby szybciej… Tu trzeba było by się pobawić kodem. Nawet po skończonym „celu” można dopracowywać swoje dzieła i tworzyć nowe funkcje, trasy itd. a to tylko foto tranzystor i dwa silniki.

No właśnie co z BT i czujnikiem odległości? Bluetooth doszedł czujnik nie..

Aby podłączyć moduł Bluetooth musiałem znaleźć 3.3V, GND i dwa cyfrowe porty aby emulować RX,TX (odbieranie, wysyłanie). Emulować, bo nie mogę w tym samym czasie programować robota i odbierać/wysyłać danych z bluetooth na tych samych pinach na procesorze.

techfreak_pl_Arduino-Robot_AAR-04_9-7

Android

Po podłączeniu czas na aplikację na Androida. Okazało się że program wysyła komendy f = 8, b = 2, s = 5, l = 4, r = 6. Czyli programowanie nie było trudne trzeba było przypisać komendy jak w przypadku programu move pod odpowiednie cyfry. I sterowanie poprzez bluetooth gotowe. Poniżej zrzut z telefonu aby pokazać jak wygląda program do sterowania.

techfreak_pl_Arduino-Robot_AAR-04_9-9

Sterowanie poprzez Bluetooth

Podsumowanie

Robot jest fajną opcją dla początkujących którzy szukają gotowej platformy podłącz i programuj. Praktycznie nie trzeba tu lutować a główny cel to pisanie programów w C. Oprócz modułu bluetooth można zastosować, serwa lub sterowanie poprzez diodę IR. Fajną opcja było by poruszanie się za pomocą czujnika odległości lub podłączenie wyświetlacza na którym wyświetlało by się np. odległość od obiektu lub temperaturę. Naprawdę możliwość są nie ograniczone.

Minusy

  • hałas metalowej kulki przy poruszaniu
  • mała liczba dostępnych wyjść 2 analogowe i 2 cyfrowe
  • brak regulatora napięcia na 5V
  • koszyk na baterie AAA. AA też by weszły

Plusy

  • Integralna platforma procesor, silniki, układy na jednej płycie
  • łatwe programowanie dzięki Arduino

Link do produktu http://www.conrad.pl/Robot-Arduino—programowalny-Arexx-AAR

EDIT:

W końcu doszedł ultradźwiękowy moduł pomiaru odległości HC-SR04 i mogłem przetestować jak działa z robotem.

Programy dla Arduino

move

/*
Arduino-Roboter AAR-04 move techfreak.pl dla conrad.pl
*/

/*
Name project: Example 4, RP6 Motor control
Author: Egbert Koerhuis
Company: Arexx Engineering
Discription:
This Example Program shows how to control the Motors.
Make sure that the AAR can __NOT__ move when uploading the program!
After uploading the program, the AAR will wait 2 seconds before the program start.

>>> DO NOT FORGET TO REMOVE THE USB CABLE, after uploading the program.

ATTENTION: THE ROBOT MOVES AROUND IN THIS EXAMPLE! PLEASE PROVIDE ABOUT
1m x 1m OR MORE FREE SPACE FOR THE ROBOT!

You are free to change the code!
*/

void setup()
{
//Setup: Initalization
//pin 10 left foreward
pinMode(10, OUTPUT);
//pin 9 left backward
pinMode(9, OUTPUT);
//pin 5 right foreward
pinMode(5, OUTPUT);
//pin 6 right backward
pinMode(6, OUTPUT);

//Then set the start value of the signals to zero:
analogWrite(9, 0);
analogWrite(10, 0);
analogWrite(5, 0);
analogWrite(6, 0);

//Startup delay:
delay(2000);

}

void loop()
{
digitalWrite(9,LOW); analogWrite(10,200); //##set pin 9 to ground!## set speed left motor 200 foreward
digitalWrite(5,LOW); analogWrite(6,200); //##set pin 6 to ground!## set speed right motor 200 foreward
delay(500); //drive for 5000ms
digitalWrite(9,LOW); analogWrite(10,200); //##set pin 9 to ground!## set speed left motor 200 foreward
digitalWrite(6,LOW); digitalWrite(5,LOW); //make a left turn
delay(500); //drive for 5000ms
digitalWrite(10,LOW); analogWrite(9,200); //##set pin 10 to ground!## set speed left motor 200 backward
digitalWrite(6,LOW); analogWrite(5,200); //##set pin 5 to ground!## set speed right motor 200 backward
delay(500); //drive for 5000ms
digitalWrite(5,LOW); analogWrite(6,200); //##set pin 5 to ground!## set speed right motor 200 backward
digitalWrite(9,LOW); digitalWrite(10,LOW); //make a right turn
delay(500); //drive for 5000ms
digitalWrite(6,LOW); digitalWrite(5,LOW); //stop motors
digitalWrite(9,LOW); digitalWrite(10,LOW); //stop motors
}

serach and back

/*
Arduino-Roboter AAR-04 line_end techfreak.pl dla conrad.pl
*/

void setup()    
{
  //Setup: Initalization 
  //pin 10 left foreward
  pinMode(10, OUTPUT);
  //pin 9 left backward
  pinMode(9, OUTPUT);
  //pin 5 right foreward
  pinMode(5, OUTPUT);
  //pin 6 right backward
  pinMode(6, OUTPUT);
  //led
  pinMode(7,OUTPUT);

  //Then set the start value of the signals to zero: 
  analogWrite(9, 0);   
  analogWrite(10, 0);   
  analogWrite(5, 0);   
  analogWrite(6, 0);
  Serial.begin(9600);
  Serial.print("\ntechfreak.pl - Test Robota AREXX dla conrad.pl\n"); 
  digitalWrite(7,HIGH);  
  //Startup delay:
  delay(2000);

}

void square(){
  int left=0;
  int right=0;
  left = analogRead(A6);
  right = analogRead(A7);

  digitalWrite(10,LOW); analogWrite(9,100); //##set pin 10 to ground!## set speed left motor 200 backward 
  digitalWrite(6,LOW); analogWrite(5,100);  //##set pin 5 to ground!## set speed right motor 200 backward
  delay(1);

  if(left < 200 || right < 200){                         
  Serial.print("LEFT: BLACK    ");
    digitalWrite(6,LOW); digitalWrite(5,LOW); //stop motors
    digitalWrite(9,LOW); digitalWrite(10,LOW); //stop motors   
    delay(10);
    digitalWrite(9,LOW); analogWrite(10,200); //##set pin 9 to ground!## set speed left motor 200 foreward
    digitalWrite(6,LOW); digitalWrite(5,LOW); //make a left turn
    delay(400);
  }
}

void loop()
{
square();
}

line follower / tracker

/*
Arduino-Roboter AAR-04 linesensor/linetracker techfreak.pl dla conrad.pl
*/

void setup()    
{
  //Setup: Initalization 
  //pin 10 left foreward
  pinMode(10, OUTPUT);
  //pin 9 left backward
  pinMode(9, OUTPUT);
  //pin 5 right foreward
  pinMode(5, OUTPUT);
  //pin 6 right backward
  pinMode(6, OUTPUT);
  //led
  pinMode(7,OUTPUT);

  //Then set the start value of the signals to zero: 
  analogWrite(9, 0);   
  analogWrite(10, 0);   
  analogWrite(5, 0);   
  analogWrite(6, 0);
  Serial.begin(9600);
  Serial.print("\ntechfreak.pl - Test Robota AREXX dla conrad.pl\n"); 
  digitalWrite(7,HIGH);  
  //Startup delay:
  delay(2000);

}
void l(){
 digitalWrite(10,LOW); analogWrite(9,100); //##set pin 9 to ground!## set speed left motor 200 foreward
 digitalWrite(6,LOW); digitalWrite(5,LOW); //make a left turn
 delay(10);
}
void r(){
 digitalWrite(6,LOW); analogWrite(5,100); //##set pin 5 to ground!## set speed right motor 200 backward
 digitalWrite(9,LOW); digitalWrite(10,LOW); //make a right turn
 delay(10);
}

void linesensor(){
  int left=0;
  int right=0;
  left = analogRead(A6);
  right = analogRead(A7);

  if(left < 150){                         
      Serial.print("LEFT: BLACK    ");
r();
      }
      else {
        Serial.print("LEFT: WHITE    ");
      //delay(10);
      }

 if(right < 150){                         
      Serial.print("RIGHT: BLACK    \n");
l();
      }
      else {
        Serial.print("RIGHT: WHITE    \n");
        //delay(10);

      }

}

void loop()
{

   linesensor();

}

sterowanie poprzez bluetooth

/*
Arduino-Roboter AAR-04 bluetooth control techfreak.pl dla conrad.pl
*/

#include 
SoftwareSerial mySerial(8, 4); // RX, TX
char incomingByte;
void setup()  
{
   pinMode(10, OUTPUT);
  //pin 9 left backward
  pinMode(9, OUTPUT);
  //pin 5 right foreward
  pinMode(5, OUTPUT);
  //pin 6 right backward
  pinMode(6, OUTPUT);
  //Then set the start value of the signals to zero: 
  analogWrite(9, 0);   
  analogWrite(10, 0);   
  analogWrite(5, 0);   
  analogWrite(6, 0);
// Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
  ; // wait for serial port to connect. Needed for Leonardo only
 }
  Serial.println("hello USB");
 // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
 mySerial.println("Hello, BT");
}
void loop() // run over and over
{
  if (mySerial.available())
   Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
  digitalWrite(6,LOW); digitalWrite(5,LOW); //stop motors
  digitalWrite(9,LOW); digitalWrite(10,LOW); //stop motors   
  if (mySerial.available() > 0) {          // if received UART data
    incomingByte = mySerial.read();        // raed byte
     if(incomingByte == '8') { 
      digitalWrite(10,LOW); analogWrite(9,200); //##set pin 10 to ground!## set speed left motor 200 backward 
      digitalWrite(6,LOW); analogWrite(5,200);  //##set pin 5 to ground!## set speed right motor 200 backward       
                delay(500);     }
    if(incomingByte == '4') { 
    digitalWrite(9,LOW); analogWrite(10,200); //##set pin 9 to ground!## set speed left motor 200 foreward
   digitalWrite(6,LOW); digitalWrite(5,LOW); //make a left turn
    delay(500);     }
     if(incomingByte == '2') { 
      digitalWrite(9,LOW); analogWrite(10,200); //##set pin 9 to ground!## set speed left motor 200 foreward 
      digitalWrite(5,LOW); analogWrite(6,200);  //##set pin 6 to ground!## set speed right motor 200 foreward 
    delay(500);     }
      if(incomingByte == '6') {
       digitalWrite(5,LOW); analogWrite(6,200); //##set pin 5 to ground!## set speed right motor 200 backward
   digitalWrite(9,LOW); digitalWrite(10,LOW); //make a right turn
    delay(500);     }
      if(incomingByte == '5') {
       digitalWrite(6,LOW); digitalWrite(5,LOW); //stop motors
   digitalWrite(9,LOW); digitalWrite(10,LOW); //stop motors   
      }
   }
}

HC-SR04

*
 HC-SR04 Ping distance sensor:
 VCC to arduino 5v 
 GND to arduino GND
 Echo to Arduino pin 7 
 Trig to Arduino pin 8
 
 This sketch originates from Virtualmix: http://goo.gl/kJ8Gl
 Has been modified by Winkle ink here: http://winkleink.blogspot.com.au/2012/05/arduino-hc-sr04-ultrasonic-distance.html
 And modified further by ScottC here: http://arduinobasics.blogspot.com/
 on 10 Nov 2012.
 */

#define echoPin 4 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED

int maximumRange = 20; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance

int randNumber = 0;

void setup() {
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
 
 //Setup: Initalization 
 //pin 10 left foreward
 pinMode(10, OUTPUT);
 //pin 9 left backward
 pinMode(9, OUTPUT);
 //pin 5 right foreward
 pinMode(5, OUTPUT);
 //pin 6 right backward
 pinMode(6, OUTPUT);

 //Then set the start value of the signals to zero: 
 analogWrite(9, 0);   
 analogWrite(10, 0);   
 analogWrite(5, 0);   
 analogWrite(6, 0);
 Serial.begin(9600);
 Serial.print("\ntechfreak.pl - Test Robota AREXX dla conrad.pl\n"); 
 digitalWrite(7,HIGH);  
 //Startup delay:
 delay(2000);

 
}

 void loop() {
 /* The following trigPin/echoPin cycle is used to determine the
 distance of the nearest object by bouncing soundwaves off of it. */ 
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 

 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10); 
 
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 
 //Calculate the distance (in cm) based on the speed of sound.
 distance = duration/58.2;
 randNumber = 0;

 if (distance <= maximumRange ){
 /* Send a negative number to computer and Turn LED ON 
 to indicate "out of range" */
 Serial.println("-1");
 digitalWrite(LEDPin, HIGH); 
 
// digitalWrite(6,LOW); digitalWrite(5,LOW); //stop motors
// digitalWrite(9,LOW); digitalWrite(10,LOW); //stop motors   
// delay(10);
 //digitalWrite(9,LOW); analogWrite(10,200); // foreward 
// digitalWrite(5,LOW); analogWrite(6,200);  // foreward 
 //delay(10);
 
 digitalWrite(6,LOW); digitalWrite(5,LOW); //stop motors
 digitalWrite(9,LOW); digitalWrite(10,LOW); //stop motors  
 delay(10);
 digitalWrite(9,LOW); analogWrite(10,200); // left motor foreward
 digitalWrite(6,LOW); digitalWrite(5,LOW); //make a left turn
 delay(500); 
 digitalWrite(6,LOW); digitalWrite(5,LOW); //stop motors
 digitalWrite(9,LOW); digitalWrite(10,LOW); //stop motors 
 }

 else {
 /* Send the distance to the computer using Serial protocol, and
 turn LED OFF to indicate successful reading. */
 Serial.println(distance);
 digitalWrite(LEDPin, LOW); 
 
 //forward
 
 digitalWrite(10,LOW); analogWrite(9,200); //##set pin 10 to ground!## set speed left motor 200 backward 
 digitalWrite(6,LOW); analogWrite(5,200);  //##set pin 5 to ground!## set speed right motor 200 backward       
 //delay(10);
 
 }
 
 //Delay 50ms before next reading.
 delay(10);
}