4WD робот продолжает зависать
Я уже некоторое время работаю над полноприводным роботом. Детали, которые я использую, это плата Arduino v4, приводной двигатель l298N, ультразвуковой датчик Hc 05, DHT 11, mq2, модуль Bluetooth, серводвигатель, модуль ИК-передатчика и приемника, а также модуль UNO, работающий от 2 литий-ионных аккумуляторов 18650 и блока питания. банк. когда я пытался использовать только инфракрасные датчики, только ультразвуковые датчики или оба для обнаружения и предотвращения препятствий, код зависает, и больше ничего не работает, пока я не уберу препятствие, тогда робот принимает решение, которое он хотел принять. он также иногда сбрасывался во время зависания, но я решил эту проблему, включив питание Arduino отдельно. я заметил, что эта проблема в основном возникает, когда все ИК дают низкий сигнал. я думаю, проблема в моем коде, но я действительно не вижу, что я набрал неправильно.
#include <dht.h>
#include <Servo.h>
#define servoPin 11
// Создаем сервообъект
Servo Servo1;
// Ультразвуковой датчик
#define trigPin 9
#define echoPin 10
// определяет переменные
long duration;
int distance;
//контакты датчика
#define gasSens A4
dht DHT;
#define DHT11_PIN 2
// контакты драйвера двигателя
#define in1 8
#define in2 7
#define in3 6
#define in4 5
//инфракрасные контакты
#define lftIr 12
#define ctrIr 4
#define rghIr 3
#define buzzer 13
int dist=1000;
int lastVal=0;
int degVal;
int leftDist;
int rightDist;
int gasVal;
int logicVal=49;
int buzzerTrig=0;
unsigned long curTime;
void setup() {
// поместите сюда код установки для однократного запуска:
Servo1.attach(servoPin);
Servo1.write(100);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(lftIr,INPUT);
pinMode(ctrIr,INPUT);
pinMode(rghIr,INPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
curTime=millis();
Serial.begin(9600);
}
void loop() {
// поместите сюда ваш основной код для многократного запуска:
if(Serial.available() > 0){ // Проверяем, поступают ли данные из последовательного порта
logicVal = Serial.read(); // Считывает данные из последовательного порта
}
if(millis()-curTime>=10000){
int chk = DHT.read11(DHT11_PIN);
gasVal=analogRead(gasSens);
Serial.print(DHT.temperature);
Serial.print(" C");
Serial.print("|");
Serial.print(DHT.humidity);
Serial.print("%");
Serial.print("|");
Serial.print(gasVal);
Serial.print("|");
if(gasVal>500){Serial.println("Dangerous gas levels");buzzerTrig=1;}
else{Serial.println("normal");buzzerTrig=0;}
curTime=millis();
}
if(buzzerTrig==1){
buzzerCall();
logicVal==48;
}
if(logicVal=='1'){
dist=distanceCall();
int leftIr=digitalRead(lftIr);
int centerIr=digitalRead(ctrIr);
int rightIr=digitalRead(rghIr);
if (leftIr==LOW && rightIr==HIGH){
stopAll();
while(leftIr==LOW){
rightMov();
leftIr=digitalRead(lftIr);
}
stopAll();
}
else if (leftIr==HIGH && rightIr==LOW){
stopAll();
while(rightIr==LOW){
leftMov();
rightIr=digitalRead(rghIr);
}
stopAll();
}
else if (leftIr==LOW && centerIr==LOW && rightIr==LOW){
stopAll();
while(leftIr==LOW || centerIr==LOW || rightIr==LOW){
backMov;
leftIr=digitalRead(lftIr);
centerIr=digitalRead(ctrIr);
rightIr=digitalRead(rghIr);
}
stopAll();
}
else if (leftIr==HIGH && centerIr==LOW && rightIr==HIGH){
stopAll();
while(centerIr==LOW){
backMov;
centerIr=digitalRead(ctrIr);
}
stopAll();
delay(10);
leftMov();
delay(500);
stopAll();
}
else{
fowardMov();
}
}
}
int distanceCall(){
// Очищает триггер
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Устанавливает тригпин в состояние HIGH на 10 микросекунд
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Считывает echoPin, возвращает время прохождения звуковой волны в микросекундах
duration = pulseIn(echoPin, HIGH);
// Расчет расстояния
distance= duration*0.034/2;
return distance;
}
void fowardMov(){
digitalWrite(in2,HIGH);
digitalWrite(in4,HIGH);
digitalWrite(in1, LOW);
digitalWrite(in3, LOW);
}
void backMov(){
digitalWrite(in1,HIGH);
digitalWrite(in3,HIGH);
digitalWrite(in2, LOW);
digitalWrite(in4, LOW);
}
void rightMov(){
digitalWrite(in1, HIGH);
digitalWrite(in4, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
}
void leftMov(){
digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH);
digitalWrite(in1, LOW);
digitalWrite(in4, LOW);
}
void stopAll(){
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void buzzerCall(){
tone(buzzer, 5000);
delay(500);
noTone(buzzer);
tone(buzzer, 1000);
delay(500);
noTone(buzzer);
}
Цель состоит в том, чтобы робот избегал препятствий и двигался автономно, используя только ИК-датчики. Раньше я питал все от батареек, но иногда он трясется и движется медленно, поэтому я решил запитать их отдельно. Как вы думаете, проблема в моем коде или это аппаратная проблема? Спасибо
@Ayanfe Adekanye, 👍1
Обсуждение1 ответ
Лучший ответ:
Я не удивлен, что у вас возникли проблемы, поскольку у вас очень сложная система. При устранении неполадок в сложных системах важно разбить их на очень простые «фрагменты» и убедиться, что каждый из них работает отдельно.
Я бы удалил из вашей системы все, кроме кода для трех ИК-датчиков, и использовал бы генератор случайных чисел, чтобы сгенерировать случайное число от 0 до 0. 7. Затем я использовал бы двоичное представление этого числа для генерации возвращаемых значений для вызовов digitalRead() датчиков с соответствующими распечатками, показывающими, какие значения были сгенерированы и какой эффект произвели эти значения. Я думаю, вы обнаружите, что одно или несколько из 8 возможных значений вызывают проблемы, поскольку у вас есть предложения IF только для 4 (или 6, если вы посчитаете две двузначные системы дважды).
Спасибо за помощь. Я последовал твоему совету и удалил все, кроме кода для ИК. Я также сгенерировал случайные значения от 0 до 1, чтобы увидеть, что вызывает зависание кода. Код больше не зависает, теперь почему-то все работает нормально. возможно, проблема была в другой части моего кода. Что вы думаете? Спасибо., @Ayanfe Adekanye
Решил немного доработать робота. Сейчас я использую 3 литий-ионных аккумулятора для питания Arduino и двигателей. Я снова попробовал сценарий только с Ir. вместо генерации случайных чисел я решил посмотреть, как это будет работать с препятствиями. это не сработало. Робот замер сразу же, как только добрался до стены, поэтому я использовал последовательный монитор, чтобы проверить это. Проблема заключается в том, что центральный ИК каждый раз, когда он сначала считывает низкий уровень, хотя на последовательном мониторе сообщение печатается, робот зависает. Как вы думаете, я должен использовать PWM, чтобы сделать робота медленнее? Улучшит ли это обнаружение препятствий или это не будет иметь значения, @Ayanfe Adekanye
Поздравляем с прогрессом! Я не уверен, что более медленное движение решит вашу проблему, но я сомневаюсь, что это произойдет. Возможно, у вас есть проблема с логикой вашей программы, которая, если ее не решить, будет продолжать делать вашего робота ненадежным. Хорошая новость заключается в том, что теперь, когда вы знаете, что у вас есть проблема, вы сможете ее решить. Может быть, еще несколько операторов печати в разных точках, чтобы вы могли построить более полную картину того, что на самом деле происходит с вашей логикой? Mega, несомненно, правильно выполняет запрограммированную логику, но также, вероятно, делает не то, что вы думаете ;-)., @user3765883
Большое спасибо за вашу помощь, я видел проблему. Проблема заключалась в том, что когда центральный IR показывает низкий уровень и входит в цикл while, он не перемещается, потому что я неправильно вызвал функцию, которую я набрал backMov; вместо backMov(); теперь он работает намного лучше, но я заметил, что UNO перезагружается каждый раз, когда сталкивается с препятствием. Он по-прежнему избегает препятствия, несмотря на сброс, но я не знаю, почему он сбрасывается. Может быть, это из-за низкого заряда батарей? Я даже не получаю много времени на его использование, и я чувствую, что это может быть связано с тем, что я сделал свой собственный держатель батареи из простых материалов, что вы думаете?, @Ayanfe Adekanye
Если Mega перезагружается, это почти наверняка связано с тем, что что-то потребляет больше тока и вызывает падение внутреннего напряжения Mega ниже 5 В. Если вы используете бочкообразный разъем или Vin для подачи питания на Mega, на внутреннем стабилизаторе напряжения будет падение примерно на 2 В., @user3765883
Спасибо за помощь. Проблема заключалась в том, что мои батареи были низкими, хотя он все еще сталкивается с препятствиями, прежде чем принять решение, но в целом он все еще работает лучше. у вас есть какой-нибудь совет, как это исправить, я заметил, что помимо дивана из ткани и штор роботы сталкиваются со всеми препятствиями, прежде чем принять решение, я чувствую, что моя проблема в том, что центральный ИК-спектр недостаточно быстро считывается, что вы думаете ?, @Ayanfe Adekanye
У меня также возникают проблемы с подключением моих двух Arduinos к связи с помощью модуля Bluetooth HC05 (https://arduinoprosto.ru/q/78714/bluetooth-modulehc-05-issues), не могли бы вы проверить его и сказать мне, что Вы думаете? Спасибо, @Ayanfe Adekanye
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- (Код ультразвукового датчика: такого файла или каталога нет)
- Несколько неблокирующих таймеров обратного отсчета?
- Датчик HC-SR505 PIR выдает только HIGH уровень
- Отправка данных из ESP8266 в PHP
- Определение уровня заряда с помощью датчика тока (ACS758) с arduino uno
- Использование YS-IRTM с Arduino Uno
- Как объединить два разных скетча датчика в один полный скетч?
это похоже на ошибку
logicVal==48;
... какова цельlogicVal
? ... было бы полезно более описательное имя ... присвоение числового значения и проверка символьного значения могут сбивать с толку, @jsotola«Я убираю препятствие, затем робот принимает решение, которое он хотел принять», и какое это будет решение? ... вы ничего не сказали о том, как вы ожидаете, что робот будет вести себя и как он должен реагировать ... нет никакого способа узнать, действительно ли части кода предназначены для того, чтобы делать то, что они делают, @jsotola
Без дополнительной информации будет трудно оказать вам большую помощь. Как минимум, нам нужна схема подключения и некоторые подробности об используемой вами библиотеке DHT, так как их несколько. Кроме того, похоже, у вас есть код для одного ультразвукового датчика, который вообще не используется. У меня довольно обширный опыт работы с ультразвуковыми датчиками HC-04/05, и я могу помочь вам разобраться с проблемами, но не в том случае, если у нас нет представления о том, чего вы пытаетесь достичь., @user3765883
@jsotola извините, если я вас запутал, но я забыл упомянуть, что сделал приложение с помощью конструктора приложений MIT для отправки данных для включения или выключения робота, а также для отображения данных датчика. то, что я ожидал, зависит от того, какой Ir пойдет первым. Робот должен отойти до тех пор, пока Ir не станет высоким. он работает для левого и правого Ir, но для центра он зависает. он также зависает, когда все датчики показывают низкие значения или когда центр и другой показывают низкие значения. когда я удаляю препятствие перед ним, робот поворачивает налево или даже разворачивается. Спасибо за помощь, надеюсь, теперь вы понимаете мою проблему, @Ayanfe Adekanye
@user3765883 user3765883 извините, я добавлю свою схему в пост. Я не знаю, кто создал библиотеку dht, которую я использую, я только что скачал ее из учебника по основам схемы о том, как использовать dht (https:/ /www.circuitbasics.com/how-to-set-up-the-dht11-humidity-sensor-on-an-arduino/) Первоначально я использовал ультразвуковой датчик, но он не очень хорошо работал, особенно когда он был обращен к ткани, поэтому Я решил совместить его с ИК, но после теста мой робот что-то наткнулся, после чего мой сервопривод перестал работать, достать детали в моей стране сложно и дорого, поэтому я решил использовать только ИК, поэтому здесь есть переменные., @Ayanfe Adekanye