Робот на Arduino управляемый с помощью жестов рук и акселерометра

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

Внешний вид робота на Arduino управляемого с помощью жестов рук и акселерометра

Необходимые компоненты

Плата Arduino UNO
Двигатели постоянного тока
Акселерометр
HT12D
HT12E
Пара радиочастотных модулей
Драйвер мотора L293D
Батарейка на 9 В
Соединитель батареи
USB кабель
Шасси робота

Пара радиочастотных модулей

Внешний вид радиочастотных модулей

Робот управляемый жестами управляется с помощью движений рук вместо использования кнопок или джойстика. В нашем случае нам просто будет нужно делать движения руками чтобы управлять роботом. В вашей руке при этом будет находиться передающее устройство, включающее радиочастотный передатчик и акселерометр. Оно будет передавать команды нашему роботу: движение вперед, назад, влево, вправо и остановка.

Одной из самых важных частей в нашем проекте является акселерометр, который представляет собой устройство для измерения ускорения в 3-х осях (координатах) с диапазоном +-3g (плюс-минус). Устройство состоит из датчика на основе поликристаллического кремния и электронной схемы для измерения ускорения. На выход данного устройства выдается аналоговое напряжение пропорциональное значению ускорения. Устройство измеряет ускорение свободного падения когда мы наклоняем его, а результат выдает в форме движения или вибрации.

Внешний вид акселерометра

В соответствии с даташитом на adxl335 структура из поликристаллического кремния нанесена поверх кремниевой пластины. Пластины поликристаллического кремния обеспечивают противодействие (сопротивление) силам ускорения. Изменение структуры датчика измеряется с помощью дифференциального конденсатора который состоит из независимых крепящих пластин и пластин, прикрепленных к движущейся массе. Крепящие пластины могут перемещаться на 180° относительно сдвинутых по фазе прямоугольных импульсов. Ускорение приводит к отклонению движущейся массы и нарушению равновесия дифференциального конденсатора, что вызывает изменение сигнала на выходе датчика, амплитуда которого будет пропорциональна величине ускорения. А затем фазочувствительные методы демодуляции используются для определения величины и направления ускорения.

Назначение контактов акселерометра

  1. Vcc – на этот контакт необходимо подать постоянное напряжение 5 В.
  2. X-OUT – аналоговый выход для оси x.
  3. Y-OUT – аналоговый выход для оси y.
  4. Z-OUT – аналоговый выход для оси z.
  5. GND – земля.
  6. ST – этот контакт используется для установки чувствительности датчика.

Работа схемы

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

  1. Передающая часть.
  2. Приемная часть.

Передающая часть робота состоит из радиочастотного передатчика и акселерометра. Как мы уже отмечали, акселерометр имеет аналоговые выходы – нам будет необходимо конвертировать аналоговые значения с этих выходов в цифровые данные. Для этой цели мы в схеме устройства будем использовать 4-х канальный компаратор вместо использования аналого-цифрового преобразования (АЦП). При помощи установки опорного напряжения компаратора мы получаем на его выходе цифровой сигнал, затем этот сигнал мы подаем на кодер (кодирующее устройство) HT12E чтобы закодировать данные или преобразовать их в последовательную форму и затем передать их с помощью высокочастотного передатчика в окружающую среду.

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

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

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

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

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

Для остановки робота необходимо удерживать руку в неизменном положении.

Схема передающей части робота и ее внешний вид представлены на следующих рисунках.

Внешний вид передающей части робота

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

Схема приемной части роботаПара радиочастотных модулей (передатчик и приемник) используются для передачи и приема команд управления роботом. Приемник через декодер подсоединен к Arduino. Управление двумя двигателями постоянного тока производится с помощью драйвера мотора L293D, подсоединенного к Arduino. Соответственно контакты драйвера мотора 2, 7, 10 и 15 подсоединены к цифровым контактам Arduino 6, 5, 4 и 3. Один из двигателей постоянного тока подключен к выходным контактам 3 и 6 драйвера мотора, а другой двигатель – к контактам 11 и 14 драйвера мотора. Для питания драйвера мотора используется батарейка 9 В.

Исходный код программы

В программе прежде всего необходимо инициализировать контакты Arduino для управления двигателями и для приема данных от декодера HT12D.

#define FD 16
#define BD 17
#define LD 18
#define RD 19

#define m11 3
#define m12 4
#define m21 5
#define m22 6

Затем определяем режим работы этих контактов – на ввод или на вывод данных.

Код для задания режима работы контактов

После этого мы можем считывать данные с входных контактов с помощью оператора ‘if’ и выполнять соответствующие инструкции.

Код для чтения данных с входных контактов

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

Условия, определяющие логику работы робота

Далее представлен полный текст программы.

#define FD 16
#define BD 17
#define LD 18
#define RD 19

#define m11 3

#define m12 4
#define m21 5
#define m22 6

void forward() // движение вперед

{
digitalWrite(m11, HIGH);
digitalWrite(m12, LOW);
digitalWrite(m21, HIGH);
digitalWrite(m22, LOW);
}

void backward() // движение назад

{

digitalWrite(m11, LOW);

digitalWrite(m12, HIGH);
digitalWrite(m21, LOW);
digitalWrite(m22, HIGH);
}

void left() // поворот влево

{
digitalWrite(m11, HIGH);
digitalWrite(m12, LOW);
digitalWrite(m21, LOW);
digitalWrite(m22, LOW);
}

void right() // поворот вправо

{
digitalWrite(m11, LOW);
digitalWrite(m12, LOW);
digitalWrite(m21, HIGH);
digitalWrite(m22, LOW);
}

void Stop() // остановка

{
digitalWrite(m11, LOW);
digitalWrite(m12, LOW);
digitalWrite(m21, LOW);
digitalWrite(m22, LOW);
}

void setup()

{
pinMode(FD, INPUT);
pinMode(BD, INPUT);
pinMode(LD, INPUT);
pinMode(RD, INPUT);
pinMode(m11, OUTPUT);
pinMode(m12, OUTPUT);
pinMode(m21, OUTPUT);
pinMode(m22, OUTPUT);
}

void loop()

{
int temp1=digitalRead(FD);
int temp2=digitalRead(BD);
int temp3=digitalRead(LD);
int temp4=digitalRead(RD);

if(temp1==1 && temp2==0 && temp3==0 && temp4==0)
backward();
else if(temp1==0 && temp2==1 && temp3==0 && temp4==0)
forward();
else if(temp1==0 && temp2==0 && temp3==1 && temp4==0)
left();
else if(temp1==0 && temp2==0 && temp3==0 && temp4==1)
right();
else Stop();
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
255 просмотров

Добавить комментарий

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