Espruino:Примеры/Роборука MeArm

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Роборука MeArm[1]

MeArm and Espruino - Remote Controlled Robot Arm

MeArm – это маленький, дешёвый набор для сборки робо-руки, выпускаемый компанией Phenoptix и разработанный Беном Греем. В нём используются серводвигатели и панели из акрилового стекла, вырезанные с помощью лазерной резки.

В этом руководстве мы расскажем, подсоединить компоненты набора друг к другу, а также о том, как настроить управление этой робо-рукой при помощи пульта дистанционного ИК-управления.

Нам понадобятся

Подсоединение

Подключите серводвигатели к гребешковым контактам на Espruino:

Контакт Серводвигатель
B15 «Плечо» робо-руки
B14 «Предплечье» робо-руки
C6 Основа
C7 Хват

И также подключите ИК-приёмник напрямую к плате:

Контакт ИК-приёмник
A1 VCC
A0 GND
C3 Сигнал

Код

Просто скопируйте и вставьте код ниже в правую часть Web IDE и кликните на кнопку загрузки кода.

Мы добавили в код комментарии, чтобы вы лучше понимали, как он работает. Но вряд ли у вас будет такой же пульт управления, как у нас, поэтому если вы нажмёте на своём пульте какую-нибудь кнопку, Espruino напечатает «Unknown 12345789» (или вроде того). Понажимайте на разные кнопки пульта, скопируйте числа, появляющиеся после нажатия на каждую кнопку, и вставьте их в код вместо тех, что там уже есть.

// Контакты, к которым подключены серводвигатели:
var servos = {
  shoulder : B15,
  elbow : B14,
  base : C6,
  hand : C7,
};
// Добавляем переменную, которую будут использовать две функции ниже: 
Pin.positions = {};
// Функция, которая будет генерировать
// широтно-импульсную модуляцию для серводвигателя:
Pin.prototype.goto = function(pos) { // -1 .. 1
  Pin.positions[this] = pos;
  console.log(this,pos);
  analogWrite(this, E.clip(0.5*pos+1.5,1,2)*0.05, {freq:50});
};
// Этот фрагмент передвигает серводвигатель
// на шаг в заданном направлении:
Pin.prototype.move = function(dir) {
  Pin.positions[this] = E.clip(Pin.positions[this]+dir,-1,1);
  this.goto(Pin.positions[this]);
};

// Зажат ли хват?
var clenched;
// В этих переменных задаётся, как быстро
// должен двигаться серводвигатель хвата
// в зависимости от того, зажат хват или нет.
// Значения, которые надо задать в этих переменных,
// очень сильно зависят от того, как вы собрали MeArm:
var hand_on = 0.15;
var hand_off = -0.2;

// При инициализации серводвигатели MeARm
// встанут в заданные здесь позиции по умолчанию:
function onInit() {
  servos.shoulder.goto(-0.5);
  servos.elbow.goto(0);
  servos.base.goto(0);
  clenched = false;
  servos.hand.goto(hand_off);
}

/* Это вторая заскриптованная последовательность действий.
   Её можно назвать «захват предмета».
   Основа останется неподвижна, но сама рука:
     - Встанет на стартовую позицию с открытым хватом
     - Протянется к цели
     - Закроет хват
     - Вернётся к стартовой позиции
     - Откроет хват
*/
function doGrab() {
  servos.shoulder.goto(-0.5);
  servos.elbow.goto(0);
  servos.hand.goto(hand_off);
  setTimeout(function() {
    servos.shoulder.goto(-1);
    servos.elbow.goto(-0.4);
    setTimeout(function() {
      servos.hand.goto(hand_on);
      setTimeout(function() {
        servos.shoulder.goto(-0.5);
        servos.elbow.goto(0);
        setTimeout(function() {
          servos.hand.goto(hand_off);
        }, 800);
      }, 500);
    }, 800);
  }, 800);
}

/* Поскольку ИК-приёмник подключен напрямую к трём GPIO-контактам,
   здесь мы настраиваем их, чтобы подать на них необходимое питание */
A1.write(1);
A0.write(0);

/* Настраиваем ИК-приёмник. 
   Коды, заданные здесь – это коды от моего пульта управления.
   Поэтому вам надо будет вписать здесь коды от вашего пульта,
   полученные при помощи функции print("Unknown "+code) ниже. */
require("IRReceiver").connect(C3, function(code) {
  switch (code) {
    // Включение/выключение:
    case "111100000111000000100000010111111": onInit(); break;
    // Меню (запускает серию движений «захват предмета»):
    case "111100000111000000101100010100111": doGrab(); break; 
    // Канал+ :
    case "111100000111000000100100010110111": servos.elbow.move(0.1); break;
    // Канал- :
    case "111100000111000000000100011110111": servos.elbow.move(-0.1); break;
    // Влево:
    case "111100000111000001010011001011001": servos.base.move(-0.1); break;
    // Вправо:
    case "111100000111000000100011010111001": servos.base.move(0.1); break;
    // Вверх:
    case "111100000111000000000011011111001": servos.shoulder.move(0.1); break;
    // Вниз:
    case "111100000111000001000011001111001": servos.shoulder.move(-0.1); break;
    // Ок:
    case "111100000111000000001011011101001": clenched = !clenched; 
                     servos.hand.goto(clenched ? hand_on : hand_off); break;
    default: print("Unknown "+code);
  }
});

// Наконец, инициализация:
onInit();

См.также

Внешние ссылки