Ви не увійшли.
Сторінки 1
Всім доброго вечора, пробую зробити паузи через 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 ("Зліва більша");
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;
}}}
те як працювала програма нижче:
1156
204
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
Ну вот код який получився на тепер:
#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);
}
}}
В мене в коді ще є перевірка підключених 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).
На жаль помилка так і не була вирішеною, так само трохи вимірює нормально а потім 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
Превелике тобі спасибі, це дійсно дуже груба помилка з мого боку, я навіть і не замітив, завтра спробую, скажу про результати
Доброго вечора всім панове, при зчитуванні з інфрачервоного датчика іноді щось йому заходить і замість нормальних показань приходять значення 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
Всім дякую, все працює
Доброго вечора, маю машинку на радіоуправлінні, добавив замість її плати Ардуіно R3, 2 мотори+драйвер для них l298n для передньої і задньої осі і ще кілька датчиків (USB модуль, дальноміри). Створив додаток, машинка їздить, але при надсиланні цифри повороту вона повертає, але не повертається в початкове положення.
Підскажіть як зробити,щоб під час відпускання кнопки повороту вона поверталася в початкове положення
пробував ставити на аналогові analogWrite(IN1, 255); analogWrite(IN2, 0); не повертає взагалі
пробував if(incomingByte == '3') {digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); delay(1000); digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); }, це поворот в іншу сторону , а не на середину. Не знаю, що робити
#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; //задня вісь
void setup()
{
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Serial.begin(9600);
mySerial.begin(9600);
}
void loop()
{
if (mySerial.available() > 0) { //если пришли данные
incomingByte = mySerial.read(); // считываем байт
if(incomingByte == '1') {
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
if(incomingByte == '2') {
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
if(incomingByte == '3') {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
}
if(incomingByte == '4') {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
}
if(incomingByte == '0') {
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}}
Привіт, там ці бібліотеки зчитуються просто я зробив дурню і не скинув папку з всіма бібліотеками тому й помилка в VL53L0X зараз скину посилання https://drive.google.com/open?id=10kRBt3tkmFXO1bOK7RvC_-tbxvJnIiiD папка examples\Final\Final.ino
там є 1) закриває if (incomingByte == '0')
2) закриває if (mySerial.available() > 0)
а void loop() закривається пізніше, я натиснув ctrl+t і помилка висвічується вже перед 2) закриваючою дужкою
expected '}' at end of input в void loop до if(incomingByte == '0') закриваючої його (if) фігурної скобки
#include <Servo.h>
#include <SoftwareSerial.h>
byte incomingByte; // входящие данные
SoftwareSerial mySerial(11, 10); // RX, TX
#include <Wire.h>
#include <VL53L0X.h>
VL53L0X sensor;
VL53L0X sensor2;
int IN1 = 5;
int IN2 = 4;
int IN3 = 3;
int IN4 = 2;
int Servopin = 8;
Servo Servo1;
#define Car_Joystick
//#define LONG_RANGE
void setup()
{
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
Servo1.attach(Servopin);
Serial.begin(9600);
Servo1.write(60);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("Hi Max!");
mySerial.begin(9600);
mySerial.println("Hello, Bogdan");
#if defined LONG_RANGE
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
delay(500);
Wire.begin();
Serial.begin (9600);
pinMode(6, INPUT);
delay(150);
mySerial.println("00");
sensor.init(true);
mySerial.println("01");
delay(100);
sensor.setAddress((uint8_t)22);
Serial.println("02");
pinMode(7, INPUT);
delay(150);
sensor2.init(true);
mySerial.println("03");
delay(100);
sensor2.setAddress((uint8_t)25);
mySerial.println("04");
Serial.println("addresses set");
sensor.setSignalRateLimit(0.1);
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
sensor2.setSignalRateLimit(0.1);
sensor2.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
sensor2.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif
}
void loop()
{
#if defined Car_Joystick
if (mySerial.available() > 0) { //если пришли данные
incomingByte = mySerial.read(); // считываем байт
if(incomingByte == '1') {
digitalWrite(IN1, HIGH); // Задаем направление вращения
digitalWrite(IN2, LOW); // Задаем скорость вращения
Servo1.write(60);
mySerial.println("Go forward");
}
if(incomingByte == '2') {
digitalWrite(IN1, LOW); // если 0, то включаем LED
digitalWrite(IN2, HIGH); // Задаем скорость вращения
Servo1.write(60);
mySerial.println("Go back");
}
if(incomingByte == '3') {
digitalWrite(IN3, HIGH); // если 0, то включаем LED
digitalWrite(IN4, LOW); // Задаем скорость вращения
Servo1.write(15);
mySerial.println("Go left");
}
if(incomingByte == '4') {
digitalWrite(IN1, LOW); // если 0, то включаем LED
digitalWrite(IN2, HIGH);
delay(2000);// Задаем скорость вращения
Servo1.write(105);
mySerial.println("Go right");
}
if(incomingByte == '0') {
digitalWrite(IN1, LOW); // если 0, то включаем LED
digitalWrite(IN2, LOW); // Задаем скорость вращения
Servo1.write(60);
Serial.println("STOP!"); // и выводим обратно сообщение
} }
#elif defined LONG_RANGE
Serial.println ("I2C scanner. Scanning ...");
byte count = 0;
for (byte i = 1; i < 60; i++)
{
Wire.beginTransmission (i);
if (Wire.endTransmission () == 0)
{
Serial.print ("Found address: ");
Serial.print (i, DEC);
Serial.print (" (0x");
Serial.print (i, HEX);
Serial.println (")");
count++;
delay (1); // maybe unneeded?
} // end of good response
} // end of for loop
Serial.println ("Done.");
Serial.print ("Found ");
Serial.print (count, DEC);
Serial.println (" device(s).");
break;
if (mySerial.available() > 0) { //если пришли данные
incomingByte = mySerial.read(); // считываем байт
if(incomingByte == '9') {
mySerial.print("1s"sensor.readRangeSingleMillimeters());
if (sensor.timeoutOccurred()) { mySerial.print(" TIMEOUT");}
mySerial.println();
mySerial.print("2s"sensor2.readRangeSingleMillimeters());
if (sensor2.timeoutOccurred()) { mySerial.print(" TIMEOUT");}
mySerial.println();
}
}
#endif}
З цим розібрався (треба було там де pinMode(4, ...); і pinMode(5, ...) і інші 4 і 5; замінити на 6 і 7 відповідно і побачило 2 датчика ну і підключити XSHUT до цих виходів звісно
Всім привіт, знайшов статтю, але через недостатнє розуміння англійської не можу повністю зрозуміти суть пунктів 2.1, 2.2. І чи можна зашити програму через USB з 5 В, потім вставити 12В в роз'єм PowerJack і тоді лише дістати USB щоб програма не збилась
https://www.st.com/content/ccc/resource/technical/document/application_note/group0/0e/0a/96/1b/82/19/4f/c2/DM00280486/files/DM00280486.pdf/jcr:content/translations/en.DM00280486.pdf
і вот знайшов код щоб змінити регістр з перевіркою, але без дії з попереднього посилання і з живленням лише 5В він змінював лише адресу 2 регістру
#include <Wire.h>
#include <VL53L0X.h>
VL53L0X sensor;
VL53L0X sensor2;
void setup()
{
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
delay(500);
Wire.begin();
Serial.begin (9600);
pinMode(4, INPUT);
delay(150);
Serial.println("00");
sensor.init(true);
Serial.println("01");
delay(100);
sensor.setAddress((uint8_t)22);
Serial.println("02");
pinMode(5, INPUT);
delay(150);
sensor2.init(true);
Serial.println("03");
delay(100);
sensor2.setAddress((uint8_t)25);
Serial.println("04");
Serial.println("addresses set");
}
void loop()
{
Serial.println ("I2C scanner. Scanning ...");
byte count = 0;
for (byte i = 1; i < 120; i++)
{
Wire.beginTransmission (i);
if (Wire.endTransmission () == 0)
{
Serial.print ("Found address: ");
Serial.print (i, DEC);
Serial.print (" (0x");
Serial.print (i, HEX);
Serial.println (")");
count++;
delay (1); // maybe unneeded?
} // end of good response
} // end of for loop
Serial.println ("Done.");
Serial.print ("Found ");
Serial.print (count, DEC);
Serial.println (" device(s).");
delay(3000);
}
ось звідси взяв програму https://github.com/pololu/vl53l0x-arduino/issues/1
Всім привіт, знайшов статтю, але через недостатнє розуміння англійської не можу повністю зрозуміти суть пунктів 2.1, 2.2. І чи можна зашити програму через USB з 5 В, потім вставити 12В в роз'єм PowerJack і тоді лише дістати USB щоб програма не збилась
https://www.st.com/content/ccc/resource/technical/document/application_note/group0/0e/0a/96/1b/82/19/4f/c2/DM00280486/files/DM00280486.pdf/jcr:content/translations/en.DM00280486.pdf
і вот знайшов код щоб змінити регістр з перевіркою, але без дії з попереднього посилання і з живленням лише 5В він змінював лише адресу 2 регістру
#include <Wire.h>
#include <VL53L0X.h>
VL53L0X sensor;
VL53L0X sensor2;
void setup()
{
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
delay(500);
Wire.begin();
Serial.begin (9600);
pinMode(4, INPUT);
delay(150);
Serial.println("00");
sensor.init(true);
Serial.println("01");
delay(100);
sensor.setAddress((uint8_t)22);
Serial.println("02");
pinMode(5, INPUT);
delay(150);
sensor2.init(true);
Serial.println("03");
delay(100);
sensor2.setAddress((uint8_t)25);
Serial.println("04");
Serial.println("addresses set");
}
void loop()
{
Serial.println ("I2C scanner. Scanning ...");
byte count = 0;
for (byte i = 1; i < 120; i++)
{
Wire.beginTransmission (i);
if (Wire.endTransmission () == 0)
{
Serial.print ("Found address: ");
Serial.print (i, DEC);
Serial.print (" (0x");
Serial.print (i, HEX);
Serial.println (")");
count++;
delay (1); // maybe unneeded?
} // end of good response
} // end of for loop
Serial.println ("Done.");
Serial.print ("Found ");
Serial.print (count, DEC);
Serial.println (" device(s).");
delay(3000);
}
ось звідси взяв програму https://github.com/pololu/vl53l0x-arduino/issues/1
Розібрався, ця робоча програма
#include <SoftwareSerial.h>
char incomingByte; // вхідні данні
SoftwareSerial mySerial(10, 11); // RX, TX
void setup()
{
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("Hi Max!");
mySerial.begin(9600);
mySerial.println("Hello, Bogdan");
pinMode(LED_BUILTIN, OUTPUT); // 13 пін – світодіод, объявляєтся як вхід
}
void loop()
{
if (mySerial.available() > 0) { //якщо прийшли данні
incomingByte = mySerial.read(); // счкачуєм байт
if(incomingByte == '0') {
digitalWrite(LED_BUILTIN, LOW); // якщо 1, то включаєм LED
Serial.println("LED OFF. Press 1 to LED ON!"); // і виводим назад повідомлення
}
if(incomingByte == '1') {
digitalWrite(LED_BUILTIN, HIGH); // якщо 0, то включаєм LED
Serial.println("LED ON. Press 0 to LED OFF!");
}
}}
Да, там напевне проблема з циклом
Хочу зробити програму щоб при введенні через програму Bluetooth Terminal (скачав в гугл плей) 1 діод світився, а при введенні 0 потухав. Так зараз виходить , що при введенні 1 діод світить, а щоб погасити треба послати кілька нулів.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup()
{
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("Hi Max!");
mySerial.begin(9600);
mySerial.println("Hello, Bogdan");
pinMode(LED_BUILTIN, OUTPUT); //
}
void loop()
{
if (mySerial.available())
Serial.write(mySerial.read());
if (mySerial.read() == '1')
{digitalWrite(LED_BUILTIN, HIGH);
Serial.println("горить");} // при 1 включается светодиод
if (mySerial.read() == '0')
{digitalWrite(LED_BUILTIN, LOW);
Serial.println("не горить");} // при 0 выключается светодиод
}
Спасибі за відповідь, хотілося б уточнити, в мене ще використовується драйвер L298N та сервопривід, в них немає виходу XSHUT, їм також вручну треба вписувати адресу?
Доброго вечора, маю 2 таких ( https://arduino.ua/prod2467-lazernii-datchik-rasstoyaniya-vl53l0x-v2 ) лазерних дальноміра, перевіряв адрес датчиків на шині i2c їхній адрес 0x29 для обох, як програмно змінити і де глянути чи можна змінити взагалі, дякую
Сторінки 1