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