Problema con shield Motori

Salve a tutti,

Ho un problema che non riesco a risolvere con un progetto riguardante una macchinina telecomandata.

La macchinina telecomandata è formata da 4 motori e una shield che li controlla mediante la libreria<AFMotor.h>.

La macchinina è telecomandata mediante ricevitore IR.

Ecco il problema

funziona tutto correttamente fatta eccezione che per i motori 1 e 2 che non funzionano mai (non gli arriva proprio corrente come se non vi fosse il comando per attivarli).

cambiando codice ed usandone uno più semplice funzionano correttamente tutti e 4 i motori.

Non riesco a capire come mai dato che le funzioni che attivano e disattivano i motori sono identiche.

Sarei grato se sapeste aiutarmi :smiley: ! Grazie.

vi lascio il codice qui

https://mega.nz/folder/94kxCa5D#MYael6wp_ErXNVAOI-M8hw

Buongiorno e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… 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:

Certo !!

Metti qui il codice

Non tutti se lo vanno a prendere, io no, per esempio

E metti anche quello che ti funziona e una descrizione dello HW

qui funzionano tutti e 4 i motori

#include <AFMotor.h>
 
AF_DCMotor motor1(1,MOTOR12_64KHZ);
AF_DCMotor motor2(2,MOTOR12_64KHZ);
AF_DCMotor motor3(3,MOTOR12_64KHZ);
AF_DCMotor motor4(4,MOTOR12_64KHZ);
                                                                                                                                                                  
// create motor #1, 64KHz pwm
 
void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Motor test!");
  
  motor1.setSpeed(255);     // set the speed to 200/255
  motor2.setSpeed(255); 
  motor3.setSpeed(255); 
  motor4.setSpeed(255); 
}
 
void loop() {
  Serial.print("tick");
  
  motor1.run(FORWARD);      // turn it on going forward
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
  delay(1000);
 
  Serial.print("tock");
  motor1.run(BACKWARD);     // the other way
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
  delay(1000);
  
  Serial.print("tack");
  motor1.run(RELEASE);      // stopped
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
  delay(3000);
}

Qui invece ne funzionano solo 2

//inizializzazione librerie
#include <AFMotor.h> //lib motori
#include <IRremote.h> //lib ricevitore IR

//direttive al processore
#define DIM 5 //dimenzione menu a funzione

//inizializzazione motori
AF_DCMotor motor1(1,MOTOR12_64KHZ);
AF_DCMotor motor2(2,MOTOR12_64KHZ);
AF_DCMotor motor3(3,MOTOR12_64KHZ);
AF_DCMotor motor4(4,MOTOR12_64KHZ);

//inizializzazione IR
const int RECV_PIN = A5;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long key_value = 0;

//inizializzazione funzioni movimento
void Avanti();
void Indietro();
void Sinistra();
void Destra();
void Stop();
//inizializzazione menu
void (*funz[DIM])() = {Avanti, Indietro ,Sinistra ,Destra ,Stop};
//conversione IR to INT
int conv(unsigned long);


void setup() {

  //inizializzazione IR
  irrecv.enableIRIn();
  irrecv.blink13(true);
  results.value = key_value;

  //inizializzazione velocitá 
  motor1.setSpeed(200);     
  motor2.setSpeed(200); 
  motor3.setSpeed(200); 
  motor4.setSpeed(200);
  
  //inizializzazione motinorSeriale
  Serial.begin(9600); 
  
}

void loop() {
  
  if (irrecv.decode(&results)){

    Serial.println(results.value);

    int SelectFunz = conv(results.value);
    
    (*funz[SelectFunz])();


    key_value = results.value;
    irrecv.resume();
  }
}


//implementazione funzioni

int conv(unsigned long segnale){

   switch(segnale){
      
      default:
      Serial.println("ERROR CASE");
      break ;
      
      case 1033561079:
      return 0;
      break ;

      case 2351064443:
      return 2;
      break ;
   
      case 1217346747:
      return 4;
      break ;
   
      case 71952287:
      return 3;
      break ;
   
      case 465573243:
      return 1;
      break ;
      
   }
}

void Avanti(){
  Serial.println("Avanti");
  motor1.run(FORWARD);     
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
  
}

void Indietro(){
  Serial.println("Indietro");
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
}

void Sinistra(){
  Serial.println("Sinistra");
  motor1.run(RELEASE);      
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(RELEASE);
}

void Destra(){
  Serial.println("Destra");
  motor1.run(FORWARD);     
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(FORWARD);
}

void Stop(){
  Serial.println("Stop");
  motor1.run(RELEASE);      
  motor2.run(RELEASE);
  motor3.run(RELEASE);
  motor4.run(RELEASE);
}

>alefau: ti ricordo che in conformità al regolamento (… regolamento che doversti aver letto), punto 7 , devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

ok scusate .. sistemo tutto seguendo il regolamento

Ma la IRremote non disabilita alcuni pwm

O ricordo male?

perdonami ma sono abbastanza nuovo a queste cose .. cosa intendi ?

Standardoil:
Ma la IRremote non disabilita alcuni pwm

Si, certo, usa il Timer 2 e quindi i pin PWM gestiti da quel timer (su Arduino UNO il pin 3 ed il pin 11) NON possono essere usati.

Guglielmo

quindi probabilmente i motori non funzionano perchè vengono attivati da quei pin .. ho capito .. un possibile alternativa ?

alefau:
.. un possibile alternativa ?

... cambiare pin.

Del resto, sul GitHub della libreria IRremote la cosa è ben specificata e quindi uno dovrebbe saperlo ... ::slight_smile:

Guglielmo

ho capito grazie mille per l aiuto !

Sono andato a leggere la libreria sia dei motori che del IR ed hai perfettamente ragione … scusami ma non sapevo le librerie fossero tutte su git xD … il problema l ho sul pin 11 … posso cambiare qualche parametro nelle librerie secondo te per far andare queste 2 cose assieme ?

Se l'autore NON l'ha ancora fatta (e la cosa di poter scegliere il timer e una cosa che gli hanno chiesto da molto tempo) ... direi che puoi solo cambiare pin al motore.

Guglielmo

P.S.: Ed in ogni caso, su Arduino UNO, ogni timer gestisce una coppia di pin PWM, quindi ... anche se potessi cambiare timer probabilmente avresti problemi su un'altro motore ...

Okay Grazie!

Usa un Arduino Mega. Quello ha oltre piú piedini anche piú Timer.
Ciao Uwe