2

Comandare il robot in remoto con un telecomando IR e Arduino

Con questo sketch siamo in grado di comandare il nostro robot in remoto tramite un semplice telecomando IR. Grazie a questo sketch siamo in grado di far “apprendere” al robot i 5 tasti che utilizzeremo per comandarlo. In questo modo possiamo utilizzare praticamente tutti i telecomandi IR e utilizzare i tasti che desideriamo.

 

Si possono utilizzare tutti i ricevitori IR, io ad esempio ho usato un TSOP4838:

TSOP4838

Nell’immagine si vedono i collegamenti, io ho usato il pin digital 26 di Arduino ma ovviamente se ne possono usare altri, basta modificare lo sketch.

Per quanto riguarda il telecomando io ho usato quello nell’immagine sottostante, utilizzando i 5 tasti cerchiati in rosso.

 

Il moto del robot non varia fino a che non viene dato un nuovo comando.

 

Lo sketch si può scaricare dal link sottostante:

Sketch per permettere di comandare il robot in remoto utilizzando un telecomando IR. Lo sketch permette di "insegnare" al robot i tasti da utilizzare a run-time e poi di comandarlo
Sketch per permettere di comandare il robot in remoto utilizzando un telecomando IR. Lo sketch permette di "insegnare" al robot i tasti da utilizzare a run-time e poi di comandarlo
robot_IR_telecomando.zip
3.2 KiB
737 Downloads
Dettagli

 

Qui sotto si può vedere un video del risultato:

 

N.B. E’ necessaria la libreria da me modificata per le funzioni di base del motore. Si può scaricare dal link sottostante

Librerie AFMotor di Motor Shield Adafruit + RobotMotorFunction per le funzioni principali dei motori
13.2 KiB
1851 Downloads
Dettagli

Serve anche la libreria IRremote scaricabile da qui.

 

Acquista il sensore

Clicca qui.

Share This:

Simone

Studente Data di nascita: 12/07/1990 - Parma, IT Hobbies: Informatica, acquariofilia, viaggi, tecnologia, aria aperta, sport, web.

2 Comments

  1. Ciao Simone,
    mi trovo in difficoltà a dover comandare con telecomando Car MP3 (kit Arduico), due motor stepper 28BYJ-48 5V con scheda Arduino uno, in modo che quando tengo premuto un tasto 4 o 6 o 2 o 8, il motore gira fino a quando non lo libero. Inoltre la rotazione dovrebbe avere un angolo di 180° circa.
    Nel file sottostante il motore gira fino a fine corsa anche se il pulsante non viene più pigiato e se ripremuto riprende a girare. Quindi non riesco ad ottenere quanto vorrei all’interno dei “case :” sinistra destra, sù e giù. premetto che con il joystick ci riesco egregiamnete, codice già incluso nello sketch che ti propongo. Puoi Aiutarmi? Grazie
    #include “Stepper.h”
    #include “IRremote.h”

    /*—– Variables, Pins —–*/
    #define STEPS 32 // Number of steps per revolution of Internal shaft
    int Steps2Take; // 512 = 1 Revolution
    //int Steps2Take; // 1024 = 1 Revolution
    int receiver = 13; // Signal Pin of IR receiver to Arduino Digital Pin 6

    #define IN1 2 // per non scaldare il motore
    #define IN2 4 // per non scaldare il motore
    #define IN3 3 // per non scaldare il motore
    #define IN4 5 // per non scaldare il motore
    #define IN8 8 // per non scaldare il motore
    #define IN9 10 // per non scaldare il motore
    #define IN10 9 // per non scaldare il motore
    #define IN11 11 // per non scaldare il motore

    const int stepsPerRevolution = 64; // change this to fit the number of steps per revolution
    /*—–( Declare objects )—–*/
    // Setup of proper sequencing for Motor Driver Pins
    // In1, In2, In3, In4 in the sequence 1-3-2-4

    Stepper small_stepper(STEPS, 2, 4, 3, 5);
    Stepper small_stepper2(stepsPerRevolution, 8,10,9,11);

    IRrecv irrecv(receiver); // create instance of ‘irrecv’
    decode_results results; // create instance of ‘decode_results’

    void setup()
    {
    small_stepper.setSpeed(200); // set first stepper speed

    small_stepper2.setSpeed(200); // set second stepper speed

    irrecv.enableIRIn(); // Start the receiver
    }

    void loop()
    {int sensorReading = analogRead(A0); // read value from joystick X-axis

    if (sensorReading 540) { small_stepper.step(-1); } // step right

    int sensorReading2 = analogRead(A1); // read value from joystick Y-axis

    if (sensorReading2 540) { small_stepper2.step(-1); } // step backward

    if (irrecv.decode(&results)) // have we received an IR signal?

    {
    switch(results.value)

    {

    case 0xFF629D: // UP button pressed CH
    small_stepper.setSpeed(500); //Max seems to be 700
    Steps2Take = 512; // Rotate CW
    small_stepper.step(Steps2Take);
    delay(50);
    small_stepper.setSpeed(500);
    Steps2Take = -512; // Rotate CCW
    small_stepper.step(Steps2Take);
    delay(50);
    break;

    case 0xFFA857: // DOWN button pressed stoppato da me +
    small_stepper.setSpeed(500);
    Steps2Take = -512; // Rotate CCW
    small_stepper.step(Steps2Take);
    delay(50);
    break;
    case 0xFF10EF: // 4 SINISTRA

    small_stepper.setSpeed(500);
    Steps2Take = 512; // Rotate CCW
    small_stepper.step(Steps2Take);
    //results.value = 0xFF10EF

    digitalWrite (IN1, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN2, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN3, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN4, LOW); // Led Spenti motore nn scalda

    break;

    case 0xFF5AA5: // 6 DESTRA

    small_stepper.setSpeed(500);
    Steps2Take = -512; // Rotate CCW
    small_stepper.step(Steps2Take);

    delay(100);
    digitalWrite (IN1, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN2, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN3, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN4, LOW); // Led Spenti motore nn scalda}

    delay(50);
    break;
    case 0xFF4AB5: // 8 GIù

    small_stepper2.setSpeed(512); //Max seems to be 700
    Steps2Take = 512; // Rotate CW
    small_stepper2.step(Steps2Take);
    delay(100);
    digitalWrite (IN8, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN9, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN10, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN11, LOW); // Led Spenti motore nn scalda}

    delay(50);
    break;
    case 0xFF18E7: // 2 Sù

    small_stepper2.setSpeed(512);
    Steps2Take = -512; // Rotate CCW
    small_stepper2.step(Steps2Take);
    delay(100);
    digitalWrite (IN8, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN9, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN10, LOW); // Led Spenti motore nn scalda
    digitalWrite (IN11, LOW); // Led Spenti motore nn scalda}

    delay(50);
    break;
    case 0xFF38C7: // 5
    //int sensorReading = analogRead(A0); // read value from joystick X-axis
    //if (sensorReading < 490) { small_stepper.step(1); } // step left

    break;
    }

    irrecv.resume(); // receive the next value
    }

    }/* –end main loop — */

    • Ciao Francesco, non credo di aver capito la domanda. Lo sketch che hai inserito funziona oppure è quello che non funziona? Inoltre, lo sketch che hai riportato è quello che sfrutta il joystick?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

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