Espruino:Примеры/Роборука MeArm
Роборука MeArm[1]
MeArm and Espruino - Remote Controlled Robot Arm
MeArm – это маленький, дешёвый набор для сборки робо-руки, выпускаемый компанией Phenoptix и разработанный Беном Греем. В нём используются серводвигатели и панели из акрилового стекла, вырезанные с помощью лазерной резки.
В этом руководстве мы расскажем, подсоединить компоненты набора друг к другу, а также о том, как настроить управление этой робо-рукой при помощи пульта дистанционного ИК-управления.
Нам понадобятся
- Плата Espruino, подключенная к серводвигателям
- ИК-приёмник
- Дистанционный пульт ИК-управления телевизором
- Набор 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();
См.также
Внешние ссылки