Сборка HEXAPOD. Электроника + Калибровка

Установка и подключение электроники HEXAPOD, является заключительным этапом сборки.

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

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека iarduino_MultiServo (для работы с Multi Servo Shield).
  • Библиотека iarduino_Hexapod (для работы с Hexapod).
  • Библиотека iarduino_IR (для работы с ИК приёмником).
  • Библиотека EEPROM (для работы с EEPROM) входит в стандартный набор

Видео:


Схема подключения:

Сначала нужно закрепить arduino Uno, при помощи крепежей, на Hexapod. Далее на arduino Uno устанавливается servo shield, к которому подключаются выводы сервоприводов. Далее, через контактные колодки, на servo shield устанавливается trema shield, к которому подключаются trema кнопки, trema светодиод и trema ИК-приёмник.

Модули Arduino
Кнопка A 2 (можно изменить)
Кнопка B 3 (можно изменить)
Светодиод 4 (можно изменить)
ИК-приёмник 7 (можно изменить)
Сервоприводы Servo Shield
1 конечность Горизонтальный сустав 0 (можно изменить)
Вертикальный сустав 1 (можно изменить)
2 конечность Горизонтальный сустав 2 (можно изменить)
Вертикальный сустав 3 (можно изменить)
3 конечность Горизонтальный сустав 4 (можно изменить)
Вертикальный сустав 5 (можно изменить)
4 конечность Горизонтальный сустав 6 (можно изменить)
Вертикальный сустав 7 (можно изменить)
5 конечность Горизонтальный сустав 8 (можно изменить)
Вертикальный сустав 9 (можно изменить)
6 конечность Горизонтальный сустав 10 (можно изменить)
Вертикальный сустав 11 (можно изменить)
  • Выводы кнопок и светодиода можно изменить на любые цифровые, указав их при объявлении переменной IXP:
iarduino_Hexapod IXP(кнопка_A, кнопка_B, светодиод);
  • Вывод ИК-приёмника можно изменить на любой цифровой, указав его при объявлении переменной IR:
iarduino_IR_RX IR(вывод_ИК_приёмника);
  • Выводы сервоприводов можно изменить на любые из 16 доступных на servo shield, указав их в файле: Servo.h библиотеки iarduino_Hexapod.

Схема паука на Arduino Uno - Hexapod

Питание:

У Servo Shield имеется два питания: логическая часть запитывается от arduino, через выводы 5V (можно поменять на 3V3) и GND, а силовая часть Servo Shield запитывается отдельно, через выводы V+ и GND напряжением 5В постоянного тока до 2А (зелёный клеммник). Так как силовая часть Servo Shield потребляет значительные токи, она требует отдельного источника питания. Не запитывайте силовую часть Servo Shield от выхода 5V arduino.

Рекомендуем запитывать hexapod от источника питания 7...12В, подключив arduino к источнику напрямую (вывод Vin), а силовую часть Servo shield через понижающий преобразователь 5В 3А.

Код программы:

// Подключаем библиотеки:
#include <EEPROM.h>                     //  Подключаем библиотеку для работы с EEPROM
#include <iarduino_MultiServo.h>        //  Подключаем библиотеку для работы с Multi Servo Shield
#include <iarduino_Hexapod.h>           //  Подключаем библиотеку для работы с HEXAPOD
#include <iarduino_IR_RX.h>             //  Подключаем библиотеку для работы с ИК приёмником
// Объявляем переменные и константы:
iarduino_Hexapod IXP(2,3,4);            //  Объявляем объект IXP, для работы с HEXAPOD       (номера цифровых выводов к которым подключены: кнопка A, кнопка B, светодиод)
iarduino_IR_RX   IR (7);                //  Объявляем объект IR,  для работы с ИК приёмником (номер  цифрового вывода к которому подключён ИК приёмник)
int              command  = COM_EMPTY;  //  Номер команды
int              parametr = COM_EMPTY;  //  Значение параметра команды
int              height   = 0;          //  Высота HEXAPOD, от -10 до 10
unsigned long    count_ms = 0;          //  Время поступления последней команды
void setup(){
   IXP.begin(SERVO_SG90);               //  Инициируем HEXAPOD
   IR.begin();                          //  Инициируем ИК приёмник
// IXP.calibration_reset();             //  Удаление ранее сохранённых параметров калибровки
}
void loop(){
//ПРИНИМАЕМ КОМАНДЫ
  if(IR.check(true)){   // если принят пакет с пульта (включая пакеты повторов)
    count_ms=millis();  // фиксируем время получения пакета
    switch(IR.data){    // проверяем какая кнопка пульта нажата
    /* CH-  = спать     */ case 0xFFA25D: command=COM_SLEEP;     parametr=COM_EMPTY;                break;
    /* CH   = рост +    */ case 0xFF629D: height++; if(height> 10){height= 10;} if(height>0){command=COM_UP; parametr=height;}else{command=COM_LAY; parametr=-height;} delay(100); break;
    /* CH+  = рост -    */ case 0xFFE21D: height--; if(height<-10){height=-10;} if(height>0){command=COM_UP; parametr=height;}else{command=COM_LAY; parametr=-height;} delay(100); break;
    /* <<   = идти ^ <  */ case 0xFF22DD: command=GO_ON_LEFT;    parametr=COM_EMPTY;                break;
    /* >>   = идти ^    */ case 0xFF02FD: command=GO_ON;         parametr=COM_EMPTY;                break;
    /* >||  = идти ^ >  */ case 0xFFC23D: command=GO_ON_RIGHT;   parametr=COM_EMPTY;                break;
    /* -    = идти   <  */ case 0xFFE01F: command=GO_LEFT;       parametr=COM_EMPTY;                break;
    /* +    = стоп      */ case 0xFFA857: command=COM_STOP;      parametr=COM_EMPTY;                break;
    /* EQ   = идти   >  */ case 0xFF906F: command=GO_RIGHT;      parametr=COM_EMPTY;                break;
    /* 0    = идти V <  */ case 0xFF6897: command=GO_BACK_LEFT;  parametr=COM_EMPTY;                break;
    /* 100+ = идти V    */ case 0xFF9867: command=GO_BACK;       parametr=COM_EMPTY;                break;
    /* 200+ = идти V >  */ case 0xFFB04F: command=GO_BACK_RIGHT; parametr=COM_EMPTY;                break;
    /* 1    = тест      */ case 0xFF30CF: command=COM_TEST;      parametr=COM_EMPTY;                break;
    /* 2    = встать    */ case 0xFF18E7: command=COM_UP;        parametr=10;        height= 10;    break;
    /* 3    = лежать    */ case 0xFF7A85: command=COM_LAY;       parametr=10;        height=-10;    break;
    /* 4    = сидеть    */ case 0xFF10EF: command=COM_SIT;       parametr=COM_EMPTY;                break;
    /* 5    = поклон    */ case 0xFF38C7: command=COM_NOD;       parametr=COM_EMPTY;                break;
    /* 6    = плав.брас */ case 0xFF5AA5: command=COM_EMPTY;     parametr=COM_EMPTY; IXP.walking=0; break;
    /* 7    = походка 1 */ case 0xFF42BD: command=COM_EMPTY;     parametr=COM_EMPTY; IXP.walking=1; break;
    /* 8    = походка 2 */ case 0xFF4AB5: command=COM_EMPTY;     parametr=COM_EMPTY; IXP.walking=2; break;
    /* 9    = походка 3 */ case 0xFF52AD: command=COM_EMPTY;     parametr=COM_EMPTY; IXP.walking=3; break;
    }
  }
//ВЫПОЛНЯЕМ КОМАНДЫ
  IXP.go(command,parametr);                                         // выполняем движение
//ОТМЕНЯЕМ КОМАНДЫ
  if(count_ms>millis()){count_ms=0;}                                // произошло переполнение millis()
  if(count_ms+250<millis()){command=COM_EMPTY; parametr=COM_EMPTY;} // стираем предыдущую команду, через 250мс после её поступления (останавливаем HEXAPOD, если не нажаты кнопки пульта)
//КАЛИБРОВКА
  IXP.calibration();                                                // калибровка суставов конечностей
}

Функции библиотеки iarduino_Hexapod:


Функция begin();
  • Назначение: Инициализация Hexapod.
  • Синтаксис: begin(тип_сервоприводов);
  • Параметры: SERVO_SG90, или SERVO_MG90, или SERVO_MG996R, или SERVO_FutabaS3003
  • Возвращаемые значения: Нет.
  • Примечание: Вызывается 1 раз в коде setup.
  • Пример:
IXP.begin(SERVO_SG90);        // Инициируем HEXAPOD собранный на сервоприводах SG90
IXP.begin(SERVO_FutabaS3003); // Инициируем HEXAPOD собранный на сервоприводах Futaba S3003
Функция go();
  • Назначение: Движение Hexapod.
  • Синтаксис:
    • 1 вариант: go(X , Y , Z );
    • 2 вариант: go(команда , параметр_команды);
  • Параметры:
    • X: от -10 (влево) до +10 (вправо).
    • Y: от -10 (назад) до +10 (вперёд). - необязательный параметр
    • Z: от -10 (вниз) до +10 (вверх). - необязательный параметр
    • команда:
      • GO_ON - движение вперед.
      • GO_BACK - движение назад.
      • GO_LEFT - поворот влево.
      • GO_RIGHT - поворот вправо.
      • GO_ON_LEFT - движение вперед и поворот влево.
      • GO_ON_RIGHT - движение вперед и поворот вправо.
      • GO_BACK_LEFT - движение назад и поворот влево.
      • GO_BACK_RIGHT - движение назад и поворот вправо.
      • COM_STOP - команда стоп.
      • COM_SIT - команда сидеть.
      • COM_NOD - команда поклон.
      • COM_UP - команда встать.
      • COM_LAY - команда лежать.
      • COM_TEST - команда тест.
      • COM_SLEEP - команда спать.
      • COM_EMPTY - команда пустая.
    • параметр_команды: значение от 0 до 10 определяющее скорость или уровень. - необязательный параметр
  • Возвращаемые значения: Нет.
  • Пример:
IXP.go( 0 , 5 , 0 );     // HEXAPOD движется прямо со средней скоростью
IXP.go( 0 , 10, 0 );     // HEXAPOD движется прямо с максимальной скоростью
IXP.go( 0 ,-1 , 0 );     // HEXAPOD движется назад с минимальной скоростью
IXP.go(-5 , 5 , 0 );     // HEXAPOD движется вперед и влево со средней скоростью
IXP.go( 5 , 5 , 10);     // HEXAPOD движется вперед и вправо со средней скоростью, максимально поднявшись над землёй
IXP.go(-1 ,-1 ,-10);     // HEXAPOD движется назад и влево с минимальной скоростью, максимально прижавшись к земле
IXP.go(GO_ON);           // HEXAPOD движется вперед
IXP.go(GO_ON, 10);       // HEXAPOD движется вперед с максимальной скоростью
IXP.go(GO_BACK_RIGHT)    // HEXAPOD движется назад и вправо
IXP.go(GO_BACK_RIGHT, 1) // HEXAPOD движется назад и вправо с минимальной скоростью
IXP.go(COM_TEST)         // HEXAPOD выполняет команду «тест»
Функция set_motion();
  • Назначение: Движение конечностями Hexapod.
  • Синтаксис: set_motion(№_конечности , №_сустава , положение_сустава);
  • Параметры:
    • №_конечности: от 1 до 6 или SERVO_ALL для всех конечностей сразу.
    • №_сустава: 1 (вертикальный), или 2 (горизонтальный).
    • положение_сустава: от 0 (внизу или сзади) до 100 (вверху или спереди) или SERVO_FREE (отключить сервопривод).
  • Возвращаемые значения: Нет.
  • Пример:
IXP.set_motion(4, 1, 0  ); // HEXAPOD опускает      4 конечность
IXP.set_motion(4, 1, 50 ); // HEXAPOD устанавливает 4 конечность в центральное положение по вертикали
IXP.set_motion(4, 1, 100); // HEXAPOD поднимает     4 конечность
IXP.set_motion(5, 2, 0  ); // HEXAPOD отодвигает    5 конечность назад
IXP.set_motion(5, 2, 50 ); // HEXAPOD отодвигает    5 конечность в центральное положение по горизонтали
IXP.set_motion(5, 2, 100); // HEXAPOD отодвигает    5 конечность вперёд
IXP.set_motion(SERVO_ALL, 1, 100); // HEXAPOD поднимет все конечности
IXP.set_motion(SERVO_ALL, 1, SERVO_FREE); // HEXAPOD отключит сервоприводы от всех вертикальных суставов
IXP.set_motion(3, 2, SERVO_FREE); // HEXAPOD отключит сервопривод от горизонтального сустава 3 конечности
Функция set_motionA();
  • Назначение: Движение конечностями Hexapod по градусу.
  • Синтаксис: set_motionA(№_конечности , градус_движения);
  • Параметры:
    • №_конечности: от 1 до 6 или SERVO_ALL для всех конечностей сразу
    • градус_движения: от 1 до 360 см. примечание
  • Возвращаемые значения: Нет.
  • Примечание: Представьте себе, как движется конечность? Она повторяет одни и те же движения (иногда с разным размахом): проходит внизу спереди назад, поднимается вверх, сверху быстрее проходит вперёд, опускается вниз, и всё повторяется. Если представить весь этот круг в виде 360°, то каждое положение конечности, можно представить числом от 1 до 360, это и есть градус_движения.
  • Пример:
for(int i=1; i<=360 i++){  // увеличиваем переменную i от 1 до 360
  IXP.set_motionA(6, i);   // устанавливаем для 6 конечности угол равный значению i
}                          // 6 конечность совершит круговое движение и вернётся в начальную точку
Функция calibration();
  • Назначение: калибровка суставов конечностей Hexapod.
  • Синтаксис: calibration();
  • Параметры: Нет.
  • Возвращаемые значения: Нет.
  • Примечание: Вызывается 1 раз в коде loop. Сама перехватывает нажатие кнопок A и B
  • Пример:
loop(){
  ...
  IXP.calibration();  // функция сможет перехватывать нажатие кнопок A и B для запуска процедуры калибровки
  ...
}

В библиотеке доступна 1 переменная: uint8_t walking, определяющая тип походки (по умолчанию = 2).

  • 0 - все конечности движутся одинаково, похоже на плавание брасом
  • 1 - конечности движутся с задержкой на 1/6 в следующем порядке: 1,2,3,4,5,6
  • 2 - конечности движутся с задержкой на 1/6 в следующем порядке: 1,3,5,2,4,6
  • 3 - конечности движутся с задержкой на 1/6 в следующем порядке: 1,4,5,2,3,6

Присвойте значение данной переменной и заставьте пойти Hexapod вызвав функцию go(); для просмотра отличий в его походке.

Калибровка:

Так как невозможно установить сервоприводы идеально по центру суставов конечностей, в библиотеке iarduino_Hexapod реализована функция calibration(), которая указывается в коде loop. Эта функция перехватывает нажатие на кнопки A и B, и выполняет процесс калибровки, позволяя сохранить реальное центральное положение суставов в энергонезависимую память EEPROM.

Если калибровка ни разу не производилась, то Hexapod не будет реагировать на команды, а светодиод будет постоянно гореть.

  • Нажмите и удерживайте обе кнопки A и B:
      Hexapod перейдёт в режим установки вертикальных суставов:
    • Все суставы отключены (горизонтальные и вертикальные).
      (светодиод равномерно мигает 1 раз в секунду)
    • Однократное нажатие на кнопку A приведет к поднятию всех вертикальных суставов.
      (светодиод учащённо мигает)
    • Однократное нажатие на кнопку B приведет к отключению всех вертикальных суставов.
      (светодиод равномерно мигает 1 раз в секунду)
    • Нажатие и удержание обеих кнопок A и B приведёт к выходу из данного режима.
  • Отсоедините все вертикальные суставы от сервоприводов.
  • Нажмите и отпустите кнопку A. Вы услышите как все сервоприводы повернутся.
  • Закрепите все вертикальные суставы к сервоприводам, так что бы они оказались в крайнем верхнем положении.
  • Нажмите и удерживайте обе кнопки A и B:
      Hexapod перейдёт в режим центрирования вертикальных суставов:
    • Все горизонтальные суставы отключены, а вертикальные сдвинутся в условно центральное положение.
      (светодиод кратковременно загорается после длительной паузы)
    • Однократное нажатие на кнопку A приведет к поднятию центрируемого вертикального сустава.
      (светодиод кратковременно загорается после небольшой паузы)
    • Однократное нажатие на кнопку B приведет к опусканию центрируемого вертикального сустава.
      (светодиод кратковременно загорается после небольшой паузы)
    • Удержание кнопки A приведет к переходу центрирования следующей конечности
    • Удержание кнопки B приведет к переходу центрирования предыдущей конечности
    • Нажатие и удержание обеих кнопок A и B приведёт к выходу из данного режима.
  • Нажмите и удерживайте кнопку A или B. Одна из конечностей поднимется вверх и опустится при отпускании кнопки.
  • Нажатием кнопок A или B, установите эту конечность в центральное положение по вертикали.
  • Повторите два предыдущих шага для каждой конечности. Пока Hexapod не будет находиться параллельно поверхности.
  • Нажмите и удерживайте обе кнопки A и B:
      Hexapod перейдёт в режим центрирования горизонтальных суставов:
    • Все горизонтальные суставы отключены, а вертикальные сдвинутся вниз.
      (светодиод долго горит с кратковременными паузами)
    • Однократное нажатие на кнопку A приведет к повороту центрируемого горизонтального сустава вперед.
      (светодиод горит с кратковременными паузами)
    • Однократное нажатие на кнопку B приведет к повороту центрируемого горизонтального сустава назад.
      (светодиод горит с кратковременными паузами)
    • Удержание кнопки A приведет к переходу центрирования следующей конечности
    • Удержание кнопки B приведет к переходу центрирования предыдущей конечности
    • Нажатие и удержание обеих кнопок A и B приведёт к выходу из данного режима.
  • Нажмите и удерживайте кнопку A или B. Одна из конечностей поднимется вверх.
  • Нажатием кнопок A или B, установите конечность в центральное положение по горизонтали.
  • Повторите два предыдущих шага для каждой конечности. Пока все конечности не окажутся параллельными.
  • Нажмите и удерживайте обе кнопки A и B:
      Hexapod перейдёт в режим тестирования:
    • Данный режим является автоматическим и не требует вмешательств.
      (светодиод непрерывно горит)
    • По окончании тестирования Hexapod выйдет из режима калибровки.
      (светодиод не горит)
  • Теперь Hexapod готов выполнять команды.

После того как калибровка произведена, можно объявлять переменную IXP без параметров (без выводов к которым подключены кнопки и светодиод), а сами кнопки и светодиод, исключить из схемы. Саму же функцию calibration() можно закомментировать или удалить из кода loop.


Обсуждение

Присоединяйся

На главную