Ciao a tutti,
ho provato a cercare sul forum ma forse la domanda è troppo generica.
Dopo un mese di vari progettini ho deciso la settimana scorsa di unire tutte le 'competenze limitate' che ho acquisito per fare una macchinina.
Ho assemblato questo chassis http://www.miniinthebox.com/intelligent-tracking-trolley-chassis-with-coded-disc_p407335.html e cominciato a comandarli con un l298n h-bridge però vedo che non riesco a controllarli molto bene, uno sembra andare meglio dell'altro quando lo appoggio a terra, in più non riesco a controllare una velocità bassa, se abbasso l'impulso analogico sotto '200' non riescono a spostare la macchina.
porzione di codice che comanda un motore:
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);//setting motorA's directon
analogWrite(ENA,200);
Ho diversi dubbi:
- il tutto troppo pesante: chassis+10 pile AA(6 per arduino e 4 per i motori)+ arduino uno+ sensore prossimità +l298n h-bridge
- le pile che uso non sono ottimali: normali pile energizer
- errori nel codice
- altro
Allego tutto il codice:
// motor
int ENA=5;//connected to Arduino's port 5(output pwm)
int IN1=2;//connected to Arduino's port 2
int IN2=3;//connected to Arduino's port 3
int ENB=6;//connected to Arduino's port 6(output pwm)
int IN3=4;//connected to Arduino's port 4
int IN4=7;//connected to Arduino's port 7
//HC RS04 Ultrasound sensor
int triggerPort = 12;
int echoPort = 8;
long dist = 0;
long stopDist = 10;
long slowDist = 20;
int velMax = 255;
int velSlow = 200;
void setup()
{
//setup motors
pinMode(ENA,OUTPUT);//output
pinMode(ENB,OUTPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
digitalWrite(ENA,LOW);
digitalWrite(ENB,LOW);//stop driving
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);//setting motorA's directon
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);//setting motorB's directon
//setup ultrasound sensor
pinMode( triggerPort, OUTPUT );
pinMode( echoPort, INPUT );
Serial.begin( 9600 );
Serial.println( "Sensore ultrasuoni: ");
}
void loop()
{
proximity();
driveMotors();
}
void driveMotors(){
if (dist>stopDist) {
goSx(); goDx();
} else {
stopSx(); stopDx();
backSx(); backDx();
delay(2000);
stopSx(); stopDx();
goSx();
delay(1000);
stopSx(); stopDx();
}
}
void goDx(){
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);//setting motorA's directon
if (dist>slowDist){
analogWrite(ENA,velMax);
} else {
analogWrite(ENA,velSlow);
}
}
void stopDx(){
digitalWrite(ENA,LOW);
}
void backDx(){
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);//setting motorA's directon
analogWrite(ENA,velMax);
}
void goSx(){
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);//setting motorB's directon
if (dist>slowDist){
analogWrite(ENB,velMax);
} else {
analogWrite(ENB,velSlow);
}
}
void stopSx(){
digitalWrite(ENB,LOW);
}
void backSx(){
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);//setting motorB's directon
analogWrite(ENB,velMax);
}
void proximity(){
//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );
long duration = pulseIn( echoPort, HIGH );
long r = 0.034 * duration / 2;
Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );
//dopo 38ms è fuori dalla portata del sensore
if( duration > 38000 ) Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}
dist = r;
//aspetta 1.5 secondi
// delay( 1500 );
}