Espruino:Примеры/Роборука MeArm: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
(Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighlig...»)
 
Нет описания правки
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


=<ref>[ www.espruino.com - ]</ref>=
=Роборука MeArm<ref>[https://www.espruino.com/MeArm www.espruino.com - ]</ref>=


[Видео]


[[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:
Контакт
Серводвигатель
B15
«Плечо» робо-руки
B14
«Предплечье» робо-руки
C6
Основа
C7
Хват
И также подключите ИК-приёмник напрямую к плате:
Контакт
ИК-приёмник
A1
VCC
A0
GND
C3
Сигнал
== Код ==
Просто скопируйте и вставьте код ниже в правую часть [[Web IDE]] и кликните на кнопку загрузки кода.
Мы добавили в код комментарии, чтобы вы лучше понимали, как он работает. Но вряд ли у вас будет такой же пульт управления, как у нас, поэтому если вы нажмёте на своём пульте какую-нибудь кнопку, [[Espruino]] напечатает ''«Unknown 12345789»'' (или вроде того). Понажимайте на разные кнопки пульта, скопируйте числа, появляющиеся после нажатия на каждую кнопку, и вставьте их в код вместо тех, что там уже есть.


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript" enclose="div">
// Контакты, к которым подключены серводвигатели:
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>



Версия от 18:35, 7 июля 2021

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


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

[Видео]

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();

См.также

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