Robot Octagon

ciao a tutti mi sono appena iscritto nel nuovo forum arduino volevo farvi vedere il mio primo robot fatto con arduino il robot lavora con un range sensor oppure comandato via seriale con il pc (comandarlo via tastiera) io ho usato i moduli WPM di DFROBOT per la comunicazione seriale e ho fatto un breve tutorials di come programmarli che lo trovate qui: http://www.gioblu.com/tutorials/comunicazione/197-wireless-programming-module-for-arduino
ECCO I VIDEO DEL ROBOT :

1 - http://www.youtube.com/watch?v=gBSJ8aBEEi0

2 - http://www.youtube.com/watch?v=9ToZNYYD8xM
SCUSATE per la bassa qualità del video

ho fatto un tutorials di come costrurilo se vi interessa e lo postato qui:
http://www.gioblu.com/tutorials/robotica/200-robot-octagon
SPERO VI SIA UTILE CIAO A TUTTI
ArDuINo RuLez!!

ECCO IL CODICE:

#include "Servo"

#include "URMSerial.h"

 

Servo sservo; // Servo sinistro

Servo dservo; // Servo destro

Servo uservo; // Servo centrale Range Scanner

int ang=0;

int angolomax=0;

int distmax=0;

int value=100;

int ind=0;

int rotazione=0;

 

// Definizione delle misure

#define DISTANCE 1

#define TEMPERATURE 2

#define ERROR 3

#define NOTREADY 4

 

//angolo di riposo dei servi delle ruote

#define RIPOSOS 90

#define RIPOSOD 90

 

// inizializza l'oggetto della libreria urm del sensore ultrasuoni

URMSerial urm;

 

const int buttonPin = 2; // pin del bottone

int buttonPushCounter = 0; //contatore di quante volte è schiacciato il bottone

int buttonState = 0; // stato bottone

int lastButtonState = 0; // previous stato bottone

 

 

void setup()

{

Serial.begin(57600); // Imposta il baud rate a 9600

urm.begin(6,7,9600); // RX Pin, TX Pin, Baud Rate

pinMode(13, OUTPUT);

pinMode(buttonPin, INPUT);

sservo.attach(10); // Attacca il servo sinistro al pin 10

dservo.attach(9); // Attacca il servo destro al pin 9

uservo.attach(3); // Attacca il servo degli ultrasuoni al pin 3

uservo.write(90); // metti il servo degli ultrasuoni dritto

sservo.write(RIPOSOS); // ferma il robot

dservo.write(RIPOSOD); // ferma il robo

delay(200);

}

 

void loop()

{

 

int val;

val=analogRead(0); //Sensore Termoresistenza

Serial.print("Quantità Luce ");

Serial.println(val,DEC);//Stampa Valore Termoresistenza

delay(100);

if ( val > 890)

{

digitalWrite(13, HIGH);

}

else if ( val < 600)

{

digitalWrite(13, LOW);

}

buttonState = digitalRead(buttonPin);

 

// buttonState è diverso di lastButtonState

if (buttonState != lastButtonState) {

// se buttonState e on

if (buttonState == HIGH) {

//conta qualche volte

buttonPushCounter++;

}

}

//lastButtonState è uguale a buttonState

lastButtonState = buttonState;

 

 

// se buttonPushCounter è = a 0

if (buttonPushCounter == 0){

tasti();

}

 

if(buttonPushCounter == 1){

sservo.write(RIPOSOS); // ferma il robot

dservo.write(RIPOSOD); // ferma il robot

sservo.write(RIPOSOS + 90); // fai andare il robot dritto

dservo.write(RIPOSOD - 90); // fai andare il robot dritto

 

// Richiedi la distanza al sensore ad ultrasuoni

urm.requestMeasurement(DISTANCE);

delay(50); // attendi allineamento dei servi

if(urm.hasReading())

{

switch(urm.getMeasurement(value)) // Verifica che il valore letto sia una distanza

{

case DISTANCE: // Ulteriore verifica che sia una distanza

 

if (value>0 & value<30) // se il valore e' < 20 cm stiamo per sbatter

{

angolomax=0; // imposta l'angolo di migliore uscita a zero

distmax=0; // imposta la distanza di uscita migliore a zero

uservo.write(5); // sposta il servo degli ultrasuoni a destra

sservo.write(RIPOSOS); // ferma il servo in posizione di riposo

dservo.write(RIPOSOD); // ferma il servo in posizione di riposo

for (ang=0; ang<=9; ang++) // fai un ciclo per controllare dove sono gli ostacoli

{

uservo.write(ang*20); // imposta il servo degli ultrasuoni sul valore assunto da ang

urm.requestMeasurement(DISTANCE); //richiedi una nuova lettura della distanza

delay(50); //attendi allineamento servo ultrasuoni

if(urm.hasReading()) // verifica se ha letto

{

switch(urm.getMeasurement(value)) // Verifica che il valore letto sia una distanza

{

case DISTANCE: // Ulteriore verifica che sia una distanza

if (value > distmax) // verifica che la distanza letta sia maggiore del max

{

angolomax=ang*20; // se e' maggiore del max imposta il nuovo angolo max e

distmax=value; // la nuova distanza max

} //end if (value > distmax)

break;

} // end switch interno

} // end if(urm.hasReading())

} //end for (ang=0; ang<180; ang +=5)

 

uservo.write(90); //rimetti il servo degli ultrasuoni dritto

// scrivi sulla seriale il max valore e il max angolo rilevati

Serial.print("Angolo max \t");

Serial.println(angolomax);

 

//imposta i servi sull'angolo di max distanza per non toccare l'ostacolo

 

if (angolomax > 180)

angolomax=180;

if (angolomax < 0)

angolomax=0;

 

rotazione=abs(angolomax-90); //serve per far durare di piu la rotazione

 

// scrivi un po' di valori di controllo nel serial monitor

Serial.print("Angolo inviato ai servi \t");

Serial.println(RIPOSOS+angolomax-90);

Serial.print("Valore di rotazione \t");

Serial.println(rotazione / 5);

 

// fai andare i servi verso l'angolo di max distanza

for (ind=1; ind < rotazione/5; ind+=1)

{

sservo.write(RIPOSOS+angolomax-90);

dservo.write(RIPOSOD+angolomax-90);

delay (40); // attendi allineamento servi

} // end for (ind=1; ind < rotazione / 9; ind+=1)

} // end if (value 0)

break;

} // end switch esterno

} // end if(urm.hasReading()) esterno

} // end else Robot Seriale

} //end loop

 

char a;

long previousMillis = 0;

long interval = 600;

long intervall = 400;

 

void tasti()

{

 

if(Serial.available() > 0){

a = Serial.read();

sservo.write(RIPOSOS); // ferma il robot

dservo.write(RIPOSOD); // ferma il robot

switch(a){

case 'w':

previousMillis = millis();

while(millis() - previousMillis < interval ) {

Serial.println("avanti");

for( int throttle = 0.0001; throttle < 91; throttle++) {

sservo.write(RIPOSOS + 90 + throttle); // fai andare il robot dritto

dservo.write(RIPOSOD - 90 + throttle); // fai andare il robot dritto

}

}

sservo.write(RIPOSOS); // ferma il robot

dservo.write(RIPOSOD); // ferma il robot

break;

case 's':

previousMillis = millis();

while(millis() - previousMillis < interval) {

Serial.println("indietro");

sservo.write(RIPOSOS - 90); // fai andare il robot indietro

dservo.write(RIPOSOD + 90); // fai andare il robot indietro

}

sservo.write(RIPOSOS); // ferma il robot

dservo.write(RIPOSOD); // ferma il robot

break;

case 'd':

previousMillis = millis();

while(millis() - previousMillis < interval - intervall) {

Serial.println("destra");

sservo.write(RIPOSOS - 90); // fai andare il robot a destra

dservo.write(RIPOSOD - 90); // fai andare il robot a destra

}

sservo.write(RIPOSOS); // ferma il robot

dservo.write(RIPOSOD); // ferma il robot

break;

case 'a':

previousMillis = millis();

while(millis() - previousMillis < interval - intervall) {

Serial.println("sinistra");

sservo.write(RIPOSOS + 90); // fai andare il robot a sinistra

dservo.write(RIPOSOD + 90); // fai andare il robot a sinistra

}

sservo.write(RIPOSOS); // ferma il robot

dservo.write(RIPOSOD); // ferma il robot

break;

case 'c':

previousMillis = millis();

while(a != 'v') {

//Serial.println("avanti tutta");

a = Serial.read();

sservo.write(RIPOSOS + 90); // fai andare il robot avanti continuo

dservo.write(RIPOSOD - 90); // fai andare il robot avanti continuo

}

sservo.write(RIPOSOS); // ferma il robot

dservo.write(RIPOSOD); // ferma il robot

break;

}

}

}