Problema con gestione motori

Ciao a tutti ,vi chiedo aiuto perchè non riesco a darmi una spiegazione dello strano funzionamento del codice che deve far compiere uno step al motore tramite pwm controllando lo stato di un encoder ottico.......Se carico solo il controllo relativo ad un singolo motore tutto funziona ma se ,come nello scketch allegato,carico il controllo di due motori inizia a fare un po quello che vuole.
Il problema non risiede nell'hardware....ho un alimentatore stabilizzato da banco con i gnd collegati ad arduino ,i motorini assorbono solo 50mA e l'alimentatore eroga fino a 5A

int mw = 11; //motorew
int sw =  4;  //sensorew
int md = 10; //motored
int sd =  7; //sensored
int ma =  9; //motorea
int sa =  8; //sensorea

void setup(){
  pinMode(4,INPUT);
  pinMode(7,INPUT);
  pinMode(8,INPUT);
  delay(1000); 
}

void loop(){
 analogWrite(ma,50);             
 if(digitalRead(sa)==HIGH){
  while(""){
   if(digitalRead(sa)==LOW){
      break;
    }
  }
  analogWrite(ma,0); 
  delay(3000);
    }
 analogWrite(md,50);
 if(digitalRead(sd)==HIGH){
  while(""){
   if(digitalRead(sd)==LOW){
      break;
    }
  }
  analogWrite(md,0); 
  delay(3000);
  }  

}

A me sembra non ci siano errori....... :roll_eyes:

E' proprio vero che quando ci si inchioda la miglior cosa da fare è staccare......Dopo una sana mangiata ho risolto :slight_smile:

Ora ti tocca dire come hai fatto

Ora ti tocca dire come hai fatto

Ahaha....hai ragione .
Allora il sensore l'ho ottenuto usando un fotodiodo ir ed un fototransistor , sul suo collettore ho messso una resistenza da 10Kohm verso il positivo. Prelevando dal collettore ottengo così senza rilevare ir una tensione di 5v mentre se si satura il fototransistor una tensione prossima a gnd. Alla ruota dell'encoder ho praticato dei "tagli che corrispondono ai punti sul quale voglio che il motore si fermi.

 analogWrite(ma,50);             
 if(digitalRead(sa)==HIGH){
  while(""){
   if(digitalRead(sa)==LOW){
      break;
    }
  }
  analogWrite(ma,0); 
  delay(3000);
    }

Il codice dice di mandare al motore "ma" un pwm e subito dopo controlla l'ingresso digitale (sa) se è alto (ciò significa che non riceve più ir
in quanto ha già cominciato a ruotare)si blocca in un ciclo while ed aspetta che il fototransistor rilevi nuovamente ir (digitalRead(sa)==LOW) ed in quel caso esce dal while fermando il motore (analogWrite(ma,0):wink: ed aspettando 3 secondi prima di ripetere il ciclo....Quando ho provato questo parte di codice da sola funzionava ma per culo perchè in realtà appena il motore parte non si può ancora entrare nell'if in quanto non è ancora vera perchè il fototransistor vede ancora ir, così il ciclo si ripete fino a quando non vede vera l'if e poi tutto funziona .. Quando invece ho provato il codice per pilotare 3 motori si verificava l'errore perchè il codice attivava in pratica tutti e tre i motori e quando incontrava l'if vera mi spegneva il motore a cui era riferita.....
Insomma ho scritto io un codice sbagliato convinto del contrario visto che un motore da solo funzionava......sbagliando s'impara. :wink: