Robot Beginner Kit – variante di Claudio

Continuano ad arrivarmi stupende evoluzioni del Robot Beginner Kit realizzate da appassionati di Arduino della robotica e di questo Blog:

Robot Beginner Kit

oggi la variante che ti presento è quella realizzata da Claudio, un appassionato della robotica che ha realizzato una versione sonora del Robot Beginner Kit ed ha voluto condividere il suo lavoro.

L’elettronica del Robot Beginner Kit di Claudio

Claudio ha realizzato un assemblaggio del Robot Beginner Kit differente da quello che hai trovato sul blog, ha invertito la posizione dei componenti inserendo tutta l’elettronica sul primo ripiano del Robot Beginner Kit

Robot Beginner Kit posiziona l'elettronica

una soluzione davvero interessante, in questo modo ti resta a disposizione tutto il piano superiore per aggiungerci altri kit, componenti ed espansioni, in particolare Claudio ha utilizzato il ripiano in alto per ospitare la batteria:

Robot Beginner Kit la batteria supplementare

La vera variante del Robot Beginner Kit realizzato da Claudio è l’aggiunta del sonoro ossia di una melodia.

Se vuoi realizzare questa variante puoi seguire lo schema che Claudio mi ha inviato relativo a come collegare un altoparlante ad Arduino:

Robot Beginner Kit schema

con

  • n.1 resistenza da 180ohm
  • n.1 condensatore elettrolitico da 2,2microFarad
  • n.1 diodo tipo 1N4007
  • n.1 transistor tipo BC547
  • n.1 altoparlante da 8ohm 10Watt

collegati come nello schema e connessi al pin 8 di Arduino ed al pin negativo ( Gnd ) puoi dotare il tuo Robot Beginner Kit di una melodia.

Lo sketch del Robot Beginner Kit con Melodia

Ecco lo sketch che mi ha inviato Claudio:

/*
  Melody Plays a melody
  circuit:
  * 8-ohm speaker on digital pin 8

  created 21 Jan 2010
  modified 30 Aug 2011
  by Tom Igoe 

 This example code is in the public domain.

 http://arduino.cc/en/Tutorial/Tone
*/

#include "pitches.h"

// notes in the melody:
int melody[] = {NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = { 4, 8, 8, 4,4,4,4,4 };

#define PWMA 3
#define PWMB 9
#define AIN1 4
#define AIN2 7
#define BIN1 10
#define BIN2 12
#define STBY 2

#define SENSIBILITA 200

int SHIR = A5;

void melodia() {
  // iterate over the notes of the melody:
  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // to calculate the note duration, take one second
    // divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000/noteDurations[thisNote];
    tone(8, melody[thisNote],noteDuration);

    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(8);
  }
}

void setup()
{
  pinMode( STBY,OUTPUT );
  pinMode( PWMA,OUTPUT );
  pinMode( PWMB,OUTPUT );
  pinMode( AIN1,OUTPUT );
  pinMode( AIN2,OUTPUT );
  pinMode( BIN1,OUTPUT );
  pinMode( BIN2,OUTPUT );

  pinMode( SHIR,INPUT );

  digitalWrite( STBY,HIGH );
}

void loop()

{

  int dist = analogRead(SHIR);
  if ( dist > SENSIBILITA ) { gira(); }
  else                      { avanti(); }
}

void avanti()
{

  digitalWrite( AIN1,HIGH );
  digitalWrite( AIN2,LOW );
  digitalWrite( BIN1,HIGH );
  digitalWrite( BIN2,LOW );
  analogWrite( PWMA,100 );
  analogWrite( PWMB,100 );

}

void indietro()
{
  melodia();
  digitalWrite( AIN1,LOW );
  digitalWrite( AIN2,HIGH );
  digitalWrite( BIN1,LOW );
  digitalWrite( BIN2,HIGH );

  analogWrite( PWMA,100 );
  analogWrite( PWMB,100 );
}

void alt()
{
    analogWrite( PWMA,50 );
    analogWrite( PWMB,50 );

    digitalWrite( AIN1,LOW );
    digitalWrite( AIN2,LOW );
    digitalWrite( BIN1,LOW );
    digitalWrite( BIN2,LOW );
}

void gira()
{
  // STOP x 1/2 sec
  alt();
  delay( 500 );

  // INDIETRO x 1/2 secondo
  indietro();
  delay( 500 );

  // STOP x 1/2 sec
  alt();
  delay( 500 );

  // Gira
  digitalWrite( AIN1,LOW );
  digitalWrite( AIN2,HIGH );
  digitalWrite( BIN1,HIGH );
  digitalWrite( BIN2,LOW );

  analogWrite( PWMA,100 );
  analogWrite( PWMB,100 );

  delay( 200 );
}

gran parte dello sketch è quello che puoi trovare nell’articolo Robot Beginner Kit – il primo sketch a cui è stata aggiunta una funzione melodia() e alcune variabili che lo sketch utilizza per eseguire la melodia.

La linea 16: include un altro sketch che ti basta posizionare nella medesima cartella in cui metti lo sketch principale e che contiene le note che puoi utilizzare per la melodia, lo riporto alla fine della descrizione del primo sketch per non crearti confusione;

linea 19: definisci la melodia che è composta da una sequenza di note definite nel file pitches.h ( vedi sotto );

linea 22: definisci i tempi di durata della nota, 4 per un quarto di nota o un 8 ottava di nota;

linea 36: imposta una funzione melodia che invocata dallo sketch emette la melodia attraverso il pin 8 di Arduino;

linea 38: definisci un ciclo for da 0 a 7 ( < 8 ) cioè la lunghezza della melodia definita alla linea 19;

linea 43: calcoli la durata in millesimi della nota, la notazione noteDuration[thisNote] restituisce la durata della nota definita alla linea 22 per ciascun indice thisNote del ciclo for;

linea 44: usa la funzione arduino tone(pin,nota,durata) per emettere la nota (definita come secondo parametro) per la lunghezza (definita come terzo parametro) attraverso il pin 8 (definito come primo parametro);

linea 48: calcola la pausa tra una nota e la successiva come il 30% in più del tempo di durata della nota, se la tua melodia non avesse una tale regolarità ossia non tutte le pause potessero essere calcolate come il 30% in più della durata della nota avresti dovuto definire un terzo array simile a quello della linea 22 ma con i tempi di pausa per ciascuna nota;

linea 49: esegui la pausa prima di continuare con il ciclo for ed eseguire la nota successiva;

linea 51: con la funzione noTone(pin) interrompi l’emissione della nota sulpin definito come parametro, nel caso dello sketch che stai scrivendo sarà il pin 8.

Ora che sai come funziona la funzione melodia() puoi inserirla nel codice del Robot Beginner Kit nel punto in cui vuoi che venga eseguita, Claudio ha pensato di inserirla ogni volta che il Robot Beginner Kit rileva un ostacolo, per cui ha inserito il richiamo alla funzione melodia() alla linea 93 prima di eseguire la manovra indietro().

Ti riporto anche il file pitch.h che devi inserire come file nella medesima cartella dello sketch principale:

/*************************************************
 * Public Constants
 *************************************************/

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978

Mi raccomando che il file si chiami pitch.h altrimenti alla linea 16 l’include fallisce con l’errore “No such file or directory”:

errore sketch arduino su include

se vuoi comprendere meglio la funzione tone(pin) puoi leggere il tutorial sul sito ufficiale arduino

Il video del Robot Beginner Kit di Claudio

claudio ha realizzato anche un video che ho montato e ti mostro:

Buon divertimento !!!

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/robot-beginner-kit-variante-di-claudio.html

11 comments

Skip to comment form

    • claudio on 24 gennaio 2013 at 17:41
    • Reply

    ciao mauro, troppo onore! presentazione molto professionale,ti ringrazio ancora perche’ e’ grazie ai tuoi articoli e tutorial(molto ben spiegati),mi hai fatto tornare la voglia di riprendere lo stagnatore e fare quacosa. grazie ancora

    • Stefano Musumeci on 6 luglio 2013 at 09:51
    • Reply

    Ciao,
    vorrei iniziare a cimentarmi nella costruzione di un primo robot.
    Premetto di essere del tutto neofita e che di fatto la mia istruzione ha radici diverse e lontane dal mondo dell’elettronica e della robotica (sono laureato in chimico e in economia), ciò malgrado mi sono appassionato a questo mondo ed ho comprato alcuni libri su arduino e a brevissimo mi arriverà il kit arduino di secondo livello, acquistato dal sito robot domestici.
    Fatta la premessa a chi posso chiedere per avere dei consigli/aiuti?
    Ho già delle idee che vorrei sottoporre.

    1. Ciao Stefano,
      neanch’io ho un passato da studente di elettronica.
      Iniziare dai libri è un’ottima idea, poi nel Blog troverai tanti esempi e buoni esercizi da seguire.
      Quando hai bisogno di aiuto cerca un articolo che tratti l’argomento o il progetto più simile al tuo, sperimenta e comprendi lo sketch illustrato, se nonostante questo incontri delle difficoltà commenta quell’articolo ed io cercherò di aiutarti.

      Mauro

    • Stefano Musumeci on 7 luglio 2013 at 15:23
    • Reply

    Grazie mille per la disponibilità.
    ho già letto la guida ufficiale arduino, e sto studiando “Make an Arduino-Controlled Robot” di Michael Margolis.
    La mia idea è di costruire un robot dotato di 4 ruote motrici che in carenza di illuminazione accende dei led, dotato di videocamera e di alcuni sensori.
    La cosa più difficile sarà la possibilità di inviare i dati al cellulare e poterlo guidare dallo stesso.
    Hai qualche dritta da consigliare?

    ps se esiste un luogo dove pubblicare questa discussione in modo più attagliato nn devi fare altro che indicarmelo, grazie anticipatamente

    1. Ciao Stefano,
      ottima lettura, prova anche a dare un occhio al mio progetto Leonardo Wi Rover5 potrebbe ispirati per la parte di connessione da smartphone o tablet.

      Mauro

    • Stefano Musumeci on 21 luglio 2013 at 15:07
    • Reply

    Caro Mauro,
    finalmente ho iniziato i lavori, ho montato la platform di dfrobot 4wd, saldato la scheda adafruit motor shield (saldature penose ma migliorerò), assemblato tutto anche se mi mancano alcuni sensori che comprerò presto (QTR -RC sensoria riflessione).
    Ho scaricato le librerie dal sito, ma appena provo a inviare lo sketch con il cavo mi dice:
    avrdude: stk500_getsync (): not in sync: resp= 0x00

    Non so che fare!!!
    Help

    1. Ciao Stefano,
      l’errore sembra indicare che arduino non viene riconosciuto, prova a verificare che i driver siano installati sul PC.

      Mauro

    • Simone on 29 gennaio 2015 at 21:17
    • Reply

    Ciao Mauro,
    complimenti per il sito, e’ veramente ben fatto e i commenti per ogni linea di codice sono una benedizione a volte! Come molti, sono un neofita di elettronica, ma sto facendo un progetto per la mia universita’ in cui devo progettare un rover che eviti ostacoli e navighi autonomamente. Per evitare ostacoli ho creato qualcosa di simile, con un arduino UNO, un motor shield, un ultrasonico HC-SR04. Solo che vorrei fare in modo che ogni volta che il rover incotra un ostacolo, si fermi , il servo su cui e’ montato il sensore giri a destra e sinistra e decida di andare dalla parte migliore.
    So che c’e’ una marea di esempi di rover simili, ma non riesco a far funzionare il mio, sicuramente perche’ mi sfugge qualcosa di fondamentale e banale. Ho controllato se nel tuo sito ci sono tutorial o progetti simili ma non ho trovato nulla; e’ cosi’ o mi sbaglio?
    grazie
    ciao
    Simone

    1. Ciao Simone,
      ho già realizzato quello che desideri in uno degli esempi con il Beginner Kit che trovi sul blog.
      Anche se prima di copiare la soluzione ti consiglierei di provarci da solo, sei sulla buona strada con il ragionamento, che è la parte fondamentale, ti basta tradurre quello che hai descritto a parole in comandi per arduino.

    • simone on 2 giugno 2015 at 12:51
    • Reply

    dove ha attaccato la batteria da 12v? nel senso dove la connette ad arduino??

    1. Ciao Simone,
      la collega al connettore di ingresso di Arduino.

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.