Espruino:Примеры/Роборука MeArm: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...») |
Нет описания правки |
||
(не показано 5 промежуточных версий 2 участников) | |||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=<ref>[ www.espruino.com - ]</ref>= | =Роборука MeArm<ref>[https://www.espruino.com/MeArm www.espruino.com - ]</ref>= | ||
[https://www.youtube.com/watch?v=WRMF7wJ57Ak MeArm and Espruino - Remote Controlled Robot Arm] | |||
[[MeArm]] – это маленький, дешёвый набор для сборки робо-руки, выпускаемый компанией [[Phenoptix]] и разработанный Беном Греем. В нём используются серводвигатели и панели из акрилового стекла, вырезанные с помощью лазерной резки. | |||
В этом руководстве мы расскажем, подсоединить компоненты набора друг к другу, а также о том, как настроить управление этой робо-рукой при помощи пульта дистанционного ИК-управления. | |||
== Нам понадобятся == | |||
* [https://www.espruino.com/Original Плата Espruino], подключенная к [https://www.espruino.com/Servo+Motors серводвигателям] | |||
* [https://www.espruino.com/IRReceiver ИК-приёмник] | |||
* Дистанционный пульт ИК-управления телевизором | |||
* [https://mearm.com/products/mearm-pocket-sized-robot-arm/ Набор MeArm от Phenoptix]. Или же вы можете сами вырезать части набора при помощи [https://www.thingiverse.com/thing:360108 вот этого файла] | |||
== Подсоединение == | |||
Подключите серводвигатели к гребешковым контактам на [[Espruino]]: | |||
{| class="wikitable" | |||
|- | |||
! Контакт !! Серводвигатель | |||
|- | |||
| B15 || «Плечо» робо-руки | |||
|- | |||
| B14 || «Предплечье» робо-руки | |||
|- | |||
| C6 || Основа | |||
|- | |||
| C7 || Хват | |||
|} | |||
И также подключите [[ИК-приёмник]] напрямую к плате: | |||
{| class="wikitable" | |||
|- | |||
! Контакт !! ИК-приёмник | |||
|- | |||
| A1 || VCC | |||
|- | |||
| A0 || GND | |||
|- | |||
| C3 || Сигнал | |||
|} | |||
== Код == | |||
Просто скопируйте и вставьте код ниже в правую часть [[Web IDE]] и кликните на кнопку загрузки кода. | |||
Мы добавили в код комментарии, чтобы вы лучше понимали, как он работает. Но вряд ли у вас будет такой же пульт управления, как у нас, поэтому если вы нажмёте на своём пульте какую-нибудь кнопку, [[Espruino]] напечатает ''«Unknown 12345789»'' (или вроде того). Понажимайте на разные кнопки пульта, скопируйте числа, появляющиеся после нажатия на каждую кнопку, и вставьте их в код вместо тех, что там уже есть. | |||
<syntaxhighlight lang="javascript"> | |||
// Контакты, к которым подключены серводвигатели: | |||
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(); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=См.также= | =См.также= | ||
=Внешние ссылки= | =Внешние ссылки= | ||
Строка 19: | Строка 173: | ||
<references /> | <references /> | ||
{{Навигационная таблица/Espruino | {{Навигационная таблица/Портал/Espruino}} | ||
Текущая версия от 15:07, 20 мая 2023
Роборука 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();
См.также
Внешние ссылки