Часть III. Практическое применение Arduino
Черная линия выдавала показания — 24
(sensorValues[i] * 10 / 1001)
, белый
лист — 0–2.
Остается только реализовать движение по черной линии.
Создаем два режима работы робота:
внешнее управление;
автономный (движение по линии).
Для этого добавляем для ИК-пульта две клавиши:
#define EXT 16 //"1" - переход во внешнее управление
#define LOCAL 1040 //"3" - автономный режим
И два псевдокода (при наезде на черную линию передним левым и передним пра-
вым датчиком):
#define LOCAL_LEFT 9997 // для поворота по QTR
#define LOCAL_RIGHT 9998 // для поворота по QTR
При срабатывании датчиков выдаем в основной цикл программы срабатывание
псевдокодов, и программа
ir_go()
переводит их в движения. Содержимое скетча
приведено в листинге 21.4.
Листинг 21.4
// подключение библиотеки irremote
#include
//вход ИК-приемника
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long ir_dt, old_ir;
long ir_kod;
unsigned long ir_time1, ir_time2;
// коды клавиш ИК-пульта (marmitek)
#define FORWARD 1936
#define BACK 3984
#define SPEED_UP 144 //ch+
#define SPEED_DOWN 2192 //ch-
#define LEFT 3472
#define RIGHT 1424
#define CIRCLE_LEFT 3216 //vol+
#define CIRCLE_RIGHT 1168 //vol-
#define STOP 2320 //0
#define EXT 16 //1
#define LOCAL 1040 //3
#define LOCAL_LEFT 9997 // для поворота по QTR
#define LOCAL_RIGHT 9998 // для поворота по QTR
Глава 21. Создаем робота
283
int local=0;
// состояние моторов робота
struct POZ // структура для хранения статусов моторов
{
int poz1; // позиция для 1 мотора
int poz2; // позиция для 2 мотора
int direction12; // направление до поворота
int qtr[4]; //
long millis1[4]; // для датчиков черное-белое фиксация появления белого
};
// моторы
struct MOTOR // структура для хранения номеров pin-ов, к которым подключены
моторчики
{
int in1; // INPUT1
int in2; // INPUT2
int enable; // ENABLE1
};
// определяем порты, к которым подключены моторчики
MOTOR MOTOR1 = { 13, 12, 5 };
MOTOR MOTOR2 = { 7, 8, 6 };
// начальная позиция робота
// 1,2 мотор - выключены
POZ POZ12={7,7,7,{0,0,0,0},{0,0,0,0}};
// массив возможных состояний моторов
// max down -> min down -> stop -> min up -> max up
int arrpoz[9][17]={
// in1 первого мотора
{0,0,0,0,0,0,0,0,1,1,1,1,1,1,1},
// in2 первого мотора
{1,1,1,1,1,1,1,0,0,0,0,0,0,0,0},
// скорости (enable1) первого мотора
{250,230,210,190,170,150,130,0,130,150,170,190,210,230,250},
// in3 второго мотора
{0,0,0,0,0,0,0,0,1,1,1,1,1,1,1},
// in4 второго мотора
{1,1,1,1,1,1,1,0,0,0,0,0,0,0,0},
// скорости (enable2) второго мотора
{250,230,210,190,170,150,130,0,130,150,170,190,210,230,250},
// скорость++
{0,-1,-1,-1,-1,-1,-1,0,1,1,1,1,1,1,0},
// скорость--
{-1,-1,-1,-1,-1,-1,-1,0,1,1,1,1,1,1,1},
// кружение влево-вправо
{14,12,10,8,6,4,2,0,-2,-4,-6,-8,-10,-12,-14}
};
284
Do'stlaringiz bilan baham: |