Pull to refresh

Трех-степенной манипулятор на Arduino

Developing for Arduino *
Множество интересных статей имеется про платформу Arduino, которую можно смело заказать на интернет аукционе Ebay. К данной платформе имеется множество модулей и статей в интернете, поэтому захотелось сделать что-то интересное, пусть и не всегда полезное в быту.
image


По работе имеется опыт управления платформами с различными степенями свободы, поэтому первым делом захотелось сделать шести-степенную платформу (Stewart Platform), но к сожалению пришло только четыре серво привода, поэтому для начала сделаем трех-степенную платформу.

Инструменты и материалы


Итак для построения данного агрегата нам понадобятся следующие комплектующие:
Найменование Количество
Arduino Mega 1 шт.
Сервопривод HXT900 3 шт.
Фанера 1 шт.
Стабилизатор напряжения на 5В 1 шт.
Скрепка канцелярская 3 шт.
Крепление для провода 3 шт.
USB Шнур 1 шт.
Блок питания 1 шт.
Соединительные провода 13 шт.
Стиракозавр 1 шт.


Стоимость платы и контроллера Arduino Mega Kit на аукционе колеблется от $50. С покупкой сервоприводов из Китая тоже не должно возникнуть проблем, стоимость одной штуки около $2. Фанеру можно найти на даче или в магазине. Три скрепки на работе. Самое сложное добыть стиракозавра, обычно данные вид животных можно увидеть на почте или в детском магазине.

Изготовление платформы


Основная задача изготовления платформы заключается в выпиливании основания платформы и самой платформы из фанеры. Управляющие элементы размещаются внутри окружности под углами 120 градусов.

1 Шаг — Выпиливание

Выпиливание основания платформы размером 10x10 см, а также самой платформы размером 8x8 см. Саму платформу можно оставить квадратной, но для удобства был выпилен треугольник. В месте крепления опор сделаны спилы.

2 Шаг — Сверление

Для сверления первоначально необходимо прочертить окружность, разделенную на три части. В лучах под 120 градусов необходимо приложить сервоприводы, а также разметить точки для сверления.

По готовой разметке высверлить отверстия в зависимости от способа крепления. Для крепления жгутами (наилучший вариант) отверстия должны быть диаметром 4 мм. В случае крепления проволокой (как в моем случае) хватит отверстий диаметром 2 мм.

3 Шаг — Подготовка креплений

Для крепления не нашлось ничего кроме скрепок (уже после демонстрации на работе был предложен другой вариант). Скрепки необходимо сделать в виде буквы «Г», которая закрепляется на сервоприводе, и вставляется в крепление на площадке платформы.

На работе мне предложили вместо скрепок использовать шаровое крепление от вертолета Trex 450 (уже заказано из Китая). С данным типом креплений платформа будет более жесткой в конструкции.

4 Шаг — Сборка платформы

Сборка платформы осуществляется в следующей последовательности:
  • продевание поволоки в основание платформы;
  • крепление сервоприводов на основании;
  • установка креплений для проводов на площадку платформы;
  • установка креплений в виде буквы «Г» на сервоприводы.


Итоги

В итоге получается основание платформы, представленное на рисунке ниже. Время выполнения 1 час.
image

Сборка схемы


Для подключения первоначально был использован способ, описанный в официальной документации на сайте Arduino. При подключении нескольких сервоприводов питания не хватит, поэтому желательно «запитать» три привода отдельно через стабилизатор напряжения на 5В (подробное описание подключения).

В случае подключения трех сервоприводов на Arduino питания будет не хватать и будет срабатывать защита. Подключение трех приводов через стабилизатор на макетной плате представлено на рисунке ниже:
image

Управление из Arduino будет осуществляться с помощью 1, 2, 3 аналоговых выходов (Analog Pins) с платы. В моем случае питание также подключено с платы. Пример подключения показан на рисунке:
image
, где слева направо: синий — 5В, желтый — «земля», красный — привод 1, черный — привод 2, желтый привод 3.

Вся схема подключения имеет вид:
image

Программирование Arduino


Управление платформой осуществляется с компьютера через последовательный порт, предоставляемый Arduino. Работа с портом осуществляется средствами библиотеки Serial, а управление сервоприводами средствами библиотеки SoftwareServo.

Для разбора команды из последовательного порта используется следующая структура на языке Си:
struct _set_pos_cmd_t
{
 char cmd;
 int pos1;
 int pos2;
 int pos3;
};

typedef _set_pos_cmd_t set_pos_cmd_t;


* This source code was highlighted with Source Code Highlighter.


Соответственно указываются три позиции в целочисленном виде. Также указывается байт команды, в нашем случае команда записи позиций в контроллер имеет код 0xC1.

Установка позиций сервоприводов осуществляется с помощью функции update_positions, которая отображает значения из команды в значения угла поворота вала сервопривода.
void update_positions()
{
  int val = map(servo_position1, VALUE_MINIMUM, VALUE_MAXIMUM, SERVO_MINIMUM, SERVO_MAXIMUM);
  myservo1.write(val);
  val = map(servo_position2, VALUE_MINIMUM, VALUE_MAXIMUM, SERVO_MINIMUM, SERVO_MAXIMUM);
  myservo2.write(val);
  val = map(servo_position3, VALUE_MINIMUM, VALUE_MAXIMUM, SERVO_MINIMUM, SERVO_MAXIMUM);
  myservo3.write(val);
 delay(5);
 SoftwareServo::refresh();
}


* This source code was highlighted with Source Code Highlighter.


Итоговая программа для Arduino

  1. #include <SoftwareServo.h>
  2.  
  3. #define SET_CMD    0xC1
  4.  
  5. #define COMMAND_ERROR 0x01
  6. #define FORMAT_ERROR  0x02
  7.  
  8. #define VALUE_MINIMUM 0
  9. #define VALUE_MAXIMUM 4096
  10.  
  11. #define SERVO_MINIMUM 0
  12. #define SERVO_MAXIMUM 90
  13.  
  14. SoftwareServo myservo1;
  15. SoftwareServo myservo2;
  16. SoftwareServo myservo3;
  17.  
  18. int servo_position1 = 0;
  19. int servo_position2 = 0;
  20. int servo_position3 = 0;
  21.  
  22. struct _set_pos_cmd_t
  23. {
  24.  char cmd;
  25.  int pos1;
  26.  int pos2;
  27.  int pos3;
  28. };
  29.  
  30. typedef _set_pos_cmd_t set_pos_cmd_t;
  31.  
  32. void setup()
  33. {
  34.  pinMode(13, OUTPUT);
  35.  myservo1.attach(A0);
  36.  myservo2.attach(A1);
  37.  myservo3.attach(A2);
  38.  Serial.begin(115200);
  39. }
  40.  
  41. boolean readBytes(char *bytes, int count)
  42. {
  43.  char data;
  44.  
  45.  for(int counter = 0; counter < count; ++counter)
  46.  {
  47.   data = Serial.read();
  48.   bytes[counter] = data;
  49.  }
  50.  
  51.  Serial.flush();
  52.  
  53.  return true;
  54. }
  55.  
  56. void set_positions(char *data)
  57. {
  58.   set_pos_cmd_t *command = (set_pos_cmd_t*)data;
  59.  
  60.   servo_position1 = command->pos1;
  61.   servo_position2 = command->pos2;
  62.   servo_position3 = command->pos3;
  63. }
  64.  
  65. void update_positions()
  66. {
  67.   int val = map(servo_position1, VALUE_MINIMUM, VALUE_MAXIMUM, SERVO_MINIMUM, SERVO_MAXIMUM);  
  68.   myservo1.write(val);
  69.   val = map(servo_position2, VALUE_MINIMUM, VALUE_MAXIMUM, SERVO_MINIMUM, SERVO_MAXIMUM);
  70.   myservo2.write(val);
  71.   val = map(servo_position3, VALUE_MINIMUM, VALUE_MAXIMUM, SERVO_MINIMUM, SERVO_MAXIMUM);
  72.   myservo3.write(val);
  73.   delay(5);        
  74.   SoftwareServo::refresh();
  75. }
  76.  
  77. void loop()
  78. {
  79.  int availableBytes = 0;
  80.  char buffer[128];
  81.  
  82.  if((availableBytes = Serial.available()) > 0)
  83.  {
  84.   if(!readBytes(buffer, availableBytes))
  85.   {
  86.    Serial.write(FORMAT_ERROR);
  87.   }
  88.   
  89.   switch(buffer[0])
  90.   {
  91.    case SET_CMD:
  92.     set_positions(buffer);
  93.     Serial.write(0xDA);
  94.     break;
  95.   } 
  96.  }
  97.  
  98.  update_positions();
  99. }
* This source code was highlighted with Source Code Highlighter.


Программа управления


Программа управления трехстепенной платформой написана на языке C#, которая в первоначальном виде имела упрощенный вид:
image

Последняя версия программы управления платформой приняла вид:
image

UPD:исходный код класса управления

Видео реализации




Спасибо за внимание!

Tags:
Hubs:
Total votes 34: ↑30 and ↓4 +26
Views 20K
Comments Comments 29