Роботизированная рука, управляемая жестами рук, с использованием Arduino Nano

Роботизированная рука, управляемая жестами рук, с использованием Arduino Nano
Роботизированная рука

Robotic Arms — одно из увлекательных инженерных разработок, и всегда интересно наблюдать за тем, как эти вещи наклоняются и поворачиваются, чтобы делать сложные вещи, как это делает человеческая рука. Эти роботизированные руки можно найти в отраслях промышленности на конвейере, выполняющих интенсивные механические работы, такие как сварка, сверление, покраска и т.д. Недавно были разработаны усовершенствованные роботизированные руки с высокой точностью для выполнения сложных хирургических операций. Ранее мы печатали 3D-манипулятор с помощью робота-манипулятора и строили роботизированный манипулятор Pick and Place, используя микроконтроллер ARM. Мы снова будем использовать тот же роботизированный манипулятор с 3D-печатью для создания робота ARM с управлением жестами рук, используя Arduino Nano, MPU6050 гироскоп и гибкий датчик.

Положение робота-манипулятора с 3D-печатью контролируется через ручную перчатку, которая прикреплена к гироскопу MPU6050 и гибкому датчику. Датчик Flex используется для управления сервоприводом манипулятора Robotic Arm и MPU6050 — для перемещения робота по осям X и Y. Если у вас нет принтера, вы также можете собрать свою руку из простого картона, как мы сделали для нашего предыдущего проекта. Для вдохновения вы также можете обратиться к роботизированной руке Record and Play, которую мы создали ранее с использованием Arduino.

Прежде чем вдаваться в подробности, давайте сначала познакомимся с датчиком MPU6050 и датчиком flex sensor.

Гироскопический MPU6050 и акселерометр

MPU6050 основан на технологии микромеханических систем (MEMS). Этот датчик имеет 3х-осевой акселерометр, 3х-осевой гироскоп и встроенный датчик температуры. Его можно использовать для измерения таких параметров, как ускорение, скорость, ориентация, смещение и т.д. Мы ранее связывали MPU6050 с Arduino и Raspberry PI, а также построили несколько проектов, используя его, например: самобалансирующийся робот, цифровой транспортир Arduino и инклинометр Arduino.

Особенности датчика MPU6050:

  • Связь: протокол I2C с настраиваемым адресом I2C;
  • Входное питание: 3-5В;
  • Встроенный 16-разрядный АЦП обеспечивает высокую точность;
  • Встроенный DMP обеспечивает высокую вычислительную мощность;
  • Может использоваться для взаимодействия с другими устройствами I2C, такими как магнитометр;
  • Встроенный датчик температуры.

Распиновка MPU6050: 

Роботизированная рука, управляемая жестами рук, с использованием Arduino Nano
MPU6050
PinХарактеристики
VccОбеспечивает питание модуля от + 3В до + 5В. 
Обычно используется + 5В
GroundПодключен к заземлению системы
Serial Clock (SCL)Используется для обеспечения тактового импульса, связи I2C
Serial Data (SDA)Используется для передачи данных через связь I2C
Auxiliary Serial Data (XDA)Используется для сопряжения других модулей I2C с MPU6050
Auxiliary Serial Clock (XCL)Используется для сопряжения других модулей I2C с MPU6050
AD0Используется для изменения адреса
Interrupt (INT)Контакт прерывания, доступность данных для чтения MCU

Датчик Flex

Роботизированная рука, управляемая жестами рук, с использованием Arduino Nano

Гибкие датчики — это не что иное, как переменный резистор. Сопротивление датчика гибкости изменяется, когда датчик изгибается. Они обычно доступны в двух размерах 2,2 дюйма и 4,5 дюйма.

Почему мы используем гибкие датчики в нашем проекте?

В этом роботизированном манипуляторе, управляемом жестами, для управления захватом манипулятора робота используется гибкий датчик. Когда датчик изгиба на перчатке согнут, серводвигатель, прикрепленный к захвату, вращается, и захват открывается.

Flex-датчики могут быть полезны во многих приложениях, и мы создали несколько проектов с использованием Flex-датчиков, таких, как игровой контроллер, генератор тонов и т.д.

Роботизированная рука, управляемая жестами рук, с использованием Arduino Nano

Готовимся к 3D-печати Robotic ARM:

Роботизированная рука, управляемая жестами рук, с использованием Arduino Nano

Роботизированная рука, напечатанная на 3D-принтере, использованная в этом уроке, была сделана в соответствии с разработанным EEZYbotARM дизайном, доступным в Thingiverse. На картинке выше изображен трехмерный роботизированный манипулятор после сборки с 4 сервомоторами.

Необходимые компоненты:

  • Ардуино Нано
  • Датчик Flex
  • Резистор 10к 
  • MPU6050
  • Перчатки
  • Подключение проводов
  • Макетировать

Принципиальная электрическая схема:

Роботизированная рука, управляемая жестами рук, с использованием Arduino Nano
MPU6050Ардуино Нано
VCC+5V
FNDGND
SDAA4
SCLA5

На следующем рисунке показаны схемы соединений для робота- манипулятора, управляемого жестами на  основе Arduino .

Цепное соединение между MPU6050 и Arduino Nano:

Arduino NanoСервоприводАдаптер питания
D2Серво 1 Оранжевый (PWM Pin)
D3Серво 2 Апельсин (PWM Pin)
D4Серво 3 Апельсин (PWM Pin)
D5Серво 4 Апельсин (PWM Pin)
GNDСерво 1,2,3,4 Коричневый (GND Pin)GND
Серво 1,2,3,4 Красный (+ 5В контакт)+5V

Цепная связь между сервоприводом и Arduino Nano:

Датчик изгиба содержит два штифта. Не содержит поляризованных клемм. Таким образом, вывод P1 подключен к аналоговому выводу A0 Arduino Nano с помощью подтягивающего резистора 10 кОм, а вывод 2 P2 заземлен на Arduino.

Крепление MPU6050 и датчика гибкости к перчаткам

Мы установили MPU6050 и гибкий датчик на ручную перчатку. Здесь проводное соединение используется для соединения перчаток и роботизированной руки, но оно может быть сделано беспроводным, используя радиочастотное соединение или соединение Bluetooth.

После каждого подключения окончательная настройка Robotic Arm с управлением жестами выглядит следующим образом:

Роботизированная рука, управляемая жестами рук, с использованием Arduino Nano

Скетч на Arduino Nano для роботизированной руки

Сначала включите необходимые файлы библиотеки. Библиотека Wire.h используется для связи I2C между Arduino Nano и MPU6050 и servo.h для управления серводвигателем.

#include <Wire.h>
#include <Servo.h>

Далее объявляются объекты для класса servo. Поскольку мы используем четыре серводвигателя, создаются четыре объекта, такие как серво_1, серво_2, серво_3, серво_4

Servo servo_1;
Servo servo_2;
Servo servo_3;
Servo servo_4;

Затем объявляется адрес I2C MPU6050 и используемые переменные.

const int MPU_addr=0x68;        //MPU6050 I2C Address
int16_t axis_X,axis_Y,axis_Z;
int minVal=265;
int maxVal=402;
double x;
double y;
double z;

Далее в настройке void скорость передачи 9600 устанавливается для последовательной связи.

Serial.begin(9600);

И связь I2C между Arduino Nano и MPU6050 установлена!

servo_1.attach(2);   // Forward/Reverse_Motor
servo_2.attach(3);   // Up/Down_Motor
servo_3.attach(4);   // Gripper_Motor
servo_4.attach(5);   // Left/Right_Motor

Затем в функции void loop снова установите соединение I2C между MPU6050 и Arduino Nano, а затем начните считывать данные осей X, Y, Z из регистра MPU6050 и сохранять их в соответствующих переменных.

Wire.beginTransmission(MPU_addr);
Wire.write(0x3B);			//Start with regsiter 0x3B
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true);	//Read 14 Registers
	axis_X=Wire.read()<<8|Wire.read();
	axis_Y=Wire.read()<<8|Wire.read();
	axis_Z=Wire.read()<<8|Wire.read();

После этого отобразите минимальное и максимальное значение данных оси датчика MPU6050 в диапазоне от -90 до 90.

	int xAng = map (axis_X, minVal, maxVal, -90,90);
	int yAng = map (axis_Y, minVal, maxVal, -90,90);
	int zAng = map (axis_Z, minVal, maxVal, -90,90);

Затем используйте следующую формулу для вычисления значений x, y, z в диапазоне от 0 до 360.

	x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI);
	y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI);
	z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI);

Затем просчитайте данные аналогового выхода гибкого датчика на выводе A0 Arduino Nano и в соответствии с цифровым значением гибкого датчика установите угол сервопривода захвата. Таким образом, если данные датчика гибкости больше 750, угол серводвигателя захвата составляет 0 градусов, а если меньше 750, то он равен 180 градусам.

int gripper;
  int flex_sensorip = analogRead(A0);    
  if(flex_sensorip > 750)
        {
          gripper = 0;
        }
        else
        {
          gripper = 180;
        }
   servo_3.write(gripper);

Затем перемещение MPU6050 по оси X от 0 до 60 отображается с точки зрения от 0 до 90 градусов для движения сервомотора вперед/назад манипулятора робота.

    if(x >=0 && x <= 60)
  {
     int mov1 = map(x,0,60,0,90);
     Serial.print("Movement in F/R = ");
     Serial.print(mov1);
     Serial.println((char)176);
     servo_1.write(mov1);
  } 

А перемещение MPU6050 по оси X от 250 до 360 отображается в виде от 0 до 90 градусов для манипулятора манипулятора вверх(UP)/вниз(DOWN) серводвигателя.

else if(x >=300 && x <= 360)
  {
     int mov2 = map(x,360,250,0,90);
     Serial.print("Movement in Up/Down = ");
     Serial.print(mov2);
     Serial.println((char)176);
     servo_2.write(mov2);
  }

Перемещение MPU6050 по оси Y от 0 до 60 отображается с точки зрения 90–180 градусов для левостороннего движения сервомотора манипулятора робота.

 if(y >=0 && y <= 60)
  {
     int mov3 = map(y,0,60,90,180);
     Serial.print("Movement in Left = ");
     Serial.print(mov3);
     Serial.println((char)176);
     servo_4.write(mov3);
  }

Перемещение MPU6050 по оси Y от 300 до 360 отображается от 0 до 90 градусов для правого движения серводвигателя манипулятора.

else if(y >=300 && y <= 360)
  {
     int mov3 = map(y,360,300,90,0);
     Serial.print("Movement in Right = ");
     Serial.print(mov3);
     Serial.println((char)176);
     servo_4.write(mov3);
  }

Работа робота-манипулятора, управляемого жестами, с использованием Arduino

Наконец, загрузите код в Arduino Nano и наденьте ручную перчатку, установленную с MPU6050 & Flex Sensor.

  1. Теперь опустите руку вниз, чтобы переместить роботизированную руку вперед, и поднимитесь, чтобы переместить роботизированную руку вверх.
  2. Затем наклоните руку влево или вправо, чтобы повернуть манипулятор влево или вправо.
  3. Согните гибкий кабель, прикрепленный пальцем руки перчатки, чтобы открыть захват, а затем отпустите его, чтобы закрыть его.

Оставляйте свои комментарии если знаете как сделать все проще или лучше.

Весь скетч можете скачать по ссылке ниже:

Оставьте комментарий