Motore con controllo IR

Buona sera .
vi illustro il problema.
Ho progettato un Ponte-H per controllare un motore nei due sensi di marcia tramite Arduino utilizzando un L293D.

ho cercato di implementare il funzionamento del suddetto motore collegando sulla BreadBoard un ricevitore IR cosi da poter controllare il motore a distanza.

lo schema elettronico e' giusto e non mi da problemi.

i problemi che ho sono nel codice che ora pubblico:

`

 #include <IRremote.h>

const int RECV_PIN = 10;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;
  
  
  
 const int motor1Pin = 3;   
const int motor2Pin = 4;    
const int enablePin = 9;    

  

  void setup() {
    irrecv.enableIRIn(); 

  pinMode(motor1Pin, OUTPUT);
  pinMode(motor2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  digitalWrite(enablePin, HIGH);

    
    
  }
  void loop() {

    if (irrecv.decode(&results)){
 
        if (results.value == 0XFFFFFFFF)
          results.value = key_value;

        if(results.value==0xFF30CF){
            digitalWrite(enablePin, HIGH);  
            digitalWrite(motor1Pin, HIGH);   
            digitalWrite(motor2Pin, LOW);
            irrecv.resume();  
        }
         if (results.value== 0xFF18E7){
          digitalWrite(enablePin, HIGH);  
          digitalWrite(motor1Pin, LOW);   
          digitalWrite(motor2Pin, HIGH); 
          irrecv.resume();  
          }
        else {};
        key_value = results.value;
        irrecv.resume(); 
  }
  }

`
il problema consiste nel fatto che se premo il pulsante 1 il motore gira a sinistra, premendo il pulsante 2 del tecomando il motore gira a destra .
sembrerebbe che il problema non ci fosse se non per il fatto che posso premere soltanto una volta il tasto 1 oppure il tasto 2 .
difatto se premo il testo per cambiare il giro del motore il giro rimane quello di prima senza cambiare.
non so che fare!!! credo che il problema risieda nel codice ,vi prego aiuto.

Buongiorno,
:warning: prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ...
quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato,
da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ...
la prossima volta potrebbe venire direttamente eliminato, dopo di che ...

... essendo il tuo primo post, nel rispetto del regolamento dellasezione Italiana del forum (… punto 13, primo capoverso), tichiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà (eventuali risposte verrebbero temporaneamente nascoste), quindi ti consiglio di farla al più presto. :wink:

Non vedo nelle sue condizioni l'ordine per aumentare o diminuire la velocità, dovrebbe avere qualcosa di simile a:

if (results.value == 0xFF30CF) {
  velo++;
  if (velo > 255) {
    velo = 255;
  }
  analogWrite(enablePin, velo);
  digitalWrite(motor1Pin, HIGH);
  digitalWrite(motor2Pin, LOW);
  irrecv.resume();
}
if (results.value == 0xFF18E7) {
  velo--;
  if (velo < 0) {
    velo = 0;
  }
 analogWrite(enablePin, velo);
  digitalWrite(motor1Pin, LOW);
  digitalWrite(motor2Pin, HIGH);
  irrecv.resume();
}

Dovresti dichiarare globalmente la variabile veil come int.
Saluti.

1 Like

Inoltre il pezzo che evidenzio NON ha nessun senso. I tuoi if sono messi male, anche se li indenti non sono degli if...else if

nel caso di results.value essendo numerico può essere utile usare switch

...
#define K_TASTO_RIPETI 0xFFFFFFFF
#define K_TASTO_SX 0xFF30CF
#define K_TASTO_DX 0xFF18E7
...
void loop() 
{ if (irrecv.decode(&results))
  { switch(results.value)
     { case K_TASTO_RIPETI:  
         results.value = key_value;
         break;
       case K_TASTO_SX:       
         MotoreVaSx();
         key_value = results.value; 
         break;
       case K_TASTO_DX:    
         MotoreVaDx();
         key_value = results.value; 
         break;
      }
      irrecv.resume(); 
   }
}
void MotoreVaSx()
{ digitalWrite(enablePin, HIGH);  
  digitalWrite(motor1Pin, HIGH);   
  digitalWrite(motor2Pin, LOW);
}

void MotoreVaDx()
{ digitalWrite(enablePin, HIGH);  
  digitalWrite(motor1Pin, LOW);   
  digitalWrite(motor2Pin, HIGH);
}

void MotoreStop()
{ digitalWrite(enablePin, LOW);  
  digitalWrite(motor1Pin, LOW);   
  digitalWrite(motor2Pin, LOW);
}
1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.