Problema con doppio ultrasuoni e un motore stepper.

Salve,
sto cercando di far muovere un motore stepper e mentre si muove, se si avvicina qualcosa tramite due ultrasuoni cerco di seguirlo ma il codice non funziona molto bene.
Utilizzo arduino due, un motore stepper preso da una stampante e 2 sensori ad ultrasuoni HC-SR04.
Posto il codice:

int motorPins[] = {7, 8, 10, 12};
int count = 0;
int count2 = 0;
int delayTime = 200;
int val = 0;

#define echo1 2
#define trig1 3

#define echo2 4
#define trig2 5

void setup() {
  
pinMode (echo1,INPUT );
pinMode (trig1,OUTPUT );
pinMode (echo2,INPUT );
pinMode (trig2,OUTPUT );
Serial.begin(9600) ;

  // put your setup code here, to run once:

}

void moveForward() {
  if ((count2 == 0) || (count2 == 1)) {
    count2 = 16;
  }
  count2>>=1;
  for (count = 3; count >= 0; count--) {
    digitalWrite(motorPins[count], count2>>count&0x01);
  }
  delay(delayTime);
}

void moveBackward() {
  if ((count2 == 0) || (count2 == 1)) {
    count2 = 16;
  }
  count2>>=1;
  for (count = 3; count >= 0; count--) {
    digitalWrite(motorPins[3 - count], count2>>count&0x01);
  }
  delay(delayTime);
}

long ultrasuoni1(){
digitalWrite (trig1,LOW);
delayMicroseconds (15);
digitalWrite (trig1,HIGH);
delayMicroseconds (15);
digitalWrite (trig1,LOW);
long time= pulseIn (echo1,HIGH);
long distance=time/29/2;
//Serial.print(distance);
//Serial.print("cm 1 \n");
delay (300);
return distance;
}
long ultrasuoni2(){
digitalWrite (trig2,LOW);
delayMicroseconds (15);
digitalWrite (trig2,HIGH);
delayMicroseconds (15);
digitalWrite (trig2,LOW);
long time= pulseIn (echo2,HIGH);
long distance=time/29/2;
//Serial.print(distance);
//Serial.print("cm 2 \n");
delay (300);
return distance;
}


void segui(){
  long dist1=0,dist2=0;
dist1 = ultrasuoni1();
dist2 = ultrasuoni2();
  if((dist1 - dist2) < -7  )
  moveForward();                      // muove a destra
  
  if((dist1 - dist2) > 7  )
  moveBackward();                    // muove a sinistra
  
  if( -7 < (dist1 - dist2) < 7  )
  return;
  
}

void loop() {
  long dist1=0,dist2=0,dist3=0,dist4=0;
  long maxdist=20;
  // put your main code here, to run repeatedly: 
for(int i=0;i<50;i++)
  {
  moveForward();

dist1 = ultrasuoni1();
dist2 = ultrasuoni2();

if((( dist1) || ( dist2)) < maxdist ){

segui(); 
                                           }
}
 
for(int k=0;k<50;k++) 
    {
  moveBackward();
  
dist3=ultrasuoni1();
dist4=ultrasuoni2();
  
  if((( dist3) || ( dist4)) < maxdist ){
segui();
                                           }  
    }
   
}

Qualcuno potrebbe aiutarmi?

Ma è un codice preso da qualche parte ? Non puoi postare il sito tanto per capirci un po' di più :slight_smile:

Il sensore ultrasuoni é questo? http://www.micropik.com/PDF/HCSR04.pdf
Come lo alimenti? con 5V o con 3,3V? Come lo hai interfacciato? Direttamente o con driver e partitore resistivo?

Come piloti il motore? con quale dirver?

Ciao Uwe

Il codice l'ho preso da vari esempi e poi l'ho un po' modificato.
il sensore e' quello del pdf, lo attacco direttamente all'arduino alla 5v e per il motore uso il ponte H l293b per mandargli corrente e uso la 3.3v e un trasformatore per il ponte h.

La 3.3 ? Non si capisce un trasformatore ? Alimentatore magari ma da quanto ? Perche minimo il ponte si alimenta a 5 volt Come la logica, ma se ho capito è un problema di software che in realtà tutti i componenti funzionano giusto ?

Il L293B non funziona con 3,3V. Ha bisogno di almeno 4,5V per l' alimentazione della parte logica.
Non puoi dare 5V su un entrata del Arduino DUE ( l' uscita del senssore a ultrasuoni Ti da 5V!!!). È molto probabile che hai rotto l' entrata del Arduino DUE.

Perché usi un Arduino DUE?

Ciao Uwe

Mi sono espresso male?
L'hardware funziona tutto benissimo, ho fatto varie prove: prima solo con l'ultrasuoni, poi solo con il motore. Dopodiche' ho unito il tutto, e il codice non mi funziona molto bene, un problema che ho trovato e' sui tempi dell'ultrasuoni che non sono molto brevi.Un'altro problema e' nella condizione dell'if che sta nel loop che se le distanze sono < o > di maxdist deve fare segui, altrimenti non la fa e il motore gira normalmente continuando il ciclo for, invece non so perche' mi da problemi oppure per fare il ciclo for ci mette un'eternita'.

Uso arduino due, perche' ho quello :wink:
Si ho un po' rischiato a non mettere una resistenza, avevo visto una guida che non la usava, fortuna(?) che non si e' rotto il piedino, ce ne mettero' una.

Aggiungi dei serial print un po' qui e un po' lì, fai del buon debug aiutandoti con il monitor seriale.
Così è più o meno impossibile capire se il programma gira correttamente.

Questo

count2>>=1;

cos'è? :cold_sweat:

Bene, ci provero'.

Anche questo

if( -7 < (dist1 - dist2) < 7  )

in C non ha senso.

Ah, ecco. Ho da poco finito un corso di python, e vedendo che il compilatore non mi diceva nulla pensavo che la prendeva come giusta.

count2>>=1;

Questo e' un pezzo di codice che ho riciclato da un esempio preso nella sezione tutotial, oggi lo modifichero'.

Anche qui

 if((( dist1) || ( dist2)) < maxdist )

Dividi il codice con IF più semplici anche se inizialmente ti porta a duplicare il codice.
Poi puoi sempre ottimizzarlo, ma prima deve funzionare.

Non è che volevi scrivere

count2++;

e incrementare la variabile di 1?