В настоящее время роботы играют возрастающую с каждым годом роль в жизни человечества, помогающие выполнять нам какие либо рутинные операции. В данной статье мы рассмотрим создание робота на Arduino Uno, управляемого с помощью DTMF сигналов. DTMF (сокр. от Dual-Tone Multi-Frequency) представляет собой двухтональный многочастотный набор [телефонного] номера.
Смысл этой технологии заключается в том, что смешивая две или более частот можно сформировать DTMF сигнал (тон). Используемые данной технологией частоты представлены на следующем рисунке:
На рисунке можно увидеть две группы различных частот. Когда одна из верхних и одна из нижних частот из представленных на рисунке смешиваются (т.е. передаются одновременно), то мы получаем сигнал двухтонального многочастотного набора [телефонного] номера (DTMF сигнал).
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Двигатель постоянного тока (2 шт.).
- Декодер DTMF сигналов (купить на AliExpress).
- Драйвер двигателей L293D (купить на AliExpress).
- Мобильный телефон.
- Батарейка на 9 В.
- Соединитель батареи.
- Шасси робота (на колесах).
- Соединительные провода.
Что такое декодер DTMF сигналов
Декодер DTMF сигналов представляет собой микросхему MT8870, которая декодирует сигнал двухтонального многочастотного набора номера в цифровой сигнал который можно считать с помощью платы Arduino. Необходим вспомогательный провод (aux wire) чтобы соединить декодер DTMF сигналов с телефоном.
На следующем рисунке представлена блоковая диаграмма, показывающая логику работы устройства.
Модуль удаленной связи: главным компонентом этого модуля является декодер DTMF сигналов, который принимает сигнал от нашего сотового телефона по вспомогательному проводу. Декодер DTMF сигналов (микросхема MT8870) преобразует этот DTMF сигнал в 4-битный цифровой сигнал.
Модуль управления: плата Arduino UNO используется для управления всем процессом функционирования робота. Arduino считывает команды, передаваемые ей декодером DTMF сигналов, сравнивает их с эталонами, хранящимися в своей памяти, и на основе этого сравнения формирует управляющие команды для робота.
Модуль движения: состоит из драйвера мотора и двух двигателей постоянного тока. Драйвер мотора используется для управления двигателями поскольку плата Arduino не обеспечивает достаточные для этого значения напряжения и тока. Драйвер мотора принимает управляющие команды от Arduino и передает их двигателям.
Работа схемы
Схема робота, управляемого с помощью DTMF сигналов, представлена на следующем рисунке.
Схема робота в значительной мере похожа на уже рассмотренные нами схемы роботов на основе платы Arduino:
- робот, управляемый движениями рук;
- робот, управляемый с компьютера;
- робот, следующий вдоль линии.
В представленной схеме входные контакты драйвера двигателей 2, 7, 10 и 15 подсоединены к цифровым контактам платы Arduino 6, 5, 4 и 3 соответственно. Один из двигателей постоянного тока подключен к выходным контактам драйвера мотора 3 и 6, а другой двигатель – к контактам 11 и 14. Батарейка на 9 В используется для подачи питания на драйвер мотора.
Декодер DTMF сигналов подключен к мобильному телефону с помощью вспомогательного провода чтобы принимать от него DTMF сигналы. Декодер DTMF сигналов своими контактами D0-D3 подключен к контактам 19,18,17,16 Arduino. Как уже упоминалось, первая батарейка на 9 В используется для питания драйвера мотора и, соответственно, двигателей, а вторая батарейка 9 В используется для питания остальных элементов схемы.
Принципы работы робота
Рассматриваемый нами робот управляется с помощью команд, передаваемых с помощью мобильного телефона. Для передачи команд управления используются DTMF сигналы. Для демонстрации работы схемы мы используем два телефона, один из которых мы назовем "управляющим телефоном" – с него мы будем передавать команды управления, а другой будет подключен к схеме робота с помощью вспомогательного провода – его мы назовем "принимающим телефоном".
Сначала мы осуществим звонок с управляющего телефона на принимающий телефон и после того как он примет вызов мы переведем его в ручной или автоматический режим ответа. И после этого у нас появится возможность управлять роботом с помощью DTMF сигналов.
Когда мы будем нажимать ‘2’ на управляющем телефоне робот начнет двигаться вперед и будет двигаться в этом направлении до тех пор пока не получит следующую команду.
Когда мы будем нажимать ‘8’ на управляющем телефоне робот начнет двигаться назад и будет двигаться в этом направлении до тех пор пока не получит следующую команду.
Когда мы будем нажимать ‘4’ на управляющем телефоне робот будет поворачивать влево до поступления очередной команды.
Когда мы будем нажимать ‘6’ на управляющем телефоне робот будет поворачивать вправо до поступления очередной команды.
Для остановки робота необходимо будет нажать на управляющем телефоне ‘5’.
Исходный код программы
В программе первым делом необходимо инициализировать контакты, к которым будет подключаться декодер DTMF сигналов и драйвер мотора.
#define m11 3
#define m12 4
#define m21 5
#define m22 6
#define D0 19
#define D1 18
#define D2 17
#define D3 16
Далее необходимо установить режим работы для инициализированных контактов: для тех, которые будут принимать данные от декодера DTMF сигналов – на ввод данных, для тех, которые будут подавать управляющие команды на драйвер мотора – на вывод данных.
После этого мы в программе считываем значения с выходов декодера DTMF сигналов и сравниваем их с заранее определенными значениями с помощью оператора “if” и по результатам сравнения выполняем соответствующие операции.
Пять условий, в соответствии с которыми осуществляется управление роботом, представлены в следующей таблице.
Далее представлен полный текст программы.
#define m11 3
#define m12 4
#define m21 5
#define m22 6
#define D0 19
#define D1 18
#define D2 17
#define D3 16
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(D0, INPUT);
pinMode(D1, INPUT);
pinMode(D2, INPUT);
pinMode(D3, INPUT);
pinMode(m11, OUTPUT);
pinMode(m12, OUTPUT);
pinMode(m21, OUTPUT);
pinMode(m22, OUTPUT);
}
void loop()
{
int temp1=digitalRead(D0);
int temp2=digitalRead(D1);
int temp3=digitalRead(D2);
int temp4=digitalRead(D3);
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==1 && temp3==1 && temp4==0)
right();
else if(temp1==0 && temp2==0 && temp3==0 && temp4==1)
backward();
else if(temp1==1 && temp2==0 && temp3==1 && temp4==0)
Stop();
}
Отлично