#1 2018-11-30 21:16:17

Бодя96
Учасник
Зареєстрований: 2018-10-28
Повідомлень: 24

Помилкове значення 65535 при зчитуванні з інфрачервоного датчика

Доброго вечора всім панове, при зчитуванні з інфрачервоного датчика іноді щось йому заходить і замість нормальних показань приходять значення 65535, що це за значення і звідки бралось не знаю unsigned int не використовував.

    Датчик цей https://arduino.ua/prod2467-lazernii-datchik-rasstoyaniya-vl53l0x-v2

    В програмі я прирівнюю значення показів до x та y чи при значенні 65535 я можу зробити reset пристрою приміром через watch dog? Чи якось по-іншому? Бо скидання відбувається лише після натискання кнопки, в мене, переривання ардуіно уно р3, поки не скинеш далі ці 65535 приходять

IN це піни на які подаю сигнали через драйвер двигунів l298n, суть проекта: при натисканні кнопки чи отримання символу # машинка сама центрується на дорозі

    І взагалі, якщо вважаєте що цикл міг би бути написаний краще будь-ласка скажіть як я міг би покращити, ось частини програми
перевіряв цикли на працездатність в межах 50 - 2000

#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; //коричнивий
     
int x;
int y;
int Servopin = 9;
VL53L0X sensor;
VL53L0X sensor2;   //2 датчика
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);     //змінюються адреси регістрів 2 інфрачерв датчиків
  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);    //принцип роботи 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 == '#') //опитується символ при натисканні кнопки чи написанні символа
    {//Auto
       mySerial.print(sensor.readRangeSingleMillimeters());   //передаються значення лівого інфрачерв датчика по блютуза на тел
      x = sensor.readRangeSingleMillimeters();    //присвоюються х

      mySerial.println();
      
      mySerial.print(sensor2.readRangeSingleMillimeters());
      y = sensor2.readRangeSingleMillimeters();

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

      mySerial.println();
      
      mySerial.print(sensor2.readRangeSingleMillimeters());
      y = sensor2.readRangeSingleMillimeters();

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

          digitalWrite(IN2, HIGH);  //вправо
          delay(2000);
          digitalWrite(IN3, HIGH);  // Вперед
          delay(800);
           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 ("Справа більша");
         mySerial.print(sensor.readRangeSingleMillimeters());
      x = sensor.readRangeSingleMillimeters();
     

      mySerial.println();
      
      mySerial.print(sensor2.readRangeSingleMillimeters());
      y = sensor2.readRangeSingleMillimeters();
     
      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;}

if (mySerial.available() > 0) {  //если пришли данные
    incomingByte = mySerial.read();
 if(incomingByte == '0') {
    break;
 } }
}    //mySer.println("справа б")
}    //if (y > x)
}    //Auto
}    //if mySer. avail.>0
}    //void loop

Неактивний

#2 2018-12-02 21:32:01

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Помилкове значення 65535 при зчитуванні з інфрачервоного датчика

Ничего, если я по-русски?

Функция readRangeSingleMillimeters возвращает 65535 в случае истечения таймаута, т.е. у тебя просто истекает таймаут.

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

Вот в этих строках

mySerial.print(sensor.readRangeSingleMillimeters());   //передаються значення лівого інфрачерв датчика по блютуза на тел
x = sensor.readRangeSingleMillimeters();    //присвоюються х

Ты читаешь дважды подряд вообще без продыху,к тому же во время работы сериала.

Попробуй так (и ниже тоже, ты там со вторым датчиком тоже самое делаешь), т.е. читаем один раз

x = sensor.readRangeSingleMillimeters();    //присвоюються х
mySerial.print(x);   //передаються значення лівого інфрачерв датчика по блютуза на тел

Должно помочь.

Не поможет, публикуй получившийся код, будем дальше думать.

Остання редакція Kaka (2018-12-02 21:34:23)

Неактивний

#3 2018-12-02 23:29:50

Бодя96
Учасник
Зареєстрований: 2018-10-28
Повідомлень: 24

Re: Помилкове значення 65535 при зчитуванні з інфрачервоного датчика

Превелике тобі спасибі, це дійсно дуже груба помилка з мого боку, я навіть і не замітив, завтра спробую, скажу про результати

Неактивний

#4 2018-12-03 15:47:02

Бодя96
Учасник
Зареєстрований: 2018-10-28
Повідомлень: 24

Re: Помилкове значення 65535 при зчитуванні з інфрачервоного датчика

На жаль помилка так і не була вирішеною, так само трохи вимірює нормально а потім 65535 валить, але це регістри збиваються певне причому правий може 25 адреса ще чимось використовується? В мене в програмі результат натискання кнопок зберігає в файл, він іде знизу

3
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  //це окрема кнопка в мене для визначення відстані, значить обидві адреси регістру зараз в порядку
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

Неактивний

#5 2018-12-06 19:47:41

Бодя96
Учасник
Зареєстрований: 2018-10-28
Повідомлень: 24

Re: Помилкове значення 65535 при зчитуванні з інфрачервоного датчика

В мене в коді ще є перевірка підключених i2c пристроїв, адреси їх регістрів, там цикл був до 60 і бачило 2 пристрої, збільшив до 200 і вже 4, під'єднано тільки 2 пристрої на спеціальні слоти в платі розширення, на А4, А5 нічого не під'єднували
вот код в ардуіно

  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);
    }

а тут з збереженого файла

I2C scanner. Scanning ...
Found address: 22 (0x16)
Found address: 25 (0x19)
Found address: 150 (0x96)
Found address: 153 (0x99)
Done.
Found 4 device(s).

Неактивний

#6 2018-12-08 16:41:54

Бодя96
Учасник
Зареєстрований: 2018-10-28
Повідомлень: 24

Re: Помилкове значення 65535 при зчитуванні з інфрачервоного датчика

Ну вот код який получився на тепер:

#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(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() 
{ 
  
  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(150);
    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();
      
       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();    //присвоюються х
      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(150);
          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 ("Середина досягнута");
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);  // Під'їхало
}*/
 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;}
}
} 
}
if(incomingByte == 't') {
       digitalWrite(IN3, HIGH);  
       digitalWrite(IN4, LOW);   
       Servo1.write(60);
       delay(1500);
       Servo1.write(120);
       digitalWrite(IN3, LOW);  
    }
    
}}
 
 

Остання редакція Бодя96 (2018-12-08 16:53:28)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму