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();
}
}
}
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?
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.
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
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.