Essendo un novellino della materia, vedere gironzolare per casa il mio rover mi ha dato qualche soddisfazione (e anche una certa dose di sorpresa).

Devo trovargli un nome.

Qui il video che descrive un pomeriggio di puro divertimento:

Assembly List

Label Part Type Properties
Arduino1 Arduino processor ATmega; variant Arduino UNO R3
C1 Ceramic Capacitor package 100 mil [THT, multilayer]; capacitance 0.1µF; voltage 6.3V
C2 Ceramic Capacitor package 100 mil [THT, multilayer]; capacitance 0.1µF; voltage 6.3V
D1 Rectifier Diode package 300 mil [THT]; tipo Rectifier; part number 1N4001
D2 Rectifier Diode package 300 mil [THT]; tipo Rectifier; part number 1N4001
J1 Basic Servo part number Goteck GS-9025MG Micro Analog Metal-Gear Servo 9g
LED1 Green LED – 3mm package 3 mm [THT]; leg yes; colore Green (555nm)
LED2 Green LED – 3mm package 3 mm [THT]; leg yes; colore Green (555nm)
M1 DC Motor
M2 DC Motor
Q1 NPN-Transistor package TO92 [THT]; tipo NPN; part number Transistor BC337-40
Q2 NPN-Transistor package TO92 [THT]; tipo NPN
R1 10k Ω Resistor package THT; tolerance ±5%; bands 4; resistenza 10kΩ; pin spacing 400 mil
R2 330 Ω Resistor package THT; tolerance ±5%; bands 4; resistenza 330Ω; pin spacing 400 mil
R3 10k Ω Resistor package THT; tolerance ±5%; bands 4; resistenza 10kΩ; pin spacing 400 mil
R4 330 Ω Resistor package THT; tolerance ±5%; bands 4; resistenza 330Ω; pin spacing 400 mil
VCC1 Battery block 9V voltage 9V
VCC2 Battery block 9V voltage 9V
X1 Sonar

Shopping List

Amount Part Type Properties
3 DC Motor
2 Ceramic Capacitor package 100 mil [THT, multilayer]; capacitance 0.1µF; voltage 6.3V
2 Green LED – 3mm package 3 mm [THT]; leg yes; colore Green (555nm)
2 Rectifier Diode package 300 mil [THT]; tipo Rectifier; part number 1N4001
2 10k Ω Resistor package THT; tolerance ±5%; bands 4; resistenza 10kΩ; pin spacing 400 mil
2 330 Ω Resistor package THT; tolerance ±5%; bands 4; resistenza 330Ω; pin spacing 400 mil
1 NPN-Transistor package TO92 [THT]; tipo NPN
1 NPN-Transistor package TO92 [THT]; tipo NPN; part number Transistor BC337-40
1 Basic Servo part number Goteck GS-9025MG Micro Analog Metal-Gear Servo 9g
1 Arduino processor ATmega; variant Arduino UNO R3
2 Battery block 9V voltage 9V

 

Qui lo schema per le connessioni:

 

Non è da escludere che ci sia qualcosa di non proprio corretto, ma il tutto funziona. Qui il codice PROCESSING banalissimo:

 

//———— MotorDC
#define motorPinR 9 // define the pin the motor is connected to
#define motorPinL 10 // (if you use pin 9,10,11 or 3you can also control speed)
//———— Servo
// Goteck GS-9025MG Micro Analog Metal-Gear Servo 9g
#include <Servo.h>
Servo myservoH;
#define servoPosH 0
#define servoPosHZero 75
int servoPinH=4;
//———— Ultrasonic sensor
// Ultrasonic module distance sensor HC-SR04
#include <Ultrasonic.h>
Ultrasonic ultrasonic(11,12); //int TP, int EP
int distanceR;
int distanceL;
int distance;void setup()
{
// — setup Serial
Serial.begin(9600);
// — setup MotorDC
pinMode(motorPinR, OUTPUT);
pinMode(motorPinL, OUTPUT);
// — Setup Servo
myservoH.attach(servoPinH);
myservoH.write(servoPosHZero);
// —————-
randomSeed(analogRead(3));
//
delay(2000);
}

void loop()
{
GetDistance();
Go();
delay(100);
}

void GetDistance()
{
distance = ultrasonic.Ranging(CM);
//
Serial.print(“Distance: “);
Serial.print(distance, DEC);
Serial.println(” cm”);
}

void Go()
{
if (distance  {
Stop();
GetDirection();
}
else
{
Run();
}
}

void Run()
{
//Serial.println(“RUN!”);
digitalWrite(motorPinR, HIGH); // turns the motor On
digitalWrite(motorPinL, HIGH);
}

void Stop()
{
Serial.println(“STOP!”);
digitalWrite(motorPinR, LOW); // turns the motor Off
digitalWrite(motorPinL, LOW);
}

void TurnL(int T)
{
Serial.println(“LEFT!”);
//
digitalWrite(motorPinR, LOW);
digitalWrite(motorPinL, HIGH);
delay(T);
digitalWrite(motorPinL, LOW);
}

void TurnR(int T)
{
Serial.println(“RIGHT!”);
//
digitalWrite(motorPinL, LOW);
digitalWrite(motorPinR, HIGH);
delay(T);
digitalWrite(motorPinR, LOW);
}

void TurnRandom(int T)
{
Serial.print(“Random: “);
int rand = random(2);
if (rand==1)
{
TurnR(T);
}
else
{
TurnL(T);
}
}

void GetDirection()
{
myservoH.write(servoPosHZero+45);
delay(500);
distanceL=ultrasonic.Ranging(CM);
delay(500);
Serial.print(“Distance L: “);
Serial.print(distanceL, DEC);
Serial.println(” cm”);
//
myservoH.write(servoPosHZero-45);
delay(500);
distanceR=ultrasonic.Ranging(CM);
delay(500);
Serial.print(“Distance R: “);
Serial.print(distanceR, DEC);
Serial.println(” cm”);
//
myservoH.write(servoPosHZero);
//
if (distanceR  {
Serial.println(“Noooooo! U Turn!!”);
Stop();
TurnRandom(2500);
return;
}
if (abs(distanceR-distanceL)=distanceL)
{
TurnR(1000);
}
else
{
TurnL(1000);
}
}
}

 

Ci sono alcuni parametri cablati nel codice che possono essere variati per tarare il comportamento del rover. Se volete spiegazione (ma soprattutto se volete darmi qualche dritta) scrivete nei commenti.

Si tratta ovviamente di un primo prototipo: il secondo avrà la retromarcia, due sensori di luminosità ed un display LCD…!