Robot Beginner Kit con Arduino – il primo sketch

Ora che il tuo Robot Beginner non è più solo un Kit puoi passare alla sua programmazione, su questo argomento potrai divertirti per molto tempo sperimentando nuovi sketck e altri ne troverai in futuro su questo blog.

connessioni elettriche finite

Da subito ti do un consiglio che ho appreso dopo alcune prove e un po’ di sketch caricati a vuoto su arduino che si comportavano in modo inatteso: utilizza solo batterie alcaline da 1,5v tipo AA, ho provato batterie tipo AAA e ricaricabili di tipo AA ottenendo comportamenti del tutto inattesi con lo sketch proposto.

In particolare con le batterie ricaricabili ( 4,8v ) la tensione non è sufficiente ad alimentare arduino ed i motori per cui non si muove, mentre con le batterie di tipo AAA la corrente erogata è esigua e il robot continuava a girare su se stesso non riuscendo a rilevare correttamente il segnale fornito dal sensore SHARP GP2Y0A21YK.

Prima di caricare lo sketch ricordati di togliere l’alimentazione alla scheda arduino e di scollegare anche il pin Vin tra arduino e il driver motori, con la prima operazione ti metti in sicurezza da eventuali problemi elettrici o conflitti di tensione che possano generarsi tra l’usb di arduino ed il computer evitando di danneggiare l’uno o l’altro; la seconda operazione ti evita che il robot appena ricevuto lo sketch inizia a muoversi sul tavolo rischiando di cadere.

Passiamo allo sketch:

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

#define SENSIBILITA 200

int SHIR = A5;

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()
{
    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 );
}

Già nelle prime linee trovi la definizione dei pin di arduino:

linee 01-07: definisci i pin a cui hai collegato il driver per i motori TB6612FNG, se dopo aver uplodado lo sketch il robot gira solo su se stesso, va al contrario o fa cose inattese puoi invertire i pin AIN1 con AIN2 o BIN1 con BIN2 sulla scheda senza dover ricaricare lo sketch;

linea 09: definisci il valore di distanza che il sensore deve rilevare per scansare l’ostacolo, nel precedente articolo hai trovato uno sketch per rilevare questo valore prima di caricare questo sketch;

linea 11: definisci il pin analogico a cui hai collegato il pin di segnale del sensore SHARP GP2Y0A21YK;

linee 15-21: definisci di utilizzare i pin definiti alle linee 01-07 come OUTPUT per inviare segnali al driver motori;

linea 23: definisci di utilizzare il pin A5 come INPUT, pin a cui è collegato il sensore;

linea 25:  il pin STBY deve essere  portato a livello HIGH per consentire alla scheda motori di lavorare;

linea 30: definisci una variabile di tipo integer a cui assegni  il valore letto con il comando analogRead( pin ) dove pin in questo sketch è A5;

linee 31-32:  confronta il vaore letto dal sensore, attraverso il pin A5, e il valore impostato alla linea 09, quando il valore letto dal sensore è maggiore di quello impostato vuol dire che il tuo ostacolo è entrato nel campo visuale del robot, quello che definisci al verificarsi di questa condizione dipende da cosa vuoi che il robot esegua, ad esempio nel mio caso il robot esegue una manovra per girare, ma potresti decidere che il robot è un’ariete e che alla rilevazione dell’obiettivo ci si avventi contro o essere un cagnolino che ti segue per cui intercettare l’ostacolo ( tu ) vuol dire seguimi. In caso contrario ossia se il sensore rileva valori inferiori al 200 vuol dire che l’ostacolo è fuori dal campo visivo ed il suo scopo, nel mio esempio, è avanza fino al prossimo ostacolo;

linee 35-44: definisci la funzione avanti() invocata alla linea 32, lo scopo della funzione è far avanzare il robot;

linee 37 e 38 pongono i pin AIN1 e 2 rispettivamente a 1 e 0 logici ( HIGH e LOW ) questo consente al robot di impostare un verso di rotazione ai motori, analogamente le linee 39 e 40 impostano il verso di rotazione per il secondo motore. Assumi che i motori sia connessi in modo corretto e che il pin di tipo IN1 ( A e B  ) portati a livello logico HIGH impostino il verso di rotazione uguale per entrambi i motori in questa situazione il robot avanza o indietreggia secondo il verso in cui i rispettivi pin sono collegati al driver motori, se il robot non si comporta come desiderato inverti le connessioni sui motori fino ad ottenere quello che desideri.

linee 42-43: imposta per ciascun mootre una velocità di rotazione, i valori possibili sono da 0 a 255 per cui ho impostato un valore un po’ più basso di quello medio (125 media, 100 valore impostato ) questo è il risultato di qualche prova in cui il robot aumentando questo valore correva a tal punto da non far in tempo a fermarsi dopo la rilevazione dell’ostacolo, o in alcuni casi alla frenata scivolava contro l’ostacolo 🙂

linee 46-55: definisci la funzione indietro() questa differisce dalla precedente solo per l’impostazione dei pin di tipo IN1 e IN2 sia A sia B, infatti invertendo il segnale logico su questi il risultato è che i motori invertono la loro rotazione ed il robot va indietro.

linee 57-66: definisci la funzione alt() che ferma il robot, per farlo puoi agire sia sulla velocità dei motori che sull’impostazione dei pin IN1 e IN2, la funzione che ho scritto fa entrambe le cose, porta il segnale PWM sui motori a 0 e il livello logico a LOW per tutti i pin, avrei potuto anche agire sul pin STBY portandolo a LOW, tuttavia non ho seguito questa strada perché nelle funzioni avanti() e indietro() o nella loop() non ho inserito un comando che riportasse a HIGH tale pin per ridare vita ai motori;

linee 68-92: definisci la funzione gira() invocata alla line 31 quando il robot rileva un ostacolo nel suo raggio d’azione, analizzala nel dettaglio:

linee 71-72: all’interno della funzione gira() la prima operazione che esegue è fermare i motori, per farlo invoca la funzione alt() ed attendi un tempo di 500 millisecondi per consentire al robot una corretta frenata;

linee 75-76: inverti la rotta del robot, chiama la funzione indietro() ed attendi 500 millisecondi, un tempo adeguato a far indietreggiare il robot di qualche centimetro, utile sopratutto se l’ostacolo è molto vicino o se non è un ostacolo lineare come un muro ma presenta qualche sporgenza che il robot non può rilevare;

linee 79-80: identiche alle linee 71-72;

linee 83-86: imposta la rotazione dei motori inversa l’uno rispetto all’altro, in modo da ottenere una rotazione verso destra o sinistra, dipende da come hai collegato i motori;

linee 88-89: imposta la velocità dei motori a 100, in questo modo la rotazione sarà simmetrica;

linea 91: attendi un tempo di 200 millisecondi, tempo necessario ad eseguire la manovra di rotazione, il controllo dopo tale tempo ritorna alla funzione loop() che valuta la distanza dell’oggetto e decide se applicare una nuova rotazione o procedere in avanti().

Prima di lasciarti al video demo girato dopo aver caricato lo sketch su arduino voglio darti una dritta o quasi dritta 🙂 a causa della rotazione dei motori e della geometria delle ruote non proprio identica il tuo esemplare potrebbe non andare in linea retta quando va avanti, potresti divertirti a variare le velocità di rotazione dei motori per compensare questa differenza ed in futuro applicare le due rondelle dentellate

Beginner Robot Motori

e degli encoder per correggere via codice le differenze di rotazione 🙂

Buon divertimento.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/robot-beginner-kit-con-arduino-il-primo-sketch.html

160 commenti

2 ping

Vai al modulo dei commenti

    • massimo il 8 Maggio 2012 alle 10:52
    • Rispondi

    visto che mi sono giocato una scheda Arduino dopo aver caricato un programma ti faccio una domanda. la scheda è in loop (ripete il programma all’infinito) e non viene riconosciuta dall’IDE (neanche facendo reset).

    Ci sono particolari precauzioni da prendere quando stacchi la presa USB dall’Arduino e la lascia alimentata solo dal pacco batterie?

    1. Ciao Massimo,
      Ogni volta che stacchi il cavo USB devi farlo con attenzione per non indurre cortocircuiti, se la scheda è riconosciuta come periferica da Win io consiglio di eseguire la procedura di rimozione prevista da Win stesso, come con le chiavette Usb.

      In ogni caso non ho mai tolto l’usb lasciando un’alimentazione esterna, cerco di alimentare sempre con una sola fonte: o USB o batterie esterne, questo x evitare problemi al computer in caso di anomalie elettriche.

      Sulla tua scheda hai già provato a ricaricare il bootloader di arduino?

      Mauro

    • massimo il 12 Maggio 2012 alle 21:44
    • Rispondi

    ciao Mauro, quale sarebbe la procedura per ricaricare il bootloader?

    1. Ciao,
      in internet trovi dei tutorial interessanti per farlo.
      Prossimamente scriverò anche io un articolo su questo argomento.

      Mauro

    • massimo il 13 Maggio 2012 alle 11:15
    • Rispondi

    grazie per i consigli, attendo il tuo tutorial : )

    • Roberto il 27 Giugno 2012 alle 12:16
    • Rispondi

    Ciao Mauro, come deciso rendo partecipi i lettori del problema di cui ti ho scritto.

    In sintesi ho voluto apportare una piccola miglioria al progetto del robot, installando il sensore su di un microservo, così da permettergli, una volta raggiunto l’ostacolo, di rilevare la distanza a destra e quella a sinistra e dirigersi quindi dove lo spazio rilevato risulta maggiore.

    Ho però riscontrato due problemi.

    In primo luogo quando è in funzione il microservo gira il motore di una sola ruota.

    In secondo luogo mentre la ruota gira (in fase di avanzamento) il microservo non riesce a mentenere la posizione centrale, fissata in 90°, ma si posiziona all’angolo 0° senza trovare stabilità, salvo poi funzionare correttamente quando il motore della ruota si ferma.

    Ti posso dire che utilizzo proprio la libreria predefinita Servo (unica libreria utilizzata nel codice, peraltro) per le funzioni attach() e write().

    La scheda è una Arduino R3. Lo slot è composto da 4 pile nuovissime di tipo AA alcaline da 1.5V.

    Non ho ancora avuto modo di testare singolarmente il funzionamento del servo indipendentemente dall’attività dei motori, ma posso presumere che sia corretto, in quanto se posiziono un ostacolo di fronte al sensore mentre il servo sta nella posizione sbagliata i motore si ferma e il servo compie esattamente i movimenti stabiliti da codice.
    Si posizione centralmente (90°), ruota prima nella posizione 30°, poi in quella a 150°, infine torna a 90°.
    Appena calcolato lo spazio maggiore riparte il motore della ruota, ma in quel momento il servo impazzisce di nuovo tornando alla posizione di 0°.

    Disabilitando le funzioni relative al servo (attach() e write()) i motori girano entrambi e anche il sensore risponde correttamente.

    Ti ringrazio per l’attenzione,
    Roberto.

    1. Ciao Roberto,
      leggendo il tuo commento mi sembra chiaro che il problema derivi da un conflitto tra la libreria Servo.h e il PQM che controlla i motori.

      In passato, trovi degli articoli sul blog, ho utilizzato questa libreria ed il controllo motori (cerca robot-sfera nel blog) senza rilevare problemi. Tuttavia da poco ho provato un microservo simile al tuo in un progetto con la motor schield rilevando anomalie simili a quelle che mi segnali.

      Mi sono ripromesso di approfondire, se vuoi, date le tue competenza sw se vuoi iniziare ad indagare magari arrivi ad una soluzione prima di me e la puoi condividere sul blog.

      Mauro

    • Roberto il 29 Giugno 2012 alle 16:21
    • Rispondi

    Ciao Mauro,
    chiedendo pareri, consigli e leggendo qua e là sono riuscito, almeno per quanto riguarda il mio caso, a risolvere il problema.

    Per farla breve occorre far sì che il driver motori e il servo non utilizzino PWM regolati con lo stesso timer.

    Pin e Timer sono così organizzati:
    TCCR0 -> pin 5, pin 6
    TCCR1 -> pin 9, pin 10
    TCCR2 -> pin 3, pin 11

    Nel mio caso per esempio il driver si appoggiava per il motore destro al PWM 9 e il servo era attaccato al PWM 10, quindi sullo stesso timer.

    Il robot ora sembra funzionare correttamente, si tratta solo di affinare il codice per perfezionarne i movimenti, nel complesso però è ok e la libreria Servo può essere utilizzata senza problemi.

    Mi auguro che questo possa essere d’aiuto anche ad altri.

    Un saluto,
    Roberto.

    1. Ciao Roberto ottimo lavoro, sono sicuro che il tuo prezioso consiglio sarà utile a molti altri.

      Se vorrai pubblicare il tuo sketch spiegando a tutti che csa hai realizzato il blog è a tua disposizione.

      Grazie
      Mauro

    • franzan claudio il 7 Gennaio 2013 alle 22:03
    • Rispondi

    grazie mauro, seguendo i tuoi consigli ho realizzato il robot per la felicita’ di mio figlio ( 8 anni), come batteria ne ho usata una ricaricabile 12v di un avvitatore, messa nel piano superiore, mentre la scheda arduino ed il controller motori in quello sotto, assieme al sensore, ho aumentato il tempo di retromarcia e cosi’ fa’ delle piroette.Ora volevo inserire una melodia , ma non so’ come fare inserire il trone melody degli esempi dell’ide nel tuo listato, mi puoi aiutare. grazie

    /*
    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 };

    void setup() {
    // 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 loop() {
    // no need to repeat the melody.
    }

    1. Ciao Claudio,
      in quali occasioni vuoi attivare la melodia ?
      In questo sketch la melodia è attiva solo in fase di setup, io ti consiglio di rinominare la funzione setup() di questo sketch in melodia();
      Poi nel loop() dello sketch del beginner kit quando vuoi che esegua la melodia richiami la funzione melodia() semplicemente scrivendo:

      void loop() {
      … comandi dello sketch …
      melodia()
      … altri comandi ….
      }

      Non dimenticare che sia la funzione melodia sia le impostazioni presenti in questo sketch devi riportarle nello sketch del beginner kit.

      Mauro

    • franzan claudio il 8 Gennaio 2013 alle 16:14
    • Rispondi

    ciao mauro, grazie del tuo consiglio,ho inserito la musica quando fa’ la retromarcia, e definito bin1 il pin 12 in qunto l’8 e’ usato dall’ altoparlante.Sei grande, grazie ancora!

    /*
    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 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 );

    }

    1. Ciao Claudio,
      bravissimo !!!
      Se ti va mi mandi le foto ed il video con il sonoro del tuo progetto?
      Mi piacerebbe pubblicarlo.

      Mauro

    • franzan claudio il 11 Gennaio 2013 alle 21:09
    • Rispondi

    ciao mauro, come faccio ad inviarti il materiale ?

    1. Ciao Claudio,
      via email, la trovi nella sezione contatti del blog.

      Mauro

    • franzan claudio il 15 Gennaio 2013 alle 14:07
    • Rispondi

    ciao mauro , ti ho mandato su facebook le foto e il video del robot,ora ho provato a mettere una melodia anche quando va’ avanti, ti ringrazio ancora per avermi fatto conoscere arduino.

    #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 };

    int speakerPin = 8;
    int length = 15; // the number of notes
    char notes[] = “ccggaagffeeddc “; // a space represents a rest
    int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
    int tempo = 300;
    #define PWMA 3
    #define PWMB 9
    #define AIN1 4
    #define AIN2 7
    #define BIN1 10
    #define BIN2 12
    #define STBY 2

    #define SENSIBILITA 250

    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 playTone(int tone, int duration) {
    for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
    }
    }
    void playNote(char note, int duration) {
    char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
    int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
    // play the tone corresponding to the note name
    for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
    playTone(tones[i], duration);
    }
    }
    }
    void setup()
    {
    pinMode(speakerPin, OUTPUT);
    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()

    {
    for (int i = 0; i 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 );

    }

    1. Ciao Claudio,
      grazie 1000 non ho ricevuto nulla, puoi inviarmi tutto sulla mail che trovi nella pagina contatti del Blog?

      Mauro

    • claudio il 18 Gennaio 2013 alle 14:57
    • Rispondi

    ciao mauro, ti ho mandato il video e delle foto del robot, tramite un amico: mario rossi in quanto non sono iscritto a facebook,volevo chiederti, arduino puo’ eseguire piu’ temporizzazioni simultaneamente in modo indipendente, era per dei rele’ temporizzati comandati ognuno col suo pulsante?

    ciao grazie, claudio

    1. Ciao Claudio,
      preferirei che il materiale relativo ai tuoi progetti me lo inviassi via email all’indirizzo che trovi nella pagina contatti.
      Ritengo che FB non sia il metodo migliore per scambiare file.

      Per quanto riguarda il tuo dubbio, considera che il linguaggio di arduino non è multithread ed è sequenziale, lui esegue sempre un ciclo ( loop ) e tutto quello che contiene viene eseguito, se inserisci un delay() si ferma per il tempo stabilito.
      Se ho compreso quello che vuoi fare devi utilizzare la funzione millis() e fare tu i calcoli dei tempi, leggi qualcuno dei miei tutorial sulla funzione millis().

      Mauro

    • Cristiano il 16 Febbraio 2013 alle 23:45
    • Rispondi

    Buonasera Mauro Alfieri
    Ho da poco realizzato il beginner kit, sono in difficoltà con la velocità di rotazione dei motori, inizialmente era più veloce il destro, dopo aver variato la velocità per tentativi, è il sinistro ad essere più veloce.
    La differenza anche inizialmente era molto evidente, ora imposto i valori inviali di 100 e procedo con le prove che definirei empiriche, credo sia inutile effettuare qualsiasi misurazione agli ingressi dei motori, dovrebbe essere un problema meccanico e di costruzione dei motori stessi.
    Escludo che il difetto sia nella scheda che pilota i motori perche scambiando le posizioni A con B, non si riscontra nessuna variazione nel comportamento.
    Il comportamento è macroscopico, si muove percorrendo una circoferenza di circa un 1-1.50 metri, le variazioni di velocità che ho effettuato forse sono troppo repentine, devro procedere di una sola unità in più o meno.
    Credo che accetterei molto volentieri un tuo consiglio.

    1. Ciao Cristiano,
      quello che descrivi sembra un problema di meccanica dei motori.
      Il mio consiglio è di provare i motori singolarmente per determinate il PWM di differenza, se possiedi due potenziometri è più divertente, leggi il valore sel potenziometro (0-1023) converti in valori PWM (0-255) e te li fai scrivere a video oltre che inviarli al motore.

      Regoli i potenziometri fino a quando i motori vanno alla medesima velocità e leggi i valori di differenza tra il primo ed il secondo, questa differenza è quella che presumibilmente dovrai applicare tra il PWMA e PWMB per far andar dritto il tuo Beginner Robot 🙂

      Mauro

    • Cristiano il 19 Febbraio 2013 alle 13:50
    • Rispondi

    Ciao Mauro
    Ti ringrazio della risposta alla mia richiesta di aiuto, durante l’attesa sono riuscito ad ottenere un risultato accettabile con PWM 100 (A) e 122 (B), anche se il moto non è sempre rettilineo. Comportamento strano si verifica se imposto il PWM per avere una maggiore velocità, circa 150 e 172, allora ruota letteralmente su se stesso con una ruota ferma. Osservando la parte elettronica e i motori non noto nessun circuito per la soppressione dei disturbi causato dallo scintillio delle spazzole, condensatori ceramici nuclei, sono nel cip della scheda controllo motori???
    Il tuo suggerimento è ottimo, ma tu non conosci il tuo interlocutore, un architetto di oltre 60 anni, con tanti hoby, che però è un novizio programmatore, il concetto mi è chiaro quanto non mi è chiaro al momento lo sketch.
    Avevo due idee, una usare due interruttori a forcella come encoder per leggere la rotazione delle ruote, e aggiungere un altro sensore, ponendoli lateralmente.
    Ciao Grazie Cristiano

    1. Ciao Cristiano,
      complimenti per la voglia di fare e per le idee, davvero interessanti.
      Ora che conosco il mio interlocutore un po’ di più ammiro ancor di più le tue intuizioni e sono certo che provengano da molta esperienza fatta sul campo non con i robot magari ma nella vita.

      Ti chiedo se puoi fare un test, puoi alimentare il circuito con una batteria da 9v di quelle che una volta si utilizzavano sui telecomandi?
      Da quello che mi racconti potrebbe essere un problema di alimentazione.
      In merito ai condensatori se vuoi puoi aggiungerli ai motori, considera che si tratta di un prodotto molto entry level 🙂

      Mauro

    • Cristiano il 20 Febbraio 2013 alle 00:48
    • Rispondi

    Ciao Mauro
    Ho tolto i motori dai riduttori, ruotando con le dita mi sono reso conto di un maggiore attrito meccanico, ho lubrificato, montato i condensatori e il tutto si comporta meglio, non sono in grado di capire quale terapia abbia avuto effetto ( eseguite entrambe prima di rimontare i motori), sono daccordo sul prodotto entry level, ho visionato anche i tuoi filmati e il movimento non è costante, ma credo che non si possa pretendere di più.
    Per l’alimentazione uso un pacco batterie ricaricabili che ho realizzato composto da 6 stilo da 1,2 V, 7.2 V, non volevo utilizzare le pile, credo che i 7.2 V siano corretti per arduino e per il controllo motori, forse sono più veloci con i settaggi da te proposti, comunque se credi che ci possono essere problemi di alimentazione posso provare con una pila a 9V.
    Credi che l’interruttore a forcella possa essere impiegato per il controllo della velocità di rotazione??
    L’utilizzo di un encoder di quadratura mi sembra sprecato e più complesso.
    Cristiano

    1. Bravissimo Cristian,
      dalle tue precedenti email avevo intuito che la tua è vera passione !!! e sono contento di non essermi sbagliato.
      L’alimentazione a 7,2 è un tocco di classe, ti suggerivo i 9v perché il beginner kit è acquistato da chi non ha esperienza sull’alimentazione e il pacco batterie in alcuni modelli è insufficiente.

      Si l’interruttore potrebbe essere un ottimo approccio, del resto un encoder è troppo considerato che la direzione la imposti tu e sai qual’è.
      Ti lancio una sfida, che ne pensi di usare questo sensore:

      http://www.robot-domestici.it/joomla/component/virtuemart/robotica-domotica/sensori/sensori-ad-infrarossi/photo-interrupter-gp1a57hrj00f

      è ottico e funziona bene con Arduino, lo sto provando anche io.
      Indipendentemente dal sensore che usi, ti consiglio di usare per i due interruttori o sensori ottici i pin 2 e 3 di arduino usati come interrupt, trovi sul blog come si usano, potrebbe essere una interessantissima evoluzione del Beginner Robot che mi piacerebbe pubblicare una volta ultimata, se vorrai.

      Mauro

    • Cristiano il 21 Febbraio 2013 alle 00:44
    • Rispondi

    Come mai negli sketch non hai usato la libreria del GP2Y0A21YK ???

    1. Ciao Cristiano,
      i motivi sono i seguenti:
      1. la GP2Y0A21YK non è la libreria corretta per il sensore utilizzato;
      2. lo scopo del tutorial è insegnare che il sensore ir trasforma la distanza rilevata in tensione 0-5v letta dal pin analogico;
      3. ho scoperto dopo la stesura di questo tutorial l’esistenza di quella libreria 🙂

      Mauro

    • Cristiano il 5 Marzo 2013 alle 20:36
    • Rispondi

    Ciao Mauro
    Ho avuto problemi di accumulatori, risolti quelli ho realizzato i due circuiti con gli interruttori a cavalletto che piazzati funzionano egregiamente, lo sketch è ok con gli interrupt ( 2 e 3), momentaneamente solo con visualizzazione su monitor, ora devo inserire il tutto sullo sketch del beginner, per prima cosa libero i pin 2 e 3 e provo la convivenza, poi studierò l’interazione giri velocità motori.
    I consigli o dritte sono ben accetti.
    Cristiano
    Mi dimenticavo, ho acquistato gli interruttori a cavalleto della robot-domestici, ma sono troppo grandi e non sono riuscito ad alloggiarli tra i motori, allora ho ripiegato su materiale di recupero da stampanti.

    1. Ciao Cristiano,
      ottimo lavoro, non vedo l’ora di ricevere foto,video e sketch se ti andrà di condividere il tuo progetto 🙂

      Consigli: nessuno mi sembra che tu proceda alla grande.

      Mauro

    • Giuseppe il 15 Marzo 2013 alle 20:12
    • Rispondi

    Salve Mauro,

    Ho voluto incrementare il Suo codice, inserendo delle istruzioni per far accendere e spegnere il robottino al touch del mio telecomando.

    Ho aggiunto una pila da 9V, ma credo che non sia sufficiente per farlo muovere correttamente.
    Ossia ho provato a sostituire anche i pin AIN1 con AIN2 o BIN1 con BIN2 sulla scheda, ma si muove solo la ruota destra, una, due volte, e poi si ferma definitivamente.
    Cos’è che potrebbe non andare? L’alimentazione? Non ho inserito nessun sensore per gli ostacoli poi.

    #include

    //motor A connected between A01 and A02
    //motor B connected between B01 and B02

    int STBY = 10; //standby

    //Motor A
    int PWMA = 3; //Speed control
    int AIN1 = 9; //Direction
    int AIN2 = 8; //Direction

    //Motor B
    int PWMB = 5; //Speed control
    int BIN1 = 11; //Direction
    int BIN2 = 12; //Direction

    // DICHIARAZIONI CONTROL REMOTE
    const int RECV_PIN = 13;

    IRrecv irrecv(RECV_PIN);

    decode_results results;

    // FINE DICHIARAZIONI CONTROL REMOTE

    void setup(){

    pinMode(STBY, OUTPUT);

    pinMode(PWMA, OUTPUT);
    pinMode(AIN1, OUTPUT);
    pinMode(AIN2, OUTPUT);

    pinMode(PWMB, OUTPUT);
    pinMode(BIN1, OUTPUT);
    pinMode(BIN2, OUTPUT);

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

    digitalWrite( STBY,HIGH );
    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver
    }

    void loop() {
    if (results.value == 16613503) {
    Serial.println(“spento”);
    alt();
    irrecv.resume(); // Receive the next value
    } else { // irrecv.decode(&results)
    Serial.println(“acceso”);
    avanti();
    indietro();
    gira();
    irrecv.resume(); // Receive the next value
    }
    }

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

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

    void indietro()
    {
    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 sec
    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 );
    }

    La ringrazio,
    Giuseppe

    1. Bravo Giuseppe,
      senza la modifica funziona?
      Potrebbe essere un problema di alimentazione in quanto il driver di questo robot ha un guadagno ridotto e assorbe tanta corrente, un miglioramento puoi ottenerlo collegando il Vm del driver direttamente al + della pila senza passare da arduino.

      Mauro

        • Franco il 6 Gennaio 2016 alle 23:10
        • Rispondi

        Il VM del Driver alla pila e il – al polo negativo al posto che su Arduino? Ho capito bene? Io ho problemi di alimentazione 🙁

        1. Ciao Franco, non ho compreso la richiesta.

            • Franco il 7 Gennaio 2016 alle 23:34

            In pratica volevo sapere se collegando il VM al polo positivo
            della batteria devo anche collegare il polo negativo del driver con il filo che attualmente va a Gnd su Arduino?

          1. Si Franco,
            il Gnd, in italiano si chiama anche: comune, deve essere collegato al medesimo polo per tutto il circuito.

            • Franco il 8 Gennaio 2016 alle 22:49

            Mannaggia non mi è ancora chiaro cosa devo fare!

            Scusami se insisto ma prima di fare qualche grave errore meglio informarsi.

            In sostanza prendo il pacco batterie da 6 e lo collego ad Arduino.

            Aggiungo una pila da 9 Volt, scollego il cavetto che va VM ad Arduino e lo collego al polo positivo della batteria, scollego il cavetto del Driver Gnd che andava a connettersi a Gnd su Arduino e lo attacco al polo negativo della batteria da 9 Volt.

            È corretto?

            Non rischio di bruciare niente?

          2. Ciao Franco,
            i poli negativi, gnd, o comune devono essere collegati insieme.

    • Matteo il 23 Marzo 2013 alle 09:22
    • Rispondi

    Io ho utilizzato un chip l293d montato nella basetta e un sensore a ultrasuoni.
    Come modifico lo sketch?
    Grazie.

    1. Ciao Matteo,
      leggi l’articolo sul Sensore ultrasuoni per capire come modificare lo sketch.
      Per l’L293d è utilizzato in moti articoli sul Blog, ti consiglio di leggere quelli.

      Mauro

    • Cristiano il 25 Marzo 2013 alle 13:33
    • Rispondi

    Buongiorno Mauro
    La convivenza funziona, leggo i giri degli encoder via seriale, con il robot funzionante, evoluzione con servo, i risultati visualizzati mostrano una regime di rotazione incostante di entrambi i motoriduttori, uno è comunque più veloce, la fluttuazione del numero di giri mi aveva fatto pensare ad un problema di alimentazione, quindi ho eseguito le seguenti modifiche:
    – Ho alimentato il driver direttamente dagli accumulatori, alimentando anche la sua logica con 5 V. da Arduino, provato l’iserimento della funzione Brake, ma non sò se funziona, ma non è cambiato niente, percui il problema e nei piccoli ed economici motoriduttori, forse troppo economici.
    Comunque non mi arrendo e mentre studio lo sketch per il controllo della velocità dei motori con gli encoder, sto pensando alla realizzazione di un telaio con 4 ruote da poter provare in esterno, giardino.
    -Il primo problema è la scelta dei motori, qualcosa con una qualità e costo accettabile che dia una resa simile per tutti è quattro.
    – sensore utrasuoni, avrei pensato il ping della Parallax.
    – il driver dei motori, eliminati quelli da montare, vedo critica la saldatura dell’integrato smd, quale arduino o laltro prodotto in Italia, tutti provati da te.
    Gradirei il tuo commento su quanto sopra esposto e un consiglio sui materiali che mi sono necessari per progettare il telaio.
    Grazie Cristiano

    1. Ciao Cristiano,
      i tuoi test sono incredibilmente precisi e mi illuminano su tante situazioni che io stesso avevo solo ipotizzato.
      Per i motori da utilizzare in un modello da esterno io ti consiglio dei motoriduttori, molto dipende dalla grandezza del tuo modello, dal peso e dal tipo di terreno che vuoi affrontare.
      Io utilizzo spesso i motori della micromotors, che acquisto sempre da robot-domestici, l’ultimo che ho acquistato, e non ancora provato, ha anche un encoder effetto Hall a bordo.
      Sono sufficientemente piccoli ed economici se vuoi realizzare un modello non enorme, devi valutare se la coppia erogata ti è sufficiente.

      Come motor shield ne trovi molte presentate sul blog, scegli quella che ritieni più adatta al tipo di motore e controllo che vuoi utilizzare.
      Per il telaio puoi valutare materiale da brico center fino a materiale realizzato in prototipazione, dipende da quanto vuoi spendere, io rimarrei sull’alluminio, sufficientemente leggero e robusto, se hai disponibilità puoi realizzarlo anche il carbonio, kevlar o altro materiale 🙂

      Mauro

    • Giuseppe il 4 Aprile 2013 alle 21:43
    • Rispondi

    Buonasera Mauro,

    mi serve un aiuto col codice.

    Se voglio programmare il rover col telecomando, assegnando rispettivamente a due diversi valori, di due differenti bottoni, la funzione “avanti” e l’altra “alt”, come posso scrivere nel codice?

    Dal monitor seriale del software, premendo il telecomando, posso leggere tutti i valori di ogni singolo bottone.

    Per assegnare un valore, ad esempio, a “results.value” o “irrecv.decode(&results)”, come sì può scrivere?
    Trattandosi di una stringa, come questa, “FD00FF”,
    se nella condizione IF, tra parentesi, scrivo “results.value == “FD00FF”, mi da due errori.

    rover.ino: In function ‘void loop()’:
    rover.ino: error: ISO C++ forbids comparison between pointer and integer

    ————————————————————————————————–

    #include

    //motor A connected between A01 and A02
    //motor B connected between B01 and B02

    int STBY = 10; //standby

    //Motor A
    int PWMA = 3; //Speed control
    int AIN1 = 9; //Direction
    int AIN2 = 8; //Direction

    //Motor B
    int PWMB = 5; //Speed control
    int BIN1 = 11; //Direction
    int BIN2 = 12; //Direction

    // DICHIARAZIONI CONTROL REMOTE

    const int RECV_PIN = 7;
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    // FINE DICHIARAZIONI CONTROL REMOTE

    void setup(){
    pinMode(STBY, OUTPUT);
    pinMode(PWMA, OUTPUT);
    pinMode(AIN1, OUTPUT);
    pinMode(AIN2, OUTPUT);
    pinMode(PWMB, OUTPUT);
    pinMode(BIN1, OUTPUT);
    pinMode(BIN2, OUTPUT);
    pinMode( STBY,OUTPUT );
    pinMode( PWMA,OUTPUT );
    pinMode( PWMB,OUTPUT );
    pinMode( AIN1,OUTPUT );
    pinMode( AIN2,OUTPUT );
    pinMode( BIN1,OUTPUT );
    pinMode( BIN2,OUTPUT );
    digitalWrite( STBY,HIGH );
    Serial.begin(9600);
    irrecv.enableIRIn(); // Start the receiver
    }

    void loop() {

    if (irrecv.decode(&results)) { // QUALSIASI TASTO DEL TELECOMANDO, TRANNE PER “FD00FF”, FA
    digitalWrite( AIN1,HIGH ); // PARTIRE IL ROVER
    digitalWrite( AIN2,LOW );
    digitalWrite( BIN1,HIGH );
    digitalWrite( BIN2,LOW );
    analogWrite( PWMA,100 );
    analogWrite( PWMB,100 );
    Serial.println(results.value, HEX); // ACCESO
    irrecv.resume(); // Receive the next value

    } else (results.value == “FD00FF” ) { // SPENGO IL ROVER .
    digitalWrite( AIN1,LOW );
    digitalWrite( AIN2,LOW );
    digitalWrite( BIN1,LOW );
    digitalWrite( BIN2,LOW );
    analogWrite( PWMA,100 );
    analogWrite( PWMB,100 );
    Serial.println(results.value, HEX); // SPENTO
    irrecv.resume(); // Receive the next value

    }

    }

    La ringrazio Mauro,
    Giuseppe

    1. Ciao Giuseppe,
      nell’articolo sul lampadario a fibre ottiche ho assegnato ai pulsanti di un telecomando IR delle funzioni di accensione led.

      L’ambito é differente dal tuo, ma il concetto é lo stesso.

      Prova a leggere quell’articolo e verifica se riesci a risolvere il problema.

      Mauro

    • ALESSANDRO il 4 Aprile 2013 alle 22:12
    • Rispondi

    Ciao Mauro,
    ho un ultimo problema (speriamo l’ultimo), praticamente il robot funziona, solo che mi sembra un po troppo lento(avendo utilizzato 4 batterie alcaline da 1,5 V) e tende a girare un po su se stesso, come se un mototre andasse di meno

      • Giuseppe il 4 Aprile 2013 alle 23:15
      • Rispondi

      Per alimentare i due motorini, ho collegato in serie tre batterie: due da 3V e una da 9V.
      Sicuramente la prestazione del rover è migliorata e anche di parecchio!

      Saluti

      1. Ciao Giuseppe,
        non starai esagerando con 15v ?
        12v penso siano più che sufficienti 🙂

        Mauro

    1. Ciao Alessandro,
      io non li chiamo problemi ma sfide da risolvere, mi piace l’idea di affrontare nuove prove e trovarne le soluzioni.
      E spero che non sia davvero l’ultimo, vorrebbe dire che ti sei fermato nella sperimentazione.

      Vengo alla tua domanda, i motori hanno velocità differenti, in quanto non sono meccanica di precisione ma stampati in serie ed economici, puoi provare a cambiare la velocità di rotazione di quello più rapido per cercare di equilibrare l’andatura.

      Mauro

        • ALESSANDRO il 5 Aprile 2013 alle 15:53
        • Rispondi

        perfetto ora funziona, ma per esempio, se volessi fare tornare indietro il robot una volta che è bloccato perchè trova ostacoli ai lati e quindi l’unica è farlo indietreggiare come posso fare? facciamo per esempio che se il robot rimane fermo per più di 4 secondi, torna indietro

        1. Ciao Alessandro,
          la soluzione più semplice è aggiungere sensori.
          Puoi usare dei sensori ai lati o qualcosa che ti permetta di capire che il robot è fermo.

          In progetti più complessi questo si fa con gli encoder che ti dicono se i motori stanno girando oppure no.

          Mauro

  1. Heya! I realize this is kind of off-topic but I needed to ask.
    Does operating a well-established blog such as yours take a massive amount work?
    I’m completely new to blogging however I do write in my diary every day. I’d like
    to start a blog so I can share my experience and thoughts online.
    Please let me know if you have any suggestions or tips for brand new aspiring blog owners.

    Appreciate it!

    1. There are many software and systems for open-source blog I suggest you search the web for the one that best suits your needs.

      Mauro

    • Michael il 11 Giugno 2013 alle 14:25
    • Rispondi

    Ciao ho fatto esattamente ciò che hai scritto in tutte le guide, ma il mio robot attaccato al pc sembra non riceva abbastanza energia per partire, collegandolo invece a parte funziona, ma mi funziona solamente il motore collegato a A01 e A02

    1. Ciao Michael,
      prova ad invertire i collegamenti tra i due motori per verificare che i motori funzionino entrambi.
      Se un motore non dovesse funzionare puoi scrivere dove lo hai acquistato (robot-domestici.it) e farti sostituire il componente rotto.

      Mauro

    • Michael il 12 Giugno 2013 alle 00:30
    • Rispondi

    Si ho invertito i due motori e funziona anche l altro quindi presumo sia un problema di scheda?

    1. Ciao Michael,
      potrebbe dipendere dell’alimentazione o solo da un contatto non inserito bene.

      Prova ad eseguire questi test:
      – alimenta il beginner con 9v
      – controlla le connessioni B01 e B02
      – collega il VM del driver motore direttamente ai 9v di alimentazione

      Dimmi poi che risultato ottieni 🙂

      Mauro

    • Michael il 15 Giugno 2013 alle 16:46
    • Rispondi

    fatto tutte e tre queste cose…

    1. Ciao Michael,
      immagino che il risultato non cambi.
      Prova a invertire il pin PWMA e PWMB

      Mauro

    • Luca il 1 Luglio 2013 alle 21:49
    • Rispondi

    Devo comprare un arduino , è mi è venuto un dubbio sul quale comprare per fare un robot
    è meglio comprare un arduino r3(ATmega16U2) o un arduino smd rev 3 (Atmega328P)???

    1. Ciao Luca,
      ci sono pochissime differenze tra le due versioni.
      Dipende dal tuo robot e da ciò che vorrai lui faccia.
      Se leggi il mio articolo su Leo Wi Rover 5 saprai c’è in quel caso ho preferito la versione Leonardo perché meglio rispondente al mio scopo.
      In genere la R3 é la versione più diffusa e testata ed ottima per chi inizia.

      Mauro

    • arnaldo il 6 Luglio 2013 alle 16:38
    • Rispondi

    Ciao Mauro, sto continuando il mio percorso di apprendimento…Un piccolo problema: Al robot che ho costruito ho applicato una shield REV3 acquistata su robot-domestici.
    Seguendo il datasheet della scheda vedo che per il canale A utilizza i pins 12 per la direzione; 3 per PWM e 9 per Brake e per il canale B rispettivamente 13 direzione; 11 PWM e 8 Brake. ho fatto le seguenti sostituzioni nel codice da te proposto ( e che mi funziona senza la shield ..)
    PWMA 3
    PWMB 11
    AIN1 12
    AIN2 9
    B1N1 13
    BIN2 8
    STBY 2 ( ho lasciato questo valore ma non so se con la shield serve…)
    Dove sbaglio?……puoi con la tua solita cortesia aiutarmi?
    Cordialmete
    Arnaldo

    1. Ciao Arnaldo,
      la shield arduino che stai usando non ha 4 pin per definire la direzione ma solo due.
      Dovrai eseguire delle modifiche allo sketch differenti.
      Segui uno dei tutorial in cui uso quella shield per comprendere le differenze.

      Il pin STBY nella shield che stai usando non ti serve puoi usare quel pin (2) per altri scopi del tuo robot

      Mauro

    • arnaldo il 7 Luglio 2013 alle 19:17
    • Rispondi

    Ciao Mauro,
    grazie al tuo suggerimento ho capito perfettamente adesso il mio errore ..Mi sono già costruito un sketch per la prova dei motori ..avanti-indietro ed incrociata. Adesso potrò apportare tutte le modifiche allo sketch completo del robot…Ti farò sapere……
    Buona Domenica
    Arnaldo

    1. Ciao Arnaldo,
      sono contentissimo per te!!!

      Mauro

    • arnaldo il 7 Luglio 2013 alle 19:22
    • Rispondi

    Ciao Mauro, girovagando ho visto che Adafruit adotta delle bellissime librerie AFMotor.h e Robot.h che credo funzionino con la loro shield…sono molto semplici da utilizzare ……Io ho scaricato le librerie ed ho provato ad usarle, m con la shield REV3 non vanno…..che me dici? le conosci?
    Arnaldo

    1. Ciao Arnaldo,
      Le conosco ma non le ho mai provate.
      Leggendo la documentazione penso che funzionino solo con la loro shield in quanto usa dei driver e delle connessioni differenti da quelle delle altre shield.

      Mauro

    • arnaldo il 8 Luglio 2013 alle 08:47
    • Rispondi

    Ciao Mauro,
    una domanda….nel tuo tutoria ( robot con shield prova dei motori) vedo che non usi i pin relativi ai Brake…e comunque funziona…nel mio sketch io li ho usati…mi potresti spiegare che differenza fa?….Grazie mille
    Arnaldo

    1. Ciao Arnaldo,
      io non li utilizzo in quanto il driver presentato non li possiede.
      Il freno ( brake ) si esegue mandando a LOW tutti i pin Ain1,Ain2,Bin1,Bin2 nel tuo caso, se non ricordo male, devi portare a HIGH i pin del Brake per usare il freno motore.

      Prova a consultare anche la documentazione ufficiale del produttore della shield per capire se ciò che ti ho detto é vero o mi sono confuso.

      Mauro

    • arnaldo il 9 Luglio 2013 alle 08:56
    • Rispondi

    Ciao Mauro, è come dici tu…bisogna portare ad HIGH il freno…Comunque, anche ignorando i Brakes ed usando solo i pin direzionali tutto funziona. Per fermare i motori basta mettere a 0 i PWM…Mi chiedevo quali fossero i vantaggi dell’una o l’altra soluzione!! …..comunque sempre grazie per la tua attenzione.
    Adesso comunque tutto comincia ad essere più chiaro!
    Cordialmente
    Arnaldo

    1. Ciao Arnaldo,
      è una domanda che mi sono posto anche io e l’unica risposta che mi sono dato è che il brake abbia effetto più rapido sul controllo del motore rispetto alla variazione di PWM.
      Probabilmente in sketch e progetti di altra natura ha vantaggi migliori di quelli che presenta in un robot.

      Mauro

    • arnaldo il 2 Agosto 2013 alle 12:31
    • Rispondi

    Ciao Mauro, sto lavorando su un progetto di Robot che ti segnalo perché veramente interessante sopratutto per un espero come te…si chiama ” michelino ” …
    http://blog.miguelgrinberg.com/post/building-an-arduino-robot-part-i-hardware-components
    Purtroppo è in inglese…ma non credo avrai problemi….il software è molto interessante e ben costruito…Contiene anche il logging and il remote control….Se ti interessa dai uno sguardo..
    E’ molto difficile corrispondere con il progettista per cui ti pongo un problema di ordine generale nella speranza che tu possa aiutarmi…
    Come mai tutto funziona se il robot è connesso tramite USB al PC e quando alimentato dalle sole batterie il controllo dei sensori non va??? che senso ha una cosa del genere??? CONNETTERE il robot alla USB non altera certo il firmware già installato…..E’ un problema di potenza?—ho messo due batterie:
    Una di 6 Volt che alimenta arduino ed una di 9 V per i motori….ma, in generale, tu pensi che un problema di alimentazione possa alterare il corretto funzionamento del firmware?
    Scusami come sempre…
    Cordialmente
    Arnaldo

    1. Ciao Arnaldo,
      il robot é interessante in quanto identico al beginner kit con la variante del sensore di distanza ad ultrasuoni e il modulo Bluetooth che ti permette il controllo remoto.

      A mio avviso il tuo problema riguarda proprio l’alimentazione del tutto. Innanzitutto invertirei le alimentazioni:

      6v per i motori
      9v per arduino

      Se leggi le caratteristiche di arduino troverai che preferisce tensioni da 7v in su se lo alimenti dal suo connettore.

      Sulle ultime versioni del Beginner io adotto 6 pile da 1,5v = 9v per alimentarlo.

      Mauro

    • arnaldo il 5 Agosto 2013 alle 12:57
    • Rispondi

    Ciao Mauro, grazie per la tua risposta…Dunque….ho provato ad apportare le modifiche ma con questa soluzione il robot pure mi da dei problemi….mi gira in tondo e guardando il data logger sul monitor seriale vedo che ci sono valori sballati del Ping Sensor il quale invece funziona perfettamente quando carico a parte lo sketch relativo al suo funzionamento….Sono un po “flippato” tant’è che avevo proposto a Pagliani della Robot-Domestici di darmi una mano ( pagando ovviamente) con uno sketch ex novo ad hoc per i miei componenti ..ho .promesso il robot al mio nipotino che vive in USA e non voglio mancare la promessa……Spero di non crearti nessun imbarazzo….potrei anche ordinarne uno completo e funzionante ma cosi perdo il mio desiderio di imparare bene arduino.
    Grazie Mille
    Arnaldo

    1. Ciao Arnaldo,
      la tua determinazione mi piace, non ho chiaro che componente hai acquistato e in cosa differisce dal Kit proposto.
      Paliani è in gamba e se ti ha dato la sua disponibilità sono certo che risolverai.

      Se hai bisogno di qualche info commenta l’articolo ed io ti rispondo.

      Mauro

    • arnaldo il 6 Agosto 2013 alle 12:29
    • Rispondi

    Ciao Mauro, e grazie come sempre….nei prossimi giorni voglio riassemblare il tutto e fare delle prove ex novo.
    Utilizzerò anche un set di batterie come tu proponi 6 da 1,5 V AA per Arduino e 4 da 1,5 V per i motori.
    Per Arduino avevo utilizzato una ) una 9V alcalina e forse è questo il problema.
    Ti terrò informato… Paliani mi ha parlato in maniera entusiastica di te…Complimenti.
    Quanto ad ostinazione….beh….è una mia prerogativa da sempre….
    Un cordiale saluto.
    Arnaldo

    PS. hai uno sketch tuo personale per il sensore Ping che vorrei sostituire a quello ad infrarossi… che ne dici di quello proposto da ” michelino” che calcola le medie delle distanze??

    1. Ciao Arnaldo,
      l’alimentazione a 9v è corretta per arduino sia che la riceva da una pila unica sia da 6 pile da 1,5v.
      Non conosco il sensore Ping, puoi mandarmi un link del sensore?

      Robot domestici lo vende?

      Mauro

    1. Ciao Arnaldo,
      non conoscevo il componente, apparentemente sembra semplice da utilizzare grazie ai soli 3 pin di collegamento.
      E’ molto interessante la misurazione da 2cm a 3m, sicuramente un range ottimo.

      Anche la motor shield è nuova sul catalogo robot-domestici ed io non ho ancora avuto modo di provarla, tuttavia la descrizione ed il tutorial con esempi sono semplici e facili da comprendere.

      Mauro

    • arnaldo il 7 Agosto 2013 alle 10:31
    • Rispondi

    Ciao Mauro, un aggiornamento: alimentando Arduino con i soli 9V senza collegare i motori alla batteria di 6V la cosa migliora molto……Se provo il robot non a terra ma facendolo girare su un supporto tutto funziona tranquillo…mettendo un ostacolo davanti al sensore il robot risponde bene invertendo la rotazione dei motori nella giusta maniera etc….Quando è a terra fa un po di bizze…dvanti ad alcuni ostali si ferma ed altri no…
    Ho asseverato intanto che non ho commesso errori di collegamenti o software e questo è già qualcosa…Non riesco a spiegarmi il resto….Ancora problema di alimentazione? Sensore difettoso?…..Mah….Che ne dici?
    Grazie…
    Arnaldo

    1. Ciao Arnaldo,
      il comportamento del robot a banco e a terra in modo differente mi fa pensare ancora all’alimentazione, sopratutto se, come scrivi, hai ricontrollato tutti i collegamenti.
      Quando il robot deve muoversi a terra l’attrito delle ruote sul pavimento ed il peso del robot richiedono maggiore potenza ai motori che la chiedono al driver e all’alimentazione.

      Mauro

    • arnaldo il 7 Agosto 2013 alle 10:59
    • Rispondi

    Ciao Mauro, non ci crederai…sai perchè tutto andava a caso?….ho spostato i pin del ping sonar sulla breadborad in un’altra possizione sylla stessa breadboard e mantenendo ovviamente i dovuti collegamenti ad arduino…
    tutto funziona bene…..penso che tu, da buon tecnico conosca perfettamente la legge di Murphi….beh..questa è una dimostrazione della sua validità….
    Sono molto interessato anche ad un buon inseguitore solare per fotovoltaico…quando avrai tempo rimettiti al lavoro….sono disposto a contribuire in qualche modo finanziariamente…
    Cordialmente.
    Arnaldo

    1. Ciao Arnaldo,
      bene sono contento … Murphi è sempre in agguato.
      L’inseguitore solare è un bel progetto spero di aver tempo da dedicargli nei prossimi mesi.

      Mauro

    • soufiane il 19 Novembre 2013 alle 19:39
    • Rispondi

    Hi Mauro

    thank you for sharing your knowledge with us,
    thats really great to see that,
    i just got into arduino and all that im not that good in sketch, i build little robot like yours with arduino uno, motor control shield, distance sensor (HC-SR04), and bluetooth module.
    i’ve been trying to find sketch to run it but i couldnt, i cant write my own sketch im new to that. i used your but gives me error.
    wondering if you have any sketch for that i can use, would be big help

    thank you

    1. Hello Soufiane,
      thanks for the compliments.
      I do not have a sketch ready for your project.

      Read the articles dedicated to the single shield of your project.
      One would be this: https://www.mauroalfieri.it/en/elettronica/digital-meter-di-matteo-naldoni.html

      Mauro

    • Laura il 12 Dicembre 2013 alle 14:03
    • Rispondi

    Ciao Mauro, vorrei un consiglio.
    Sto pensando di regalare a mio figlio di 13 anni il Multiplo Robot Starter Kit, per il momento senza Arduino. Il prossimo anno comincera’ a studiare informatica, non ha conoscenze specifiche, e’ solo molto curioso e sveglio.

    Secondo te puo’ essere utile per cominciare? Oppure e’ meglio che inizi da Arduino?
    Grazie.
    Laura

    1. Ciao Laura,
      il robot che mi hai indicato non lo conoscevo fino a un minuto prima di aver letto il tuo commento.
      Mi sembra interessante tuttavia non l’ho mai provato e non mi sento in grado di esprimere un parere.

      Se vuoi regalargli un robot che usa arduino ti consiglio il Beginner Robot Kit della robot-domestici che solitamente viene acquistato dalle scuole medie per i propri allievi e trovi tutti i tutorial su come costruirlo, programmarlo e farlo evolvere sul mio blog.

      Mauro

    • Daniele il 5 Gennaio 2014 alle 16:40
    • Rispondi

    Ciao Mauro,
    intanto complimenti.
    Ho un piccolo problema da risolvere: una volta caricato lo sketch sul robot(senza staccare il pin VIN) lo faccio muovere sul tavolo e funziona benissimo. Dopo di che lo stacco e passo ad alimentarlo per via esterna(batterie) ma invece di comportarsi come prima inizia a girare su se stesso.
    Come posso risolvere questo problema?
    Grazie.
    Daniele

    1. Ciao Daniele,
      alimenta il robot con una pila da 9v direttamente in arduino o 6 pile stilo di tipo AA ( 1,5v ciascune ) vedrai che il comportamento sarà il medesimo in entrambe le situazioni.

      Mauro

        • Daniele il 6 Gennaio 2014 alle 16:17
        • Rispondi

        Grazie mille Mauro.
        provvederò ad applicare il tuo consiglio.
        Grazie ancora.
        Daniele

    • thomas il 6 Febbraio 2014 alle 18:27
    • Rispondi

    Ciao Mauro,
    ho seguito passo per passo tutta la guida fino alla fine ma quando alimento arduino (uno rev3) con le 4 pile aa, si accende il led on ed L di arduino ma il robot rimane fermo al suo posto.

    thomas

    1. Ciao Thomas,
      prova a lasciare anche la porta USB collegata e sollevare il robot durante il tuo test, potrebbe essere un problema di alimentazione insufficiente, questo kit prevede un pacco batterie da 6 pile AA non ricaricabili.

      Se dopo il test vedi che funziona puoi chiedere a robot-domestici di sostituirti il porta batterie.

      Mauro

    • thomas il 7 Febbraio 2014 alle 19:34
    • Rispondi

    ho provato ma non cambia niente,
    poi con il tester ho guardato l’uscita di a01 e a02 b01 b02 e non esce nulla.

    1. Ciao Thomas,
      quale motor shield stai usando?

      Mauro

        • thomas il 8 Febbraio 2014 alle 13:15
        • Rispondi

        non uso motor shield

        Thomas

        1. Ciao Thomas,
          hai già controllato che i pin di direzione e PWM inviino i valori corretti alla motor shield?

          Mauro

    • Gabriele il 24 Febbraio 2014 alle 15:18
    • Rispondi

    Gent. Mauro Alfieri,
    inizio con il farle i miei complimenti per il suo sito, d’avvero completo e
    con spiegazioni chiare.
    Sono uno studente di informatica che frequenta la classe quinta e come
    progetto per l’esame di maturità ho pensato di portare un robot realizzato
    con arduino.
    Ho delle basi sulla programmazione in Java e quindi riesco anche a
    destreggiarmi un pochino con C++.
    Ora come leggo anche nella sua guida ho riscontrato un problema, i due
    motori non girano alla stessa velocità e quindi il robot non segue una
    linea retta.

    Come suggerito nella sua guida per ovviare a questo problema si possono
    utilizzare degli encoder.
    Quindi ho acquistato due fototransistor e li ho collegati ai pin di arduno
    in modo da leggere gli impulsi creati dalle ruote dentate delle due ruote.

    Adesso mi trovo in difficoltà sul codice da scrivere per effettuare il
    controllo della velocità delle ruote e di conseguenza adattare la velocità
    della ruota più lenta a quella che gira più veloce.

    Ho cercato nel suo sito una soluzione ma non sono stato capace di trovare
    un post che trattasse il mio problema.

    Non è che per caso ha uno sketch che mi possa aiutare?

    La ringrazio molto

    Saluti
    Gabriele

    1. Ciao Gabriele,
      ho scritto un articolo dedicato agli encoder che ti invito a leggere.
      Nel tuo caso gli encoder sono 2 e se li hai realizzati con due fototransistor dovrai collegare il primo all’interrupt0 ed il secondo all’interrupt1 ricevendo non un segnale sfasato di 90° ma due segnali che puoi gestire come conteggio.

      In pratica dovrai contare, in un intervallo di tempo da te definito, in cui i motori si muovono la differenza di impulsi tra il primi ed il secondo encoder e regolare di conseguenza la velocità del motore corrispondente per adattarla l’uno all’altro.
      Purtroppo non possiedo codice di questo tipo già pronto, se riuscirai a scriverlo e vorrai condividere le tue conoscenze con altri appassionati, sarò lieto di pubblicare il tuo progetto.

      Mauro

        • Gabriele il 24 Febbraio 2014 alle 16:55
        • Rispondi

        Grazie Mauro,
        avevo già adocchiato il tuo articolo, ora proverò a guardarlo con più attenzione, non mi ero soffermato proprio perchè avevo notato i due segnali sfalsati.

        Se riuscirò a scriverlo sicuramente lo condividerò.

        Grazie
        Gabriele

        1. Bene Gabriele, considera anche i consigli che ti ho scritto per realizzare il codice.

            • Gabriele il 25 Febbraio 2014 alle 14:51

            Grazie Mauro dei consigli, io sto utilizzando una Mboard della Itead, hai idea di come posso fare a capire quali pin possono gestire gli interrupt?

            Grazie, caio

          1. Ciao Gabriele, non la conosco, verifica che il produttore abbia rilasciato la documentazione sui pin come fa arduino, se così non fosse dovrai scrivere loro.

    • Alessandro il 1 Aprile 2014 alle 00:55
    • Rispondi

    Ciao,
    Ho comprato il robot beginner kit qualche mese fa. L’avevo montato e fatto tutto, però invece di andare dritto andava storto; poi per vari impegni ho messo via l’Arduino e il problema è rimasto irrisolto.
    Sabato sono andato all’Arduino Day e mi è venuta voglia di tornare a giocarci un po’:
    Ho smontato tutto quello che avevo fatto e ho provato a collegare un solo motore (nel driver motori ho usato solo A) e sono riuscito a farlo funzionare, ho provato anche l’altro e andava. Allora ho provato ad attaccarli tutti e due agli stessi cavi (A01 e A02), ho poggiato il robottino a terra ma è andato comunque storto.
    Ho quindi dedotto che uno dei due motori è rovinato, perché anche avendo lo stesso segnale dell’altro va più piano.
    Quindi la mia domanda è: “Sai dove posso comprare un solo motore (DG01D)?”
    Ho cercato su internet ma ho trovato solo il kit completo (che non voglio ricomprare).
    Grazie.

    1. Ciao Alessandro,
      con “storto” intendi che non va in linea retta o che continua a girare su se stesso?
      Nel primo caso è normale, puoi risolvere mettendogli 6 pile al posto di 4 che a volte sono insufficienti, resta una base da poche decine di euro ed è possibile che non vada perfettamente dritta.
      Io nei corsi insegno che va calibrata via codice e puoi fare anche tu la medesima cosa.

    • Federico il 1 Maggio 2014 alle 23:29
    • Rispondi

    Ho un problema con il pwma: perchè se assegno come valore analogico un valore <255 il motorino non gira, mentre il pwmb funziona.
    Non è un problema nè dell' alimentazione ne del circuito. Probabilmente è il chip del controllo motori, te che dici?

    1. Ciao Federico, sei sicuro di aver collegato il PWMA ad un pin PWM e non ad un pin digitale e basta? In tal caso il problema é risolto.

  2. Ciao Mauro,
    ti chiedo gentilmente un consiglio riguardo ad un problema riscontrato con il robot che sto costruendo :
    Sembra che quando girano i motori si generi un disturbo sull’ alimentazione in quanto il robot continua a girare !
    Ho provato a mettere al posto di un motore dc un servo motore e ho potuto costatare che funziona perfettamente.
    Ho messo il servo motore in rotazione continua 0-180 gradi ed avvicinando la mano al sensore ultra suono si ferma correttamente. Per sicurezza ho fatto anche al contrario servo fermo ed avvicinando la mano ruota perfettamente.
    Con i motori dc vedo con l’ oscilloscopio che viene generato un disturbo sull’ alimentazione.
    Per tutte le prove effettuate ho usato come alimentazione un alimentatore e non batterie
    Rimango in attesa di una tua cortese risposta
    Grazie mille
    Alberto

    1. Ciao Alberto,
      il robot che stai costruendo è il beginner kit o uno simile che usa almeno uno dei componenti presentati in questo progetto?
      Te lo chiedo perché se differisce da questo progetto potrebbero essere infinite le cause del problema che riscontri.
      Sicuramente parte del problema puoi risolverlo usando dei condensatori sui motori, che immagino non ci siano e devi calcolare in funzione del tipo di motore.

    • rossano il 28 Maggio 2014 alle 23:55
    • Rispondi

    salve volevo chiederle dei chiarimenti/consigli su un kit comprato su ebay chiamato “Robot Auto Chassis Kit Encoder”. Il kit in questione è simile a quello presente in questo articolo, ma presenta solo due motori uguali a quelli presenti nel Robot Beginner Kit ma non ha nessuna scheda di collegamento ma solo le due uscite (+ e -) e i cavetti. Vorrei capire come devo collegarli ad arduino, se devo comprare qualche altro accessorio e in tal caso quale e se lo sketch è simile a quello presente in questo articolo.
    Spero di essere stato chiaro. Cordiali saluti

    1. Ciao Rossano,
      purtroppo info su kit che non conosco e non ho provato mi è difficile elargirli e sarebbe presuntuoso farlo.
      Sappi che arduino ha bisogno sempre di una scheda motori per controllare motori cc come quelli del beginner e nei numerosi articoli dedicati al Beginner Kit trovi tutte le info di montaggio e programmazione che ti servono.

      Devi solo leggerli e capirli per adattali al tuo progetto.

    • Giuseppe Pipero il 23 Luglio 2014 alle 11:54
    • Rispondi

    Salve, vorrei parlarle di un problema che ho riscontrato nel robot beginner kit.
    Ho montato il tutto e fin qui nessun problema, però ho problemi con il sensore sharp… Quando provo a verificare la lettura della distanza con lo sketch da lei pubblicato e tutto funziona perfettamente… Quando invece carico lo sketch completo del robot, la lettura del sensore cambia, in particolare i dati sono abbastanza più alti rispetto alla normalità. Di conseguenza ho problemi nel far muovere il robot, in quanto il sensore legge dei valori diversi, e anche quando non ci sono ostacoli, a volte si ferma e cambia direzione… Sa aiutarmi?
    Grazie in anticipo

    1. Ciao Giuseppe,
      a volte questo tipo di comportamento si verifica in mancanza di sufficiente alimentazione.
      Prova ad alimentare il tutto con una pila da 9v o con 6 pile da 1,5v e dimmi se vedi dei miglioramenti.

        • Giuseppe Pipero il 23 Luglio 2014 alle 13:15
        • Rispondi

        Grazie per la risposta!
        Ho provato ad alimentarlo con le pile, ma niente… invece ho notato una cosa.
        La lettura del sensore “sballa” appena imposto il valore HIGH al pin STBY del driver motori…
        Infatti, se rimuovo la stringa “digitalWrite(stby, HIGH);”, il sensore legge correttamente, ma, naturalmente, i motori non si muovono!

        1. Ciao Giuseppe,
          quello che scrivi conferma il problema di alimentazione.
          Nel momento in cui porti HIGH il pin STBY dici al driver di alimentare i motori e l’alimentazione è insufficiente per motori+sensore+arduino+driver
          Se hai già provato con più pile da 1,5v potrebbero essere non sufficientemente cariche ad assolvere alle richieste del beginner.

          Io spesso durante i corsi quando mi accorgo di questi problemi uso un alimentatore da 9v 1A per testare il funzionamento del robot.
          A volte questo comportamento è dovuto dalla costruzione dei motori che possono richiedere maggiore corrente per funzionare in modo corretto.

            • Giuseppe Pipero il 23 Luglio 2014 alle 13:40

            Ok, grazie mille! Metterò più batterie!

            • Giuseppe Pipero il 23 Luglio 2014 alle 15:07

            Volevo parlarti di uno strano (per me che so poco di elettronica) fenomeno!
            Al momento ho alimentato arduino con 4 batterie da 1.5v, e, nonostante i problemi con il sensore, il robot cammina e funziona, anche le ruote si muovono abbastanza velocemente…. Adesso ho preso una pila da 9v per alimentare solamente il driver motori (e staccarlo dall’alimentazione di arduino), e, non so perchè, le ruote camminano molto più lentamente!

          1. Ciao Giuseppe,
            la pila da 9v è nuova?

    • Giuseppe Pipero il 23 Luglio 2014 alle 16:38
    • Rispondi

    Comprata oggi!

    1. Ciao Giuseppe,
      a meno che non sia già scarica, ma ne dubito, direi che è collegata in modo errato.
      Dovrai mettere il +9v sul VM e il nagativo a Gnd ricordandoti di portare un’altro Gnd al Gnd di arduino.

        • Giuseppe Pipero il 23 Luglio 2014 alle 17:45
        • Rispondi

        Ho fatto così… adesso provo un’altra batteria… l’unica motivazione può essere solo che è scarica

        1. Ciao Giuseppe,
          se i collegamenti li hai eseguiti come indicato può essere un problema di batteria scarica.
          In alternativa prova ad alimentare tutto il progetto con la pila da 9v.

    • GIANFRANCO il 19 Ottobre 2014 alle 18:45
    • Rispondi

    Ciao Mauro ho realizzato uno sketch per un robot a quattro ruote con il sensore a ultrasuoni posizionato su un servo. L’idea sarebbe quella di fargli analizzare lo spazio circostante mediante diverse angolazioni, memorizzare queste in variabili e far sì che scelga di andare laddove trova spazio maggiore. La logica dello sketch mi sembra buona , purtroppo se lo carico le ruote girano in modo strano, addirittura quando il robottino dovrebbe girare le ruote di una stessa fila girano una contro l’altra, non riesco a venirne a capo! Posso postare qui lo sketch e farti dare un’occhiata? PS: ho testato le singole funzioni ovviamente, e non ci sono problemi hardware come se avessi collegato i motori con polarità inversa, anche se dal comportamento si può pensare questo.

    1. Ciao Gianfranco,
      no, non è possibile postare sketch come puoi leggere in fondo ad ogni articolo, in ogni caso anche se lo facessi io non ho modo e tempo di analizzare i migliaia di sketch che ogni settimana mi arrivano dai lettori del blog e per non far torto a nessuno evito di leggerli.

      Posso aiutarti anche senza sketch, del resto se hai provato le singole funzioni, il problema è altrove; qualche ipotesi:

      1. alimentazione non sufficiente: cui quando appoggi il robot a terra i motori assorbono più del previsto a vuoto e causano il malfunzionamento dell’arduino;
      2. conflitto tra le funzioni: se singolarmente funzionano e insieme no potresti aver generato dei conflitti. inizia a mettere una funzione alla volta verificando che non vi siano conflitti di funzionamento e quando inizia a comportarsi in modo strano verifichi con il monitor seriale cosa sta accadendo;
      3. il servo assorbe troppa alimentazione da arduino: se il servo è di quelli mini, sopratutto se di fabricazione economica, potrebbe essere causa dell’eccessivo assorbimento che attraverso arduino non può avvenire, alimentalo con 5v separatamente.

      Dimmi come va dopo questi controlli 🙂

    • GIANFRANCO il 20 Ottobre 2014 alle 22:12
    • Rispondi

    Forse dopo numerosi tentativi ho capito il problema… Spero sia quello: Cosa cambia esattamente da porre una serie di semplici if piuttosto che un primo if() seguito da vari else if() con un else finale? Domani provo a cambiare con la seconda opzione

    1. Ciao Gianfranco,
      cambia la logica con cui scrivi il programma.
      Ti consiglio di leggere un manuale di programmazione base, anche in altri linguaggi procedurali, in cui spiegano molto bene la differenza tra le due sintassi.

    • LUCA il 10 Marzo 2015 alle 17:29
    • Rispondi

    Ciao Mauro,
    inanzitutto tantissimi complimenti per il blog!!
    Stavo facendo il corso di robotica.
    – Ho assemblato il robot
    – Ho montato l’elettronica
    – Ho scritto e caricato lo sketch

    ma la cosa strana è che se è alimentato tramite USB il robot fa tutto quello che deve fare, se invece alimentato tramite il battery pack è come se non avesse abbastanza potenza per fare tutto quello che dovrebbe fare. In sintesi se non collego il sensore SHARP il robot si muove (ma ovviamente va a sbattere ovunque), mentre se collego il sensore non si muove (si muove solo se collegato via USB).

    1. Ciao Luca,
      hai acquistato il kit o lo hai assemblato da solo?
      Nel kit ho fatto cambiare il porta pile da 4 a 6 di tipo AA perché non sempre sufficienti ad alimentare arduino,motori,driver e sensore sharp; ad esempio se usi pile ricaricabili o non alcaline si manifestano problemi simili a quelli che evidenzi.

        • LUCA il 10 Marzo 2015 alle 19:27
        • Rispondi

        Ho acquistato il kit!!
        Pensi che se cambio il porta pile da 4 a 6 potrei risolvere il problema?

        Saluti,
        Luca

        1. Ciao Luca,
          se cambi l’alimentazione molti dei problemi legati alla mancanza di energia saranno risolti.
          Segnalerò al venditore che ti ha inviato un porta pile da 4 al posto di quello da 6, fai lo stesso perché è una caratteristica fondamentale del kit.

    • simone il 21 Aprile 2015 alle 17:01
    • Rispondi

    salve ho ordinato da robot domestici il kit robot beginner con saldatura inclusa sfortunatamente non me lo hanno saldato potrebbe dirmi lei gentilmente cosa saldare e come? grazie

    1. Ciao Simone,
      se hai pagato un servizio di saldatura e si sono sbagliati puoi chiedere loro di fare le saldature che hai chiesto.
      Se vuoi fartela da solo puoi saldare i soli connettori del driver motori, non è difficile ma serve un po’ di attenzione e praticità per non danneggiare il driver di controllo.

    • Simone il 1 Giugno 2015 alle 22:01
    • Rispondi

    Salve,
    Risolto il problema saldature e ho fatto tutto ciò che ha scritto nelle sue guide peró ho un problema il robot continua ad eseguire la manovra per girarsi anke se nn dovrebbe come posso risolvere??

    1. Ciao Simone,
      quante pile stai utilizzando?

        • simone il 3 Giugno 2015 alle 19:42
        • Rispondi

        salve e grazie per la risposta ho messo una batteria 9v con uscita jack arduino.
        cosa posso fare?? mettere un portabatterie da 8 stilo 1,5v per arrivare a 12v e con uscita jack arduino??

        1. Ciao Simone,
          i 9v sono sufficienti, controlla che i collegamenti elettrici dei motori non implichino che il robot continui a ruotare su se stesso, cosa differente dalla manovra di girata che prevede delle pause.

            • simone il 9 Giugno 2015 alle 21:12

            risolto con una batteria nuova dopo una decina di minuti di utilizzo inizia ad impazzire

          1. Ciao Simone,
            non ho compreso se hai risolto oppure no.

    • simone il 13 Giugno 2015 alle 16:37
    • Rispondi

    salve,
    in pratica ho risolto cambiando batteria finchè la batteria è molto carica funziona tutto regolarmente appena inizia a scaricarsi un pò invece impazizsce.

    ho un altra domanda da farle potrebbe spiegarmi il significato delle sigle del driver motore??
    intendo cosa vuol dire PWMA , PWMB , AIN1,AIN2 ,BIN1 ,BIN2 ,STBY e VM?? potrebbe essere così gentile da spiegarmi il significato di ogni sigla?? grazie

    1. Ciao Simone, trovi tutto descritto nel blog, leggi gli articoli relativi al montaggio ed all’elettronica.

        • simone il 17 Giugno 2015 alle 16:17
        • Rispondi

        perfavore ho letto ma nn trovo il significato

        1. Ciao Simone,
          probabilmente non ho compreso io il tipo di spiegazione che cerchi.

            • Simone il 19 Giugno 2015 alle 16:22

            Vorrei sapere ke significato ha la porola ain1 e tutte le altre scritte prima

          1. Ciao Simone,
            i pin AIN1 e 2 come i pin BIN1 e 2 inidicano li input per i canali A e B, rispettivamente: se lo scomponi ottieni:

            A canale
            IN input
            1 numero del pin

            • Simone il 22 Giugno 2015 alle 21:44

            La ringrazio

    • Simone il 15 Giugno 2015 alle 11:21
    • Rispondi

    Ciao scusami ho riletto tutto ma ci sono scritti dove collegarli non i significati. Potresti dirmi il significato?

    • marco il 19 Settembre 2015 alle 11:39
    • Rispondi

    ciao vorrei porti il mio problema io ho realizzato il Robot Beginner Kit con Arduino ho messo una alimentazione a 9v i motori funzionano ma uando io inserisco il sensore il Sensore distanza Sharp GP2Y0A21YK0F sulla
    scheda arduino uno r3 i motori cominciano a rallentare e il sensore non funziona ho provato a testareli separatamente e funzionano

    1. Ciao Marco,
      hai ricevuto il kit con 6 pile ? In caso contrario scrivi al rivenditore chiedendo la rettifica.
      Il rivenditore ufficiale del kit è http://www.robotics-3d.com, se lo hai acquistato da altri non sono sicuro eseguano la sostituzione.

    • Franco il 6 Gennaio 2016 alle 23:00
    • Rispondi

    Grandissimo questo sito!!! Complimenti!

    Ho realizzato il mio primo Robot, non ero a digiuno di Arduino, ma ho trovato informazioni utilissime.

    Ho solamente fatto una variazione, al posto del sensore Infrarossi ho usato un sensore HC-SR04 a ultrasuoni.

    Ho due problemi però e volevo chiedere consigli

    1- il robot tira molto a sinistra non ho ben capito cosa servirebbe (Che sensore) servirebbe, insieme alle due rotelline, per correggere la differenza di rotazione e farlo camminare dritto ???

    2- Con un pacco da batterie da 4 stilo e una pila da 9 Volt il Robot è lentissimo vorrei prendere delle batterie ricaricabili da 12V che possa poi sfruttare anche su altri progetti. Dal video mi sembra di intravedere che il tuo
    ha una seconda fonte di alimentazione… Hai dei consigli? Soprattutto per quanto riguarda Ampere, dimensioni
    e peso, Hai qualche modello specifico che mi puoi consigliare?

    Grazie mille per tutto questo ben di Dio che ci regali con i tuoi corsi 😉

    1. Ciao Franco,
      parto dalla prima richiesta: la meccanica, il pavimento, il tipo di motori, la motoriduzione sono tutti fattori che possono influenzare la direzione e per correggerla hai 2 modi:

      1. empiricamente compensando la velocità di rotazione della ruota più veloce adeguandola in modo che corregga la direzione;
      2. modificando la meccanica ed introducendo due encoder, uno per ciascun motore che compensi la rotazione in modo automatico;

      La soluzione 2 è più complessa e costosa ma di certo corregge anche eventuali errori di direzione dovuti a cause esterne come la pendenza o l’attrito del pavimento.

      Per la seconda richiesta: se hai letto lo sketch e compreso il funzionamento dei segnali PWM, vedi corso arduino gratuito on-line, avrai anche compreso come dare maggiore potenza ai motori del tuo robot. l’alimentazione può aiutare ma non è risolutiva se non cambi la potenza erogata ai motori.
      Come alimentazione io uso di solito 6 pile AA da 1,5v ( 9v in totale ) e funziona senza grandi problemi.

    • Franco il 7 Gennaio 2016 alle 23:43
    • Rispondi

    Grazie mille per i tuoi chiarimenti vedrò di provare a fare
    qualche modifica appena ho il tempo e ti riporterò il risultato.

    Grazie ancora

    Già mi piaceva Arduino… Adesso mi stai facendo innamorare della robotica 🙂

    • andrea il 18 Febbraio 2016 alle 18:44
    • Rispondi

    ciao Mauro ho un problema di questo tipo:
    Arduino lo alimento con 4 pile da 1,5V= 5,5V quindi sull’uscita 3,3V leggo 3,3V ma sull’uscita 5V leggo 4V.
    Ho dei sensori ultrasuoni che ahimè alimento con i 4V direttamente dalla Arduino. Sembrandomi pochi provo a darei ai sensori i 5V esternamente (lasciando GND di riferimento con Arduino), ma si pianta.

    1. Ciao Andrea,
      ho scritto un articolo sulle alimentazioni di arduino o genuino, inoltre trovi sul sito arduino.cc descritto in modo chiaro che se lo alimenti dal connettore devi applicare una tensione maggiore o uguale a 7v

    • Livio Vecchi il 24 Febbraio 2016 alle 12:12
    • Rispondi

    Egr. Sig Mauro Alfieri
    Sono Livio ho 73 anni , mi sono sempre dilettato con apparecchiature elettroniche, da gennaio ho scoperto e uso Arduino Mega, per comandare un robot da me costruito circa 9 anni fa .
    Leggo i suoi articoli e le lezioni, ho preso spunto da questi e da qunto trovato in internet, per automatizzarlo con tre sensori SCH04 uno frontale e due montati lateralmente a 15° rispetto al corpo robot, perchè ho notato che in alcuni casi urtava l’ostacoli, in queste condizioni va molto meglio, un LCD 20×2 un gruppo di 8 relè e due transistor per comandare i 2 motoriduttori, adesso ho ordinato una scheda per azionare il motore e per eliminare i relè.
    Quando il robot si trova in ambiente molto grande quindi oltre i 4mt. va in crisi e sul LCD esce le scritta che si trova a 9 cm. ma non è vero, parte un po come vuole poi quando la distanza dimiusce tutto e ok, però quando arriva tra 45°-60° davanti a una colonna il segnale si sperde e ritorna una indicazione di 130/145 cm. e urta l’ostacolo, come si può risolvere il problema.
    La ringrazio anticipatamente se vorrà rispondere a questa mia.
    Cordiali saluti Livio Vecchi

    1. Ciao Livio,
      i problemi sono due e distinti:
      Il primo riguarda l’avvio del robot che va impostato in modo che quando i sensori rilevano distanze oltre quella di pericolo d’utro, vanno ignorate.
      Se, ad esempio, la distanza di 5cm dall’ostacolo è tollerabile, puoi impostare che una distanza rilevata maggiore di 5cm sia ignorata.

      Il secondo comportamento va corretto aumentando il numero di sensori o usando un servo che sposti il sensore per eseguire delle rilevazioni più fitte nell’arco 46-60°

    • franco il 25 Febbraio 2016 alle 20:20
    • Rispondi

    Fa’ piacere sapere che ci sono persone come Lei, capaci e disponibili.
    Mi immagino che questo non sia solo un lavoro, da quanto ho capito insegna, ma una passione vera.
    Complimenti davvero.

    1. Ciao Franco,
      è solo passione .. il mio lavoro è un’altro.
      Insegno per passione e investo gli introiti in materiale per altri tutorial.

    • Antonio il 23 Maggio 2016 alle 19:50
    • Rispondi

    Ciao Mauro,
    Prima di leggere questo tutorial ho letto quello su come leggere la distanza da un sensore sharp, ho visto che per quello hai utilizzato una libreria, come mai per questo no?

    1. Ciao Antonio,
      non ricordo bene a memoria, sono tutorial di qualche anno fa, potrei sbagliare, mi sembra che la libreria l’avessi usata per convertire direttamente in valore metrico ( cm ) la distanza.
      Per il Robot Beginner Kit non è necessario avere questa info.
      Puoi leggere bene i miei articoli e le descrizioni degli sketch per comprendere le differenze e confermare se ricordo bene.

    • simona il 31 Ottobre 2017 alle 12:10
    • Rispondi

    Ciao, ho montato l’arduino e installato lo scketch che hai proposto, però non parte, in cosa posso aver sbagliato?

    1. Ciao Simona,
      il monitor seriale che tipo di informazioni ti restituisce?
      Hai usato delle batterie per alimentarlo? la sola porta USB potrebbe non essere sufficiente per i motori.

    • Giovanni greco il 15 Gennaio 2020 alle 19:41
    • Rispondi

    Buongiorno Mauro! Complimenti per il blog molto interessante! Volevo chiederti se ti è mai capitato di fare un robot che scrive con Arduino del tipo dei draw robot che si vedono ogni tanto commerciali ma mi piacerebbe autocostruirlo seguendo un tutorial essendo quasi un neofita.
    Sai per caso darmi qualche indicazione a riguardo? Grazie molte!!

    1. Ciao Giovanni,
      purtroppo no, non ne ho mai realizzato uno, potresti iniziare leggendo i miei tutorial sui robot e poi, pian piano, realizzare il tuo.
      In alternativa puoi cercare se ci siano disponibili tutorial già pronti su altri blog nel web.

  1. […] di oggi è dedicato ad Anto che ha realizzato il Robot Beginner Kit seguendo i miei articoli ed ha fatto evolvere il […]

  2. […] 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 […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.