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 =)
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...
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
// 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);
}
}
}
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...
Anche io ho scritto che delay() NON blocca gli interrupt.