problema motori robot homemade

salve.
sto costruendo il mio primo robot con arduino
l'arduino è una mega
scheda motori AF
uso due motori tipo ( http://blogs.di.unito.it/arduino/files/2013/06/Motoriduttore.jpg )
servo da 9g
sensore a ultrasuoni e vari led
il problema ora è che alla fine del caricamento dello sketch i motori non girano ma emettono solo un sibilo i led lampeggiano all'impazzata
carico lo sketch magari mi potreste dire se è li il problema
grazie a tutti per l'aiuto =)

mark1.ino (4.34 KB)

// mark 1


#include <AFMotor.h>
#include <Servo.h>

AF_DCMotor motoredestro (1); // motore ruota destra attaccato al connettore 1
AF_DCMotor motoresinistro (2); // motore ruota sinistra attaccato al connettore 2
Servo servoocchio; // denominazione del servo del controllo distanza
int triggerPort = 52;//pin per trg
int echoPort = 50;//pin per echo
int ledgiallo = 22;
int ledrosso =48;
int ledverde = 46;
int pos1= 0;//posizione destra del servo
int pos2 = 90;//posizione centrale
int pos3 = 180;//posizione sinistra del servo
int durationdestramax;
int durationdestramin;
int durationsinistramax;
int durationsinistramin;

void setup() {
  servoocchio.attach(9);
  motoredestro.setSpeed(150);
  motoresinistro.setSpeed(150);
  motoredestro.run(RELEASE);
  motoresinistro.run(RELEASE);
  pinMode( triggerPort, OUTPUT );
pinMode( echoPort, INPUT );
pinMode( ledgiallo,OUTPUT);
pinMode( ledverde,OUTPUT);
pinMode( ledrosso,OUTPUT);
}
void loop(){
  digitalWrite(ledrosso, HIGH);
  delay(150);
  digitalWrite(ledgiallo, HIGH);
  delay(150);
  digitalWrite (ledverde, HIGH);
  delay (150);
  digitalWrite(ledrosso, LOW);
  delay(150);
  digitalWrite(ledgiallo, LOW);
  delay(150);
  digitalWrite (ledverde, LOW);
  delay (150);
  //porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
 
//invia un impulso di 20microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 20 );
digitalWrite( triggerPort, LOW );
long duration = pulseIn( echoPort, HIGH );//calcolo della durata dell'impulso
     if(duration>200){//se la distanza è maggiore di quella indicata fai avanzare engrambi i motori
     motoredestro.run(FORWARD);
     motoredestro.setSpeed(150);
     motoresinistro.run(FORWARD);
      
      motoresinistro.setSpeed(150);
     digitalWrite(ledverde, HIGH);
     digitalWrite(ledrosso,LOW);
     }
     else{
       //se la distanza è minore stoppa i motori
     digitalWrite(ledverde,LOW);
     digitalWrite(ledrosso,HIGH);
     motoredestro.run(RELEASE);
     motoresinistro.run(RELEASE);
     delay(1000);
     servoocchio.write(pos1);
     delay(500);
     digitalWrite( triggerPort, LOW );
 
     //invia un impulso di 20microsec su trigger
     digitalWrite(ledgiallo,HIGH);
     digitalWrite( triggerPort, HIGH );
     delayMicroseconds( 20 );
     digitalWrite( triggerPort, LOW );
     long durationdestra = pulseIn( echoPort, HIGH );//calcolo della durata dell'impulso
     delay(500);
     digitalWrite(ledgiallo,LOW);
     servoocchio.write(pos3);
     delay(500);
     digitalWrite( triggerPort, LOW );
  
     //invia un impulso di 20microsec su trigger
     digitalWrite(ledgiallo,HIGH);
     digitalWrite( triggerPort, HIGH );
     delayMicroseconds( 20 );
     digitalWrite( triggerPort, LOW );
     long durationsinistra = pulseIn( echoPort, HIGH );//calcolo della durata dell'impulso
     delay(500);
     digitalWrite(ledgiallo,LOW);
     servoocchio.write(pos2);
     if(durationdestra<durationsinistra){
       digitalWrite( triggerPort, LOW );
  
     //invia un impulso di 20microsec su trigger
     digitalWrite(ledgiallo,HIGH);
     digitalWrite( triggerPort, HIGH );
     delayMicroseconds( 20 );
     digitalWrite( triggerPort, LOW );
     long durationistantanea = pulseIn( echoPort, HIGH );//calcolo della durata dell'impulso
     durationsinistramin=durationsinistra-50;
     durationsinistramax=durationsinistra+50;
        while (durationistantanea>durationsinistramin && durationistantanea<durationsinistramax){
       
           motoredestro.run(FORWARD);
            motoresinistro.setSpeed(150);
           motoredestro.setSpeed(150);
           motoresinistro.run(BACKWARD);
         delay(1500);}
       }
      else{
        digitalWrite( triggerPort, LOW );
  
     //invia un impulso di 20microsec su trigger
     digitalWrite(ledgiallo,HIGH);
     digitalWrite( triggerPort, HIGH );
     delayMicroseconds( 20 );
     digitalWrite( triggerPort, LOW );
     long durationistantanea = pulseIn( echoPort, HIGH );//calcolo della durata dell'impulso
     durationdestramin=durationdestra-50;
     durationdestramax=durationdestra+50;
      while (durationistantanea>durationdestramin && durationistantanea<durationdestramax){
          motoresinistro.run(FORWARD);
           motoresinistro.setSpeed(150);
          motoredestro.run(BACKWARD);
          motoredestro.setSpeed(150);
          delay(1500);
     }
     }
}
}

Come alimenti il robott?
Ciao Uwe

l 'alimentazione non è un problema poichè alimento il tutto per i test con alimentatore 12 atx
anche perchè se provo con altri codici tutto funziona .
perciò credo che il problema sia nel codice
grazie

Se pensi che il problema sia nel codice perché non Ti scrivi uno sketch minimale che fa solo girare i 2 motori in avanti. Cosí sei sicuro che la parte elettrica funziona.
Ciao Uwe

Il tuo codice mi lascia alquanto perplesso. E' pieno di delay() che sono bloccanti (non bloccano solo gli interrupt).
Quando esegui una delay(500) fermi tutta la MCU per mezzo secondo.

nid69ita:
Il tuo codice mi lascia alquanto perplesso. E' pieno di delay() che sono bloccanti (non bloccano solo gli interrupt).
Quando esegui una delay(500) fermi tutta la MCU per mezzo secondo.

Non è corretto. Il delay è un semplice ciclo while che non ferma gli interrupt. Difatti il valore di millis continua ad aumentare (è agganciato ad un interrupt sull'overflow del timer 0), la seriale continua a ricevere e/o spedire dati (sia le funzioni di RX che di TX sono basate su interrupt) ecc... :wink:

grazie per la risposta a tutti.
ho risolto riscrivendo il codice da zero.
il problema era nell'ultimo if... il quale andava in overflow e bloccava il resto dell'esecuzione =)
posto il nuovo codice :slight_smile:

// mark 1
// prova progetto del primo prototipo
#define trigPin 52
#define echoPin 50
#include <AFMotor.h>
#include <Servo.h>
AF_DCMotor motor3(4, MOTOR34_8KHZ); // create motor #3, 8KHz pwm
AF_DCMotor motor1(2, MOTOR12_8KHZ); // create motor #1, 8KHz pwm

Servo servoocchio; // denominazione del servo del controllo distanza

int ledgiallo = 22;
int ledrosso =48;
int ledverde = 46;
int pos1= 0;//posizione destra del servo
int pos2 = 90;//posizione centrale
int pos3 = 180;//posizione sinistra del servo
int durationdestramax;
int durationdestramin;
int durationsinistramax;
int durationsinistramin;

void setup() {
  servoocchio.attach(9);
   pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  motor1.setSpeed(200); // set the speed to 200/255
  motor3.setSpeed(200); // set the speed to 200/255


pinMode( ledgiallo,OUTPUT);
pinMode( ledverde,OUTPUT);
pinMode( ledrosso,OUTPUT);
}
int CheckDistance()
{
  long duration, distance;
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line

  digitalWrite(trigPin, HIGH);
//  delayMicroseconds(1000); - Removed this line
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  
  return distance;
}
void MotorForward(int delaytime)
{
  motor1.run(FORWARD);
  motor3.run(FORWARD);
  delay(delaytime);
}
void MotorBackward(int delaytime)
{
  motor1.run(BACKWARD);
  motor3.run(BACKWARD);
  delay(delaytime);
}
void MotorRelease()
{
  motor1.run(RELEASE);
  motor3.run(RELEASE);
  delay(1000);
}

void MotorLeft(int delaytime)
{
  motor1.run(FORWARD);
  motor3.run(BACKWARD);
  delay(delaytime);
}

void MotorRight(int delaytime)
{
  motor1.run(BACKWARD);
  motor3.run(FORWARD);
  delay(delaytime);
}
int girasinistra()
{long distancer;
        MotorRelease();
       //se la distanza è minore stoppa i motori
     digitalWrite(ledverde,LOW);
     digitalWrite(ledrosso,HIGH);
     
     delay(50);
     servoocchio.write(pos1);
     delay(500);
     digitalWrite( trigPin, LOW );
 
     //invia un impulso di 20microsec su trigger
     digitalWrite(ledgiallo,HIGH);
     digitalWrite( trigPin, HIGH );
     delayMicroseconds( 20 );
     digitalWrite( trigPin, LOW );
     long durationdestra = pulseIn( echoPin, HIGH );//calcolo della durata dell'impulso
     distancer = (durationdestra/2) / 29.1;
     delay(500);
     digitalWrite(ledgiallo,LOW);
     servoocchio.write(pos2);
   return distancer;}
int giradestra(){
  long distances;
  servoocchio.write(pos3);
     delay(500);
     digitalWrite( trigPin, LOW );
  
     //invia un impulso di 20microsec su trigger
     digitalWrite(ledgiallo,HIGH);
     digitalWrite( trigPin, HIGH );
     delayMicroseconds( 20 );
     digitalWrite( trigPin, LOW );
     long durationsinistra = pulseIn( echoPin, HIGH );//calcolo della durata dell'impulso
     distances = (durationsinistra/2) / 29.1;
     delay(500);
     digitalWrite(ledgiallo,LOW);
     servoocchio.write(pos2);
   return distances;}
  
void loop(){
  int testDistance = CheckDistance();
  digitalWrite(ledrosso, HIGH);
  delay(150);
  digitalWrite(ledgiallo, HIGH);
  delay(150);
  digitalWrite (ledverde, HIGH);
  delay (150);
  digitalWrite(ledrosso, LOW);
  delay(150);
  digitalWrite(ledgiallo, LOW);
  delay(150);
  digitalWrite (ledverde, LOW);
  delay (150);
 
     if(testDistance >= 10){//se la distanza è maggiore di quella indicata fai avanzare engrambi i motori
    MotorForward(30);
    digitalWrite(ledverde,HIGH);
     }
     if(testDistance < 10 ){
       MotorRelease();
       int distancer=giradestra();
       int distances=girasinistra();
       if(distancer<distances){
         MotorLeft(120);
         }
         else{
           MotorRight(120);
         }
         
     }
}

leo72:

nid69ita:
Il tuo codice mi lascia alquanto perplesso. E' pieno di delay() che sono bloccanti (non bloccano solo gli interrupt).
Quando esegui una delay(500) fermi tutta la MCU per mezzo secondo.

Non è corretto. Il delay è un semplice ciclo while che non ferma gli interrupt. Difatti il valore di millis continua ad aumentare (è agganciato ad un interrupt sull'overflow del timer 0), la seriale continua a ricevere e/o spedire dati (sia le funzioni di RX che di TX sono basate su interrupt) ecc... :wink:

Anche io ho scritto che delay() NON blocca gli interrupt. :smiley:

Tu hai scritto:

E' pieno di delay() che sono bloccanti (non bloccano solo gli interrupt)

Messa così, significa: gli interrupt non bloccano solo gli interrupt [ma anche altro].

C'è un "solo" ambiguo e di troppo, che fa intendere l'affermazione in 2 modi. :stuck_out_tongue:
Senza, si capiva meglio :wink:

Vero, davo per scontato il soggetto nella seconda affermazione. Ambigua. :slight_smile: