Strano problema con motori e infrarossi

Salve a tutti, ho costruito una macchinina usando un Arduino Uno, uno shield L298N. e due motori DC.
Ho scritto un programma tramite cui faccio muovere la macchina attraverso il monitor seriale, e la macchina si comporta esattamente come mi aspetto che faccia: va avanti con w, indietro con s, a destra con r e a sinistra con l.
Ho quindi aggiunto un modulo di ricezione di segnali infrarossi e mappato il telecomando, per poi integrare il modulo con la macchina, sostituendo all’input del seriale l’input del telecomando; da quel momento il motore sinistro ha smesso di funzionare, senza motivo, mentre il destro va alla perfezione, ma se ricarico il programma del seriale ripartono entrambi come prima.
I codici, che riporto qui sotto, sono sostanzialmente identici, non riesco a capire cosa possa essere cambiato da uno all’altro.

(Se rimuovo dal codice il motore funzionante l’altro comunque non parte, quindi non credo sia un problema elettrico o di scarso amperaggio, poiché un motore alla volta sicuramente parte)

Codice della guida tramite seriale

#define enB 3
#define in3 5
#define in4 4
#define enA 9
#define in1 6
#define in2 7
#define buzzerPin 10

int Stop = 0;

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  Serial.begin(9600);
  analogWrite(buzzerPin, 200);
  delay(100);
  analogWrite(buzzerPin, 100);
  delay(100);
  analogWrite(buzzerPin, 200);
  delay(100);
  analogWrite(buzzerPin, 255);
  Serial.println("w - FORWARD");
  Serial.println("s - BACKWARD");
  Serial.println("r - RIGHT");
  Serial.println("l - LEFT");  
}

void loop() 
{ fflush;
  if (Serial.available())
  { char ch = Serial.read();
  if (ch == 's') { 
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      analogWrite(enA, 250); // Send PWM signal to L298N Enable pin
      analogWrite(enB, 250);
      delay(3000);
      analogWrite(enA, Stop);
      analogWrite(enB, Stop);
  }
  if (ch == 'w') {
     digitalWrite(in1, HIGH);
     digitalWrite(in2, LOW);
     digitalWrite(in3, HIGH);
     digitalWrite(in4, LOW);
     analogWrite(enA, 250); // Send PWM signal to L298N Enable pin
     analogWrite(enB, 250);
     delay(3000);
     analogWrite(enA, Stop);
     analogWrite(enB, Stop);
  }
  if (ch == 'l') {
     digitalWrite(in1, HIGH);
     digitalWrite(in2, LOW);
     digitalWrite(in3, LOW);
     digitalWrite(in4, HIGH);
     analogWrite(enA, 250); // Send PWM signal to L298N Enable pin
     analogWrite(enB, 250);
     delay(3000);
     analogWrite(enA, Stop);
     analogWrite(enB, Stop);
  }
  if (ch == 'r') {
     digitalWrite(in1, LOW);
     digitalWrite(in2, HIGH);
     digitalWrite(in3, HIGH);
     digitalWrite(in4, LOW);
     analogWrite(enA, 250); // Send PWM signal to L298N Enable pin
     analogWrite(enB, 250);
     delay(3000);
     analogWrite(enA, Stop);
     analogWrite(enB, Stop);
  }
  }
}

Codice della guida tramite IR

#include <IRremoteInt.h>
#include <IRremote.h>
#define irPin 13
#define enB 3
#define in3 5
#define in4 4
#define enA 9
#define in1 6
#define in2 7
#define buzzerPin 10

#define DOWN 16730805
#define UP 16718055
#define LEFT 16716015
#define RIGHT 16734885
#define OK 16726215
#define NULLVALUE 4294967295


int Stop = 0;
int command;
IRrecv irrecv(irPin);     
decode_results results;  


void setup() {
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  Serial.begin(9600);
  analogWrite(buzzerPin, 200);
  delay(100);
  analogWrite(buzzerPin, 100);
  delay(100);
  analogWrite(buzzerPin, 200);
  delay(100);
  analogWrite(buzzerPin, 255);    
  irrecv.enableIRIn();  
}

void loop() {
  if (irrecv.decode(&results))// Returns 0 if no data ready, 1 if data ready.     
    {  Serial.println(results.value); //prints the value a a button press     
       Serial.println(" ");     
        // Restart the ISR state machine and Receive the next value
       command = results.value;
       irrecv.resume();
    if (command == 16730805) { //down
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      analogWrite(enA, 250); // Send PWM signal to L298N Enable pin
      analogWrite(enB, 250);
      delay(3000);
      analogWrite(enA, Stop);
      analogWrite(enB, Stop);
    }
    if (command == UP) { //up
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      analogWrite(enA, 250); // Send PWM signal to L298N Enable pin
      analogWrite(enB, 250);
      delay(3000);
      analogWrite(enA, Stop);
      analogWrite(enB, Stop);
  }
    if (command == LEFT) { //left
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      analogWrite(enA, 250); // Send PWM signal to L298N Enable pin
      analogWrite(enB, 250);
      delay(3000);
      analogWrite(enA, Stop);
      analogWrite(enB, Stop);
  }
    if (command == RIGHT) { //right
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      analogWrite(enA, 250); // Send PWM signal to L298N Enable pin
      analogWrite(enB, 250);
      delay(3000);
      analogWrite(enA, Stop);
      analogWrite(enB, Stop);
  }
  if (command == OK) { //ok
    analogWrite(buzzerPin, 200);
    delay(100);
    analogWrite(buzzerPin, 100);
    delay(100);
    analogWrite(buzzerPin, 200);
    delay(100);
    analogWrite(buzzerPin, 255);
  } 
  if (command == NULLVALUE) {
  }
  }
  
}

Buongiorno, :slight_smile:
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo 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 su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

La biblioteca IR usa un timer e percui blocca il PWM (analogWrite() dei Pin 3 e 11 che usano pure quel timer.

Usa altri pin per enB.

Ciao Uwe

Grazie mille, ora funziona perfettamente!