История о создании руки-сурдопереводчика

в 10:12, , рубрики: arduino, java, микроконтроллер, Программирование, программирование микроконтроллеров, Разработка под android, Разработка под Arduino, С++

Предыстория

В начале этого учебного года (17-18) администрация нашего любимого лицея сказала нам: «В конце года каждый из вас должен защитить индивидуальный проект. У тех, кто не защитит проект, останется академ. задолженность и к гоcам (ГИА-9) они допущены не будут». Получается что-то вроде дипломной работы (в 9 классе, просто супер). Примерно с сентября по декабрь мы с моим другом Кириллом (kkirra) опрделялись, что за проект мы будем делать: хотелось что-то не очень сложное в исполнении, но вместе с тем что-то зрелищное и оригинальное. В конце концов мы определились: решили сделать модель человеческой руки, да еще такую, чтобы под управлением андроид устройства (именно в этом году мы с Кириллом случайно поступили в IT-школу Samsung на базе нашего лицея, поэтому хотели обязательно использовать в проекте полученные знания) она переводила введенный текст в язык жестов.

Программная часть

Android-приложение

Примерно за месяц до дедлайна мы начали работу над проектом. Первым этапом работы стала разработка андроид-приложения.

Если честно, самым сложным для меня было и остается разметка приложения: проблемы у меня с этими layout'ами и их типами (я все-таки девятикласник, да еще и из физмата). Сделать так, чтобы приложение выглядело одинаково красиво на всех устройствах также было довольно сложно.

Еще одной сложной задачей, помимо разметки, было прикручивание bluetooth'а к приложению (мы решили реализовать связь между андроид-устройством и моделью через bluetooth): такому на курсах школы Samsung нас не учили, а в интернете про это не очень-то информации (имею ввиду информаци про реализацию связи между андроид-устройством и ардуино, которым управлялась модель).

Теперь немного про сам код (ссылка на GitHub в самом-самом конце статьи). Программа представляет из себя четыре активности: стартовый экран и по одной активности на каждый режим управления.

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

Если честно, мне очень стыдно за свой код: он выглядит недоработанным. Дело в том, что я мог бы инкапсулировать bluetooth-подключение в отдельный класс, создав метот подключения, отправки данных, отключения и т.д., но, вместо этого, я в каждой активности прописывал все выше указанное заново, поскольку инкапсуляция приводила к некоторым (не очень большим) проблемам. Тем не менее, для их решения необходимо было потратить некоторое время на изучение работы bluetooth'а, а я, вроде, торопился написать код, чтобы осталось время на разработку и реализацию аппаратной части.

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

В процессе реализации программной части было необходимо запрограммировать микроконтроллер Arduino, который получал данные со смартфона и управлял манипулятором. Была написана библиотека, которая содержала в себе данные о подключении сервоприводов к Arduino (к каким именно контактам подсоединять серво) и методы перевода текста в язык жестов. Главная часть библиотеки — матрица, в которой содержится информация о положении каждого пальца, соответствующих буквам русского алфавита и различные методы для упрощения кода. Матрица приведена ниже.

const int navigate [Hand::n][Hand::m]= { 
{224, 180, 180, 180, 180, 180},//а
{225, 90, 0, 180, 180, 180},//б
{226, 0, 0, 0, 0, 0},//в
{227, 0, 90, 180, 180, 180},//г
{228, 180, 0, 0,180, 180},//д
{229, 90, 180, 180, 90, 90},//е
{230, 90, 180, 180, 90, 90},//ж
{231, 180, 0, 180, 180, 180},//з
{232, 180, 180, 180, 0, 0},//и
{233, 180, 180, 180, 0, 0},//й
{234, 180, 0, 0,180, 180},//к
{235, 180, 90, 90, 180, 180},//л
{236, 180, 90, 90, 90, 180},//м
{237, 180, 0, 0, 180, 0},//н
{238, 90, 180, 0, 0, 0},//о
{239, 180, 90, 90, 180, 180},//п
{240, 180, 0, 180, 0, 0},//р
{241, 90, 90, 90, 90, 90},//с
{242, 180, 90, 90, 90, 180},//т
{243, 0, 180, 180, 180, 0},//у
{244, 0, 90, 90, 90, 90},//ф
{245, 0, 0, 180, 180, 180},//х
{246, 180, 0, 0, 180, 180},//ц
{247, 0, 90, 180, 180, 180},//ч
{248, 180, 0, 0, 0, 180},//ш
{249, 180, 0, 0, 0, 180},//щ
{250, 0, 0, 180, 180, 180},//ъ
{251, 0, 90, 180, 180, 90},//ы
{252, 0, 0, 180, 180, 180},//ь
{253, 90, 90, 180, 180, 180},//э
{254, 0, 90, 90, 90, 0},//ю
{255, 90, 90, 90, 180, 180}};//я

«Hand» — это header-файл библиотеки (с расширением ".h" ), содержащий в себе прототипы функций и константы.

Теперь несколько слов о методах перевода. Метод перевода символов получает на вход кодировку буквы, ищет нужную строку (первый элемент каждой строки матрицы — код символа), и устанавливает сервоприводы в соотвествие указанными в строке градусами угла поворота (коды символов помещены в таблицу для того, чтобы при желании можно было поменять кодировочную таблицу, не меняя весь код) затем выжидается несколько секунд для того, чтобы жесты можно было прочесть и они не следовали один за другим. Метод перевода предложений разбивает предложение на символы и использует метод перевода символов.

Метод перевода сиволов:

void Hand :: SymbolTranslate(unsigned char a){ //перевод символов в жесты
    int str=-1;
    int i;
    for(i=0; i<n; i++){
        if(navigate[i][0]==(int)(a)){
            str=i;
            break;  
        }
    }
    if(str==-1){
    	return;
    }

	else{
    First.write(navigate[str][1]); //высавляем сервоприводы в нужное положение
    Second.write(navigate[str][2]);
    Third.write(navigate[str][3]);
    Fourth.write(navigate[str][4]);
    Fifth.write(navigate[str][5]);
    delay(200);
    Serial.println(str);
    Serial.println("Succsessfull");
	}
}

Метод перевода предложений:

void Hand :: SentenceTranslate(char* s){ //перевод предложения в жесты
    unsigned char a;
    for(int i=0; i< strlen(s); i++){
        a=s[i];
        SymbolTranslate(a);
        delay(2000);
    }
}

Методы также выводят в лог сообщения с принятым текстом и результатом перевода (печатается «Succsessfull»), что очень помогло нам при отладке неработающего ардуино-кода.

Аппаратная часть

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

Изначально, мы хотели распечатать детали манипулятора на 3D-принтере, чертежи взяли из окрытого французского банка проектов (свои тоже нарисовали, но позже решили, что лучше взять из open-source), но, отправив чертежи на печать, мы узнали, что для печати наших деталей потребуется несколько недель, которых у нас на тот момент не было. Тогда мы решили собрать манипулятор из подручных материалов: предплечье из металлических пластин, пальцы из фанеры. Пальцы сгибались благодаря сервоприводам под управлением микроконтроллера Arduino. Примерный чертеж представлен ниже.

image

  • Красный цвет — оси вращения пальцев, если смотреть на пальцы людей — это суставы
  • Зеленый цвет — небольшие резинки, которые возвращают пальцы в исходное положение (т.е. сухожилие)

Заключение

Подведем итоги. Мы собрали и запрограммировали манипулятор-сурдопереводчик (между собой коротко называем его «культяпка» за внешний вид). Наш проект позволяет людям, не знающим языка жестов, общаться с людьми с ограниченными возможностями слуха с помощью русского жестового алфавита. Реализация программного обеспечения позволяет быстро изменить код и, ничего при этом не сломав, добавить в него другие жестовые языки (например, английский).
В будущем мы планируем распечатать ранее выбранную модель на 3D-принтере и собрать ее (собираемся занятся этим, когда немного отдохнем от экзаменов и прочей чепухи).

В общем, получился довольно неплохой, пусть и не очень красивый с точки зрения прошивки и внешнего вида, но главное — рабочий проект. Мы много научились, работая над этим проектом (например тому, что надо начинать работать над проектом, расчитаным на весь год, в начале года, а не за пару недель до сдачи) и за это очень благодарны преподавателям, которые нам помогали и особенно — Дамиру Муратовичу — нашему научруку, который помогал нам в решении большей часть проблем, связанных с проектом.

Спасибо, что дочитали до конца!

Если вам стало интересно — все материалы проекта (включая текст работы, презентации, и т.д.) выложены в открытый доступ вот тут.

Еще раз спасибо за внимание!

Автор: DKay7

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js