В этой статье мы рассмотрим создание на основе платы Arduino и радиочастотных модулях (RF-модулях) 433 МГц дистанционно управляемой лодки. Управляться лодка будет с пульта дистанционного управления, который мы сделаем своими руками.
Для дистанционного управления лодкой можно использовать различные технологии: связь в инфракрасном диапазоне (IR), Bluetooth, радиочастотные модули (RF-модули), Wi-Fi, LoRa и т.д. Но по сравнению с инфракрасной связью радиосвязь имеет ряд очевидных преимуществ: больший диапазон действия и отсутствие необходимости наличия прямой видимости между передатчиком и приемником. А если сравнивать с Bluetooth, то RF-модули, работающие на частоте 433 МГц, существенно дешевле, к тому же они обеспечивают дуплексную связь – то есть могут передавать и принимать информацию одновременно. Из-за этих очевидных преимуществ мы и выбрали их для дистанционного управления нашей лодкой.
На нашем сайте мы можете посмотреть следующие похожие проекты:
- связь двух микроконтроллеров AVR ATmega8 через радио модули;
- робот, управляемый с помощью DTMF сигналов;
- машина, управляемая по Bluetooth.
Необходимые компоненты
- Плата Arduino Pro Mini (купить на AliExpress). Можно использовать и другие модели плат Arduino, но с целью минимазиции размеров нашего устройства мы выбрали Arduino Pro Mini.
- Передатчик и приемник на 433 МГц (купить на AliExpress).
- Микросхемы HT12E и HT12D (купить на AliExpress).
- Кнопки – 4 шт.
- Резисторы 47 кОм и 1 МОм (купить на AliExpress).
- Драйвер двигателей L293d (купить на AliExpress).
- Батарейка на 9 В (мы вместо нее использовали литий-ионную батарею на 7.4 В - купить на AliExpress) – 2 шт.
- Регулятор напряжения 7805 (купить на AliExpress).
- Электродвигатели постоянного тока – 2 шт.
- Пропеллеры для двигателей (мы использовали самодельные) – 2 шт.
- Конденсатор 1 мкФ – 2 шт. (купить на AliExpress).
- Common PCB (печатная плата).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Внешний вид необходимых для проекта компонентов показан на следующем рисунке.
Передающие и приемные радиочастотные модули (RF-модули) на 433 МГц
Данные типы радио модулей пользуются большой популярностью у радиолюбителей вследствие их низкой стоимости и простоты работы с ними. Они идеально подходят для радиосвязи на небольшие расстояние для передачи небольших объемов информации. Они используют простейший вид модуляции – амплитудную манипуляцию (АМ, АТ). При данном виде модуляции при передаче 1 в окружающее пространство излучается радиоволна с фиксированной (неизменной) частотой, а при передаче 0 ничего не излучается. То есть при передаче логического нуля данные модули не расходуют энергии поскольку в эфир ничего не излучается, что делает подобные модули весьма энергоэффективными, что особенно полезно в устройствах, работающих от батарей.
Передающий радио модуль на 433 МГц
Этот модуль очень маленького размера и имеет всего 3 контакта: VCC (питающее напряжение), ground (общий провод, земля) и data (данные). Некоторые разновидности этих модулей также имеют контакт антенны. Рабочее напряжение передающего радио модуля составляет 3V-12V. Модуль не имеет никаких регулировок. Также одним из существенных достоинств модуля является низкое энергопотребление, во многом обусловленное тем, что для передачи логического нуля не расходуется никакой энергии.
Структурная схема работы передающей части проекта
В передающей части нашего проекта, которое, по сути, представляет собой пульт дистанционного управления, у нас есть 4 кнопки, с помощью которых мы управляем направлением движения лодки (вперед, назад, направо и налево). К сожалению, нажатия этих кнопок нельзя непосредственно подавать на кодирующее устройство (encoder), поэтому сначала мы подаем их в плату Arduino, а затем уже на кодирующее устройство. Фактически, плата Arduino здесь используется для того, чтобы при движении лодки вперед или назад одновременно управлять двумя параллельными входами кодирующего устройства, что нельзя сделать только при помощи кнопок. Затем кодирующее устройство преобразует эти параллельно поступающие данные в последовательные, которые после этого и подаются на передающий радио модуль.
Принципиальная схема передающей части проекта
Схема пульта дистанционного управления лодкой на основе платы Arduino представлена на следующем рисунке.
В схеме одни концы кнопок подключены к цифровым контактам D6-D9 платы Arduino, а другие их концы подключены к общему проводу (земле). Соответственно, если мы нажимает одну из кнопок, на соответствующий цифровой контакт платы Arduino подается напряжение низкого уровня (low). Четыре параллельных входа микросхемы HT12E подключены к цифровым контактам D2-D5 платы Arduino, поэтому с помощью платы Arduino мы можем легко управлять состоянием этих контактов.
Микросхема HT12E представляет собой 12-битное кодирующее устройство (encoder, энкодер), которое преобразует параллельные входные данные в последовательные выходные данные. Из этих 12 бит 8 бит представляют собой биты адреса, которые можно использовать для управления несколькими приемниками. Контакты A0-A7 микросхемы HT12E являются контактами входного адреса. В нашем проекте мы будем управлять только одним приемником, поэтому нам не нужно изменять этот адрес и поэтому мы замкнули эти контакты на землю. Если вам необходимо с помощью HT12E управлять несколькими приемниками с помощью одного передатчика, то вам в этом случае можно использовать двухрядные переключатели (dip switches). AD8-AD11 – это входные контакты, с их помощью можно управлять выходными контактами D0-D3 декодера HT12D. Также нам в нашей схеме необходим излучатель с частотой 3 кГц, работающий от 5V. Также при питании от 5V нам необходим резистор сопротивлением 1.1 МОм. Выход микросхемы HT12E мы подключили к передающему радио модулю. Поскольку все компоненты нашей схемы работают от напряжения 5V, то в схему мы добавили регулятор напряжения 7805 – поэтому мы можем подавать напряжение на вход схемы в диапазоне 6-12 В.
Сборка конструкции передающей части проекта
Мы припаяли все компоненты передающей части проекта к печатной плате (common PCB). Помните о том, что поскольку вы работаете с радио модулями, то возможны нежелательные помехи между различными частями схемы, поэтому старайтесь соединить все компоненты схемы максимально близко друг к другу. Также мы использовали коннекторы типа "мама" (female pin) для подключения платы Arduino и передающего радио модуля. Старайтесь все компоненты схемы соединить с помощью печатных дорожек платы вместо использования соединительных проводов. Также подключите небольшой кусок провода к передающему радио модулю – он будет выполнять роль антенны и увеличит, таким образом, дальность связи. Перед подключением платы Arduino и передающего радио модуля обязательно проверьте напряжение на выходе регулятора lm7805.
Нижняя часть печатной платы передающей части нашего проекта показана на следующем рисунке.
Сборка корпуса передающей части проекта
Для пульта дистанционного управления (ДУ) нашей лодкой необходимо подходящий корпус – вы можете изготовить его по своему усмотрению. Мы для изготовления корпуса пульта ДУ использовали листы MDF толщиной 4mm, также для этого можно использовать клееную фанеру, пенопластовый лист или картон. Из этих листов мы вырезали два кусочка длиной 10 см и шириной 5 см – на них мы обозначили позиции кнопок. Кнопки вправо-влево мы разместили с левой стороны листа, а кнопки вперед-назад – с правой. С другой стороны листа мы подключили кнопки к основной части схемы. Помните о том, что обычная кнопка (pushbutton) имеет 4 контакта – по два на каждой стороне. Один контакт кнопки необходимо подключить к плате Arduino, а другой – к общему проводу (ground).
После этого мы поместили основную плату нашего пульта ДУ между двумя листами MDF и скрепили эти листы между собой с помощью длинных болтов.
Приемный радио модуль на 433 МГц
Приемный радио модуль на 433 МГц также отличается достаточно маленькими размерами и имеет 4 контакта: VCC, ground и два средних контакта для вывода данных. Рабочее напряжение модуля – 5 В. Также как и передающий модуль, приемный модуль также отличается низким энергопотреблением и может также иметь контакт антенны (у используемого нами модуля его нет).
Структурная схема работы приемной части проекта
Как следует из представленной структурной схемы, сначала мы принимаем передаваемый сигнал с помощью приемного радио модуля. На выходе радио модуля у нас последовательные данные – но в таком виде мы с их помощью не можем управлять двигателями, поэтому выход приемного радио модуля у нас подключен к декодеру, который преобразует поступающие последовательные данные в их первоначальный параллельный вид. В приемной части проекта у нас нет необходимости в использовании каких либо микроконтроллеров, мы можем напрямую подключить выходы декодера к драйверу двигателей.
Принципиальная схема приемной части проекта
Схема приемной части дистанционно управляемой лодки представлена на следующем рисунке.
Микросхема HT12D представляет собой 12-битный декодер, который преобразует данные из последовательного вида в параллельный. Входные контакты HT12D подключены к последовательному выходу приемного радио модуля. Среди этих 12 бит 8 бит (A0-A7) являются битами адреса и микросхема HT12D будет декодировать входные данные только при совпадении адреса. Чтобы соответствовать передающей части проекта мы контакты адреса микросхемы HT12D подключили к общему проводу схемы (ground). D8-D11 являются выходными контактами микросхемы HT12D – с них мы будем получать данные в параллельном виде. Чтобы получить нужную частоту работы схемы необходимо подключить к контактам осциллятора микросхемы HT12D резистор сопротивлением 33-56 кОм. Светодиод, подключенный к 17-му контакту микросхемы HT12D, будет свидетельствовать о корректном приеме данных, он будет зажигаться только когда у приемника будет связь с передатчиком. Входное напряжение приемной части проекта также может составлять 6-12 В.
Для управления двигателями с целью уменьшения веса конструкции мы использовали микросхему драйвера двигателей L293D. Данная микросхема отлично подходит для управления 2-мя двигателями в 2-х направлениях. Микросхема L293D имеет 16 контактов, на следующем рисунке показана ее распиновка.
Контакты 1, 9 дают разрешение на работу (enable pin), на них мы подаем 5 В. Контакты 1A, 2A, 3A и 4A являются контактами управления. Двигатель будет вращаться вправо если на контакт 1A подано low, а на контакт 2A подано high. Двигатель будет вращаться влево если на контакт 1A подано high, а на контакт 2A подано low. Соответственно, мы подключили эти контакты к выходам микросхемы декодера. К контактам 1Y, 2Y, 3Y и 4Y подключаются двигатели. На контакт Vcc2 подается питающее напряжение. Если вы используете высоковольтные моторы, то на этот контакт необходимо подать соответствующее напряжение.
Сборка конструкции приемной части проекта
Перед сборкой приемной части проекта нам необходимо уяснить следующую вещь – ее вес и размеры являются существенными поскольку она размещается на лодке. То есть если ее вес будет увеличиваться, то это будет негативно влиять на плавучесть и скорость движения лодки.
Также как и для передающей части проекта постарайтесь спаять все компоненты схемы на печатной плате маленького размера и не используйте соединительные провода (по возможности). В нашем проекте мы подключили контакт 8 драйвера двигателей L293D поскольку мы используем двигатели с рабочим напряжением 5 В.
Сборка корпуса приемной части проекта
Мы пробовали различные материалы для изготовления корпуса лодки, но наилучших результатов мы достигли с помощью листа такого материала как thermocol (его можно купить, но почему то точного перевода этого слова я не нашел). Мы взяли лист толщиной 3 см из этого материала и положили сверху на него печатную плату приемной части нашего проекта. После этого мы обозначили контуры необходимо углубления для размещения электронной части и вырезали его в листе thermocol'а. Разумеется, вы можете изготовить корпус лодки исходя из собственных предпочтений, можно для этих целей также использовать игрушечную лодку.
Двигатели и пропеллеры для лодки
Здесь также необходимо учитывать вес компонентов, поэтому в качестве двигателей мы выбрали электродвигатели постоянного тока типа n20, работающие от 5 В и отличающиеся малыми размерами и массой. Для предотвращения появления радиопомех необходимо подключить конденсатор 0,1 мкФ параллельно входным контактам двигателя.
Пропеллеры (воздушные винты) для лодки мы изготовили из листов пластмассы, но при желании их можно купить в соответствующих магазинах. Мы же просто вырезали из пластика необходимые полоски, согнули их при помощи нагрева от свечи и проделали в них небольшой отверстие чтобы закрепить их на осях двигателей.
Принципы работы дистанционно управляемой лодки на Arduino
Лодка имеет два двигателя, назовем их правым и левым двигателями. Если двигатель вращается по часовой стрелке, то при соответствующей форме пропеллера воздух забирается спереди и выталкивается сзади. Таким образом, создается движущая вперед сила.
Движение вперед: если оба двигателя вращаются по часовой стрелке, то лодка движется вперед.
Движение назад: если оба двигателя вращаются против часовой стрелки, то лодка движется назад.
Движение влево: если вращается только правый мотор, то движущая сила вперед создается только с правой стороны, поэтому лодка поворачивается влево.
Движение вправо: если вращается только левый мотор, то лодка поворачивает вправо.
Мы подключили входные контакты драйвера двигателей к четырем выходным битам декодера (D8-D11). Мы можем управлять этими 4-мя выходами при помощи замыкания контактов AD8-AD11 в передающей части проекта на землю (ground). К примеру, если мы замкнем на землю AD8, то это приведет к срабатыванию (активации) D8. Таким образом мы можем управлять вращением двух моторов в двух направлениях с использованием этих 4-х выходов. Но мы не можем непосредственно управлять двумя двигателями (а это необходимо для движения вперед и назад) с помощью одной кнопки, поэтому для этой цели мы в проекте и использовали плату Arduino – с ее помощью мы можем управлять входными контактами кодирующего устройства по нашему желанию.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты. Программа очень простая поскольку в ней нам всего лишь необходимо управлять переключением логических уровней на контактах платы.
В начале программы объявим переменные целого типа для работы с кнопками и входными контактами кодирующего устройства.
1 2 3 4 5 6 7 8 |
int f_button = 9; int b_button = 8; int l_button = 7; int r_button = 6; int m1=2; int m2=3; int m3=4; int m4=5; |
В функции setup мы зададим режимы работы для используемых контактов, к которым подключены кнопки – режим ввода данных с внутренними подтягивающими резисторами, а к которым подключены контакты кодирующего устройства – на вывод данных.
1 2 3 4 5 6 7 8 |
pinMode(f_button,INPUT_PULLUP); pinMode(b_button,INPUT_PULLUP); pinMode(l_button,INPUT_PULLUP); pinMode(r_button,INPUT_PULLUP); pinMode(m1,OUTPUT); pinMode(m2,OUTPUT); pinMode(m3,OUTPUT); pinMode(m4,OUTPUT); |
Затем в функции loop мы будем считывать состояние кнопок с помощью функции digitalRead. Если кнопка нажата, то на контакте, к которому она подключена, будет уровень LOW.
1 |
if ( digitalRead(f_button)==LOW) |
Если нажата кнопка движения вперед нам необходимо будет выполнить следующую последовательность действий:
1 2 3 4 5 6 |
{ digitalWrite(m1, LOW); digitalWrite(m3, LOW); digitalWrite(m2, HIGH); digitalWrite(m4, HIGH); } |
Эта последовательность команд активирует вращение по часовой стрелке обоих двигателей лодки. Соответственно, для движения назад необходимо выполнить следующую последовательность команд:
1 2 3 4 5 6 |
{ digitalWrite(m1, HIGH); digitalWrite(m3, HIGH); digitalWrite(m2, LOW); digitalWrite(m4, LOW); } |
Для движения влево:
1 2 3 4 5 6 |
{ digitalWrite(m1, LOW); digitalWrite(m3, HIGH); digitalWrite(m2, HIGH); digitalWrite(m4, HIGH); } |
Для движения вправо:
1 2 3 4 5 6 |
{ digitalWrite(m1, HIGH); digitalWrite(m3, LOW); digitalWrite(m2, HIGH); digitalWrite(m4, HIGH); } |
После сборки аппаратной части проекта можно загружать программу в плату Arduino и приступать к тестированию проекта.
Предупреждение: прежде чем начинать тестирование проекта убедитесь в том, ровно ли лодка стоит на водной поверхности, не превышает ли ее вес допустимого, не перепутали ли вы полярность двигателей и в правильную ли сторону вы изогнули пропеллеры.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
int f_button = 9; int b_button = 8; int l_button = 7; int r_button = 6; int m1 = 2; int m2 = 3; int m3 = 4; int m4 = 5; void setup () { pinMode(f_button, INPUT_PULLUP); pinMode(b_button, INPUT_PULLUP); pinMode(l_button, INPUT_PULLUP); pinMode(r_button, INPUT_PULLUP); pinMode(m1, OUTPUT); pinMode(m2, OUTPUT); pinMode(m3, OUTPUT); pinMode(m4, OUTPUT); } void loop() { if ( digitalRead(f_button) == LOW) { digitalWrite(m1, LOW); digitalWrite(m3, LOW); digitalWrite(m2, HIGH ); digitalWrite(m4, HIGH); } if ( digitalRead(b_button) == LOW) { digitalWrite(m2, LOW); digitalWrite(m4, LOW); digitalWrite(m1, HIGH); digitalWrite(m3, HIGH); } if ( digitalRead(l_button) == LOW) { digitalWrite(m1, LOW); digitalWrite(m2, HIGH); digitalWrite(m3, HIGH); digitalWrite(m4, HIGH); } if ( digitalRead(r_button) == LOW) { digitalWrite(m1, HIGH); digitalWrite(m2, LOW); digitalWrite(m3, HIGH); digitalWrite(m4, HIGH); } } |