Робот в начале разработки
Задумка (?)
— работа в режиме робота по транспортировке деталей
из одного места в другое по линии(очень толстой магистрали)
На данный пока только управляемая по ИК машинка
на основе
-Craftduino+
-tamiya
-TSOP31236
На данный момент реализовано
управление движением по ИК
— скорость регулируется +/-
— повороты влево-вправо плавно регулируютcя уменьшением скорости вращения одного из двигателей
— есть вращение на месте в обе стороны
Выглядит на данный момент так



Для работы с ИК использовал библиотеку IRremote. Поддерживаемые протоколы: NEC, Sony SIRC, Philips RC5, Philips RC6.
Пульт использовал Marmitek для Умного дома X10

Назначение клавиш:
↑ – движение вперед;
↓ – движение назад;
← – поворот влево;
→ – поворот вправо;
— CH – увеличение скорости при движении вперед-назад;
CH+ – уменьшение скорости при движении вперед-назад;
-VOL – круговое движение на месте влево;
VOL+ – круговое движение на месте вправо;
0 – остановка робота.
Прием кодов — по прерыванию 0
Для начала определяем коды клавиш, а затем им приписываем действия
Скетч для приема и обработки кодов + проверка выбора кодов
// подключение библиотеки
#include <IRremote.h>
//вход ИК приемника
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
void setup()
{
// последовательный порт
Serial.begin(9600);
// включить приемник
irrecv.enableIRIn();
// прерывания для ИК
ir_time1=0;ir_time2=0;
attachInterrupt(0, get_ir_kod, FALLING);
}
void loop()
{
// обработка кода нажатия
if(ir_kod>0)
{
Serial.println(ir_kod);
ir_go(ir_kod);
ir_kod=0;
}
}
// получить код переданный с ИК пульта
void get_ir_kod()
{
detachInterrupt(0); // отключить прерывание 0
if (irrecv.decode(&results))
{
if (results.value > 0 && results.value < 0xFFFFFFFF)
{
ir_dt = results.value;
ir_time2=millis();
if (ir_time2-ir_time1>1000)
{ir_kod = ir_dt;ir_time1=ir_time2;}
else
ir_kod = 0;
}
irrecv.resume();
}
attachInterrupt(0, get_ir_kod, CHANGE);
}
void ir_go(long kod)
{
switch(kod)
{
case FORWARD : // направление вперед
Serial.println("forward");
break;
case BACK : // направление назад
Serial.println("back");
break;
case SPEED_UP : // скорость++
Serial.print("speed++");
break;
case SPEED_DOWN : // скорость--
Serial.println("speed--");
break;
case LEFT : // влево
Serial.println("left");
break;
case RIGHT : // вправо
Serial.println("right");
break;
case CIRCLE_RIGHT : // кружение вправо
Serial.println("circle_right");
break;
case CIRCLE_LEFT : // кружение влево
Serial.println("circle_left");
break;
case STOP : // стоп
Serial.println("stop");
break;
default:
break;
}
}
Продолжение — Часть 2. Шасси на основе гусениц и редуктора Tamiya
