Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

9
voti

Un intruso per casa

Tra le tante pazzie ed incongruenze che circolano nel mio cervello, uno di questi giorni ne vedo transitare una che mi attira un po' più delle altre.
Decido di mettere su nel tempo libero un "qualcosa" (è davvero indefinibile data la sua inutilità) che vada in giro per casa e faccia un po' di rumore, ovviamente senza creare danni.
Dopo qualche opera di convincimento, sono riuscito ad ottenere in regalo da un mio amico la piastra e i due motori del famosissimo Cybot, il robot della De Agostini (erano le uniche uscite in edicola che aveva comprato di questa raccolta).
Pazienza, parto da queste due cose e il resto lo faccio io: prendo l'Arduino che avevo buttato lì sulla scrivania e inizio a fare un paio di collegamenti senza senso.

Utilizzando anche una batteria da 9 V, un servo, un led ed un sonar HC-SR04, mi viene su una cosa del genere:
image_1359884919304527.jpg

image_1359884919304527.jpg


image_1359884980820079.jpg

image_1359884980820079.jpg


image_1359885101462993.jpg

image_1359885101462993.jpg




Circuito e codice

Mi diverto nello scrivere e testare queste poche righe di codice, specialmente nello stabilire l'angolazione del servo per gli ostacoli.
Dopo qualche piccola prova mi rendo conto che la configurazione migliore è questa qui:

#include <Servo.h>
int motor1_A = 5;
int motor1_B = 6;
int motor2_A = 9;
int motor2_B = 10;
int led = 13;
int servo_pin = 14; //analog pin 0
int ultrasonar_trigger_pin = 11;
int ultrasonar_echo_pin = 12;

Servo servo;

//Functions Declaration
void go_forward (void);
void go_backforward (void);
void go_left (void);
void go_right (void);
long trigger_ultrasonar (void);

// the setup routine runs once when you press reset:
void setup(){
// initialize motors input pin.
pinMode(motor1_A, OUTPUT);
pinMode(motor1_B, OUTPUT);
pinMode(motor2_A, OUTPUT);
pinMode(motor2_B, OUTPUT);

//led
pinMode(led, OUTPUT);
//servo
servo.attach(servo_pin); //analog pin 0
//sonar
pinMode( ultrasonar_trigger_pin, OUTPUT );
pinMode( ultrasonar_echo_pin, INPUT );
}

// the loop routine runs over and over again forever:
void loop(){
int degree;
long cm = 0;
for (degree = 50; degree <= 140; degree += 20){
servo.write(degree);
// delay(10);
cm = trigger_ultrasonar();
if (cm < 15){
digitalWrite(led, HIGH);
//object found
if (degree > 105){
while (trigger_ultrasonar() < 20){
go_right ();
delay(150);
}
}
else if (degree < 75){
while (trigger_ultrasonar() < 20){
go_left ();
delay(150);
}
}
else{while (trigger_ultrasonar() < 20){
go_backforward ();
delay(150);
}
}
}
else{digitalWrite(led, LOW);
go_forward ();
}
delay(100);
}
for (degree = 140; degree >= 50; degree -= 20){
servo.write(degree);
// delay(10);
cm = trigger_ultrasonar();
if (cm < 15){
digitalWrite(led, HIGH);//object found
if (degree > 105){
while (trigger_ultrasonar() < 20){
go_right ();
delay(150);
}
}
else if (degree < 75){
while (trigger_ultrasonar() < 20){
go_left ();
delay(150);
}
}
else{while (trigger_ultrasonar() < 20){
go_backforward ();
delay(150);
}
}
}
else{
digitalWrite(led, LOW);
go_forward ();
}
delay(100);
}
}

void go_forward (void){
//forward
digitalWrite(motor1_A, LOW);
digitalWrite(motor1_B, HIGH);
digitalWrite(motor2_A, LOW);
digitalWrite(motor2_B, HIGH);
}
void go_backforward (void){
//backforward
digitalWrite(motor1_A, HIGH);
digitalWrite(motor1_B, LOW);
digitalWrite(motor2_A, HIGH);
digitalWrite(motor2_B, LOW);
}
void go_right (void){
//left
digitalWrite(motor1_A, HIGH);
digitalWrite(motor1_B, LOW);
digitalWrite(motor2_A, LOW);
digitalWrite(motor2_B, HIGH);
}
void go_left (void){
//right
digitalWrite(motor1_A, LOW);
digitalWrite(motor1_B, HIGH);
digitalWrite(motor2_A, HIGH);
digitalWrite(motor2_B, LOW);
}
long trigger_ultrasonar (void){
digitalWrite( ultrasonar_trigger_pin, LOW );
digitalWrite( ultrasonar_trigger_pin, HIGH );
delayMicroseconds( 10 );
digitalWrite( ultrasonar_trigger_pin, LOW );
//wait ultrasonic returns
long duration = pulseIn( ultrasonar_echo_pin, HIGH );
//calculate distance in cm
long r = 0.034 * duration / 2;
return r;
}

Ha anche un led per informare qualcuno (forse me quando gli vado dietro) che ha trovato un ostacolo. Cavolo fa anche questo, deve essere proprio intelligente allora!



Un modo carino per passare qualche oretta vuota dopo lo studio, che ne dite?

5

Commenti e note

Inserisci un commento

di ,

interessante grazie

Rispondi

di ,

È un semplice driver per motori. Puoi dare uno sguardo alla figura di destra alla pagina 2 del datasheet per avere un'idea: http://www.datasheetcatalog.org/datasheet/SGSThomsonMicroelectronics/mXyzuxsr.pdf

Rispondi

di ,

bell' articolo , per i principianti come me sarebbe stato utile un po di spiegazione sul funzionamento dell integrato l293d per comprendere meglio ,comunque grazie

Rispondi

di ,

Ti ringrazio :-)

Rispondi

di ,

Ti direi che ti capisco, e anche a me piacerebbe avere qualche "robottino/diavoleria elettronica" che gira per la casa senza motivo...Giusto per il gusto di ammirarla e poter dire l'ho fatto io :) Si potrebbe tentare di renderlo simile al gatto domestico: sale sui tavoli, dorme tutto il giorno, si fa le unghie sui mobili :) +1 ;)

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.