Простой ИК-бот на Arduino Uno и Iskra JS

  • Платформы: Arduino, Iskra JS
  • Языки программирования: Arduino (C++), JavaScript
  • Тэги: робот, ИК-пульт, сервопривод, сервопривод постоянного вращения, серво 360

Что это

Простейший полноприводной бот, контролируемый с инфракрасного пульта дистанционного управления. Мы собрали двух роботов — на базе ARduino Uno и Iskra JS — и устроили гонку.

Что понадобится

Видеообзор

Как собрать

  1. Возьмите Troyka Shield LP и установите сверху на управляющую плату — Arduino или Iskra JS.
  2. Закрепите на обратную сторону управляющей платы с помощью двустороннего скотча два сервопривода спереди — «передние колёса», и два сзади — «задние колёса». Закрепите круглые качельки на валах сервоприводов.
  3. Подключите передние колёса «ServoFordL» и «ServoFordR» через 3-проводные шлейфы к 8 и 9 пину Troyka Shield LP соответственно, а задние колёса «ServoBackL» и «ServoBackR» — к 10 и 11 пину Troyka Shield LP соответственно.
  4. Подключите ИК-приёмник к 4 пину Troyka Shield LP. В итоге должна получиться схема.
  5. Установите Power Shield сверху на Troyka Shield LP.

Исходный код

Генерировать управляющие серводвигателями импульсы можно самостоятельно, но это настолько распространённая задача, что для её решения предусмотрена библиотека Servo. Она входит в установочный пакет Arduino IDE и доступна из Espruino Web IDE.

Скетч для Arduino

ir-servo-robot.ino
// библиотека для ИК приёмника
#include <IRremote.h>
// подключаем библиотеку для работы с сервоприводами
#include <Servo.h> 
// создаём объект для управления сервоприводом
Servo myservoFordL;
Servo myservoFordR;
Servo myservoBackL;
Servo myservoBackR;
 
// даем имя пину подключения ИК приёмника
int RECV_PIN = 4;
 
// указываем к какому пину подключен ИК приёмник
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup() 
{
  // запускаем работу ИК приемника
  irrecv.enableIRIn();
  // подключаем сервоприводы
  myservoFordL.attach(8);
  myservoFordR.attach(9);
  myservoBackL.attach(10);
  myservoBackR.attach(11);
} 
 
void loop() 
{
  // принимаем данные с ИК пульта
  // в зависимости от нажатой кнопки пульта
  // даём разные команды роботу
  if (irrecv.decode(&results)) {
    if (results.value == 0x1689609F) {
      ford();
    } else if (results.value == 0x1689B847) {
      back();   
    } else if (results.value == 0x168910EF) {
      left();   
    } else if (results.value == 0x16899867) {
      right();   
    } else if (results.value == 0x168938C7) {
      stop();   
    }
    // ждем следующее значение
    irrecv.resume();
  }
  //делаем задержку
  delay(100);
}
 
// функция движение вперёд
void ford() {
  myservoFordL.write(0);
  myservoFordR.write(180);
  myservoBackL.write(0);
  myservoBackR.write(180);
}
 
// функция движение назад
void back() {
  myservoFordL.write(180);
  myservoFordR.write(0);
  myservoBackL.write(180);
  myservoBackR.write(0);
}
 
// функция поворота налево
void left() {
  myservoFordL.write(180);
  myservoFordR.write(180);
  myservoBackL.write(180);
  myservoBackR.write(180);
}
 
// функция поворота направо
void right() {
  myservoFordL.write(0);
  myservoFordR.write(0);
  myservoBackL.write(0);
  myservoBackR.write(0);
}
 
// функция остановки
void stop() {
  myservoFordL.write(90);
  myservoFordR.write(90);
  myservoBackL.write(90);
  myservoBackR.write(90);
}

Скрипт для Iskra JS

ir-servo-robot.js
// подключаем модуль ИК-приёмника
var receiver = require('@amperka/ir-receiver').connect(P4);
// подключаем модули сервоприводов
var myServoFordL = require('@amperka/servo').connect(P8);
 
var myServoFordR = require('@amperka/servo').connect(P9);
 
var myServoBackL = require('@amperka/servo').connect(P10);
 
var myServoBackR = require('@amperka/servo').connect(P11);
 
// если пришёл сигнал с ИК-пульта
receiver.on('receive', function(code) {
  // в зависимости от нажатой кнопки пульта
  // даём разные команды роботу
  if (code === 0x1689609F) {
    ford();
  } else if (code === 0x1689B847){
    back();
  }
  else if (code === 0x168910EF) {
    left();
  }
  else if (code === 0x16899867) {
    right();
  }
  else if (code === 0x168938C7) {
    stop();
  }
});
 
// функция движение вперёд
function ford() {
    myServoFordL.write(180);
    myServoFordR.write(0);
    myServoBackL.write(180);
    myServoBackR.write(0);
}
// функция движение назад
function back() {
    myServoFordL.write(0);
    myServoFordR.write(180);
    myServoBackL.write(0);
    myServoBackR.write(180);
}
// функция поворота налево
function left() {
    myServoFordL.write(0);
    myServoFordR.write(0);
    myServoBackL.write(0);
    myServoBackR.write(0);
}
// функция поворота направо
function right() {
    myServoFordL.write(180);
    myServoFordR.write(180);
    myServoBackL.write(180);
    myServoBackR.write(180);
}
// функция остановки
function stop() {
    myServoFordL.write(90);
    myServoFordR.write(90);
    myServoBackL.write(90);
    myServoBackR.write(90);
}

Что дальше

Научиться создавать сложных роботов поможет электронный конструктор «Робоняша».

Если вы прошли «Йодо» и хотите использовать его детали для сборки Робоняши, не обязательно покупать весь набор — мы подготовили подборку компонентов, необходимых для апгрейда первого эпизода до мобильного робота.