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:

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

Popular posts from this blog

Error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode - Raspberry Pi Forums

class MPU6050 has no member named begin

missing filename after '-o'