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

Цель состоит в том, чтобы робот избегал препятствий и двигался автономно, используя только ИК-датчики. Раньше я питал все от батареек, но иногда он трясется и движется медленно, поэтому я решил запитать их отдельно. Как вы думаете, проблема в моем коде или это аппаратная проблема? Спасибо

, 👍1

Обсуждение

это похоже на ошибку 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


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