HC-SR04 : lettura infinita
buongiorno tutti!
volevo porvi alcuni quesiti:
-il codice che posterò controlla una base mobile (4 ruote)
-effettua ad ogni comando una lettura di distanza con un hc-sr04
la mia domanda è: riesco fargli leggere la distanza con l'ostacolo ogni secondo per esempio?
questo è il mio codice:
grazie per la disponibilità e l'aiuto!
ps: mi scuso con il sig. gugliemo. ieri non è stata una bella giornata e sono stato molto sgarbato causa problemi personali..
volevo porvi alcuni quesiti:
-il codice che posterò controlla una base mobile (4 ruote)
-effettua ad ogni comando una lettura di distanza con un hc-sr04
la mia domanda è: riesco fargli leggere la distanza con l'ostacolo ogni secondo per esempio?
questo è il mio codice:
code: [select]
#include <newping.h>
#include <afmotor.h>
#include <servo.h>
#include <softwareserial.h>
#define pingpin a0
newping sonar(pingpin,pingpin);
const int speed = 20; //velocità in %
#define rx 15 //a1
#define tx 16 //a2
#define led 17 //a3
#define fotor 18//a4
int data;
int data2;
servo servo;
af_dcmotor motor_left_front(4,motor34_1khz);
af_dcmotor motor_right_front(3,motor34_1khz);
af_dcmotor motor_left_rear(1,motor12_1khz);
af_dcmotor motor_right_rear(2,motor12_1khz);
softwareserial btserial(rx,tx);
void setup() {
serial.begin(9600);
btserial.begin(9600);
servo.attach(9);
servo.write(45);
pinmode(led,output);
pinmode(fotor,input);
motor_left_front.setspeed(255);
motor_right_front.setspeed(255);
motor_left_rear.setspeed(255);
motor_right_rear.setspeed(255);
}
void loop() {
if(btserial.available())
{
data2=btserial.read();
serial.print(data2);
//data=serial.read();
serial.print(data2, hex);
serial.print(" - ");
serial.println((char) data2);
switch(data2)
{
case '0'://reset servo position
servo.write(45);
break;
case '1'://look right
servo.write(90);
break;
case '2'://look left
servo.write(-90);
break;
case '3': //servomotor , distance (hc-sr04)
servorotation();
break;
case 'd': //distance (hc-sr04)
distance();
break;
case 'o': //led off
btserial.print("led off");
btserial.print("");
digitalwrite(led,low);
break;
case 'n': //led on
btserial.print("led on");
btserial.print("");
digitalwrite(led,high);
break;
case 'f': //forward
btserial.print("forward");
btserial.print("");
motor_left_front.run(forward);
motor_right_front.run(forward);
motor_left_rear.run(forward);
motor_right_rear.run(forward);
servorotation();
break;
case 'b': //backward
btserial.print("backward");
btserial.print("");
motor_left_front.run(backward);
motor_right_front.run(backward);
motor_left_rear.run(backward);
motor_right_rear.run(backward);
break;
case 's': //stop
btserial.print("stop");
btserial.print("");
motor_left_front.run(release);
motor_right_front.run(release);
motor_left_rear.run(release);
motor_right_rear.run(release);
break;
case 'r': //turn right
btserial.print("turn right");
btserial.print("");
motor_left_front.run(backward);
motor_right_front.run(backward);
motor_left_rear.run(release);
motor_right_rear.run(backward );
break;
case 'l': //turn left
btserial.print("turn left");
btserial.print("");
motor_left_front.run(backward);
motor_right_front.run(backward);
motor_left_rear.run(backward);
motor_right_rear.run(release );
break;
case 'a': //auto light
light();
break;
}
}
}
void servorotation()
{
//senso orario
servo.write(0);
delay(300);
servo.write(45);
distance();
delay(300);
servo.write(90);
delay(300);
//anti-orario
servo.write(135);
delay(300);
servo.write(90);
delay(300);
servo.write(45);
distance();
delay(300);
}
void distance()
{
delay(50); // wait 50ms between pings (about 20 pings/sec). 29ms should shortest delay
unsigned int = sonar.ping(); // send ping, ping time in microseconds (us).
btserial.print("distance: ");
btserial.print(us/us_roundtrip_cm); // convert time distance
btserial.println("cm");
btserial.print("");
if(us/us_roundtrip_cm<10)
{
motor_left_front.run(release);
motor_right_front.run(release);
motor_left_rear.run(release);
motor_right_rear.run(release);
}
}
void light()
{
int luce=analogread(fotor);
btserial.println("light: "+ string(luce));
if(luce<200)
{
digitalwrite(led,high);
}
else
{
digitalwrite(led,low);
}
}
grazie per la disponibilità e l'aiuto!
ps: mi scuso con il sig. gugliemo. ieri non è stata una bella giornata e sono stato molto sgarbato causa problemi personali..
mi scuso con il sig. gugliemo. ieri non è stata una bella giornata e sono stato molto sgarbato causa problemi personali..nessun problema, le "brutte giornate", purtroppo, capitano tutti ...
riguardo il codice, purtroppo ci devi mettere pesantemente le mani e ... eliminare quelle raffiche di delay() che, ogni volta che chiami la servorotation() ... ti bloccano il programma per parecchio tempo tra una chiamata distance() ed un altra ...
per avere un esatto controllo delle temporizzazioni e non avere ritardi, devi non usare la delay() ed usare la millis() ...
... se non l'hai mai usata/studiata, puoi cominciare leggere prima qui, poi qui ed infine leggi anche qui e qui ... vedrai che ti sarà tutto più chiaro.
guglielmo
Arduino Forum > International > Italiano > Software (Moderator: leo72) > HC-SR04 : lettura infinita
arduino
Comments
Post a Comment