Программа работает, но не реагирует на датчик пламени

Jeki
Offline
Зарегистрирован: 01.05.2019

Здравствуйте, помогите пожалуйста разобраться  в программе. Есть готовая программа для робота обходящего препятствия и  датчика газа, как я понимаю. В своей работе я взяла датчик огня и подключила его к реле, а затем водяной насос. Решили с ребятами сделать робота пожарного. Но робот едет, обходит препятствия, но не реагирует на огонь,вернее  в мониторе порта данные изменяются, а вот вкл или выкл насоса не происходит. Как исправить код? Либо что не верно в схеме подключения?

Робот должен двигаться и обходить препятствия, если видит огонь останавливаться и тушить его, далее повторение.

 
#include <Ultrasonic.h>
 
#define INTERVAL_GET_DATA 500  // интервала измерений, мс 
// аналоговый пин
#define FLAMEPIN         A3
int buzzPin = 13;  // реле
 
// переменная для интервала измерений
unsigned long millis_int1=0;
 
// Подключаем библиотеку управления сервомоторами.
#include <Servo.h>
// Подключаем библиотеку управляющую дальномером.
#include "Ultrasonic.h"
// Инициализируем дальномер
// Контакт Trig соединен с 5 портом, Echo с 6 портом.
Ultrasonic sonar(5, 6);
// Создаем сервомотор поворота головы.
Servo neck;
// Объявляем переменные для хранения состояния двух моторов.
int motor_L1, motor_L2, input_L;
int motor_R1, motor_R2, input_R;
// Константы - постоянные значения для уточнения углов.
// поворота головы.
// Эти значения нужно уточнить для вашего робота!
const int left_ang = 160;
const int front_ang = 90;
const int right_ang = 20;
// Временные константы служат для точного задания времени на поворот,
//  разворот, движение вперед в миллисекундах.
// Эти значения нужно уточнить для вашего робота!
const int time_turn_45 = 195;
const int time_turn_180 = 750;
const int time_move_30cm = 220;
// Длина робота.
// Эти значения нужно уточнить для вашего робота!
const int robot_length = 30;
// Эти значения нужно уточнить для вашего робота!
//Максимальная скорость не может превышать 255.
const int max_speed = 255;
//Минимальная скорость, ниже которой колеса уже не вращаются.
const int min_speed = 130;
 
void setup()
{
  pinMode( buzzPin, OUTPUT );  
  // открываем последовательный порт
  Serial.begin(9600);
  // Инициализируем сервомотор, управление 9 портом.
  neck.attach(9);
  // Заносим в переменные номера контактов (пинов) Arduino.
  // Для левых и правых моторов машинки.
  setup_motor_system(3, 4, 11, 7, 8, 10);
  // Двигатели остановлены.
  setspeed(0, 0);
}
// Основная программа.
void loop()
{
  //Скорость вращения колес
  setspeed(max_speed, max_speed);
  // Остановка для анализа обстановки.
  _stop();
  // Создаем переменные для хранения трех дистанций до препятствий слева, впереди, справа.
  int Dist_left, Dist_front, Dist_right;
  // Поворачиваем голову налево.
  neck.write(left_ang);
  // Ждем, так как поворот занимает небольшое время.
  delay(150);
  // Записываем расстояние до препятствия слева.
  Dist_left = sonar.Ranging(CM);
  // Поворачиваем голову прямо вперед.
  neck.write(front_ang);
  // Ждем, так как поворот занимает небольшое время.
  delay(250);
  // Записываем расстояние до препятствия впереди.
  Dist_front = sonar.Ranging(CM);
  // Поворачиваем голову направо.
  neck.write(right_ang);
  // Ждем, так как поворот занимает небольшое время.
  delay(250);
  // Записываем расстояние до препятствия впереди.
  Dist_right = sonar.Ranging(CM);
  //Заранее даем команду повернуть голову влево,
  //это уменьшит время остановок робота на анализ местности.
  neck.write(left_ang);
  // Если габариты робота позволяют движение вперед и развороты.
  if ((Dist_right > ((robot_length / 2) - 2)) && (Dist_left > ((robot_length / 2) - 2)))
  {
    if (Dist_front > robot_length) //Если можно двигаться вперед
    {
      forward(); // едем вперед 30см.
      delay(time_move_30cm);
    }
    else if (Dist_right > Dist_left)
    {
      right(); // поворачиваем направо на 90 градусов.
      delay(time_turn_45);
    }
    else
    {
      left(); // поворачиваем направо на 90 градусов.
      delay(time_turn_45);
    }
  }
  else
  {
    do {
      //Отъезжаем назад от препятствия.
      backward();
      delay(time_move_30cm / 2);
      _stop();
      neck.write(left_ang);
      // Ждем, так как поворот занимает небольшое время.
      delay(350);
      // Записываем расстояние до препятствия слева.
      Dist_left = sonar.Ranging(CM);
      neck.write(right_ang);
      // Ждем, так как поворот занимает небольшое время.
      delay(350);
      // Записываем расстояние до препятствия впереди.
      Dist_right = sonar.Ranging(CM);
      //Заранее даем команду повернуть голову влево,
      //это уменьшит время остановок робота на анализ местности.
      neck.write(left_ang);
      // Цикл повторяется, пока есть препятствия для разворота.
    }
    while ((Dist_right < ((robot_length / 2) - 2)) || (Dist_left < ((robot_length / 2) - 2)));
    //разворачиваем робота.
    left(); delay(time_turn_180);
  }
   if(millis()-millis_int1 >= INTERVAL_GET_DATA) {    
            float  flame= get_data_flame();
      // выводим значения flame sensor
      Serial.print("flame=");
      Serial.println(flame);
     
      millis_int1=millis();
      if( !digitalRead( FLAMEPIN ) )
    digitalWrite( buzzPin, LOW );
  else
    digitalWrite( buzzPin, HIGH );
   }
}
 
// получение данных с датчика flame sensor
float get_data_flame()  {
  // получение значения 
  float value=analogRead(FLAMEPIN);  
  return (float)value;
}
 
// Функция инициализации уравления моторами.
void setup_motor_system(int L1, int  L2, int iL, int  R1, int R2, int iR)
{
  // Заносим в переменные номера контактов (пинов) Arduino.
  motor_L1 = L1; motor_L2 = L2; input_L = iL;
  // Для левых и правых моторов робота.
  motor_R1 = R1; motor_R2 = R2; input_R = iR;
  // Переводим указанные порты в состояние вывода данных.
  pinMode(motor_L1, OUTPUT);
  pinMode(motor_L2, OUTPUT);
  pinMode(input_L, OUTPUT);
  pinMode(motor_R1, OUTPUT);
  pinMode(motor_R2, OUTPUT);
  pinMode(input_R, OUTPUT);
}
 
// Функция задает скорость двигателя.
void setspeed(int LeftSpeed, int RightSpeed)
{
  // Задаем ширину положительного фронта от 0 до 255.
  analogWrite(input_L, LeftSpeed);
  analogWrite(input_R, RightSpeed);
  // Чем больше, тем интенсивнее работает мотор.
}
// движение вперед.
void forward()
{
  // Если двигатель будет работать не в ту сторону,
  // поменять на нем контакты местами.
  digitalWrite(motor_L1, HIGH);
  digitalWrite(motor_L2, LOW);
  digitalWrite(motor_R1, HIGH);
  digitalWrite(motor_R2, LOW);
}
// Поворот налево с блокировкой левых колес.
void forward_left()
{
  // блокируем вращение левых колес.
  digitalWrite(motor_L1, LOW);
  digitalWrite(motor_L2, LOW);
  // правые колеса вращаются.
  digitalWrite(motor_R1, HIGH);
  digitalWrite(motor_R2, LOW);
}
// Поворот налево.
void left()
{
  // левые колеса вращаются назад
  digitalWrite(motor_L1, LOW);
  digitalWrite(motor_L2, HIGH);
  // правые колеса вращаются.
  digitalWrite(motor_R1, HIGH);
  digitalWrite(motor_R2, LOW);
}
// Поворот направо с блокировкой правых колес.
void forward_right()
{
  // левые колеса вращаются.
  digitalWrite(motor_L1, HIGH);
  digitalWrite(motor_L2, LOW);
  // блокируем вращение правых колес.
  digitalWrite(motor_R1, LOW);
  digitalWrite(motor_R2, LOW);
}
void right()
{
  // левые колеса вращаются.
  digitalWrite(motor_L1, HIGH);
  digitalWrite(motor_L2, LOW);
  //правые колеса вращаются назад.
  digitalWrite(motor_R1, LOW);
  digitalWrite(motor_R2, HIGH);
}
// Включаем движение назад.
void backward()
{
  // Меняем направление вращения двигателей.
  digitalWrite(motor_L2, HIGH);
  digitalWrite(motor_L1, LOW);
  digitalWrite(motor_R2, HIGH);
  digitalWrite(motor_R1, LOW);
}
void _stop()
{
  // Блокируем все колеса.
  digitalWrite(motor_L2, LOW);
  digitalWrite(motor_L1, LOW);
  digitalWrite(motor_R2, LOW);
  digitalWrite(motor_R1, LOW);
}
mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

вставьте программу по правилам. Тогда можно будет ссылаться на Ваши ошибки.

Кроме того - почему Вы с flaimpin делаете и аналоговое и цифровое чтение - давайте уж что-то одно и вот это значение и анализируйте.

Jeki
Offline
Зарегистрирован: 01.05.2019

Я  новичок, потому и ошибаюсь, теперь программа вставлена верно? а что косается flaimpin, то вот этот кусок программы  мне  особенно не понятен

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Jeki пишет:

Я  новичок, потому и ошибаюсь, теперь программа вставлена верно? а что косается flaimpin, то вот этот кусок программы  мне  особенно не понятен

Программу Вы не вставили поэтому общаться с Вами сложно, но давайте по порядку. FLAMEPINом назван АНАЛОГОВЫЙ вход А3. Почитайте про аналоговые входы - настоятельно рекомендую. далее данные от считывания FLAMEPIN Вы используете через подпрограмму get_data_flame() для вывода на монитор, а должны еще использовать для выбора варианта действия по значению пламени, но Вы за каким-то х.. еще раз читаете с аналогового входа как с дискретного (тоже почитайте) и удивляетесь, что них не получается.

Чего-то добрый я сегодня...

1// получение данных с датчика flame sensor
2float get_data_flame()  {
3  // получение значения
4  float value=analogRead(FLAMEPIN); 
5  return (float)value;
6}

 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
1В такси садится девушка.Таксист:
2- А хотите, я вам анекдот про блондинку расскажу?
3- Нет, я блондинка!
4- А я медленно и три раза?

ПС: Вставте правильно код http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii  . 1 пост не редактируется. Так что вствьте в последующие посты.