Предыстория


В начале этого учебного года (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-принтере и собрать ее (собираемся занятся этим, когда немного отдохнем от экзаменов и прочей чепухи).

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

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

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

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

Комментарии (13)


  1. mickvav
    29.06.2018 13:27
    +3

    Для школьников — неплохо. А как же видосик на ютюбчик выложить с тем, как это-вот-всё работает?


  1. Vsevo10d
    29.06.2018 13:42
    +2

    Если честно, мне очень стыдно за свой код: он выглядит недоработанным


    Если честно, мне очень стыдно: в своем девятом классе я часами играл в Operation Flashpoint: Resistance и больше ничего не делал. А вы молодцы.


  1. SADKO
    29.06.2018 16:26

    Не, ну а чё, прикольно…
    … интересно только, вы эту культяпку на реальных глухих проверяли, не напряжно ли им было, они-же не алфавитом между собой общаются, а символами?

    Ну, да ладно, для школы это итак мега круто!


    1. M_AJ
      30.06.2018 10:02

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


  1. kosmonaFFFt
    29.06.2018 18:29

    Идея для развития — убрать физическую культяпку, и заменить ее 3D моделью на экране смартфона.


    1. DKay7 Автор
      29.06.2018 21:39

      В самом начале хотели так и сделать, но потом решили, что навыков моделирования, аимации и программирования не хватит


  1. Costic
    29.06.2018 19:24
    +1

    С учебной точки зрения вы хорошо сработали, а по делу — проект бесполезный, т.к. зачем смотреть жест манипулятора, если можно на экран посмотреть? Люди глухие, но не слепые. Надо думать о более полезном манипуляторе.


    1. Antzor
      29.06.2018 20:21

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


  1. nerlihmax
    29.06.2018 21:40

    Ребята, а вы случаем не из Новосибирска?


    1. DKay7 Автор
      29.06.2018 21:40

      Неа, из челябинска


      1. goiliago
        30.06.2018 13:33

        У нас в городе (Троицк, новая Москва) та же история была. Разве что про ОГЭ ничего не говорили. Лично я сделал вот приложение для просмотра расписания школы: http://mgk.olimpiada.ru/work/2918/city/


  1. alkneu
    29.06.2018 21:40

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


    1. DKay7 Автор
      29.06.2018 21:41

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