Планета Марс на протяжении многих веков пленяла воображение человеческих умов, а идея отправить марсоходы для исследования ее поверхности еще больше подогревала их любопытство. В этом проекте мы окунемся в захватывающий мир робототехники и продемонстрируем, как построить марсоход на базе Arduino , способный преодолевать различные ландшафты. Итак, пристегните ремни безопасности - мы отправляемся в захватывающее путешествие по созданию собственного марсохода. Если же у вас нет возможности испытать его на Марсе, то тогда вы можете использовать его на Земле в качестве робота (вездехода) с повышенной проходимостью.))
В этой статье мы рассмотрим создании робота-марсохода на основе платы Arduino с управлением по Bluetooth. Целью данного руководства является предоставление четкого пошагового объяснения от сборки шасси вездехода до его программирования и тестирования. Наша основная задача — кодирование инструкций, написанных на языке программирования C или C++. Микроконтроллер Arduino компилирует и выполняет код, позволяя марсоходу функционировать в соответствии с заложенной в него программой.
Ранее на нашем сайте мы уже рассматривали различные проекты роботов на основе платы Arduino, такие как робот, следующий вдоль линии, пожарный робот, роботизированная рука, самобалансирующийся робот и т. д .
Также на нашем сайте вы можете проект более продвинутого марсохода, являющегося копией марсохода Mars Perseverance.
Конструкция робота-марсохода
Прежде чем мы углубимся в технические аспекты проекта, давайте потратим немного времени на то, чтобы разобраться в конструкции марсохода. Типичному марсоходу приходится преодолевать сложные ландшафты поверхности Марса. Для достижения этой цели мы сосредоточимся на создании вездехода с системой привода на 6 колес с соответствующей подвеской, обеспечивающей оптимальную мобильность и устойчивость марсохода.
Шасси вездехода служит основой всего транспортного средства. Оно должно быть прочным, долговечным и способным преодолевать различные ландшафты, а также должно обеспечивать размещение различных электронных компонентов, таких как плата Arduino, блок питания и модули управления двигателем.
Автор проекта (ссылка на оригинал приведена в конце статьи) создал акриловые детали шасси робота с помощью SolidWorks и выполнил лазерную резку, чтобы построить свой марсоход.
Также вы можете скачать файлы .dxf проекта марсохода, которые вы можете использовать для лазерной резки. Следующее видео продемонстрирует процесс сборки марсохода и демонстрацию его работы.
Необходимые компоненты
- Шасси марсохода.
- 6 двигателей BO и колеса.
- Плата Arduino Uno (купить на AliExpress).
- Модуль драйвера двигателя L298N (L298N Motor Driver Module) (купить на AliExpress).
- Модуль Bluetooth HC-05 (купить на AliExpress).
- Литий-ионный аккумулятор 12 В с разъемом.
- L-зажим (8 шт.).
- Гайки и болты М4 10 мм (8 шт.).
- Гайки и болты M3 10 мм (12 шт.).
- Гайки и болты M3 30 мм (12 шт.).
- Выключатель и соединительные провода.
Модуль драйвера двигателя L298N
Модуль драйвера двигателя L298N — популярный модуль драйвера двигателя, обычно используемый в проектах робототехники и электроники. Модуль основан на интегральной схеме L298n, имеет две схемы H-моста, по одной на каждый канал двигателя, что обеспечивает двунаправленное управление двигателями. Подавая соответствующие логические сигналы на управляющие контакты модуля, вы можете управлять скоростью и направлением вращения двигателя. Более подробно про подключение драйвера двигателя L298N к плате Arduino вы можете прочитать в этой статье.
Поскольку в нашем проекте мы не используем сигнал ШИМ, генерируемый Arduino, для управления скоростью двигателей, они будут работать на максимальной скорости. Это связано с тем, что мы сохраняем на плате контакты ENA и ENB, соответствующие управлению ШИМ, в фиксированном состоянии. Следовательно, основной целью модуля драйвера двигателя в этой установке является изменение направления вращения двигателей. Эта возможность позволяет роботу двигаться во всех четырех направлениях, включая вперед, назад, влево и вправо.
Распиновка драйвера двигателя L298N
Модуль драйвера двигателя L298N имеет специальную распиновку, соответствующую его различным функциям. Назначение его контактов следующее:
VCC - данный контакт используется для подключения внешнего источника питания (до 12 В) для питания двигателей.
GND - общий провод (земля) модуля и должен быть подключен к земле источника питания и источника управляющего сигнала (Arduino).
5V - обеспечивает регулируемый выход 5 В, который можно использовать для питания внешних компонентов или подачи логического напряжения на источник управляющего сигнала.
ENA и ENB - используются для включения или отключения двигателя, подключенного к каналам A и B. Отвечают за управление скоростью вращения двигателя посредством сигналов ШИМ (широтно-импульсной модуляции).
IN1, IN2, IN3, IN4 - эти входные контакты используются для управления направлением вращения двигателя, подключенного к каналу А (IN1 и IN2) и каналу B (IN3 и IN4). Подавая соответствующие логические уровни (HIGH или LOW), вы можете установить желаемое направление вращения двигателя.
OUT-1 и OUT-2 - предназначены для подключения двигателей. В частности, один двигатель должен быть подключен к OUT-1 и OUT-2, а другой двигатель должен быть подключен к OUT-3 и OUT-4. Важно отметить, что двигатели можно подключать в диапазоне напряжений от 5 В до 35 В. Однако стоит учитывать, что выходное напряжение на этих контактах уменьшится примерно на 2 В по сравнению с напряжением, подаваемым на контакт Vcc.
Модуль Bluetooth HC-05
HC-05 — это широко используемый модуль Bluetooth, который обеспечивает удобный и надежный способ добавления возможностей беспроводной связи к электронным устройствам. Он поддерживает последовательную связь по протоколу UART (универсальный асинхронный приемник-передатчик).
Модуль HC-05 поддерживает спецификацию Bluetooth версии 2.0 и может быть настроен как ведущее или ведомое устройство с помощью AT-команд, в зависимости от желаемого приложения. В режиме «Master» он может инициировать соединения с другими устройствами Bluetooth, а в режиме «Slave» — принимать входящие соединения.
Распиновка HC-05
Модуль Bluetooth HC-05 имеет определенную распиновку, соответствующую его различным функциям. Назначение его контактов:
VCC - данный контакт используется для подачи питания на модуль. Обычно он работает в диапазоне напряжений от 3,3 В до 6 В.
GND - общий провод (земля) модуля и должен быть подключен к земле источника питания и источника управляющего сигнала.
TXD - контакт передачи данных, используется для отправки данных из модуля на другое устройство. Он должен быть подключен к контакту приема (RX) принимающего устройства.
RXD - контакт приема данных, используется для получения данных от другого устройства. Он должен быть подключен к контакту передачи (TX) передающего устройства.
STATE - этот контакт является дополнительным, который можно использовать для проверки состояния модуля. Его можно настроить для предоставления информации о состоянии подключения модуля или другой соответствующей информации.
EN - используется для переключения модуля между режимом команд и данных. Когда на этот вывод подается ВЫСОКИЙ уровень (3,3 В или 5 В), включается командный режим, а когда на этот вывод подается НИЗКИЙ уровень (0 В или GND), модуль переключается в режим данных.
Сборка шасси марсохода
Для создания шасси для нашего проекта мы использовали лазерную резку акрилового листа. Лист был точно разрезан для размещения всех необходимых фитингов и компонентов, что позволяет легко собрать его потом с помощью отверток.
Последовательность сборки робота при этом будет следующей. Сначала соедините заднюю ногу с передней с помощью гаек и болтов M4 10 мм.
Затем соедините пару передней и задней опоры с опорной пластиной с помощью L-образного зажима с гайками и болтами M3, M4 диаметром 10 мм.
После этого прикрепите двигатели обеими ножками к соответствующему месту с помощью гаек и болтов M3 диаметром 30 мм.
И, наконец, поместите все электронные компоненты в подходящее место с помощью двусторонней ленты.
Схема проекта
Схема робота-марсохода на основе платы Arduino приведена на следующем рисунке.
В конструкции нашего робота шесть двигателей: три двигателя соединены параллельно с правой стороны и три двигателя подключены параллельно с левой стороны. Такая конфигурация позволяет всем трем двигателям с каждой стороны работать синхронно, с одинаковой скоростью и в одном направлении. Подключив их параллельно, мы обеспечиваем получение ими одинаковых сигналов управления и питания. Такое расположение обеспечивает эффективное и скоординированное движение марсохода, повышая его маневренность и устойчивость.
Соединения:
Модуль Bluetooth Arduino и HC-05:
- Подключите контакт TX модуля Bluetooth к контакту RX (обычно цифровой контакт 0) платы Arduino.
- Подключите контакт RX модуля Bluetooth к контакту TX (обычно цифровой контакт 1) платы Arduino.
- Подключите контакты VCC и GND модуля Bluetooth к соответствующим контактам питания (+5 В) и земли на Arduino.
Модуль Arduino и драйвер двигателя:
- Подключите цифровые выходные контакты Arduino (цифровые контакты 10, 9, 8 и 7) к соответствующим входным контактам (IN1, IN2, IN3 и IN4) на модуле драйвера двигателя.
- Подключите контакты ENA и ENB модуля драйвера двигателя к контакту платы с уровнем High с помощью разъема типа "мама".
- Подключите контакты OUT1, OUT2, OUT3 и OUT4 модуля драйвера двигателя к соответствующим клеммам двигателей.
- Подключите контакты VCC (+5 В) и GND модуля драйвера двигателя к соответствующим разъемам питания (Vin) и земли (GND) на Arduino.
Источник питания:
- Подключите положительную клемму источника питания к входу +12 В модуля драйвера двигателя.
- Подключите отрицательную клемму источника питания к контакту GND модуля драйвера двигателя.
- Подключите контакт GND Arduino к контакту GND модуля драйвера двигателя.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Конфигурация контактов: заданы контакты на плате Arduino, которые подключены к модулю драйвера двигателя и другим компонентам. Этот шаг гарантирует, что для управления двигателем и других операций используются правильные контакты.
Мы определили контакты IN1, IN2, IN3 и IN4 как цифровые контакты 10,9,8 и 7 платы Arduino. Эти контакты подключены к входным контактам модуля драйвера двигателя.
1 2 3 4 5 |
int state=0; const int motorpin11=10; // L298n #NI1 const int motorpin12=9; // L298n #NI2 const int motorpin21=8; // L298n #NI3 const int motorpin22=7; // L298n #NI4 |
Настройка: функция настройки запускается только один раз в начале выполнения кода. Она отвечает за настройку протоколов связи, настройку режимов работы контактов и инициализацию переменных.
В функции setup() мы начинаем с инициализации аппаратной последовательной связи со скоростью передачи данных 9600 бод. Это позволяет плате Arduino устанавливать связь с внешними устройствами, такими как модуль Bluetooth, с заданной скоростью передачи данных.
Далее мы устанавливаем режимы контактов для контактов управления направлением вращения двигателей. Эти контакты предназначены для управления движением и направлением вращения двигателей. Устанавливая их изначально на LOW , мы гарантируем, что двигатели будут остановлены в начале выполнения программы. Это предотвращает любое непреднамеренное движение двигателей до получения каких-либо команд или инструкций.
Инициализация аппаратной последовательной связи и установка соответствующих режимов контактов являются важными шагами в подготовке Arduino к правильному управлению двигателем и обеспечению того, чтобы исходное состояние двигателя было контролируемым и стационарным.
1 2 3 4 5 6 7 8 9 10 11 |
void setup() { Serial.begin(9600); pinMode(motorpin11,OUTPUT); pinMode(motorpin12,OUTPUT); pinMode(motorpin21,OUTPUT); pinMode(motorpin22,OUTPUT); digitalWrite(motorpin11,LOW); digitalWrite(motorpin12,LOW); digitalWrite(motorpin21,LOW); digitalWrite(motorpin22,LOW); } |
Цикл (Loop): функция цикла работает непрерывно после завершения настройки. Она включает в себя основную логику программы, определяющую поведение марсохода на основе полученных команд.
Функция loop() постоянно проверяет наличие входящих команд от модуля Bluetooth. В зависимости от полученной команды марсоход будет двигаться вперед, назад, поворачивать налево, поворачивать направо или останавливаться.
Код проверяет входящие сигналы Bluetooth и получает команды от сопряженного устройства. Это могут быть инструкции по движению вперед, назад, повороту влево или вправо или остановке марсохода.
1 2 3 4 |
void loop() { if (Serial.available()>0) state=Serial.read(); { |
Принятые команды переводятся в соответствующие управляющие сигналы для двигателей. Код отправляет необходимые сигналы модулю драйвера двигателя, корректируя направления согласно приянтым инструкциям.
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 |
if (state=='F') { digitalWrite(motorpin11,HIGH); digitalWrite(motorpin12,LOW); // Forward motion of rover digitalWrite(motorpin21,HIGH); digitalWrite(motorpin22,LOW); } else if(state=='B') { digitalWrite(motorpin11,LOW); digitalWrite(motorpin12,HIGH); // Backward motion of rover digitalWrite(motorpin21,LOW); digitalWrite(motorpin22,HIGH); } else if(state=='S') { digitalWrite(motorpin11,LOW); digitalWrite(motorpin12,LOW); // Stop digitalWrite(motorpin21,LOW); digitalWrite(motorpin22,LOW); } else if(state=='L') { digitalWrite(motorpin11,HIGH); digitalWrite(motorpin12,LOW); // Left motion of rover digitalWrite(motorpin21,LOW); digitalWrite(motorpin22,HIGH); } else if(state=='R') { digitalWrite(motorpin11,LOW); digitalWrite(motorpin12,HIGH); // Right motion of rover digitalWrite(motorpin21,HIGH); digitalWrite(motorpin22,LOW); } else if(state=='l') { digitalWrite(motorpin11,LOW); digitalWrite(motorpin12,HIGH); // Backward Left motion of rover digitalWrite(motorpin21,HIGH); digitalWrite(motorpin22,LOW); } else if(state=='r') { digitalWrite(motorpin11,HIGH); digitalWrite(motorpin12,LOW); // Backward Right motion of rover digitalWrite(motorpin21,LOW); digitalWrite(motorpin22,HIGH); } }} |
Полученные данные сравниваются с помощью операторов if и else if, что позволяет условно выполнить определенные операторы на основе оценки этих условий.
В рамках этих условных операторов мы определили семь различных функций движения, соответствующих различным действиям марсохода. Эти функции вызываются внутри операторов if в зависимости от конкретных условий. Каждая функция отвечает за управление определенным движением, например движением вперед, назад, поворотом влево или вправо, остановкой, назад влево и назад вправо.
Организовав код таким образом, мы можем упростить его понимание и доработку (при необходимости). Условные операторы гарантируют, что соответствующая функция перемещения будет выполнена при выполнении соответствующего условия на основе полученных данных.
Таким образом, операторы if и else if позволяют коду программы оценивать полученные данные и выполнять соответствующую функцию движения на основе выполненного условия, обеспечивая точное управление и маневренность марсохода.
Установка Android-приложение для управления марсоходом
Чтобы управлять нашим вездеходом по Bluetooth с телефона, выполните следующие действия:
- Откройте приложение «Bluetooth RC Car» на своем устройстве (телефоне) Android. Обратите внимание, что в настоящее время это приложение доступно только для пользователей Android.
- Включите Bluetooth на телефоне, зайдя в настройки телефона.
- Подключите телефон к модулю Bluetooth HC-05. Если у вас новый модуль HC-05, перед подключением необходимо выполнить дополнительный шаг.
- Зайдите в настройки Bluetooth на вашем телефоне.
- Выполните поиск устройств Bluetooth.
- Вы найдете устройство Bluetooth с именем HC-05.
- Выполните сопряжение устройства Bluetooth с телефоном, выбрав его.
- В процессе сопряжения вам будет предложено ввести пароль.
- Пароль по умолчанию для HC-05 обычно — 1234 или 0000 .
- Введите пароль и продолжите процесс сопряжения.
- После успешного сопряжения ваш марсоход, управляемый через Bluetooth, будет подключен к вашему устройству Android.
Выполнив следующие действия, вы сможете установить соединение между вашим телефоном и модулем Bluetooth марсохода, что позволит вам управлять им по беспроводной сети с помощью приложения «Bluetooth RC Car».
Заключение
Поздравляем! Вы успешно собрали марсоход на основе платы Arduino. Теперь можно приступить к тестированию его работы. Путешествуйте на своем вездеходе по разным местам, проводите эксперименты и собирайте ценные данные. Управляйте им по беспроводной сети с помощью смартфона или других устройств с поддержкой Bluetooth и наблюдайте, как он справляется с трудностями.
Исходный код программы (скетча)
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
int state=0; const int motorpin11=10; // L298n #NI1 const int motorpin12=9; // L298n #NI2 const int motorpin21=8; // L298n #NI3 const int motorpin22=7; // L298n #NI4 void setup() { pinMode(motorpin11,OUTPUT); pinMode(motorpin12,OUTPUT); pinMode(motorpin21,OUTPUT); pinMode(motorpin22,OUTPUT); digitalWrite(motorpin11,LOW); digitalWrite(motorpin12,LOW); digitalWrite(motorpin21,LOW); digitalWrite(motorpin22,LOW); Serial.begin(9600); } void loop() { if (Serial.available()>0) state=Serial.read(); { if (state=='F') { digitalWrite(motorpin11,HIGH); digitalWrite(motorpin12,LOW); // Forward motion of rover digitalWrite(motorpin21,HIGH); digitalWrite(motorpin22,LOW); } else if(state=='B') { digitalWrite(motorpin11,LOW); digitalWrite(motorpin12,HIGH); // Backward motion of rover digitalWrite(motorpin21,LOW); digitalWrite(motorpin22,HIGH); } else if(state=='S') { digitalWrite(motorpin11,LOW); digitalWrite(motorpin12,LOW); // Stop digitalWrite(motorpin21,LOW); digitalWrite(motorpin22,LOW); } else if(state=='L') { digitalWrite(motorpin11,HIGH); digitalWrite(motorpin12,LOW); // Left motion of rover digitalWrite(motorpin21,LOW); digitalWrite(motorpin22,HIGH); } else if(state=='R') { digitalWrite(motorpin11,LOW); digitalWrite(motorpin12,HIGH); // Right motion of rover digitalWrite(motorpin21,HIGH); digitalWrite(motorpin22,LOW); } else if(state=='l') { digitalWrite(motorpin11,LOW); digitalWrite(motorpin12,HIGH); // Backward Left motion of rover digitalWrite(motorpin21,HIGH); digitalWrite(motorpin22,LOW); } else if(state=='r') { digitalWrite(motorpin11,HIGH); digitalWrite(motorpin12,LOW); // Backward Right motion of rover digitalWrite(motorpin21,LOW); digitalWrite(motorpin22,HIGH); } }} |