Программа работает, но не реагирует на датчик пламени
- Войдите на сайт для отправки комментариев
Ср, 01/05/2019 - 13:48
Здравствуйте, помогите пожалуйста разобраться в программе. Есть готовая программа для робота обходящего препятствия и датчика газа, как я понимаю. В своей работе я взяла датчик огня и подключила его к реле, а затем водяной насос. Решили с ребятами сделать робота пожарного. Но робот едет, обходит препятствия, но не реагирует на огонь,вернее в мониторе порта данные изменяются, а вот вкл или выкл насоса не происходит. Как исправить код? Либо что не верно в схеме подключения?
Робот должен двигаться и обходить препятствия, если видит огонь останавливаться и тушить его, далее повторение.
#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);
}
вставьте программу по правилам. Тогда можно будет ссылаться на Ваши ошибки.
Кроме того - почему Вы с flaimpin делаете и аналоговое и цифровое чтение - давайте уж что-то одно и вот это значение и анализируйте.
Я новичок, потому и ошибаюсь, теперь программа вставлена верно? а что косается flaimpin, то вот этот кусок программы мне особенно не понятен
Я новичок, потому и ошибаюсь, теперь программа вставлена верно? а что косается flaimpin, то вот этот кусок программы мне особенно не понятен
Программу Вы не вставили поэтому общаться с Вами сложно, но давайте по порядку. FLAMEPINом назван АНАЛОГОВЫЙ вход А3. Почитайте про аналоговые входы - настоятельно рекомендую. далее данные от считывания FLAMEPIN Вы используете через подпрограмму get_data_flame() для вывода на монитор, а должны еще использовать для выбора варианта действия по значению пламени, но Вы за каким-то х.. еще раз читаете с аналогового входа как с дискретного (тоже почитайте) и удивляетесь, что них не получается.
Чего-то добрый я сегодня...
1
// получение данных с датчика flame sensor
2
float
get_data_flame() {
3
// получение значения
4
float
value=analogRead(FLAMEPIN);
5
return
(
float
)value;
6
}
1
В такси садится девушка.Таксист:
2
- А хотите, я вам анекдот про блондинку расскажу?
3
- Нет, я блондинка!
4
- А я медленно и три раза?
ПС: Вставте правильно код http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii . 1 пост не редактируется. Так что вствьте в последующие посты.