Go Down

Topic: Problema con funzione irrecv.enableIRIn() (Read 194 times) previous topic - next topic

ireon

Jun 03, 2014, 11:38 am Last Edit: Jun 03, 2014, 11:53 am by ireon Reason: 1
Salve ho costruito un robot con arduino seguendo questa guida http://www.mauroalfieri.it/elettronica/robot-beginner-kit-con-elettronica.html e funziona perfettamente. Ora avevo intenzione invece di utilizzare il sensore infrarossi, di comandare il robot utilizzando un ricevitore infrarossi e un telecomando. Il ricevitore infrarossi è l'AX-1838HS fornito con il kit di arduino. Ho provato ad utilizzare la libreria IRremote e un telecomando della samsung, ho effettuato con la connessione seriale la decodifica dei segnali del telecomando e ho provato ad accendere e spegnere il led 13 di arduino utilizzando i tasti del telecomando, tutto funziona perfettamente. Il problema è quando vado ad implementare il tutto sul robot. Supponendo inizialmente per semplicità di far volere andare il robot solamente in avanti il codice è il seguente:

Code: [Select]
#define PWMA 3
#define PWMB 9
#define AIN1 4
#define AIN2 7
#define BIN1 8
#define BIN2 12
#define STBY 2

#define SENSIBILITA 450

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

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

   analogWrite( PWMA,115 );
   analogWrite( PWMB,123 );
}


Collegando quindi la batteria dopo aver caricato il codice, il robot va sempre avanti. Ora se io modifico il codice nel seguente modo inserendo la funzione irrecv.enableIRIn() per la ricezione del segnale trasmesso dal telecomando.

Code: [Select]


[b]#include <IRremote.h>
int receiver = 11;
IRrecv irrecv(receiver);
decode_results results;
[/b]
#define PWMA 3
#define PWMB 9
#define AIN1 4
#define AIN2 7
#define BIN1 8
#define BIN2 12
#define STBY 2

#define SENSIBILITA 450

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

  [b]irrecv.enableIRIn();[/b]

}

void loop()
{
    avanti();
}

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

   analogWrite( PWMA,115 );
   analogWrite( PWMB,123 );
}


In grassetto ho scritto le righe di codice aggiunte. Il robot non funziona più correttamente, ovvero invece di andare avanti ruota intorno a se stesso poichè funziona solamente il motore  di sinistra, quello di destra è completamente fermo. Togliendo la riga irrecv.enableIRIn()  tutto rifunziona perfettamente. Da cosa può essere dovuto questo strano comportamento?

nid69ita

Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0
e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0
- qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0
- qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

Quante volte dobbiamo invitarti?        :D
Soprattutto a leggere il regolamento, così capirai che il codice deve essere racchiuso nei tag code, vedi regolamento sezione 7 che spiega bene come fare. Altrimenti parte del codice è visualizzato male.
my name is IGOR, not AIGOR

nid69ita

#2
Jun 03, 2014, 11:53 am Last Edit: Jun 03, 2014, 12:01 pm by nid69ita Reason: 1
Di base la IRRemote utilizza un timer che usa il pin 3, quello che tu usi per uno dei motori.

Nella cartella della libreria c'e' il file  IRRemoteInt.h
All'inizio si può cambiare il timer (e quindi i pin) usati per i vari tipi di Arduino.
Code: [Select]
// Arduino Mega
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  //#define IR_USE_TIMER1   // tx = pin 11-12
  //#define IR_USE_TIMER2   // tx = pin 9-10
  //#define IR_USE_TIMER3   // tx = pin 2-3-5
  #define IR_USE_TIMER4     // tx = pin 6-7-8
  //#define IR_USE_TIMER5   // tx = pin 44-45-46
....
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  //#define IR_USE_TIMER1   // tx = pin 9-10
  #define IR_USE_TIMER2     // tx = pin 3-11
#endif

Io ho "sfoltito". Il primo è per Arduino Mega, l'ultimo, nell'#else è per Arduino Uno.
Quello senza // è quello in uso.
my name is IGOR, not AIGOR

ireon

Ah non lo sapevo, sul libro e sulla guida non c'era scritto di non utilizzare il pin 3 con IRremote, ho spostato il controllo dei motori al pin 6 e adesso funziona perfettamente! Grazie per l'aiuto  :) Vado a presentarmi

ireon

#4
Jun 05, 2014, 05:28 pm Last Edit: Jun 05, 2014, 05:41 pm by ireon Reason: 1
Utilizzando la libreria IRremote comando il robot con il telecomando della TV, inoltre ho aggiunto un tasto del telecomando che mi permette di passare dalla modalità telecomandata alla modalità "sensore ultrasuoni" per evitare gli ostacoli. Il passo successivo che ho fatto è quello di controllare la velocità di rotazione dei motori utilizzando i tasti + e - del volume del telecomando. Qui però ottengo un comportamento anomalo.. Il codice di partenza è il seguente:

Code: [Select]

#include <IRremote.h> // use the library
int receiver = 11; // pin 1 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;

#define PWMA 6
#define PWMB 10
#define AIN1 4
#define AIN2 7
#define BIN1 8
#define BIN2 12
#define STBY 2

#define SENSIBILITA 330

int SHIR = A5;
const int RED_LED = 5;
const int GREEN_LED = A0;

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 );
 
 pinMode( GREEN_LED,OUTPUT);
 pinMode( RED_LED,OUTPUT);
 
 irrecv.enableIRIn();

}



 void loop()
{
 
 int dist = analogRead(SHIR);
 
 if (irrecv.decode(&results))
 {
   irrecv.resume();
 }
   
   
     if (results.value == 0xD04CFC60)
         {
           avanti();
           digitalWrite(GREEN_LED,HIGH);
           digitalWrite(RED_LED,LOW);
         }
     
     if (results.value == 0x6F89644)
         {
           gira_sinistra();
           digitalWrite(GREEN_LED,HIGH);
           digitalWrite(RED_LED,LOW);
         }
     
     if (results.value == 0x72726A46)
         {
           gira_destra();
           digitalWrite(GREEN_LED,HIGH);
           digitalWrite(RED_LED,LOW);
         }
     
     if (results.value == 0x61DB14E2)
         {
           indietro();
           digitalWrite(GREEN_LED,HIGH);
           digitalWrite(RED_LED,LOW);
         }  
     
     if (results.value == 0x20464B24)
         {
           alt();
           digitalWrite(GREEN_LED,HIGH);
           digitalWrite(RED_LED,LOW);
         }
     
     if (results.value == 0xCE3693E6)
        {
          if ( dist > SENSIBILITA ) { evita(); }
          else                      { avanti(); }
          digitalWrite(RED_LED,HIGH);
          digitalWrite(GREEN_LED,LOW);
        }
}

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

   analogWrite( PWMA,146 );
   analogWrite( PWMB,150 );
}


Il codice poi continua con le altre funzioni indietro, gira_destra ecc.. Comunque se io modifico la funzione avanti inserendo il controllo di velocità utilizzando i tasti del telecomando avrei:

Code: [Select]
{
   digitalWrite( AIN1,HIGH );
   digitalWrite( AIN2,LOW );
   digitalWrite( BIN1,HIGH );
   digitalWrite( BIN2,LOW );

   analogWrite( PWMA,146 );
   analogWrite( PWMB,150 );
 
   if (irrecv.decode(&results))
    {
     irrecv.resume();
    }

    if (results.value == pulsante +)

    { analogWrite( PWMA,176 );
      analogWrite( PWMB,180 ); }

    if (results.value == pulsante -)

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

}


Andando a programmare Arduino e provando a schiacciare i pulsanti per il controllo della velocità dei motori, la velocità aumenta dopo che premo più volte il tasto e non diminuisce quando premo il tasto -. Quale potrebbe essere il problema?

Go Up