В этой статье мы рассмотрим создание на основе платы Arduino и гироскопа MPU-6050 специального "наперстка" (наконечника, одеваемого на палец), с помощью которого можно будет управлять движениями указателя мыши на экране компьютера.
В некотором плане данный проект похож на проект виртуальной реальности на основе платы Arduino, рассмотренный ранее на нашем сайте. Также на нашем сайте вы можете посмотреть другие проекты, в которых был использован гироскоп MPU-6050:
- подключение гироскопа MPU6050 к Arduino;
- измеритель уровня (уклономер) на основе Arduino и MPU6050;
- самобалансирующийся робот на Arduino Uno;
- управляемая жестами роботизированная рука на Arduino.
Необходимые компоненты
- Плата Arduino Micro (купить на AliExpress).
- Гироскоп MPU-6050 (купить на AliExpress).
- Джампер (для соединения Arduino и MPU-6050).
- Эластичная лента (если хотите более плотно закрепить устройство на пальце).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема "наперстка" на основе платы Arduino для управления мышкой компьютера представлена на следующем рисунке.
В схеме необходимо сделать следующие соединения между гироскопом MPU-6050 и платой Arduino:
- контакт VCC платы Arduino – к контакту VCC гироскопа;
- контакт GND платы Arduino – к контакту GND гироскопа;
- контакт 2 платы Arduino – к контакту SDA гироскопа;
- контакт 3 платы Arduino – к контакту SCL гироскопа.
Печать на 3D принтере компонентов проекта
Автор данного проекта изготовил две версии рассматриваемого наконечника на пальцы: одна из них изготовлена без использования 3D принтере и она получилась более громоздкой, а вторая, с использованием 3D принтера, получилась менее громоздкой и изготовлена в стиле стимпанка.
Скачать файлы для изготовления (печати) данных версий можно по следующим ссылкам:
Сборка проекта
В стиле стимпанка
В этом случае аккуратно вставьте гироскоп MPU-6050 внутрь верхнего выступа изготовленного корпуса наконечника на палец, а соединительные провода уложите в нижний выступ.
Обычная версия
В этом случае сборка проекта осуществляется аналогичным образом, то есть необходимо закрепить гироскоп MPU-6050 на последней фаланге необходимого вам пальца. Закрепить его можно с помощью самоклеющейся ленты или эластичного бинта.
Объяснение программы для Arduino и настройка проекта
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе нам необходимо подключить библиотеки, которые мы будем использовать в программе – Wire.h, I2Cdev.h, MPU6050.h и Mouse.h.
После этого вам необходимо загрузить в плату Arduino калибровочную программу, код которой приведен в конце данной статьи, одеть наше устройство на палец и открыть окно монитора последовательной связи (Ctrl + Shift + M).
После этого вы в окне монитора последовательной связи должны увидеть примерно следующую картину:
1 |
right | gx = 3165 gy = 469 gz = -1055 | ax = 15232 ay = 2064 az = -4496 |
Показанные цифры содержат информацию о направлении, в котором вы хотите двинуть указатель мыши. Вторая порция представленных цифр содержит значения, необходимые для калибровки.
После этого вам необходимо заново открыть код калибровочной программы и найти там строки, обозначенные как "// calibration line" и изменять там числовые значения до тех пор, пока вы не получите правильное направление перемещения указателя мыши. При этом каждый раз, когда вы изменяете эти числа, вы должны заново загружать код калибровочной программы в плату Arduino.
К примеру, вы видите в окне монитора последовательной связи следующую картину:
1 |
left | gx = 3165 gy = 469 gz = -1055 | ax = 5232 ay = 2064 az = -4496 |
Код в калибровочной программе:
1 2 3 |
if (ax> = 15000) { // calibration line right (); } |
Последовательный монитор говорит нам left", но мы хотим чтобы эта линия была маркирована как "right", поэтому нам необходимо изменить значение "15000" на "5000". В этом случае мы получаем уверенность в том, что обнаруженное значение переменной "ax" будет больше, чем указанное значение в коде программы. В коде калибровочной программы нужно будет изменять только числовые значения, остальное трогать не нужно.
После изменения значения в коде программы на "5000" мы получим в окне монитора последовательной связи:
1 |
right | gx = 3165 gy = 469 gz = -1055 | ax = 5232 ay = 2064 az = -4496 |
Как видите, left изменилось на right.
Код в калибровочной программе:
1 2 3 |
if (ax> = 5000) { // calibration line right (); } |
Когда все строчки в калибровочной программе, в которой настраиваются калибровочные значения (calibration lines), будут настроены, можно будет переносить эти настроенные калибровочные значения в код основной программы.
То есть если в коде калибровочной программы у нас записано:
1 2 3 |
if (ax> = 5000) { // calibration line right (); } |
А в коде основной программы
1 2 3 |
if (ax> = 15000) { // calibration line right (); } |
То в коде основной программы мы должны изменить эти строки на:
1 2 3 |
if (ax> = 5000) { // calibration line right (); } |
После этого можно будет загружать основную программу в плату Arduino.
Исходный код программы (скетча)
Код основной программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
//Code to control the mouse pointer through the movement of a finger //To calibrate the device run "ThimbleKrox calibration code" and follow the tutorial found at https://www.hackster.io/projects/dd8881/ //The lines that need to be changed for calibration have "//calibration line" //code write by Magform #include <Wire.h> #include <I2Cdev.h> #include <MPU6050.h> #include <Mouse.h> MPU6050 mpu; int16_t ax, ay, az, gx, gy, gz; int vx, vy; int sensibility=10; // измените это значение чтобы изменить чувствительность устройства void setup() { Serial.begin(9600); Wire.begin(); mpu.initialize(); if (!mpu.testConnection()) { // проверяем соединение с MPU-6050, если соединения нет, то останавливаем работу while (1); } } void up(){ Mouse.move(0, -sensibility); } void down(){ Mouse.move(0, sensibility); } void left(){ Mouse.move(-sensibility, 0); } void right(){ Mouse.move(sensibility, 0); } void loop() { mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); if(ax>=15000){ //calibration line right(); } if(ax<=-9000){ //calibration line left(); } if(ay<=-8000){ //calibration line up(); } if(ay>=10000){ //calibration line down(); } /*раскомментируйте следующие строки чтобы смоделировать нажатие правой кнопки мыши при резком движении указателя вверх и нажатие левой кнопки мыши при резком движении указателя вниз (работа над этим участком кода пока в прогрессе у автора проекта) */ /* if(gy>=20000){ //calibration line Mouse.click(MOUSE_RIGHT); delay(100); } if(gy<=-20000){ //calibration line Mouse.click(MOUSE_LEFT); delay(100); } */ delay(10); } |
Код калибровочной программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
//Code to calibrate the ThimbleKrox //To calibrate the device run this code and follow the tutorial found at https://www.hackster.io/projects/dd8881/ //The lines that need to be changed (as the other code) for calibration have "//calibration line" //code write by Magform #include <Wire.h> #include <I2Cdev.h> #include <MPU6050.h> #include <Mouse.h> MPU6050 mpu; int16_t ax, ay, az, gx, gy, gz; int vx, vy; int Nwrong=1; void setup() { Nwrong=1; Serial.begin(9600); Wire.begin(); mpu.initialize(); while(Nwrong!=0){ if (!mpu.testConnection()) { Serial.print("Wrong connection number: "); Serial.print(Nwrong); Nwrong++; delay(1000); }else{ Nwrong=0; } } } void up(){ Serial.print(" up "); } void down(){ Serial.print(" down "); } void left(){ Serial.print(" left "); } void right(){ Serial.print(" right "); } void rightclick(){ Serial.print(" RightClick ");; } void leftclick(){ Serial.print(" LeftClick ");; } void loop() { mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); if(ax>=15000){ //calibration line right(); } if(ax<=-9000){ //calibration line left(); } if(ay<=-8000){ //calibration line up(); } if(ay>=10000){ //calibration line down(); } /*раскомментируйте следующие строки чтобы смоделировать нажатие правой кнопки мыши при резком движении указателя вверх и нажатие левой кнопки мыши при резком движении указателя вниз (работа над этим участком кода пока в прогрессе у автора проекта) */ /* if(gy>=20000){ //calibration line rightclick(); delay(100); } if(gy<=-20000){ //calibration line leftclick(); delay(100); } */ Serial.print(" | gx= "); Serial.print(gx); Serial.print(" gy= "); Serial.print(gy); Serial.print(" gz= "); Serial.print(gz); Serial.print(" | ax= "); Serial.print(ax); Serial.print(" ay= "); Serial.print(ay); Serial.print(" az= "); Serial.print(az); Serial.print("\n"); delay(5000); } |
ВАу
Удалось собрать данный проект?