Управлением роботом с помощью простых жестов

22 марта 2017

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

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

Компоненты

Для трансмиттера: 

  1. Плата Arduino. Например, UNO R3;
  2. Акселерометр;
  3. Микросхема HT12E IC;
  4. RF Трансмиттер;
  5. Батарея.

Для ресивера:

  1. RF Ресивер;
  2. Микросхема HT12D IC;
  3. Шилд управления двигателями L293D;
  4. 2 мотора (12 Вольт);
  5. Шасси;
  6. Батарея (12 Вольт).

Принцип работы

Работа нашего робота начинается с акселерометра. Он дает аналоговый сигнал в пределах от 0 до 5 вольт или нуля до 1023 на микроконтроллер ATmega328/8.Данный микроконтроллер можно назвать сердцем всего проекта. Он и заставляет перемещаться робота в зависимости от движения руки. После считывания движения руки, через RF трансмиттер, контроллер передает данные роботу, по средствам беспроводной связи. Для ее создания и необходима микросхема HT12E IC.

Собранные данные принимаются RF ресивером и декодируются микросхемой HT12D IC. Микросхема имеет 4 контакта, которые подключаются к шилду управления L293D. Он в свою очередь и запускает двигатели.

Схема трансмиттера

Акселерометр: – прибор,измеряющий проекцию кажущегося ускорения (разности между истинным ускорением объекта и гравитационным ускорением) в трех направлениях – X, Y, Z

Arduino – плата микроконтроллера, к которой подключается акселерометр. Датчик передает на контроллер аналоговый сигнал, который позже преобразуется в цифровой, при помощи встроенного 10-битного АЦП

Микросхема HT12E IC – кодер, который может преобразовать параллельный сигнал в последовательный. Основная причина его применения в том,что RF трансмиттер не может передать параллельный сигнал. Последовательный сигнал может быть передан и непосредственно через микроконтроллер, но тогда встанет необходимость его наличия и на стороне приемника.

RF трансмиттер – собственно он и передает последовательный сигнал.

Схема приемника

RF ресивер: принимает данные с передатчика и передает декодеру HT12DIC.

HT12D IC: преобразует последовательный сигнал, полученный с приемника, в параллельный, как на выходе из контроллера.

L293D: микросхема питания, которая используется для усиления сигнала, поступающего с декодера.

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

Источник питания: аккумуляторная батарея для работы двигателей.

Код

Осталось только вставить код в Arduino IDE и загрузить его на плату.

int inx = A0;     //x pin of accelerometer
int iny = A1;     //y pin of accelerometer

int out1 = 8;     //output1 for HT12E IC
int out2 = 9;     //output1 for HT12E IC
int out3 = 10;    //output1 for HT12E IC
int out4 = 11;    //output1 for HT12E IC

void setup() {
    pinMode(inx,INPUT);
    pinMode(iny,INPUT);

    pinMode(out1,OUTPUT);
    pinMode(out2,OUTPUT);
    pinMode(out3,OUTPUT);
    pinMode(out4,OUTPUT);
}

void loop() {
    if (analogRead(inx) < 305) {
        digitalWrite(out1, HIGH);  
        digitalWrite(out2, LOW);   
        digitalWrite(out3, HIGH);  
        digitalWrite(out4, LOW); 
    } else if (analogRead(inx) > 365) {
        digitalWrite(out1, LOW);   
        digitalWrite(out2, HIGH);  
        digitalWrite(out3, LOW);   
        digitalWrite(out4, HIGH);
    } else if (analogRead(iny) < 305) {
        digitalWrite(out1, HIGH);  
        digitalWrite(out2, LOW);   
        digitalWrite(out3, LOW);   
        digitalWrite(out4, LOW); 
    } else if (analogRead(iny) > 365) {
        digitalWrite(out1, LOW);  
        digitalWrite(out2, LOW);   
        digitalWrite(out3, HIGH);   
        digitalWrite(out4, LOW); 
    } else {
        digitalWrite(out1, LOW);  
        digitalWrite(out2, LOW);   
        digitalWrite(out3, LOW);   
        digitalWrite(out4, LOW); 
    }
}

Данная статья является авторским переводом с сайта http://clgproject.com


Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.


Поделиться: