Робот в начале разработки
Задумка (?)
— работа в режиме робота по транспортировке деталей
из одного места в другое по линии(очень толстой магистрали)
На данный пока только управляемая по ИК машинка
на основе
-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