Главная страница

Дипломная работа по теме создание VR-перчатки. К дипломному проект Тема Разработка универсального кистевого устройства управления


Скачать 1.31 Mb.
НазваниеК дипломному проект Тема Разработка универсального кистевого устройства управления
АнкорДипломная работа по теме создание VR-перчатки
Дата08.01.2022
Размер1.31 Mb.
Формат файлаdocx
Имя файлаDiplomnaya_rabota_Pripeka_D_I_9SK-41_18.docx
ТипДиплом
#325971
страница7 из 11
1   2   3   4   5   6   7   8   9   10   11

2.2 Питание платы


Как было описано выше питание платы, будет осуществляться последовательной сборкой аккумуляторов формата 18650, выходное напряжение с которых составляет 3.5 вольта, при последовательном соединении их выходное напряжение составит 7 вольт. Для того, чтобы микроконтроллер не сгорел при первом же включении, нужно установить стабилизатор. В данном случае подходит KF50BDT-TR, его выходное напряжение составляет 5 вольт, а выходной ток 0.5 ампера, чего более чем достаточно для питания схемы. Необходимо установить сглаживающие конденсаторы на 10 микрофарад у самого стабилизатора и на 470 нанофарад непосредственно у питания микроконтроллера. Зарядка аккумуляторов будет осуществлять модуль заряда аккумуляторов TP5100, которого более чем достаточно для зарядки аккумуляторов, без риска их перезарядки. [7]



Рисунок 20. Схема зарядки аккумуляторов

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

2.3 Интерпретатор команд устройства


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

В качестве приёма-передатчика будет использоваться Bluetooth модуль HC-05, который и используется в основном устройстве. Он выбран для хорошей совместимости между устройствами.

Идея использования интерпретатора команд возникла во время обнаружения проблем, связанных с эмуляцией последовательного порта у модуля HC-05. Так как преследуется цель удешевления и повышения функционала, введение 1 устройства, которое принимает команды и переводит их в удобный вид, для персонального компьютера на итоговую стоимость проекта не повлияет. При этом прототип можно подключить к любому компьютеру или к другому устройству.

Также рассматривалась идея включения HID-режима у модуля HC-05, но в итоге происходит значительное удорожание из-за покупки дополнительной микросхемы, которая будет интерпретировать команды последовательного порта микроконтроллера и модуля, а стоит значительно дороже Arduino Pro Micro.

Следовательно, практичнее и дешевле использовать платформу Arduino Pro Micro. Пока на данный момента нет необходимости разрабатывать другое устройство так как для управления компьютером достаточно подключить плату к компьютеру через USB-кабель и припаять модуль HC-05 к Arduino Pro Micro. Для управления беспилотниками же, будут использоваться пины с шагом 2.54 миллиметра, они будут устанавливаться на бредборд размещённом на дроне. Структурную схему можно посмотреть на рисунке 21.



Рисунок 21. Структурная схема интерпретатора команд

Была рассмотрена структурная схема интерпретатора команд.

2.4 Программирование устройства


Программная часть будет выполнена в среде разработки Arduino IDE. Так как в ходе разработки возникла необходимость внедрить интерпретатор команд для основного устройства, то и программная часть для него будет своя, но выполнена по общим принципам. Чтобы начать процесс прошивки устройств, необходимо выбрать в главном меню Tools, в контекстном меню навестись на вкладку Board, выбрать «Arduino Leonardo». Такая процедура должна проводится для обоих устройств, так как они содержат одинаковые микроконтроллеры на борту и отпадает необходимость в изменении основных настроек.

Микроконтроллер Atmega32U4 поставляется с записанным загрузчиком, облегчающим запись новых программ без использования внешних программаторов. Связь осуществляется оригинальным протоколом STK500.

Имеется возможность не использовать загрузчик и запрограммировать микроконтроллер через выводы ICSP (внутрисхемное программирование).

После написания кода он загружается в микроконтроллер при помощи утилиты Arduino IDE.

Далее мы рассмотрим некоторые фрагменты кода, необходимые для понятия структуры программы. Во-первых, для взаимосвязи наших устройств и модулей, следует установить библиотеки, некоторые из них изначально внесены в список в самом Arduino IDE, а некоторые были загружены с ресурса интернет Git-Hub.

Было решено оставить программную часть как для устройства с датчиком GY-521, так и для BNO055. Сначала будет представлен программный код для версии с датчиком GY-521.

Листинг 1.1 Объявление библиотек.

#include "I2Cdev.h"

#include "MPU6050_6Axis_MotionApps20.h"

#include "Wire.h"

#include

#include

#include

Далее обозначаются пины с которыми будет производится необходимое взаимодействие датчиков и микроконтроллера.

Листинг 1.2 Объявление используемых пинов.

int PinRed = 5;

int PinBlue = 7;

int buttonPin = 9;

int PR0 = A4;

int PR1 = A3;

int PR2 = A2;

int PR3 = A1;

int INX = A9;

int INY = A8;

Далее идёт обозначение параметров и переменных для гироскопа.

Листинг 1.3 Активация гироскопа.

MPU6050 mpu;

uint16_t packetSize;

uint16_t fifoCount;

uint8_t fifoBuffer[64];

Quaternion q;

VectorFloat gravity;

float ypr[3];

float old_mx = -200;

float old_my = -200;

float dx, dy, mx, my;

Затем происходит перевод пинов в необходимые состояния, настройка скорости шины I2C, инициализация гироскопа и установка скорости последовательного порта.

Листинг 1.4 Настройка режимов пинов и скорости работы последовательного порта.

Serial.begin(38400);

pinMode(PinRed, OUTPUT);

digitalWrite(PinRed, HIGH);

pinMode(buttonPin, INPUT);

Wire.begin();

Wire.setClock(400000);

mpu.initialize();

mpu.dmpInitialize();

mpu.setDMPEnabled(true);

packetSize = mpu.dmpGetFIFOPacketSize();

После подготовительного этапа начинается «тело» программы, часть из которого является проверка на условие соответствие как показано ниже.

Листинг 1.5 Проверка на соответствие условию.

int buttonState = digitalRead(buttonPin);

if (buttonState == HIGH) {

Serial.println('C');

}

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

Листинг 1.6 Система буферизации и фильтрации данных гироскопа.

while (fifoCount < packetSize){

fifoCount = mpu.getFIFOCount();

}

if ( fifoCount >= 1024) {

mpu.resetFIFO();

fifoCount = mpu.getFIFOCount();

} else {

while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

mpu.getFIFOBytes(fifoBuffer, packetSize);

fifoCount -= packetSize;

mpu.dmpGetQuaternion(&q, fifoBuffer);

mpu.dmpGetGravity(&gravity, &q);

mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);

mx=ypr[0] * 180/M_PI;

my=ypr[1] * 180/M_PI;

if(old_mx>-200) {

if((old_mx<-100)&&(mx>100)) {

dx=(-180-old_mx)+(mx-180);

}

else if((old_mx>100)&&(mx<-100)) {

dx=(180-old_mx)+(180+mx);

}

else{

dx=mx-old_mx;

}

dy=my-old_my;

Mouse.move(2000/60*dx, -1000/30*dy);

}

old_mx=mx;

old_my=my;

}

Для интерпретатора, код представляет из себя лишь проверку на соответствие и выполнение команд согласно получаемой информации, описывание элементов кода здесь нецелесообразно.

Для версии с датчиком BNO055 был использованы другой программный код и библиотеки соответственно. Фрагменты кода представлены ниже.

Сначала подключаем библиотеки следующие библиотеки.

Листинг 2.1 Объявление библиотек.

#include

#include

#include

#include

#include

#include

#define BOUNCE_WAIT 10

#define BOUNCE_COUNT 1

#define ACTIVE_BUTTONS 5

Далее мы переходим к объявления глобальных переменных.

Листинг 2.2 Объявление пинов.

int buttonPins[] = {4, 5, 6, 7, 8, 2, 9, 7, 18, 19, 20, 21, 10, 16, 14, 15};

const int xAxis = 18;

const int yAxis = 19;

boolean buttonPressed[16];

Bounce debouncers[16];

int debounceCount[16];

short quatx;

short quaty;

short quatrx;

short quatry;

Затем переходим к конфигурированию датчика BNO055.

Листинг 2.3 Активация гироскопа BNO055.

Adafruit_BNO055 bno = Adafruit_BNO055(55);

#define N (2)

int RXLED = 17;

String inputString = "";

boolean stringComplete = false;

bool hasBNO = true;

int range = 254;

int responseDelay = 5;

int threshold = range / 4;

int center = range / 2;

После мы описываем функцию, которая будет воспроизводиться при подключении. В ней описывается как определяется устройства и часть алгоритма для игнорирования дребезжания.

Листинг 2.4 Конфигурация устройства.

void setup() {

inputString.reserve(200);

Gamepad.begin();

for (int i = 0; i < ACTIVE_BUTTONS; i++) {

debouncers[i] = Bounce();

debounceCount[i] = 0;

pinMode(buttonPins[i],INPUT_PULLUP);

(debouncers[i]).attach(buttonPins[i]);

(debouncers[i]).interval(BOUNCE_WAIT);

delay(100);

buttonPressed[i] = false;

}

pinMode(RXLED, OUTPUT);

digitalWrite(RXLED, LOW);

if(hasBNO){

if (!bno.begin())

{

Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");

while (1);

}

delay(1000);

bno.setExtCrystalUse(true);

}

}

В основном теле программы данные происходит обработка данных считывание датчиков (тут они больше работают как цифровые) и эмуляция геймпада.

Листинг 2.5 Основное тело программы.

void loop() {

if(hasBNO){

imu::Quaternion quat = bno.getQuat();

quatx = (short) ( (int) ( quat.x()*32767 ) );

quaty = (short) ( (int) ( quat.y()*32767 ) );

quatrx = (short) ( (int) ( quat.z()*32767 ) );

quatry = (short) ( (int) ( quat.w()*32767 ) );

Gamepad.xAxis(quatx);

Gamepad.yAxis(quaty);

Gamepad.rxAxis(quatrx);

Gamepad.ryAxis(quatry);

Gamepad.write();

}

for (int j = 0; j < ACTIVE_BUTTONS; j++) {

(debouncers[j]).update();

int value = (debouncers[j]).read();

if ( value == LOW ) {

if(debounceCount[j] == BOUNCE_COUNT && buttonPressed[j] == false) {

if(j==0){

Gamepad.press(1);

}

if(j==1){

Gamepad.press(2);

}

if(j==2){

Gamepad.press(3);

}

if(j==3){

Gamepad.press(4);

}

if(j==4){

Gamepad.press(5);

}

Gamepad.write();

digitalWrite(RXLED, HIGH);

buttonPressed[j] = true;

} else {

if(debounceCount[j] < BOUNCE_COUNT) {

debounceCount[j] = debounceCount[j] + 1;

}

}

} else {

if(debounceCount[j] > 0) {

debounceCount[j] = debounceCount[j] - 1;

} else {

buttonPressed[j] = false;

if(j==0){

Gamepad.release(1);

}

if(j==1){

Gamepad.release(2);

}

if(j==2){

Gamepad.release(3);

}

if(j==3){

Gamepad.release(4);

}

if(j==4){

Gamepad.release(5);

}

Gamepad.write();

digitalWrite(RXLED, LOW);

}

}

}

int8_t xReading = readAxis(xAxis);

int8_t yReading = readAxis(yAxis);

Gamepad.zAxis(map(xReading,-255,255,-255,255));

Gamepad.rzAxis(map(yReading,-255,255,-255,255));

Gamepad.write();

}

Ещё в скетче присутствуют подпрограммы, но они выполняют функцию распознавания устройства как джойстика. И ещё присутствует подпрограмма считывания аналогового стика и перевод поступающих от него значений в нужное нам значение.

Этот скетч является наиболее оптимизированным и показывает максимальную производительность, тем самым сильно повышая комфорт при использовании устройства.
1   2   3   4   5   6   7   8   9   10   11


написать администратору сайта