Il robot beginner kit è nato per essere il tuo primo robot e per avvicinarti ai primi concetti di robotica terrestre.
Un appassionato di robotica e makers come Anto, già autore di una variante del Robot Beginner Kit, ha colto in pieno l’uso del beginner kit e continua a far evolvere il suo robot.
Anto mi ha inviato le foto di una interessante evoluzione perchè potessi condividerle attraverso il Blog con te e tutti gli appassionati di robotica e di arduino.
La seconda variante del Beginner Kit
L’evoluzione che Anto ha realizzato prevede una translazione della base superiore rispetto a quella inferiore che ha subito 2 vantaggi:
- far spazio per un pacco batterie di maggiore capienza;
- darti la possibilità di montare una ruota anteriore snodata.
A quella che sembra solo una evoluzione meccanica segue l’evoluzione elettronica: il nuovo robot beginner kit è dotato di 3 led, un pulsante ed un nuovo transistor NPN che amplifica il suono emesso dal cicalino.
Ecco i collegamenti elettrici del beginner kit:
Evoluzione meccanica
meccanicamente Anto ha realizzato alcune foto del suo robot per mostrarti il montaggio da tutti i suoi lati, destro:
in cui vedi come le due basi siano state traslate l’una rispetto all’altra, una migliore visione la puoi avere anche dal lato sinistro:
il sensore sharp è posto sul davanti al centro in modo fisso e lo vedi bene dalla foto frontale:
mentre il retro ti mostra lo spazio ricavato per ospitare un pacco batterie capiente e potente:
ed infine una foto dall’alto in cui puoi vedere come sono assemblati i componenti del robot:
Lo sketch del Robot Beginner Kit
Anto ha voluto condividere anche lo sketch che controlla il suo beginner kit:
//Robot multifunzione:
//Programma:
//0. Fermo
//1. Movimento evitando ostacoli
//2. Movimento seguendo oggetto posto di fronte al sensore
//3. Piano virtuale: mettendo la mano di fronte al sensore a varie distanze si generano diverse note
//4. Balletto: il robot balla sulle note di "Fra Martino campanaro"
//5. .....
#include <Servo.h>
#define PWMA 3
#define PWMB 5
#define AIN1 4
#define AIN2 7
#define BIN1 8
#define BIN2 12
#define STBY 2
#define motoreA 0
#define motoreB 0
#define AVANTI 0
#define INDIETRO 0
#define SENSIBILITA 100 //valore orig 300
#define pinTesta 11
int speakerOut = A4;
// definizione delle note
#define c 3830 // 261 Hz
#define d 3400 // 294 Hz
#define e 3038 // 329 Hz
#define f 2864 // 349 Hz
#define gg 2550 // 392 Hz gg e non g per non entrare in conflitto con altra variabile
#define a 2272 // 440 Hz
#define b 2028 // 493 Hz
#define C 1912 // 523 Hz
#define R 0
int SHIR = A5;
int ledPin1=9;
int ledPin2=10;
int ledPin3=13;
int inPin=6;
int val=0;
int direzione=0;
int programma= 0;
Servo testa;
void setup() //setup pin
{
pinMode( STBY,OUTPUT );
pinMode( PWMA,OUTPUT );
pinMode( PWMB,OUTPUT );
pinMode( AIN1,OUTPUT );
pinMode( AIN2,OUTPUT );
pinMode( BIN1,OUTPUT );
pinMode( BIN2,OUTPUT );
pinMode( SHIR,INPUT );//sensore ir su pin A5
pinMode(ledPin1, OUTPUT);//led pin 9
pinMode(ledPin2, OUTPUT);//led pin 10
pinMode(ledPin3, OUTPUT);//led pin 13
pinMode(inPin, INPUT);//pulsante pin 6
pinMode(speakerOut, OUTPUT);//buzzer su pin A4
digitalWrite( STBY,HIGH );
testa.attach(pinTesta);
testa.write(90);
}
long tempo = 10000;
int pause = 1000;
int rest_count = 100;
int tone_ = 0;
int beat = 0;
long duration = 0;
int nota = 0;
void loop() //routine principale
{
controllo();//verifica pressione pulsante
if (programma == 0) //fermo led accesi 000
{
digitalWrite( ledPin1,LOW );
digitalWrite( ledPin2,LOW );
digitalWrite( ledPin3,LOW );
analogWrite( PWMA,50 );
analogWrite( PWMB,50 );
digitalWrite( AIN1,LOW );
digitalWrite( AIN2,LOW );
digitalWrite( BIN1,LOW );
digitalWrite( BIN2,LOW );
digitalWrite( STBY,LOW );
}
if (programma == 1) //evita ostacoli led accesi 100
{
digitalWrite( ledPin1,HIGH );
digitalWrite( ledPin2,LOW );
digitalWrite( ledPin3,LOW );
digitalWrite( STBY,HIGH );
prog1();
}
if (programma == 2) //segue oggetto led accesi 110
{
digitalWrite( ledPin1,HIGH );
digitalWrite( ledPin2,HIGH );
digitalWrite( ledPin3,LOW );
digitalWrite( STBY,HIGH );
prog2();
}
if (programma == 3) // piano virtuale led accesi 111
{
digitalWrite( ledPin1,HIGH );
digitalWrite( ledPin2,HIGH );
digitalWrite( ledPin3,HIGH );
analogWrite( PWMA,50 );
analogWrite( PWMB,50 );
digitalWrite( AIN1,LOW );
digitalWrite( AIN2,LOW );
digitalWrite( BIN1,LOW );
digitalWrite( BIN2,LOW );
digitalWrite( STBY,LOW );
prog3();
}
if (programma == 4) // il robot balla sulle note di "fra Martino campanaro" led accesi 101
{
digitalWrite( ledPin1,HIGH );
digitalWrite( ledPin2,LOW );
digitalWrite( ledPin3,HIGH );
digitalWrite( STBY,HIGH );
prog4();
}
if (programma == 5) //....libero per aggiunta eventuale funzione......
{
digitalWrite( ledPin1,LOW );
digitalWrite( ledPin2,HIGH );
digitalWrite( ledPin3,HIGH );
analogWrite( PWMA,50 );
analogWrite( PWMB,50 );
digitalWrite( AIN1,LOW );
digitalWrite( AIN2,LOW );
digitalWrite( BIN1,LOW );
digitalWrite( BIN2,LOW );
digitalWrite( STBY,LOW );
}
}
void avanti() //avanti
{
digitalWrite( AIN1,HIGH );
digitalWrite( AIN2,LOW );
digitalWrite( BIN1,LOW );
digitalWrite( BIN2,HIGH );
analogWrite( PWMA,100 );
analogWrite( PWMB,100 );
testa.write(90);
}
void indietro() //indietro
{
digitalWrite( AIN1,LOW );
digitalWrite( AIN2,HIGH );
digitalWrite( BIN1,HIGH );
digitalWrite( BIN2,LOW );
analogWrite( PWMA,100 );
analogWrite( PWMB,100 );
testa.write(90);
}
void alt() //frena
{
analogWrite( PWMA,50 );
analogWrite( PWMB,50 );
digitalWrite( AIN1,LOW );
digitalWrite( AIN2,LOW );
digitalWrite( BIN1,LOW );
digitalWrite( BIN2,LOW );
}
void giraD() //gira a destra
{
digitalWrite( AIN1,HIGH );
digitalWrite( AIN2,LOW );
digitalWrite( BIN1,LOW );
digitalWrite( BIN2,HIGH );
analogWrite( PWMA,70 );
analogWrite( PWMB,100 );
testa.write(50);
}
void giraS() // gira a sinistra
{
digitalWrite( AIN1,HIGH );
digitalWrite( AIN2,LOW );
digitalWrite( BIN1,LOW );
digitalWrite( BIN2,HIGH );
analogWrite( PWMA,100 );
analogWrite( PWMB,70 );
testa.write(130);
}
void indiS() //indietro a sinistra
{
digitalWrite( AIN1,LOW );
digitalWrite( AIN2,HIGH );
digitalWrite( BIN1,HIGH );
digitalWrite( BIN2,LOW );
analogWrite( PWMA,100 );
analogWrite( PWMB,70 );
testa.write(130);
}
void indiD() //indietro a destra
{
digitalWrite( AIN1,LOW );
digitalWrite( AIN2,HIGH );
digitalWrite( BIN1,HIGH );
digitalWrite( BIN2,LOW );
analogWrite( PWMA,70 );
analogWrite( PWMB,100 );
testa.write(50);
}
void playTone() { // routine creazione suono
long elapsed_time = 0;
if (tone_ > 0) {
while (elapsed_time < duration) {
digitalWrite(speakerOut,HIGH);
delayMicroseconds(tone_ / 2);
digitalWrite(speakerOut, LOW);
delayMicroseconds(tone_ / 2);
elapsed_time += (tone_);
}
} else { // Rest beat; loop times delay
for (int j = 0; j < rest_count; j++) { // See NOTE on rest_count
if (digitalRead(inPin)==LOW) { return; }
delayMicroseconds(duration);
}
}
}
void controllo() //controlla pressione pulsante e se sì passa al programma successivo
{
val = digitalRead(inPin);
if (val == LOW) {
programma = programma + 1;
if (programma==6) //programmi massimo 5 (volendo si può aumentare) se la variabile va a 6 viene reimpostata a 0
{
programma = 0;
}
}
delay(300);
}
void prog1() // evita ostacoli
{
int dist = analogRead(SHIR);
if ( dist > SENSIBILITA ) {
alt();
giraS();
delay( 600 );
int dist = analogRead(SHIR);
if ( dist > SENSIBILITA + 50 ) {
alt();
indiS();
delay( 600 );
alt();
giraD();
delay( 600 );
if (digitalRead(inPin)==LOW) { return; } //verifica pressione pulsante
int dist = analogRead(SHIR);
if ( dist > SENSIBILITA + 50 ) {
alt();
indiD();
delay( 600 );
alt();
indietro();
if (digitalRead(inPin)==LOW) { return; } //verifica pressione pulsante
delay( 1000 );
alt();
giraS();
delay( 600 );
}
}
} else {
avanti();
}
}
void prog2() //segue oggetto
{
int dist = analogRead(SHIR);
if ( dist > SENSIBILITA )
{
avanti();
}
else
{
alt();
giraS();
delay( 600 );
int dist = analogRead(SHIR);
if ( dist < SENSIBILITA + 50 ) {
alt();
indiS();
delay( 600 );
alt();
giraD();
delay( 600 );
if (digitalRead(inPin)==LOW) { return; } //verifica pressione pulsante
int dist = analogRead(SHIR);
if ( dist < SENSIBILITA + 50 ) {
alt();
indiD();
delay( 600 );
if (digitalRead(inPin)==LOW) { return; } //verifica pressione pulsante
alt();
indietro();
delay( 1000 );
if (digitalRead(inPin)==LOW) { return; } //verifica pressione pulsante
alt();
giraS();
delay( 600 );
}
}
}
}
void prog3() //piano virtuale
{
int dist = analogRead(A5);
tone_ = dist*10;
duration = 16000;
playTone();
}
void prog4() //balletto
{
int melody[] = {c,d,e,c,c,d,e,c,e,f,gg,e,f,gg,gg,a,gg,f,e,c,gg,a,gg,f,e,c,c,gg,c,c,gg,c}; //array con le note della canzone
for ( int g=0; g<32; g++) {
direzione = direzione +1; //un passo avanti e uno indietro
if (direzione==7) { direzione=1; }
if (direzione==1) { alt(); avanti(); }
if (direzione==2) { alt(); indietro(); }
if (direzione==3) { alt(); giraS(); }
if (direzione==4) { alt(); indiS(); }
if (direzione==5) { alt(); giraD(); }
if (direzione==6) { alt(); indiD(); }
tone_ = melody[g];
duration = 1600000;
playTone(); //suona la nota
if (digitalRead(inPin)==LOW) { return; } //verifica pressione pulsante
}
}
Buon divertimento !!!








Il blog mauroalfieri.it ed i suoi contenuti sono distribuiti con Licenza
1 commento
Interessante, davvero soprattutto per la struttura del robot, davvero bilanciata e funzionale. Unico possibile problema : il robot non dovrebbe andare dritto necessita di compensazione tra i due motorini.
Utile il servo utilizzato come ruota per far sterzare il robot. Bravo !