датчик VL53L0x-v2 иногда передает значение 65535

Bodia96
Offline
Зарегистрирован: 06.12.2018

Всем добрый вечер, делаю проект: радиомашинка, с двумя инфракрасными датчиками, сервоприводом, драйвером двигателей l298n и блютуз модулем HC-06. Суть проекта, чтобы машинка автоматически находила середину дороги и сервопривод нажимал на балончик с краской. Проблема следующая: при чтении с инфракрасных датчиков иногда приходит значение 65535 и дальше програма работает некорректно, 1 датчик перестает видеть и приходит только 65535. Недавно сделал проверку адреса регистра (в програме меняю адрес для двух инфракрасных датчиков) и при проверке обнаружило 4 устройства на шине і2с, вместо двух.

Буду очень признателен если ктото объяснит почему приходит 65535 или как решить проблему с 4 устройствами і2с вместо 2. И вообще посоветует как програму улучшить, спасибо заранее, и простите, если совершил ошибки в тексте.

Вот большая часть моей програмы:

 

#include <Servo.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <VL53L0X.h>

char incomingByte;  // входящие данные
SoftwareSerial mySerial(10, 11); // RX, TX
int IN1 = 5; //сірий
int IN2 = 4; //білий
int IN3  = 3; //жовтий
int IN4  = 2; //коричнивий
     
unsigned int x;
unsigned int y;
int Servopin = 9;
VL53L0X sensor;
VL53L0X sensor2;
Servo Servo1;
void setup() 
 {

 pinMode(IN1, OUTPUT); 
 pinMode(IN2, OUTPUT); 
 pinMode(IN3, OUTPUT); 
 pinMode(IN4, OUTPUT);  
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 digitalWrite(6, LOW);
 digitalWrite(7, LOW);

   delay(500);
 Servo1.attach(Servopin);
 Serial.begin(9600);
 Servo1.write(60);
  sensor.setTimeout(500);
  sensor2.setTimeout(500);

  Wire.begin();
 mySerial.begin(9600);

  pinMode(6, INPUT);
  delay(150);
  mySerial.println("00");
  sensor.init(true);


  mySerial.println("01");
  delay(100);
  sensor.setAddress((uint8_t)22);
  mySerial.println("02");


  pinMode(7, INPUT);
  delay(150);
  sensor2.init(true);
  mySerial.println("03");
  delay(100);
  sensor2.setAddress((uint8_t)25);
  mySerial.println("04");
  mySerial.println("addresses set");

  sensor.setSignalRateLimit(0.1);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
 sensor.setMeasurementTimingBudget(200000);
  sensor2.setSignalRateLimit(0.1);
  sensor2.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor2.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
 sensor2.setMeasurementTimingBudget(200000);
 } 

void loop() 
{ 
  
  if (mySerial.available() > 0) {  //если пришли данные
    incomingByte = mySerial.read(); // считываем байт
     if (incomingByte == '9') {//Scan
      mySerial.println ("I2C scanner. Scanning ...");
      byte count = 0;


      for (byte i = 1; i < 200; i++)
      {

        Wire.beginTransmission (i);
        if (Wire.endTransmission () == 0)
        {
          mySerial.print ("Found address: ");
          mySerial.print (i, DEC);
          mySerial.print (" (0x");
          mySerial.print (i, HEX);
          mySerial.println (")");
          count++;
          delay (1);  
        } 
      } 
      mySerial.println ("Done.");
      mySerial.print ("Found ");
      mySerial.print (count, DEC);
      mySerial.println (" device(s).");

      delay(1000);
    }
 if (incomingByte == '+') 
    {//Range
  x = sensor.readRangeSingleMillimeters();   
         mySerial.print(x);
      if (sensor.timeoutOccurred()) {
        mySerial.print(" TIMEOUT");

      }
      mySerial.println();
      
      y = sensor2.readRangeSingleMillimeters();    //присвоюються х
         mySerial.print(y);
      if (sensor2.timeoutOccurred()) {
        mySerial.print(" TIMEOUT");

      }
      mySerial.println();
}
if (incomingByte == '#') 
    {//Auto
      x = sensor.readRangeSingleMillimeters();    //присвоюються х
      mySerial.print(x);

      mySerial.println();
      
       y = sensor2.readRangeSingleMillimeters();    //присвоюються y
       mySerial.print(y);

      mySerial.println();
      if ( x > y )
      {
      while ( x > y ) // Якщо відстань зліва більша від відстані справа
     { mySerial.println ("Зліва більша");
         x = sensor.readRangeSingleMillimeters();    //присвоюються х
         mySerial.print(x);

      mySerial.println();
      
      y = sensor2.readRangeSingleMillimeters();    //присвоюються y
      mySerial.print(y);

      mySerial.println();
       
        if ((abs( x - y ) > 5000 ) && (abs( x - y ) < 7000 ) )    //якщо модуль різниці зліва і справа в межах 5000 7000
{ mySerial.println ("від 7 до 5 м");
          digitalWrite(IN1, HIGH);   
           delay(1000);                               //частковий поворот вправо
          digitalWrite(IN3, HIGH);  
          delay(1000);                              
          digitalWrite(IN1, LOW);
          digitalWrite(IN3, LOW);  

          digitalWrite(IN2, HIGH);
          delay(1000);
          digitalWrite(IN3, HIGH);
          delay(1000);
           digitalWrite(IN2, LOW);  
          digitalWrite(IN3, LOW);  
}
 if ((abs( x - y ) > 2000 ) && (abs( x - y ) < 5000 ) )    //якщо модуль різниці зліва і справа в межах 2000 5000
{mySerial.println ("від 5 до 2 м");
         
          digitalWrite(IN1, HIGH);
          delay(1000);
          digitalWrite(IN3, HIGH);
          delay(500);
           digitalWrite(IN1, LOW);  
          digitalWrite(IN3, LOW); 

          digitalWrite(IN2, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH); 
          delay(700);
          digitalWrite(IN2, LOW);  
          digitalWrite(IN3, LOW); 
}
if ( (abs(x - y ) > 50 ) && ( abs(x - y)  < 2000 ) )     //якщо модуль різниці зліва і справа в межах 50 2000
{mySerial.println ("від 50 до 2 м");
        digitalWrite(IN1, HIGH);  
          delay(400);
          digitalWrite(IN3, HIGH);
          delay(500);
           digitalWrite(IN1, LOW); 
          digitalWrite(IN3, LOW);  

          digitalWrite(IN2, HIGH);  
          delay(50);
          digitalWrite(IN3, HIGH);
          delay(200);
          digitalWrite(IN2, LOW); 
          digitalWrite(IN3, LOW);  
}
if  ( abs(x - y) <= 50 ){
    mySerial.println ("Середина досягнута");
    digitalWrite(IN2, HIGH); 
          delay(400);
    digitalWrite(IN3, HIGH);
          delay(400);
    digitalWrite(IN2, LOW);  
          digitalWrite(IN3, LOW);  
break;}
if ( y > x) {
  mySerial.println ("y > x");
  break;}

if (mySerial.available() > 0) {  //если пришли данные
    incomingByte = mySerial.read();
 if(incomingByte == '0') {
    break;
 } }}}

if ( y > x )
{
   while ( y > x ) // Якщо відстань справа більша від відстані зліва
      {   mySerial.println ("Справа більша");
          x = sensor.readRangeSingleMillimeters();    //присвоюються х
          mySerial.print(x);
     

      mySerial.println();
      
      y = sensor2.readRangeSingleMillimeters();    //присвоюються х
      mySerial.print(y);
     
      mySerial.println();
     
        if ((abs( y - x) > 5000 ) && (abs(y - x) < 7000 ) )
{
          digitalWrite(IN2, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH);  
          delay(1000);
          digitalWrite(IN2, LOW);  
          digitalWrite(IN3, LOW);  

          digitalWrite(IN1, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH);  
          delay(1000);
          digitalWrite(IN1, LOW); 
          digitalWrite(IN3, LOW);  
}
 if ((abs( y - x ) > 2000 ) && ( abs( y - x ) < 5000 ) )
{
          digitalWrite(IN2, HIGH);  
          delay(200);
          digitalWrite(IN3, HIGH);  
          delay(500);
           digitalWrite(IN2, LOW); 
          digitalWrite(IN3, LOW);  

          digitalWrite(IN1, HIGH); 
          delay(200);
          digitalWrite(IN3, HIGH); 
          delay(700);
           digitalWrite(IN1, LOW); 
          digitalWrite(IN3, LOW); 
}
else if ((abs( y - x ) > 50 ) && ( abs(y - x)  < 2000 ) )
{
          
          digitalWrite(IN2, HIGH);  
          delay(400);
          digitalWrite(IN3, HIGH);  
          delay(400);
           digitalWrite(IN2, LOW);  
          digitalWrite(IN3, LOW);  

          digitalWrite(IN1, HIGH);  
          delay(50);
          digitalWrite(IN3, HIGH); 
          delay(200);
           digitalWrite(IN1, LOW);  
          digitalWrite(IN3, LOW); 
}
if (abs( y - x ) <= 50) {
  mySerial.println ("Середина досягнута");
   digitalWrite(IN3, HIGH);  // Вперед
   delay(500);
    digitalWrite(IN3, LOW); 
  break;}
 
if ( x > y) {
  mySerial.println ("x > y");
  break;}
}
} 
}}}

Также у меня в текстовый документ переносяться пришедшие данные и вот что высветилось при считывания регистров і2с

I2C scanner. Scanning ...
Found address: 22 (0x16)
Found address: 25 (0x19)
Found address: 150 (0x96)
Found address: 153 (0x99)
Done.
Found 4 device(s).
nik182
Offline
Зарегистрирован: 04.05.2015

Ну так таймаут никто не считывает. Он сам приходит когда датчик ошибается. Это надо обрабатывать. Например вставить проверку что если пришло 65535 то ничего не делать а ждать следующего измерения.

Bodia96
Offline
Зарегистрирован: 06.12.2018

Приблизительный результат работы системы, до того как оказалось 4 регистра і2с:

918    //первое сравнение перед if 
566
Зліва більша  //движется к центру
908
566
від 50 до 2 м
Зліва більша
937
612
від 50 до 2 м
Зліва більша
934
706
від 50 до 2 м
Зліва більша
955
65535   //правый датчик неадекватно отображает данные
від 50 до 2 м
x > y  //условие, при котором с цикла выбрасывает
Справа більша
977
65535
Справа більша
943
65535
Справа більша
948
65535
Справа більша
883
65535
Справа більша
721  //перегрузка кнопкой на плате
00
01
02
03
04
addresses set
895
65535 TIMEOUT  //правый датчик опять не отображается
881
65535 TIMEOUT
00
01
02
03
04
addresses set
888  //кнопка для считывания регистра і2с, значит регистры считываються пока
708
884
707
887
705
Зліва більша
895
705
від 50 до 2 м
Зліва більша
877
724
від 50 до 2 м
Зліва більша
871
786
від 50 до 2 м
Зліва більша
858
65535  //і знову
від 50 до 2 м
x > y
Справа більша
862
65535
Справа більша
844
65535
Справа більша
852
65535
Справ більша
00
01
02
03
04
addresses set
1214
767
1228
761
Зліва більша
1217
805
від 50 до 2 м
Зліва більша
8190
988
Зліва більша
1030
975
від 50 до 2 м
Зліва більша
870
8190  //эта ошыбка тоже иногда появляеться
x > y
Справа більша
953
675
x > y
1078
8190
1072
649
1071
674
1075
667
Зліва більша
1068
655
від 50 до 2 м
Зліва більша
1045
715
від 50 до 2 м
Зліва більша
714
65535
від 50 до 2 м
x > y
Справа більша
719
65535
Справа більша
562
Bodia96
Offline
Зарегистрирован: 06.12.2018

nik182 пишет:
Ну так таймаут никто не считывает. Он сам приходит когда датчик ошибается. Это надо обрабатывать. Например вставить проверку что если пришло 65535 то ничего не делать а ждать следующего измерения.

Таймаут считываеться только при обычном считывании растояния, там ошибок не возникает, а ошибка 65535 только в автопоиске середины и тогда и датчик один перестает видеть програма для считывание регистров

nik182
Offline
Зарегистрирован: 04.05.2015

У вас есть функция timeoutOccurred. Проверяйте её перед вызовом замера. Пока она true ничего мерить не будет.

Bodia96
Offline
Зарегистрирован: 06.12.2018

nik182 пишет:
У вас есть функция timeoutOccurred. Проверяйте её перед вызовом замера. Пока она true ничего мерить не будет.

это как вариант решения, но если придет 65535 все равно работать не будет система, потому что 65535 прекращало показывать лишь после перезагрузки системы через кнопку на плате

nik182
Offline
Зарегистрирован: 04.05.2015

У вас слишком быстро крутится цикл while. Не хотите проверять свободен датчик или нет, вставте задержку после первого чтения больше таймаута. Иначе вы не сработавший датчик пинаете снова и он зависает.

Bodia96
Offline
Зарегистрирован: 06.12.2018

nik182 пишет:
У вас слишком быстро крутится цикл while. Не хотите проверять свободен датчик или нет, вставте задержку после первого чтения больше таймаута. Иначе вы не сработавший датчик пинаете снова и он зависает.

Спасибо, попробовать нужно, задержку добавить через delay?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если у Вас схема чуть сложнее, чем единственный датчик, лучше пользоваться millis().

Bodia96
Offline
Зарегистрирован: 06.12.2018

Спасибо, сейчас попробую

Bodia96
Offline
Зарегистрирован: 06.12.2018

Вопрос от юзера верно ли я предполагаю:


unsigned long time;
...

 if ( y > x )
{
   while ( y > x ) // Якщо відстань справа більша від відстані зліва
      {   mySerial.println ("Справа більша");
time = millis();

         x = sensor.readRangeSingleMillimeters();    //присвоюються х
         mySerial.print(x);

      mySerial.println();
      
if ((millis() - time) > 2000)
     { y = sensor2.readRangeSingleMillimeters();    //присвоюються y
      mySerial.print(y);

      mySerial.println();
}
     
     /*   if ((abs( y - x) > 5000 ) && (abs(y - x) < 7000 ) )
{
          digitalWrite(IN2, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH);  
          delay(1000);
          digitalWrite(IN2, LOW);  
          digitalWrite(IN3, LOW);  

          digitalWrite(IN1, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH);  
          delay(1000);
          digitalWrite(IN1, LOW);  
          digitalWrite(IN3, LOW);  
}
 if ((abs( y - x ) > 2000 ) && ( abs( y - x ) < 5000 ) )
{
          digitalWrite(IN2, HIGH);  //Вліво
          delay(200);
          digitalWrite(IN3, HIGH);  // Вперед
          delay(500);
           digitalWrite(IN2, LOW);  //Повернуло
          digitalWrite(IN3, LOW);  // Під'їхало

          digitalWrite(IN1, HIGH);  //Вправо
          delay(200);
          digitalWrite(IN3, HIGH);  // Вперед
          delay(700);
           digitalWrite(IN1, LOW);  //Повернуло
          digitalWrite(IN3, LOW);  // Під'їхало
}*/
 if ((millis() - time) > 2000) && ((abs( y - x ) > 50 ) && ( abs(y - x)  < 2000 ) )
{
          
          digitalWrite(IN2, HIGH);  //Вправо
          delay(50);
          digitalWrite(IN3, HIGH);  // Вперед
          delay(400);
           digitalWrite(IN2, LOW);  //Повернуло
          digitalWrite(IN3, LOW);  // Під'їхало

          digitalWrite(IN1, HIGH);  //Вліво
          delay(150);
          digitalWrite(IN3, HIGH);  // Вперед
          delay(200);
           digitalWrite(IN1, LOW);  //Повернуло
          digitalWrite(IN3, LOW);  // Під'їхало
}
if ((millis() - time) > 2000) && (abs( y - x ) <= 50) {
  mySerial.println ("Середина досягнута");

  break;}

if ((millis() - time) > 2000) && ( x > y) {
  mySerial.println ("x > y");
  break;}
}
}
Bodia96
Offline
Зарегистрирован: 06.12.2018

чи так

if ( y > x )
{
   while ( y > x ) // Якщо відстань справа більша від відстані зліва
      {   mySerial.println ("Справа більша");
time = millis();

         x = sensor.readRangeSingleMillimeters();    //присвоюються х
         mySerial.print(x);

      mySerial.println();
      
if ((millis() - time) > 2000)
     { y = sensor2.readRangeSingleMillimeters();    //присвоюються y
      mySerial.print(y);

      mySerial.println();
}
if ((millis() - time) > 4000)
{
     
     /*   if ((abs( y - x) > 5000 ) && (abs(y - x) < 7000 ) )
{
          digitalWrite(IN2, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH);  
          delay(1000);
          digitalWrite(IN2, LOW);  
          digitalWrite(IN3, LOW);  

          digitalWrite(IN1, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH);  
          delay(1000);
          digitalWrite(IN1, LOW);  
          digitalWrite(IN3, LOW);  
}
 if ((abs( y - x ) > 2000 ) && ( abs( y - x ) < 5000 ) )
{
          digitalWrite(IN2, HIGH);  //Вліво
          delay(200);
          digitalWrite(IN3, HIGH);  // Вперед
          delay(500);
           digitalWrite(IN2, LOW);  //Повернуло
          digitalWrite(IN3, LOW);  // Під'їхало

          digitalWrite(IN1, HIGH);  //Вправо
          delay(200);
          digitalWrite(IN3, HIGH);  // Вперед
          delay(700);
           digitalWrite(IN1, LOW);  //Повернуло
          digitalWrite(IN3, LOW);  // Під'їхало
}*/
 if ((abs( y - x ) > 50 ) && ( abs(y - x)  < 2000 ) )
{
          
          digitalWrite(IN2, HIGH);  //Вправо
          delay(50);
          digitalWrite(IN3, HIGH);  // Вперед
          delay(400);
           digitalWrite(IN2, LOW);  //Повернуло
          digitalWrite(IN3, LOW);  // Під'їхало

          digitalWrite(IN1, HIGH);  //Вліво
          delay(150);
          digitalWrite(IN3, HIGH);  // Вперед
          delay(200);
           digitalWrite(IN1, LOW);  //Повернуло
          digitalWrite(IN3, LOW);  // Під'їхало
}
if (abs( y - x ) <= 50) {
  mySerial.println ("Середина досягнута");

  break;}
 
if ( x > y) {
  mySerial.println ("x > y");
  break;}
}}
}

 

Bodia96
Offline
Зарегистрирован: 06.12.2018

 С millis() не получилось, а при опросе timeoutOccurred 

no matching function for call to 'VL53L0X::timeoutOccurred(int)'

if ((sensor.timeoutOccurred(false)) || (sensor2.timeoutOccurred(false))) выдает следующее:

Bodia96
Offline
Зарегистрирован: 06.12.2018

попробую через else if, теперь до if ((sensor.timeoutOccurred(true)) || (sensor2.timeoutOccurred(true))) прицепилось с тем же

Bodia96
Offline
Зарегистрирован: 06.12.2018

Всем доброй ночи, получилось с millis() но както не верно, один раз считываються показания x и y (инфракрасных датчиков), а второй раз уже пропускаються и сразу идет движение, если кто может, очень прошу разьясните в чем проблема, спасибо

if (incomingByte == '#') //опитується символ при натисканні кнопки чи написанні символа
    {//Auto
     
      x = sensor.readRangeSingleMillimeters();    //присвоюються х
      mySerial.print(x);

      mySerial.println();

      delay(2000);
       y = sensor2.readRangeSingleMillimeters();    //присвоюються y
       mySerial.print(y);

      mySerial.println();
      delay(2000);
      if ( x > y )
      {
      if ((abs( x - y ) > 50) && (abs( x - y ) < 2000))
      {
      while ((abs ( x - y ) > 50) && ((abs ( x - y ) < 2000)))// Якщо відстань зліва більша від відстані справа
     { mySerial.println ("Зліва більша");
if ((sensor.timeoutOccurred()) || (sensor2.timeoutOccurred())) {
       mySerial.println("Ти не пройдеш! Таймаут датчика");
       resetFunc(); //вызываем reset
      }
      
      else if ((!(sensor.timeoutOccurred()) || (!(sensor2.timeoutOccurred())))) {
       
time = millis();

if (((millis() - time) > 1000) && ((millis() - time) < 2000))
delay(1000);

if (((millis() - time) > 3000) && ((millis() - time) < 4000))
{
x = sensor.readRangeSingleMillimeters();    //присвоюються х
         mySerial.print(x);
      mySerial.println();
delay(1000);
}

if (((millis() - time) > 5000) && ((millis() - time) < 6000))
{
y = sensor2.readRangeSingleMillimeters();    //присвоюються y
mySerial.print(y);
mySerial.println();
delay(1000);
}

if (((millis() - time) > 7000) && ((millis() - time) < 8000))
delay(1000);


   /*     if ((abs( x - y ) > 5000 ) && (abs( x - y ) < 7000 ) )    //якщо модуль різниці зліва і справа в межах 5000 7000
{ mySerial.println ("від 7 до 5 м");
          digitalWrite(IN1, HIGH);     
           delay(1000);                               
          digitalWrite(IN3, HIGH);  
          delay(1000);                              
          digitalWrite(IN1, LOW);
          digitalWrite(IN3, LOW); 

          digitalWrite(IN2, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH);  
          delay(1000);
           digitalWrite(IN2, LOW);  
          digitalWrite(IN3, LOW);  
}
 if ((abs( x - y ) > 2000 ) && (abs( x - y ) < 5000 ) )    //якщо модуль різниці зліва і справа в межах 2000 5000
{mySerial.println ("від 5 до 2 м");
         
          digitalWrite(IN1, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH);  
          delay(500);
           digitalWrite(IN1, LOW);  
          digitalWrite(IN3, LOW);  

          digitalWrite(IN2, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH);  
          delay(700);
          digitalWrite(IN2, LOW);  
          digitalWrite(IN3, LOW); 
}*/
 if ((( x - y ) > 50) && (( x - y ) < 2000))     //якщо модуль різниці зліва і справа в межах 50 2000
{mySerial.println ("від 50 до 2 м");
        digitalWrite(IN1, HIGH);  // Вліво
          delay(150);
          digitalWrite(IN1, LOW); // Повернуло
          digitalWrite(IN3, HIGH);  // Вперед
          delay(500);
          digitalWrite(IN3, LOW);  // Під'їхало

          digitalWrite(IN2, HIGH);  // Вправо
          delay(150);
          digitalWrite(IN2, LOW);  // Повернуло
          digitalWrite(IN3, HIGH);  // Вперед
          delay(200);
          digitalWrite(IN3, LOW);  // Під'їхало
}
if  ( abs(x - y) <= 50 ){
    mySerial.println ("Середина досягнута");
break;}
}

}}
else if (abs( x - y) > 2000){
  goto label;
  }}

if ( y > x )
      {
      if ((abs( x - y ) > 50) && (abs( x - y ) < 2000))
      {
      while ((abs ( x - y ) > 50) && ((abs ( x - y ) < 2000)))// Якщо відстань зліва більша від відстані справа
     { mySerial.println ("Справа більша");
if ((sensor.timeoutOccurred()) || (sensor2.timeoutOccurred())) {
       mySerial.println("Ти не пройдеш! Таймаут датчика");
       resetFunc(); //вызываем reset
      }
      
      else if ((!(sensor.timeoutOccurred()) || (!(sensor2.timeoutOccurred())))) {
        
time = millis();

if (((millis() - time) > 1000) && ((millis() - time) < 2000))
delay(1000);

if (((millis() - time) > 3000) && ((millis() - time) < 4000))
{
x = sensor.readRangeSingleMillimeters();    //присвоюються х
         mySerial.print(x);
      mySerial.println();
delay(1000);
}
if (((millis() - time) > 5000) && ((millis() - time) < 6000))
{
y = sensor2.readRangeSingleMillimeters();    //присвоюються y
mySerial.print(y);
mySerial.println();
delay(1000);
}
if (((millis() - time) > 7000) && ((millis() - time) < 8000))
delay(1000);
     /*   if ((abs( y - x) > 5000 ) && (abs(y - x) < 7000 ) )
{
          digitalWrite(IN2, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH);  
          delay(1000);
          digitalWrite(IN2, LOW);  
          digitalWrite(IN3, LOW);  

          digitalWrite(IN1, HIGH);  
          delay(1000);
          digitalWrite(IN3, HIGH);  
          delay(1000);
          digitalWrite(IN1, LOW);  
          digitalWrite(IN3, LOW);  
}
 if ((abs( y - x ) > 2000 ) && ( abs( y - x ) < 5000 ) )
{
          digitalWrite(IN2, HIGH);  //Вліво
          delay(200);
          digitalWrite(IN3, HIGH);  // Вперед
          delay(500);
           digitalWrite(IN2, LOW);  //Повернуло
          digitalWrite(IN3, LOW);  // Під'їхало

          digitalWrite(IN1, HIGH);  //Вправо
          delay(200);
          digitalWrite(IN3, HIGH);  // Вперед
          delay(700);
           digitalWrite(IN1, LOW);  //Повернуло
          digitalWrite(IN3, LOW);  // Під'їхало
}*/
 if ((abs( y - x ) > 50 ) && ( abs(y - x)  < 2000 ) )
{
          
          digitalWrite(IN2, HIGH);  //Вправо
          delay(150);
           digitalWrite(IN2, LOW);  //Повернуло
          digitalWrite(IN3, HIGH);  // Вперед
          delay(400);
          digitalWrite(IN3, LOW);  // Під'їхало

          digitalWrite(IN1, HIGH);  //Вліво
          delay(150);
            digitalWrite(IN2, LOW);  //Повернуло
          digitalWrite(IN3, HIGH);  // Вперед
          delay(200);
           digitalWrite(IN1, LOW);  //Повернуло
          digitalWrite(IN3, LOW);  // Під'їхало
}

}
if  ( abs (x - y) <= 50 ){
    mySerial.println ("Середина досягнута");
break;}
}}
else if (abs( x - y) > 2000){
  goto label;
  }}}

и вот что считывала програма

1134
623
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
00
01
02
03
04
addresses set
trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Поиск в файле VL53L0X.cpp :

if (checkTimeoutExpired())
    {
      did_timeout = true;
      return 65535;
    }

 

Bodia96
Offline
Зарегистрирован: 06.12.2018

понял, про таймаут писали, признаю я виноват

Bodia96
Offline
Зарегистрирован: 06.12.2018

Спасибо большое, хороший совет

Bodia96
Offline
Зарегистрирован: 06.12.2018

Проблема не в том, что приходит значение 65535, а в том, что оно приходит после сбоя регистра правого ( возможно иногда и левого) лазерного дальномера при автопоиске середины, я попробовал сделать паузы через millis, завтра скину финальный вариант, и если вам не в тягость, тыкните пальцем где я ошибся, там цикл проходит много раз, но упускаеться проверка значений из датчиков после первого цикла, спасибо

Bodia96
Offline
Зарегистрирован: 06.12.2018

Как вариант может в while поместить чтобы сторона начала движения определялась (слева на право к середине или наоборот)? И действия происходили по выравниванию, тогда на 1 while было бы меньше

Вот код з Milles помилка в частині Auto:

 

void(* resetFunc) (void) = 0;
#include <Servo.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <VL53L0X.h>

char incomingByte;  // входящие данные
SoftwareSerial mySerial(10, 11); // RX, TX
int IN1 = 5; //сірий
int IN2 = 4; //білий
int IN3  = 3; //жовтий
int IN4  = 2; //коричнивий

unsigned long time;
unsigned int x;
unsigned int y;
int Servopin = 9;
VL53L0X sensor;
VL53L0X sensor2;
Servo Servo1;
void setup()
{

  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);

  delay(500);
  Servo1.attach(Servopin);
  Serial.begin(9600);
  Servo1.write(120);
  sensor.setTimeout(500);
  sensor2.setTimeout(500);

  Wire.begin();
  mySerial.begin(9600);

  pinMode(6, INPUT);
  delay(150);
  mySerial.println("00");
  sensor.init(true);


  mySerial.println("01");
  delay(100);
  sensor.setAddress((uint8_t)22);
  mySerial.println("02");


  pinMode(7, INPUT);
  delay(150);
  sensor2.init(true);
  mySerial.println("03");
  delay(100);
  sensor2.setAddress((uint8_t)25);
  mySerial.println("04");
  mySerial.println("addresses set");

  sensor.setSignalRateLimit(0.1);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
  sensor.setMeasurementTimingBudget(200000);
  sensor2.setSignalRateLimit(0.1);
  sensor2.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor2.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
  sensor2.setMeasurementTimingBudget(200000);
}

void loop()
{
label:
  if (mySerial.available() > 0) {  //если пришли данные
    incomingByte = mySerial.read(); // считываем байт
    if (incomingByte == '9') {//Scan
      mySerial.println ("I2C scanner. Scanning ...");
      byte count = 0;


      for (byte i = 1; i < 200; i++)
      {

        Wire.beginTransmission (i);
        if (Wire.endTransmission () == 0)
        {
          mySerial.print ("Found address: ");
          mySerial.print (i, DEC);
          mySerial.print (" (0x");
          mySerial.print (i, HEX);
          mySerial.println (")");
          count++;
          delay (1);  // maybe unneeded?
        } // end of good response
      } // end of for loop
      mySerial.println ("Done.");
      mySerial.print ("Found ");
      mySerial.print (count, DEC);
      mySerial.println (" device(s).");

      delay(1000);
    }
    if (incomingByte == '1') {
      //W
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);
    }

    if (incomingByte == '2') {
      //S
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);
    }
    if (incomingByte == '3') {
      //A
      digitalWrite(IN2, LOW);
      digitalWrite(IN1, HIGH);
      delay(100);
      digitalWrite(IN1, LOW);

    }
    if (incomingByte == '-') {
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW );
    }
    if (incomingByte == '4') {
      //D
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW);

    }
    if (incomingByte == '!') {
      digitalWrite(IN2, LOW);
      digitalWrite(IN1, HIGH);
      delay(150);
      digitalWrite(IN1, LOW);
    }
    if (incomingByte == '0') {
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
      Servo1.write(120);
    }
    if (incomingByte == '5') {
      //R_U
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, HIGH);
    }
    if (incomingByte == 'x') {
      digitalWrite(IN2, LOW);
      digitalWrite(IN1, HIGH);
      delay(150);
      digitalWrite(IN1, LOW);
      digitalWrite(IN3, LOW);
    }
    if (incomingByte == '6')  {
      //L_U
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      delay(150);
      digitalWrite(IN1, LOW);
      digitalWrite(IN3, HIGH);

    }
    if (incomingByte == '/') {
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW);
    }
    if (incomingByte == '7') {
      //R_D
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW);
      digitalWrite(IN4, HIGH);
    }
    if (incomingByte == '$') {
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      delay(150);
      digitalWrite(IN1, LOW);
      digitalWrite(IN4, LOW);
    }
    if (incomingByte == '8') {
      //L_D
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      delay(150);
      digitalWrite(IN1, LOW);
      digitalWrite(IN4, HIGH);
    }
    if (incomingByte == '@') {
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW);
      digitalWrite(IN4, LOW);
    }
    if (incomingByte == '+') //зчитування відстані з правого датчика з умовою
    { //Range
      x = sensor.readRangeSingleMillimeters();
      mySerial.print(x);
      if (sensor.timeoutOccurred()) {
        mySerial.print(" TIMEOUT");

      }
      mySerial.println();

      y = sensor2.readRangeSingleMillimeters();
      mySerial.print(y);
      if (sensor2.timeoutOccurred()) {
        mySerial.print(" TIMEOUT");

      }
      mySerial.println();
    }
    if (incomingByte == '#') //опитується символ при натисканні кнопки чи написанні символа
    { //Auto

      x = sensor.readRangeSingleMillimeters();    //присвоюються х
      mySerial.print(x);

      mySerial.println();

      delay(2000);
      y = sensor2.readRangeSingleMillimeters();    //присвоюються y
      mySerial.print(y);

      mySerial.println();
      delay(2000);
      if ( x > y )
      {
        if ((abs( x - y ) > 50) && (abs( x - y ) < 2000))
        {
          while ((abs ( x - y ) > 50) && ((abs ( x - y ) < 2000)))// Якщо відстань зліва більша від відстані справа
          { mySerial.println ("Зліва більша");
            time = millis();
            delay(1000);
            if (((millis() - time) > 1000) && ((millis() - time) < 2000))
              delay(1000);

            if (((millis() - time) > 2000) && ((millis() - time) < 3000))
            {
              x = sensor.readRangeSingleMillimeters();    //присвоюються х
              mySerial.print(x);
              mySerial.println();
              delay(1000);
            }

            if (((millis() - time) > 4000) && ((millis() - time) < 5000))
            {
              y = sensor2.readRangeSingleMillimeters();    //присвоюються y
              mySerial.print(y);
              mySerial.println();
              delay(1000);
            }

            if (((millis() - time) > 5000) && ((millis() - time) < 6000))
              delay(1000);

            if ((sensor.timeoutOccurred()) || (sensor2.timeoutOccurred())) {
              mySerial.println("Ти не пройдеш! Таймаут датчика");
              resetFunc(); //вызываем reset
            }

            else if ((!sensor.timeoutOccurred()) || (!sensor2.timeoutOccurred())) {




              /*     if ((abs( x - y ) > 5000 ) && (abs( x - y ) < 7000 ) )    //якщо модуль різниці зліва і справа в межах 5000 7000
                { mySerial.println ("від 7 до 5 м");
                     digitalWrite(IN1, HIGH);
                      delay(1000);
                     digitalWrite(IN3, HIGH);
                     delay(1000);
                     digitalWrite(IN1, LOW);
                     digitalWrite(IN3, LOW);

                     digitalWrite(IN2, HIGH);
                     delay(1000);
                     digitalWrite(IN3, HIGH);
                     delay(1000);
                      digitalWrite(IN2, LOW);
                     digitalWrite(IN3, LOW);
                }
                if ((abs( x - y ) > 2000 ) && (abs( x - y ) < 5000 ) )    //якщо модуль різниці зліва і справа в межах 2000 5000
                {mySerial.println ("від 5 до 2 м");

                     digitalWrite(IN1, HIGH);
                     delay(1000);
                     digitalWrite(IN3, HIGH);
                     delay(500);
                      digitalWrite(IN1, LOW);
                     digitalWrite(IN3, LOW);

                     digitalWrite(IN2, HIGH);
                     delay(1000);
                     digitalWrite(IN3, HIGH);
                     delay(700);
                     digitalWrite(IN2, LOW);
                     digitalWrite(IN3, LOW);
                }*/
              if ((( x - y ) > 50) && (( x - y ) < 2000))     //якщо модуль різниці зліва і справа в межах 50 2000
              { mySerial.println ("від 50 до 2 м");
                digitalWrite(IN1, HIGH);  // Вліво
                delay(100);
                digitalWrite(IN1, LOW); // Повернуло
                digitalWrite(IN3, HIGH);  // Вперед
                delay(500);
                digitalWrite(IN3, LOW);  // Під'їхало

                digitalWrite(IN2, HIGH);  // Вправо
                delay(100);
                digitalWrite(IN2, LOW);  // Повернуло
                digitalWrite(IN3, HIGH);  // Вперед
                delay(200);
                digitalWrite(IN3, LOW);  // Під'їхало
              }
              if  ( abs(x - y) <= 50 ) {
                mySerial.println ("Середина досягнута");
                break;
              }
            }

            else if (abs( x - y) > 2000) {
              goto label;
            }
          }
        }
      }

      if ( y > x )
      {
        if ((abs( x - y ) > 50) && (abs( x - y ) < 2000))
        {
          while ((abs ( x - y ) > 50) && ((abs ( x - y ) < 2000)))// Якщо відстань зліва більша від відстані справа
          { mySerial.println ("Справа більша");
            time = millis();
            delay(1000);
            if (((millis() - time) > 1000) && ((millis() - time) < 2000))
              delay(1000);

            if (((millis() - time) > 2000) && ((millis() - time) < 3000))
            {
              x = sensor.readRangeSingleMillimeters();    //присвоюються х
              mySerial.print(x);
              mySerial.println();
              delay(1000);
            }
            if (((millis() - time) > 3000) && ((millis() - time) < 4000))
            {
              y = sensor2.readRangeSingleMillimeters();    //присвоюються y
              mySerial.print(y);
              mySerial.println();
              delay(1000);
            }
            if (((millis() - time) > 4000) && ((millis() - time) < 5000))
              delay(1000);
            if ((sensor.timeoutOccurred()) || (sensor2.timeoutOccurred())) {
              mySerial.println("Ти не пройдеш! Таймаут датчика");
              resetFunc(); //вызываем reset
            }

            else if ((!sensor.timeoutOccurred()) || (!sensor2.timeoutOccurred())) {


              /*   if ((abs( y - x) > 5000 ) && (abs(y - x) < 7000 ) )
                {
                   digitalWrite(IN2, HIGH);
                   delay(1000);
                   digitalWrite(IN3, HIGH);
                   delay(1000);
                   digitalWrite(IN2, LOW);
                   digitalWrite(IN3, LOW);

                   digitalWrite(IN1, HIGH);
                   delay(1000);
                   digitalWrite(IN3, HIGH);
                   delay(1000);
                   digitalWrite(IN1, LOW);
                   digitalWrite(IN3, LOW);
                }
                if ((abs( y - x ) > 2000 ) && ( abs( y - x ) < 5000 ) )
                {
                   digitalWrite(IN2, HIGH);  //Вліво
                   delay(200);
                   digitalWrite(IN3, HIGH);  // Вперед
                   delay(500);
                    digitalWrite(IN2, LOW);  //Повернуло
                   digitalWrite(IN3, LOW);  // Під'їхало

                   digitalWrite(IN1, HIGH);  //Вправо
                   delay(200);
                   digitalWrite(IN3, HIGH);  // Вперед
                   delay(700);
                    digitalWrite(IN1, LOW);  //Повернуло
                   digitalWrite(IN3, LOW);  // Під'їхало
                }*/
              if ((abs( y - x ) > 50 ) && ( abs(y - x)  < 2000 ) )
              {
                mySerial.println ("від 50 до 2 м");
                digitalWrite(IN2, HIGH);  //Вправо
                delay(100);
                digitalWrite(IN2, LOW);  //Повернуло
                digitalWrite(IN3, HIGH);  // Вперед
                delay(400);
                digitalWrite(IN3, LOW);  // Під'їхало

                digitalWrite(IN1, HIGH);  //Вліво
                delay(100);
                digitalWrite(IN2, LOW);  //Повернуло
                digitalWrite(IN3, HIGH);  // Вперед
                delay(200);
                digitalWrite(IN1, LOW);  //Повернуло
                digitalWrite(IN3, LOW);  // Під'їхало
              }

            }
            if  ( abs (x - y) <= 50 ) {
              mySerial.println ("Середина досягнута");
              break;
            }
          }
        }
        else if (abs( x - y) > 2000) {
          goto label;
        }
      }
    }
    if (incomingByte == 't') {

      Servo1.write(110);

    }
    if (incomingByte == 'y') {

      Servo1.write(100);

    }
  }
}

Вот как действовала програма:

00
01
02
03
04
addresses set
t
t
t
I2C scanner. Scanning ...
Found address: 22 (0x16)
Found address: 41 (0x29)
Found address: 150 (0x96)
Found address: 169 (0xA9)
Done.
Found 4 device(s).
I2C scanner. Scanning ...
Found address: 22 (0x16)
Found address: 41 (0x29)
Found address: 150 (0x96)
Found address: 169 (0xA9)
Done.
Found 4 device(s).
00
01
02
03
04
addresses set
I2C scanner. Scanning ...
Found address: 22 (0x16)
Found address: 25 (0x19)
Found address: 150 (0x96)
Found address: 153 (0x99)
Done.
Found 4 device(s).
782
565
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
869
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
від 50 до 2 м
Зліва більша
trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Bodia96 пишет:
Проблема не в том, что приходит значение 65535, а в том, что оно приходит после сбоя регистра правого ( возможно иногда и левого) лазерного дальномера при автопоиске середины, я попробовал сделать паузы через millis, завтра скину финальный вариант, и если вам не в тягость, тыкните пальцем где я ошибся, там цикл проходит много раз, но упускаеться проверка значений из датчиков после первого цикла, спасибо

Я не сильно уверен в том что можно два  инфракрасных , ультразвуковых  или лазерных датчика
одновременно направить в одну точку
и потом успешно, без взаимного влияния, ловить отражённый сигнал.

Bodia96
Offline
Зарегистрирован: 06.12.2018

trembo пишет:

Bodia96 пишет:
Проблема не в том, что приходит значение 65535, а в том, что оно приходит после сбоя регистра правого ( возможно иногда и левого) лазерного дальномера при автопоиске середины, я попробовал сделать паузы через millis, завтра скину финальный вариант, и если вам не в тягость, тыкните пальцем где я ошибся, там цикл проходит много раз, но упускаеться проверка значений из датчиков после первого цикла, спасибо

Я не сильно уверен в том что можно два  инфракрасных , ультразвуковых  или лазерных датчика
одновременно направить в одну точку
и потом успешно, без взаимного влияния, ловить отражённый сигнал.

Спасибо за ваш комментарий, у меня два лазерных дальномера "смотрят" в разные стороны, тоесть справа и слева радиоуправляемой машинки, они должны измерить два значения и проанализировал где больше, машинка подъезжает в нужную сторону чтобы ближе к середине

Bodia96
Offline
Зарегистрирован: 06.12.2018

Я, дурак, придумал себе такую тему на магистерскую и теперь "сушу" мозги себе и вам

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, это Вы напрасно сказали. Большинство здесь присутствующих нерадивым студентам не помогают. Думаю, сейчас Вы быстро заметите отток желающих помочь :)

Bodia96
Offline
Зарегистрирован: 06.12.2018

ЕвгенийП пишет:

Ну, это Вы напрасно сказали. Большинство здесь присутствующих нерадивым студентам не помогают. Думаю, сейчас Вы быстро заметите отток желающих помочь :)

Я сказал все как есть на самом деле, зачем мне лгать кому то, практика работы с ардуино у меня всего 1.5 года

Bodia96
Offline
Зарегистрирован: 06.12.2018

Попробую delay что между считаваниями заменить на smart delay, может поможет както https://habr.com/post/319184/

Bodia96
Offline
Зарегистрирован: 06.12.2018

и так, проблема точно в delay() он точно сбивает правый регистр датчика  25 (0х19) на 41 (0х29) это стандартный, я пробовал менять на 41 правый, не помогло, 65535 так и пришли, програма делает 1 цикл, а при втором, во время считывания правого датчика "y" - 65535, а вопрос следующий: при серередине у меня через goto label должно выкидывать из программы Auto, а получаеться что при выкидывании я получаю доступ к другим клавишам (чего не было при роботе цикла), но цикл закручиваеться на "Середина досягнута", посоветуйте как я могу это исправить, спасибо

void(* resetFunc) (void) = 0;
#include <SmartDelay.h>
#include <Servo.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <VL53L0X.h>

char incomingByte;  // входящие данные
SoftwareSerial mySerial(10, 11); // RX, TX
byte state = 0;
int IN1 = 5; //сірий
int IN2 = 4; //білий
int IN3  = 3; //жовтий
int IN4  = 2; //коричнивий

unsigned long time;
unsigned int x;
unsigned int y;
int Servopin = 9;
VL53L0X sensor;
VL53L0X sensor2;
Servo Servo1;
SmartDelay d((2000000UL));
void setup()
{

  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);

  delay(500);
  Servo1.attach(Servopin);
  Serial.begin(9600);
  Servo1.write(120);
  sensor.setTimeout(500);
  sensor2.setTimeout(500);

  Wire.begin();
  mySerial.begin(9600);

  pinMode(6, INPUT);
  delay(150);
  mySerial.println("00");
  sensor.init(true);


  mySerial.println("01");
  delay(100);
  sensor.setAddress((uint8_t)22);
  mySerial.println("02");


  pinMode(7, INPUT);
  delay(150);
  sensor2.init(true);
  mySerial.println("03");
  delay(100);
  sensor2.setAddress((uint8_t)41);
  mySerial.println("04");
  mySerial.println("addresses set");

  sensor.setSignalRateLimit(0.1);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
  sensor.setMeasurementTimingBudget(200000);
  sensor2.setSignalRateLimit(0.1);
  sensor2.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor2.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
  sensor2.setMeasurementTimingBudget(200000);
}

void loop()
{label:
  if (mySerial.available() > 0) {  //если пришли данные
    incomingByte = mySerial.read(); // считываем байт

    if (incomingByte == '9') {//Scan
      mySerial.println ("I2C scanner. Scanning ...");
      byte count = 0;


      for (byte i = 1; i < 50; i++)
      {

        Wire.beginTransmission (i);
        if (Wire.endTransmission () == 0)
        {
          mySerial.print ("Found address: ");
          mySerial.print (i, DEC);
          mySerial.print (" (0x");
          mySerial.print (i, HEX);
          mySerial.println (")");
          count++;
          delay (1);  // maybe unneeded?
        } // end of good response
      } // end of for loop
      mySerial.println ("Done.");
      mySerial.print ("Found ");
      mySerial.print (count, DEC);
      mySerial.println (" device(s).");

      delay(1000);
    }
    if (incomingByte == '1') {
      //W
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);
    }

    if (incomingByte == '2') {
      //S
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);
    }
    if (incomingByte == '3') {
      //A
      digitalWrite(IN2, LOW);
      digitalWrite(IN1, HIGH);
      delay(100);
      digitalWrite(IN1, LOW);

    }
    if (incomingByte == '-') {
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW );
    }
    if (incomingByte == '4') {
      //D
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW);

    }
    if (incomingByte == '!') {
      digitalWrite(IN2, LOW);
      digitalWrite(IN1, HIGH);
      delay(150);
      digitalWrite(IN1, LOW);
    }
    if (incomingByte == '0') {
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
      Servo1.write(120);
    }
    if (incomingByte == '5') {
      //R_U
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, HIGH);
    }
    if (incomingByte == 'x') {
      digitalWrite(IN2, LOW);
      digitalWrite(IN1, HIGH);
      delay(150);
      digitalWrite(IN1, LOW);
      digitalWrite(IN3, LOW);
    }
    if (incomingByte == '6')  {
      //L_U
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      delay(150);
      digitalWrite(IN1, LOW);
      digitalWrite(IN3, HIGH);

    }
    if (incomingByte == '/') {
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW);
      digitalWrite(IN3, LOW);
    }
    if (incomingByte == '7') {
      //R_D
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW);
      digitalWrite(IN4, HIGH);
    }
    if (incomingByte == '$') {
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      delay(150);
      digitalWrite(IN1, LOW);
      digitalWrite(IN4, LOW);
    }
    if (incomingByte == '8') {
      //L_D
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      delay(150);
      digitalWrite(IN1, LOW);
      digitalWrite(IN4, HIGH);
    }
    if (incomingByte == '@') {
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      delay(150);
      digitalWrite(IN2, LOW);
      digitalWrite(IN4, LOW);
    }
    if (incomingByte == '+') //зчитування відстані з правого датчика з умовою
    { //Range
      x = sensor.readRangeSingleMillimeters();
      mySerial.print(x);
      if (sensor.timeoutOccurred()) {
        mySerial.print(" TIMEOUT");
      }
      mySerial.println();

      y = sensor2.readRangeSingleMillimeters();
      mySerial.print(y);
      if (sensor2.timeoutOccurred()) {
        mySerial.print(" TIMEOUT");

      }
      mySerial.println();
    }
    if (incomingByte == 'r') //зчитування відстані з правого датчика з умовою
    { //reset
      resetFunc();
      }
    if (incomingByte == '#') //опитується символ при натисканні кнопки чи написанні символа
    { //Auto

      x = sensor.readRangeSingleMillimeters();    //присвоюються х
      mySerial.print(x);
      mySerial.println();

      y = sensor2.readRangeSingleMillimeters();    //присвоюються y
      mySerial.print(y);
      mySerial.println();


      while (((abs( x - y )) > 0) && ((abs( x - y )) < 2000))
      {
        if (( x - y) < 2000)  // если слева (x) больше за y на остаток
        { mySerial.println ("Зліва більша");
delay(2000);
          switch (state) {

            case 0:      //Пауза перед первым лазерным дальномером
              if (d.Now())
              { mySerial.println("Перед 1");
                state = 1;
              }
              break;

            case 1:      //Считываеться левый дальномер
              if (d.Now()) {
                mySerial.println("x");
                x = sensor.readRangeSingleMillimeters();    //присвоюються х
                mySerial.print(x);
                mySerial.println();
                state = 2;
              }
              break;

            case 2:      //Пауза перед вторым лазерным дальномером
              if (d.Now())
              {mySerial.println("Перед 2");
                state = 3;
              }
              break;

            case 3:      //Считываеться правый дальномер
              if (d.Now()) {
                mySerial.println("y");
                y = sensor2.readRangeSingleMillimeters();    //присвоюються х
                mySerial.print(y);
                mySerial.println();
                state = 4;
              }
              break;

            case 4:      //Пауза после второго дальномера
              if (d.Now())
              {mySerial.println("Після 2");
                state = 5;
              }
              break;

            case 5:      //если в правом или левом дальномере 65535 - перезагрузка
              if ((sensor.timeoutOccurred()) || (sensor2.timeoutOccurred())) {
                mySerial.println("Ти не пройдеш! Таймаут датчика");
                resetFunc(); //вызываем reset
              }
              state = 6;
              break;
              
              case 6: 
              if ((!sensor.timeoutOccurred()) && (!sensor2.timeoutOccurred()))   //если и правый и левый Не 65535, то начать вдигаться влево к центру
              {mySerial.println("Пройшло");
 
                if (((abs( x - y )) > 50) && ((abs( x - y )) < 2000))            //якщо модуль різниці зліва і справа в межах 50 2000
                { mySerial.println ("від 50 до 2 м");
                  digitalWrite(IN1, HIGH);  // Вліво
                  delay(130);
                  digitalWrite(IN1, LOW); // Повернуло
                  digitalWrite(IN3, HIGH);  // Вперед
                  delay(500);
                  digitalWrite(IN3, LOW);  // Під'їхало

                  digitalWrite(IN2, HIGH);  // Вправо
                  delay(150);
                  digitalWrite(IN2, LOW);  // Повернуло
                  digitalWrite(IN3, HIGH);  // Вперед
                  delay(200);
                  digitalWrite(IN3, LOW);  // Під'їхало
                }
                 else if  ((abs(x - y)) <= 50 ) {
                  mySerial.println ("Середина досягнута");
                   goto label;
                }
                state = 0;
                break;
                }
                
              }
             
          }

        if (( y - x ) < 2000)  // если справа (y) больше за x на остаток
        { mySerial.println ("Справа більша");
delay(2000);
          switch (state) {

            case 0:      //Пауза перед первым лазерным дальномером
              if (d.Now())
              { mySerial.println("Перед 1");
                state = 1;
              }
              break;

            case 1:      //Считываеться левый дальномер
              if (d.Now()) {
                mySerial.println("x");
                x = sensor.readRangeSingleMillimeters();    //присвоюються х
                mySerial.print(x);
                mySerial.println();
                state = 2;
              }
              break;

            case 2:      //Пауза перед вторым лазерным дальномером
              if (d.Now())
              {mySerial.println("Перед 2");
                state = 3;
              }
              break;

            case 3:      //Считываеться правый дальномер
              if (d.Now()) {
                mySerial.println("y");
                y = sensor2.readRangeSingleMillimeters();    //присвоюються х
                mySerial.print(y);
                mySerial.println();
                state = 4;
              }
              break;

            case 4:      //Пауза после второго дальномера
              if (d.Now())
              {mySerial.println("Після 2");
                state = 5;
              }
              break;


              case 5:      //если в правом или левом дальномере 65535 - перезагрузка
              if ((sensor.timeoutOccurred()) || (sensor2.timeoutOccurred())) {
                mySerial.println("Ти не пройдеш! Таймаут датчика");
                resetFunc(); //вызываем reset
              }
              state = 6;
              break;
              
              case 6: 
              if ((!sensor.timeoutOccurred()) && (!sensor2.timeoutOccurred()))   //если и правый и левый Не 65535, то начать вдигаться вправо к центру
              {mySerial.println("Пройшло");
                if (((abs( x - y)) > 50) && ((abs( x - y)) < 2000))
                {
                mySerial.println ("від 50 до 2 м");
                digitalWrite(IN2, HIGH);  //Вправо
                delay(150);
                digitalWrite(IN2, LOW);  //Повернуло
                digitalWrite(IN3, HIGH);  // Вперед
                delay(400);
                digitalWrite(IN3, LOW);  // Під'їхало

                digitalWrite(IN1, HIGH);  //Вліво
                delay(100);
                digitalWrite(IN1, LOW);  //Повернуло
                digitalWrite(IN3, HIGH);  // Вперед
                delay(200);
                digitalWrite(IN3, LOW);  // Під'їхало
               
                }
              else if  ( abs (x - y) <= 50 ) {
                mySerial.println ("Середина досягнута");
                goto label;
              }
              state = 0;
              break;
              } 
          }
        }
      }
    }
    if (incomingByte == 't') {

      Servo1.write(110);

    }
    if (incomingByte == 'y') {

      Servo1.write(100);

    }
  }
}

А вот результаты роботы програмы

00
01
02
03
04
addresses set
417
1004
Справа більша
Перед 1
Справа більша
x
419
Справа більша
Перед 2
Справа більша
y
1003
Справа більша
Після 2
Справа більша
Справа більша
Пройшло
від 50 до 2 м
Справа більша
Перед 1
Справа більша
x
526
Справа більша
Перед 2
Справа більша
y
65535
Зліва більша
Зліва більша
Ти не пройдеш! Таймаут датчика
00
01
02
03
04
addresses set
t
t
I2C scanner. Scanning ...
Found address: 22 (0x16)
Found address: 25 (0x19)
Done.
Found 2 device(s).
436
276
539
924
547
8190
546
657
547
714
548
526
Зліва більша
Перед 1
Зліва більша
x
546
Зліва більша
Перед 2
Зліва більша
y
533
Зліва більша
Після 2
Зліва більша
Зліва більша
Пройшло
Середина досягнута
550
535
Зліва більша
Пройшло
Середина досягнута
547
532
Зліва більша
Пройшло
Середина досягнута
548
533
 
I2C scanner. Scanning ...
Found address: 22 (0x16)
Found address: 41 (0x29)
Done.
476
517
Справа більша
Перед 1
Справа більша
x
479
Справа більша
Перед 2
Справа більша
y
517
Справа більша
Після 2
Справа більша
Справа більша
Пройшло
Середина досягнута
479
659
Справа більша
Пройшло
від 50 до 2 м
Справа більша
Перед 1
Справа більша
x
486
Справа більша
Перед 2
Справа більша
y
65535
Зліва більша
Після 2
Зліва більша
Ти не пройдеш! Таймаут датчика
b707
Offline
Зарегистрирован: 26.05.2017

Bodia96 пишет:

Я сказал все как есть на самом деле, зачем мне лгать кому то, практика работы с ардуино у меня всего 1.5 года

1.5 года? - а код пишете так, словно в ардуине 1.5 месяца

Bodia96
Offline
Зарегистрирован: 06.12.2018

b707 пишет:

Bodia96 пишет:

Я сказал все как есть на самом деле, зачем мне лгать кому то, практика работы с ардуино у меня всего 1.5 года

1.5 года? - а код пишете так, словно в ардуине 1.5 месяца

Соглашусь с вами, но на ошибках учатся, покажите мне пожалуйста где я написал коряво, или где можно было написать пограмотнее