Роботы в настоящее время играют важную роль в автоматизации многих процессов в жизни человечества. Для платформы Arduino мы уже рассматривали создание роботов, следующих вдоль линии и управляемых с компьютера, а в этой статье мы рассмотрим создание робота на основе акселерометра (измерителя ускорения), управляемого с помощью движений рук.
Необходимые компоненты
- Плата Arduino UNO.
- Двигатели постоянного тока.
- Драйвер двигателей L293D.
- Акселерометр.
- HT12E (кодер).
- HT12D (декодер).
- Пара радиочастотных модулей.
- Батарейка на 9 В.
- Соединитель батареи.
- USB кабель.
- Шасси робота.
Пара радиочастотных модулей
Робот управляемый жестами управляется с помощью движений рук вместо использования кнопок или джойстика. В нашем случае нам просто будет нужно делать движения руками чтобы управлять роботом. В вашей руке при этом будет находиться передающее устройство, включающее радиочастотный передатчик и акселерометр. Оно будет передавать команды нашему роботу: движение вперед, назад, влево, вправо и остановка.
Одной из самых важных частей в нашем проекте является акселерометр, который представляет собой устройство для измерения ускорения в 3-х осях (координатах) с диапазоном +-3g (плюс-минус). Устройство состоит из датчика на основе поликристаллического кремния и электронной схемы для измерения ускорения. На выход данного устройства выдается аналоговое напряжение пропорциональное значению ускорения. Устройство измеряет ускорение свободного падения когда мы наклоняем его, а результат выдает в форме движения или вибрации.
В соответствии с даташитом на adxl335 структура из поликристаллического кремния нанесена поверх кремниевой пластины. Пластины поликристаллического кремния обеспечивают противодействие (сопротивление) силам ускорения. Изменение структуры датчика измеряется с помощью дифференциального конденсатора который состоит из независимых крепящих пластин и пластин, прикрепленных к движущейся массе. Крепящие пластины могут перемещаться на 180° относительно сдвинутых по фазе прямоугольных импульсов. Ускорение приводит к отклонению движущейся массы и нарушению равновесия дифференциального конденсатора, что вызывает изменение сигнала на выходе датчика, амплитуда которого будет пропорциональна величине ускорения. А затем фазочувствительные методы демодуляции используются для определения величины и направления ускорения.
Назначение контактов акселерометра
- Vcc – на этот контакт необходимо подать постоянное напряжение 5 В.
- X-OUT – аналоговый выход для оси x.
- Y-OUT – аналоговый выход для оси y.
- Z-OUT – аналоговый выход для оси z.
- GND – земля.
- ST – этот контакт используется для установки чувствительности датчика.
Работа схемы
Проектируемый нами робот, управляемый с помощью жестов рук и акселерометра, функционально разделен на две части:
- Передающая часть.
- Приемная часть.
Передающая часть робота состоит из радиочастотного передатчика и акселерометра. Как мы уже отмечали, акселерометр имеет аналоговые выходы – нам будет необходимо конвертировать аналоговые значения с этих выходов в цифровые данные. Для этой цели мы в схеме устройства будем использовать 4-х канальный компаратор вместо использования аналого-цифрового преобразования (АЦП). При помощи установки опорного напряжения компаратора мы получаем на его выходе цифровой сигнал, затем этот сигнал мы подаем на кодер (кодирующее устройство) HT12E чтобы закодировать данные или преобразовать их в последовательную форму и затем передать их с помощью высокочастотного передатчика в окружающую среду.
На приемном конце мы будем использовать радиочастотный приемник для приема этих данных, которые затем мы будем подавать на декодер HT12D. Этот декодер конвертирует полученные данные в последовательной форме в параллельную форму которые потом считываются платой Arduino. В соответствии с принятыми данными мы будем управлять движением робота с помощью двух электромоторов: двигаться вперед, назад, поворачивать вправо и влево, останавливаться.
Робот, управляемый с помощью жестов рук, будет двигаться в соответствии с положением передатчика в наших руках. Когда мы будем наклонять руку вперед робот будет двигаться прямо и будет продолжать двигаться прямо до тех пор пока не получит очередную команду.
Когда мы будем отклонять руку в обратную сторону (назад), робот изменит направление своего движения на противоположное (назад) и будет двигаться в этом направлении пока не получит следующую команду.
Когда мы будем наклонять руку вправо робот тоже будет поворачиваться вправо до получения очередной команды.
Когда мы будем наклонять руку влево робот тоже будет поворачиваться влево до получения очередной команды.
Для остановки робота необходимо удерживать руку в неизменном положении.
Схема передающей части робота и ее внешний вид представлены на следующих рисунках.
Исходный код программы
В программе прежде всего необходимо инициализировать контакты 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();
}