Seriële verbinding loopt veel te traag

IDE gerelateerde berichten
Berichten: 5
Geregistreerd: 04 Okt 2019, 21:49

Seriële verbinding loopt veel te traag

Berichtdoor Vw181 » 11 Jan 2020, 22:13

Ik heb zelf een programmatje geschreven om de I-O’s van de Arduino uit te lezen en aan te sturen vanuit de Raspberry-pi.
Alles werkt goed totdat ik het stukje programma voor de ultrasoon sensor HC-SR04 toevoeg. Ik heb zoveel mogelijk vertragingen weten te vermijden. Maar in het stukje programma onder “void Echo()” zit iets wat het programma blokt.
Weet iemand of hier een andere mogelijk voor is om deze vertraging te vermijden? De vertraging komt naar voren als de sensor niets detecteert dus als de afstand het grootst is.
Ik heb ook het programma Firmata geprobeerd maar dat loopt helemaal niet. Daar komt bij dat ik dan helemaal niet weet wat er gebeurd en ik wil zelf bepalen wanneer er iets verstuurd wordt.

IMG_3766.jpg
IMG_3766.jpg (54.75 KiB) 6175 keer bekeken


Code: Alles selecteren
#include <Servo.h>
#include <Servo.h>
Servo servo1;
Servo servo2;


// constants won't change. They're used here to set pin numbers:
const int Edge_sensor_linksvoor = 22;     
const int Edge_sensor_rechtsvoor = 23;
const int Edge_sensor_linksachter = 24;
const int Edge_sensor_rechtsachter = 25;
const int Bewegingsmelder = 26;
const int Encoder_links = 27;
const int Encoder_rechts = 28;
const int trigPin = 6;
const int echoPin = 7;
int Speed_motor_1 = 8;
int IN1 = 9;
int IN2 = 10;
int Speed_motor_2 = 11;
int IN3 = 12;
int IN4 = 13;


// variables will change:
int StateLV = 0;
int lastStateLV = 0;
int StateRV = 0;
int lastStateRV = 0;
int StateLA = 0;
int lastStateLA = 0;
int StateRA = 0;
int lastStateRA = 0;
int StateBM = 0;
int lastStateBM = 0;
int StateEL = 0;
int lastStateEL = 0;
int StateER = 0;
int lastStateER = 0;
int PosHoofd = 15; //Seriele ontvangen positie
int ActuelePosHoofd = 15;
int SpeedHoofd = 100;
int Cyclus1 = 0;
int Delay1 = 500;
int PosVork = 175; //Seriele ontvangen positie
int ActuelePosVork = 175;
int SpeedVork = 100;
int Cyclus2 = 0;
int Delay2 = 500;
int Snelheid_linker_motor = 100;
int Snelheid_rechter_motor = 100;
int lastStateECHO = 0;
int ECHO = 0;
int Delay3 = 0;
int Delay4 = 0;
long tijd, cm;
int Delay5 = 0;
int Delay6 = 0;

//Seriele informatie
const byte numChars = 10;
char receivedChars[numChars];
boolean newData = false;
int dataNumber = 0;


void setup() {
  // Open seriele poort
  Serial.begin (115200);
 
  // initialize the Inputs an Outputs:
  pinMode(Edge_sensor_linksvoor, INPUT);
  pinMode(Edge_sensor_rechtsvoor, INPUT);
  pinMode(Edge_sensor_linksachter, INPUT);
  pinMode(Edge_sensor_rechtsachter, INPUT);
  pinMode(Bewegingsmelder, INPUT);
  pinMode(IN1, OUTPUT);  //IN1 Linker motor vooruit
  pinMode(IN2, OUTPUT); //IN2 Linker motor achteruit
  pinMode(IN3, OUTPUT); //IN3 Rechter motor vooruit
  pinMode(IN4, OUTPUT); //IN4 Rechter motor achteruit
  pinMode(Speed_motor_1,OUTPUT);
  pinMode(Speed_motor_2,OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

}

void loop()
{
//-----
  // Serial:
  {
  serialData();
  showNewData();
  Echo();
  }
//----- 
  // Sensor linksvoor:
  StateLV = digitalRead(Edge_sensor_linksvoor);

  if (StateLV == HIGH && lastStateLV == 0)
  {
    Serial.write("<5>");
    lastStateLV = 1;
  }
  if (StateLV == LOW && lastStateLV == 1)
  {
    Serial.write("<6>");
    lastStateLV = 0;
  }
//-----
  // Sensor rechtsvoor:
  StateRV = digitalRead(Edge_sensor_rechtsvoor);

  if (StateRV == HIGH && lastStateRV == 0)
  {
    Serial.write("<7>");
    lastStateRV = 1;
  }
  if (StateRV == LOW && lastStateRV == 1)
  {
    Serial.write("<8>");
    lastStateRV = 0;
  }
//-----
  // Sensor linksachter:
  StateLA = digitalRead(Edge_sensor_linksachter);

  if (StateLA == HIGH && lastStateLA == 0)
  {
    Serial.write ("<9>");
    lastStateLA = 1;
  }
  if (StateLA == LOW && lastStateLA == 1)
  {
    Serial.write("<10>");
    lastStateLA = 0;
  }
//-----
  // Sensor rechtsachter:
  StateRA = digitalRead(Edge_sensor_rechtsachter);

  if (StateRA == HIGH && lastStateRA == 0)
  {
  Serial.write("<11>");
  lastStateRA = 1;
  }
  if (StateRA == LOW && lastStateRA == 1)
  {
    Serial.write("<12>");
    lastStateRA = 0;
  }
//-----
  // Bewegingsmelder in het hoofd:
  StateBM = digitalRead(Bewegingsmelder);

  if (StateBM == HIGH && lastStateBM == 0)
  {
    Serial.write("<13>");
    lastStateBM = 1;
  }
  if (StateBM == LOW && lastStateBM == 1)
  {
    Serial.write("<14>");
    lastStateBM = 0;
  }
//-----
  // Encoder sensor linker wiel:
  StateEL = digitalRead(Encoder_links);

  if (StateEL == HIGH && lastStateEL == 0)
  {
    Serial.write("<15>");
    lastStateEL = 1;
  }
  if (StateEL == LOW && lastStateEL == 1)
  {
    Serial.write("<16>");
    lastStateEL = 0;
  }
//-----
  // Encoder sensor rechter wiel:
  StateER = digitalRead(Encoder_rechts);

  if (StateER == HIGH && lastStateER == 0)
  {
    Serial.write("<17>");
    lastStateER = 1;
  }
  if (StateER == LOW && lastStateER == 1)
  {
    Serial.write("<18>");
    lastStateER = 0;
  }   
//-----
  // Servo Hoofd naar achteren:
  if (ActuelePosHoofd < PosHoofd)
  {
    if (Cyclus1 <= SpeedHoofd)
    {
      Cyclus1 += 1;
    }
    else
    {
    servo1.write(ActuelePosHoofd);
    ActuelePosHoofd += 1;
    Cyclus1 = 0;
    }
  }
  // Servo Hoofd naar voren:
  if (ActuelePosHoofd > PosHoofd)
  {
    if (Cyclus1 <= SpeedHoofd)
    {
      Cyclus1 += 1;
    }
    else
    {
    servo1.write(ActuelePosHoofd);
    ActuelePosHoofd -= 1;
    Cyclus1 = 0;
    }
  } 
    //Servo Hoofd loskoppelen:   
    if (ActuelePosHoofd == PosHoofd && Delay1 <= 500)
    {
    Delay1 += 1;
    }
   
    if (ActuelePosHoofd == PosHoofd && Delay1 >= 500)
    {
    servo1.detach();
    }
 
//-----
  //Servo Vork naar boven:
  if (ActuelePosVork < PosVork)
  {
    if (Cyclus2 <= SpeedVork)
    {
    Cyclus2 += 1;
    }
    else
    {
    Delay2 = 0;
    servo2.write(ActuelePosVork);
    ActuelePosVork += 1;
    Cyclus2 = 0;
    }
  }

  //Servo Vork naar onder:
  if (ActuelePosVork > PosVork)
  {
    if (Cyclus2 <= SpeedVork)
    {
    Cyclus2 += 1;
    }
    else
    { 
    servo2.write(ActuelePosVork);
    ActuelePosVork -= 1 ;
    Cyclus2 = 0;
   }
  }
    //Servo vork loskoppelen:
    if (ActuelePosVork == PosVork && Delay2 <= 500)
    {
    Delay2 +=1;
    }
   
    if (ActuelePosVork == PosVork && Delay2 >= 500)
    {
    servo2.detach();
    }
//-----
  //Afstanden meten en splitsen:
 
    if (cm <= 15 && lastStateECHO == 0 && ECHO == 1 && Delay3 <= 10)
    {
    Delay3 += 1;
    }
    if (cm <= 15 && lastStateECHO == 0 && ECHO == 1 && Delay3 > 10)
    {
    Serial.write("<20>");
    lastStateECHO = 1;
    Delay3 = 0;
    }

    if (cm > 15 && lastStateECHO == 1 && Delay4 <= 10)
    {
    Delay4 += 1;
    }
   
    if (cm > 15 && lastStateECHO == 1 && Delay4 > 10)
    {
    Serial.write("<19>");
    lastStateECHO = 0;
    Delay4 = 0;
    }   
}

void serialData()
{
static byte ndx = 0;
char endMarker = '\n';
char rc;

if (Serial.available() > 0)
{
  rc = Serial.read();

  if (rc != endMarker)
  {
    receivedChars[ndx] = rc;
    ndx++;
    if (ndx >= numChars)
    {
      ndx = numChars -1;
    }
  }
  else
  {
    receivedChars[ndx] = '\0';
    ndx = 0;
    newData = true;
  }
}
}

void Echo()
{
    //De sensor wordt getriggerd bij 10 us, geef eerst een lage puls om een schone hoge puls te krijgen
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
 
    // Wacht op een hoge puls en meet de tijd
    tijd = pulseIn(echoPin, HIGH);
   
    // De formule om tijd in afstand om te zetten
    cm = (tijd/2) / 29.1;
    Serial.println(cm);
}

void showNewData()

  if (newData == true)
  {
  dataNumber = 0;
  dataNumber = atoi(receivedChars);
  newData=false;
  }
  if (dataNumber > 1000 && dataNumber < 1999)
  {
    PosHoofd = dataNumber - 1000;
    dataNumber = 0;
    Delay1 = 0;
    servo1.attach(4);
  }
  if (dataNumber > 2000 && dataNumber < 2999)
  {
    SpeedHoofd = dataNumber - 2000;
    dataNumber = 0; 
  }
  if (dataNumber > 3000 && dataNumber < 3999)
  {
    PosVork = dataNumber - 3000;
    dataNumber = 0;
    Delay2 = 0; 
    servo2.attach(5);
  }
  if (dataNumber > 4000 && dataNumber < 4999)
  {
    SpeedVork = dataNumber - 4000;
    dataNumber = 0;
  }
  if (dataNumber == 1)
  {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    dataNumber = 0;
  }
  if (dataNumber == 2)
  {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    dataNumber = 0;
  }
  if (dataNumber == 3)
  {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    dataNumber = 0;
  }
  if (dataNumber == 4)
  {
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    dataNumber = 0;
  }
  if (dataNumber == 5)
  {
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    dataNumber = 0;
  }
  if (dataNumber == 6)
  {
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    dataNumber = 0;
  }
  if (dataNumber == 7)
  {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    dataNumber = 0;
  }
  if (dataNumber == 8)
  {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    dataNumber = 0;
  }
  if (dataNumber == 9)
  {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    dataNumber = 0;
  }
  if (dataNumber > 5000 && dataNumber < 5999)
  {
    Snelheid_linker_motor = dataNumber - 5000;
    analogWrite(Speed_motor_1, Snelheid_linker_motor);
    dataNumber = 0;
   
  }
  if (dataNumber > 6000 && dataNumber < 6999)
  {
    Snelheid_rechter_motor = dataNumber - 6000;
    analogWrite(Speed_motor_2, Snelheid_rechter_motor);
    dataNumber = 0;
  }
  if (dataNumber == 11)
  {
    ECHO = 1;
    dataNumber = 0;
  }
  if (dataNumber == 12)
  {
    ECHO = 0;
    dataNumber = 0;
  }
}
   

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Seriële verbinding loopt veel te traag

Berichtdoor Koepel » 11 Jan 2020, 22:38

Die paar microseconden die gewacht wordt kan de pret niet drukken en ook de Serial.println() kan het niet zijn. zolang de seriele buffer niet overloopt.
Dus blijft de pulseIn() over.
Dan lees je de reference, en dan blijkt die een timeout van 1 seconde te hebben: https://www.arduino.cc/reference/en/language/functions/advanced-io/pulsein/.

Sommigen gebruiken de NewPing: https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home

Berichten: 5
Geregistreerd: 04 Okt 2019, 21:49

Re: Seriële verbinding loopt veel te traag

Berichtdoor Vw181 » 11 Jan 2020, 22:50

Bedankt voor de reactie.

Zou ik de time-out kunnen verkorten? Ik wil schakelen bij ongeveer 15cm dus alles wat daar buiten valt heb ik niet nodig.
Ik zag in jou link deze functie “ pulseIn(pin, value, timeout) “.

Berichten: 5
Geregistreerd: 04 Okt 2019, 21:49

Re: Seriële verbinding loopt veel te traag

Berichtdoor Vw181 » 11 Jan 2020, 22:57

NewPing Klinkt ook heel interessant, dat ga ik morgen eens proberen.

Bedankt

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Seriële verbinding loopt veel te traag

Berichtdoor Gij Kieken » 11 Jan 2020, 23:02

Hey VW81,
Om Koepel aan te vullen, door het gebruik van pulseIn wordt je code zogenaamd Blocking.
Je kunt het een beetje vergelijken met het gebruik van delay().
Dus een oplossing zoeken voor de afstand meting zonder pulseIn.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Seriële verbinding loopt veel te traag

Berichtdoor shooter » 12 Jan 2020, 14:33

tjonge zeg, ja het is die pulsein om te beginnen,
pulseIn(pin, value, timeout)
Parameters

pin: the number of the Arduino pin on which you want to read the pulse. Allowed data types: int.
value: type of pulse to read: either HIGH or LOW. Allowed data types: int.
timeout (optional): the number of microseconds to wait for the pulse to start; default is one second. Allowed data types: unsigned long.
(recht uit de reference)
ik laat dat afstand doen door een aparte nano en stuur de resultaten terug naar de master.
ook pulsen tellen etc stopt dan dus andere oplossing bedenken
paul deelen
shooter@home.nl

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 14 gasten