Большинство из нас здесь пишут много кода и очень редко имеют какое-либо взаимодействие с электроникой, которая действительно запускает наши коды. Другое дело – распространенный миф о том, что электронику очень трудно понять и что нам нужно, по крайней мере, звание инженера-электронщика, чтобы начать с ней работать. Как техник, заправщик и энтузиаст программирования, Arduino всегда был где-то в моем списке. У меня тоже была радиоуправляемая машина, когда я был ребенком, и я всегда хотел купить еще одну в зрелом возрасте, так что теперь, когда я начал учиться программировать, получил комплект Arduino, это было лучшее время, чтобы воплотить эту детскую мечту в реальность.
Прежде чем и если вы перейдете к следующей части, я хочу добавить еще несколько вещей. Прежде всего, это старая статья, которую я публиковал ранее на некоторых технических сайтах, связанных с микроконтроллерами, так что вы можете рассматривать ее просто как обновленную версию. Это руководство в значительной степени основано на техническом объяснении, однако во второй части руководства я объясняю код, написанный в Arduino IDE. И последнее, но не менее важное: несмотря на то, что ArduCar – это мое собственное приложение, написанное на Java, я не предоставил ни исходный код, ни его объяснение в этом руководстве.
В этой инструкции вы узнаете, как создать радиоуправляемый автомобиль на базе Arduino с нуля. Никакого предварительного опыта программирования, Arduino или электроники не требуется. Несмотря на то, что наличие некоторого предыдущего опыта в этих областях может быть полезным, каждый должен быть в состоянии завершить этот проект без каких-либо проблем. Вы также можете спросить, почему Power bank? В наши дни эти устройства становятся все более доступными, в некоторых случаях они даже дешевле аккумуляторов, у многих из нас они есть дома, их можно использовать повторно и заряжать в любое время, когда мы захотим. Проект охватывает основные принципы создания такого автомобиля с минималистичным подходом к материалам и подробно объясняет код. Более того, предоставленные инструкции также могут быть использованы в различных проектах, так что давайте начнем!
Как у любителя, у меня было не так много инструментов, таких как паяльник и так далее. Поэтому я попытался использовать некоторые старые электронные вещи, такие как USB-кабель или блок питания, которые у большинства из вас могут быть где-то дома. Вы можете следовать всем моим инструкциям, но не стесняйтесь изменять некоторые детали и проявлять творческий подход. Ниже можно ознакомиться со списком материалов:
Arduino UNO
автомобильное шасси с колесами и двигателями, комплект
соединительные провода “мужчина – мужчина” и “женщина – мужчина”
электроизоляционная лента
Модуль Bluetooth (HC-06 или HC-05)
Контроллер двигателя постоянного тока (L298N)
Блок питания с 2 USB-выходами
Пьезозвук
Мобильный телефон на базе Android
ПК с Arduino IDE установленный
Аппаратное обеспечение – Arduino RC Автомобильный Bluetooth-контроллер
Прежде всего, нам нужно будет собрать шасси нашего автомобиля. Если у вас есть комплект, скорее всего, вы также получили инструкции к нему, но на всякий случай шаги можно найти ниже:
Подготовьте основную часть шасси, 4 небольших пластиковых кронштейна, которые будут крепить двигатели к раме шасси (по 2 для каждого), винты, латунные прокладки, гайки, двигатели, бесполезный USB-кабель и 4 кабеля/соединительных провода.
Подсоедините по одному проводу к каждому контакту двигателя, вы можете припаять их, но если у вас нет паяльника, просто попробуйте “связать” кабели узлом к каждому контакту.
Теперь возьмите свой старый/запасной USB-кабель и отрежьте его так, чтобы осталось около 20 см кабеля.
Снимите несколько сантиметров покрытия кабеля, чтобы вы могли видеть кабели внутри него; внутри должно быть 4/5 кабелей, но нас интересуют только два кабеля, GND – черный и Plus – красный. Снимите 2-4 см покрытия как с красного, так и с черного кабеля. Вы можете оставить его таким, или, чтобы сделать его прочнее, просто “завязать” его узлом или припаять более длинными и прочными кабелями/перемычками, чтобы соединение было достаточно прочным.
- Возьмите двигатель и прикрепите его к раме шасси с помощью пластиковых кронштейнов (по 2 для каждого), используя винты и гайки. Пожалуйста, обратите внимание, что на одной стороне каждого двигателя есть маленькая “точка”, и эта точка должна быть обращена внутрь, чтобы при установке двух двигателей эти точки были обращены друг к другу.
Как только двигатели будут установлены на свои места, настанет время для 3-го нейлонового опорного колеса. Когда вы смотрите на конец рамки, там должно быть 4 маленьких отверстия рядом друг с другом, выглядящих как квадратная форма. Возьмите латунные прокладки и прикрепите их к этим отверстиям с помощью винтов, чтобы латунные прокладки находились на одной стороне рамы с двигателями.
Закрепите нейлоновое опорное колесо на латунных прокладках с помощью винтов.
Установите колесо на каждый двигатель. Обратите внимание, что внутри ступицы колеса есть форма, поэтому обязательно поместите ее в нужное место. Скорее всего, будет огромное сопротивление, но вы должны быть нежны с ним и в то же время использовать некоторую силу.
Мы почти закончили сборку автомобиля, на данный момент вы можете установить модуль Arduino и контроллер двигателя постоянного тока на раму. Я использовал 3 винта с гайками, которые остались от комплекта, и покрыл провода электроизоляционной лентой там, где это было необходимо.
Как только мы соберем наш автомобиль с Arduino и контроллером двигателя постоянного тока на борту, пришло время для подключения. Подготовьте соединительные провода, как мужчина – мужчина, так и женщина – мужчина.
- Возьмите кабели, подсоединенные к двигателям, и подсоедините их к контроллеру двигателя постоянного тока. Допустим, что нижние контакты, те, что ближе к земле, являются плюсовыми контактами, а те, что ближе к раме, – минусовыми (GND). Схема должна выглядеть следующим образом:
OUT1 – Левый двигатель (-) Кабель GND
OUT2 – Левый кабель двигателя (+)
OUT3 – Кабель правого двигателя (+)
OUT4 – Правый двигатель ( -) Кабель GND
- Теперь давайте подключим Arduino к контроллеру двигателя постоянного тока, для этого мы будем использовать контакты с крошечными именами IN1, IN2, IN3 и IN4. Предыдущие разъемы OUT1, 2, 3, 4 отвечали за передачу питания на электродвигатели, но в пределах 1, 2, 3, 4 контактов мы будем посылать команды на контроллер с нашего устройства Arduino. На этот раз вам могут понадобиться перемычки между гнездами, но если у вас нет такого провода, просто попробуйте изменить перемычку между гнездами или припаять провода к контактам.
IN1 – ЦИФРОВОЙ 5
IN2 – ЦИФРОВОЙ 6
IN3 – ЦИФРОВОЙ 10
IN4 – ЦИФРОВОЙ 11
- Модуль Bluetooth – это последняя важная вещь, которая нам понадобится для нашего рулевого управления, когда вы смотрите на модуль Bluetooth, он должен иметь 4 контакта, и каждый контакт подписан следующим образом: VCC – ПИТАНИЕ, GND – Заземление (-), TXD – передача данных, RXD – прием данных. На этот раз могут снова понадобиться соединительные провода между розеткой и розеткой.
VCC – МОЩНОСТЬ 5 В
GND – МОЩНОСТЬ GND
TXD – ЦИФРОВОЙ 0 RXD
RXD – ЦИФРОВОЙ 1 TXD
Как вы можете видеть, обмен данными будет осуществляться между Arduino и нашим модулем Bluetooth, вот почему кабели передачи данных подключаются противоположным образом.
- Пьезозвук имеет 2 ножки, более длинную, анод (+), и более короткую, катод (-). Рекомендуется использовать резистор 330 Ом между пьезозуммером и анодом, потому что это очень чувствительный и крошечный прибор, но я его не использовал, так как резистор делает мой пьезозуммер очень тихим. Примечание: Перемычки между женским и мужским проводами снова могут оказаться полезными.
Анод(+) длинная ножка – ЦИФРА 3
Катод(-) короткая ветвь – МОЩНОСТЬ GND
- Мы почти на месте! Теперь нам нужно включить питание нашей платы Arduino и контроллера двигателя постоянного тока. Возьмите часть кабеля USB, которую мы подготовили в предыдущей части, и подключите эти два кабеля; красный и черный к контроллеру двигателя постоянного тока.
Красный кабель (+) – 12 В
Черный кабель (-) – GND
- Последний шаг – подключить два USB-кабеля, один к блоку питания и плате Arduino, а другой, подключенный к контроллеру двигателя постоянного тока, также к блоку питания. Последнее, что нужно сделать, это установить блок питания на раму, я использовал электроизоляционную ленту, чтобы приклеить его к раме, но есть много других способов его крепления. Примечание: на некоторых блоках питания может быть переключатель или кнопка, поэтому для питания схемы вам может потребоваться включить питание.
- Все детали и проводка находятся на своем месте, но по-прежнему нет кода в Arduino и нет приложения на мобильном телефоне для управления автомобилем.
Теперь, когда у нас готов наш радиоуправляемый автомобиль, последняя часть – загрузить код на плату Arduino и загрузить приложение на мобильный телефон Android. Для этого шага вам понадобится программа Arduino IDE на вашем компьютере, которую можно загрузить с официального сайта Arduino. Как только вы его установите, необходимо установить два параметра. Откройте программу Arduino IDE, и вы увидите несколько опций на верхней панели, выберите “Инструменты”, а затем вы должны увидеть список, найдите опцию под названием “Плата:” и выберите свою плату Arduino из списка (большую часть времени это Arduino UNO). Позже, прямо под опцией “Плата:”, нажмите на опцию “Порт”, если к вашему ПК не подключены USB-устройства, она может быть выделена серым цветом/отключена, как только вы подключите плату Arduino с помощью USB-кабеля, эта опция должна стать доступной, возможно, вам придется выбрать один порт, например, в моем случае это ПОРТ 5. Несмотря на то, что у меня есть 3 USB-порта на моем ноутбуке, только один из них работает как ПОРТ. Вы можете попробовать использовать разные USB-разъемы на вашем компьютере, пока это не сработает.
Прежде чем мы перейдем к загрузке кода в Arduino, у вас есть два варианта:
Просто загрузите прикрепленный файл, откройте его с помощью программы Arduino IDE и просто загрузите его.
Перейдите в программу Arduino IDE, нажмите “Файл – Создать”, скопируйте код отсюда и нажмите на значок “Загрузить”. Помните, что при загрузке вашего кода плата Arduino должна быть подключена к вашему ПК через правильный USB-разъем, на котором установлен порт.
Примечание: При загрузке кода в Arduino разъемы DIGITAL 0 RX, DIGITAL 1 TX должны быть отключены , когда эти разъемы подключены к модулю Bluetooth, Arduino может не принимать входящие данные с вашего ПК, и программа может зависнуть в состоянии “загрузка”.
Ниже вы можете найти код с пояснениями.
- После загрузки кода на плату Arduino пришло время повторно подключить контакты DIGITAL 0 RX и DIGITAL 1 TX к модулю Bluetooth и повторно подключить USB-кабель (Arduino – Power bank) к блоку питания.
4.Последний шаг, чтобы заставить ваш радиоуправляемый автомобиль работать, – это загрузить приложение для Android из магазина Google Play и начать получать удовольствие! Вы также можете загружать различные приложения, если они отправляют соответствующие серийные коды, или даже создать свое собственное мобильное приложение.
Спасибо вам за ваше внимание и желаю вам получить от этого массу удовольствия. В случае возникновения каких-либо вопросов или предложений, пожалуйста, дайте мне знать об этом ниже в разделе комментариев.
#define in1 5 #define in2 6 #define in3 10 #define in4 11 int state; int piezo = 3; void setup() { pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(piezo,OUTPUT); Serial.begin(9600); } void loop() { if (Serial.available() > 0) { state = Serial.read(); Stop(); switch (state) { case 'F': forward(); soundFX(3000.0,30+400*(1+sin(millis()/5000))); break; case 'G': forwardleft(); soundFX(3000.0,60); break; case 'D': forwardright(); soundFX(3000.0,60); break; case 'N': backright(); soundFX(3000.0,30+100*(1+sin(millis()/2500))); break; case 'C': backleft(); soundFX(3000.0,30+100*(1+sin(millis()/2500))); soundFX(3000.0,30+100*(1+sin(millis()/2500))); soundFX(3000.0,30+100*(1+sin(millis()/2500))); soundFX(3000.0,30+100*(1+sin(millis()/2500))); break; case 'B': back(); soundFX(3000.0,30+200*(1+sin(millis()/2500))); soundFX(3000.0,30+200*(1+sin(millis()/2500))); soundFX(3000.0,30+200*(1+sin(millis()/2500))); soundFX(3000.0,30+200*(1+sin(millis()/2500))); break; case 'L': left(); soundFX(3000.0,60); soundFX(3000.0,60); soundFX(3000.0,60); soundFX(3000.0,60); break; case 'R': right(); soundFX(3000.0,60); soundFX(3000.0,60); soundFX(3000.0,60); soundFX(3000.0,60); break; case 'H': soundFX(3000.0,30+200*(1+sin(millis()/2500))); soundFX(3000.0,60); soundFX(3000.0,30+200*(1+sin(millis()/2500))); soundFX(3000.0,60); } } } void forward() { analogWrite(in1, 255); analogWrite(in3, 255); } void forwardleft() { analogWrite(in1, 50); analogWrite(in3, 255); } void forwardright() { analogWrite(in1, 255); analogWrite(in3, 50); } void back() { analogWrite(in2, 255); analogWrite(in4, 255); } void backright() { analogWrite(in2, 50); analogWrite(in4, 255); } void backleft() { analogWrite(in2, 255); analogWrite(in4, 50); } void left() { analogWrite(in4, 255); analogWrite(in1, 255); } void right() { analogWrite(in3, 255); analogWrite(in2, 255); } void Stop() { analogWrite(in1, 0); analogWrite(in2, 0); analogWrite(in3, 0); analogWrite(in4, 0); } void soundFX(float amplitude,float period){ int uDelay=2+amplitude+amplitude*sin(millis()/period); for(int i=0;i<5;i++){ digitalWrite(piezo,HIGH); delayMicroseconds(uDelay); digitalWrite(piezo,LOW); delayMicroseconds(uDelay); } }
Для любопытных я решил добавить объяснение кода Arduino, чтобы это могло помочь некоторым из вас еще лучше понять механику и логику этого радиоуправляемого автомобиля. Я также хочу добавить, что это не совсем мой код, он очень похож на коды, которые доступны в разных проектах, я просто упростил некоторые части и добавил фрагменты для звука пьезозвука.
Программа Arduino IDE использует своего рода упрощенную гибридную версию языков программирования C и C++, поэтому она может напомнить вам об этих языках программирования, если вы с ними знакомы, но если нет, то это тоже нормально. Код будет разделен на несколько фрагментов, чтобы помочь вам лучше его понять.
Каждая программа Arduino состоит из двух основных частей:
void setup() { }
– где мы устанавливаем функцию для каждого вывода Arduino. Это то, что Arduino считывает только один раз, получает информацию и сохраняет ее для остальной части программы.
В нашем случае это выглядит так:
void setup() {pinMode(in1, OUTPUT);
pinMode означает, что мы установим режим для данного pin-кода, внутри скобок есть два значения, первое – in1, это имя pin-кода, на который мы ссылаемся, а второе значение – OUTPUT означает что мы отправим некоторые данные с Arduino на цель. Если есть записанный ВВОД, это означает, что данный вывод будет получать данные от датчика и т.д.
pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(piezo, OUTPUT);
Серийный номер.начало(9600);
Последовательный порт – это порт, который можно использовать для отправки и получения данных, вы помните те контакты DIGITAL 0 RX и DIGITAL 1 TX, к которым мы подключали модуль Bluetooth? Речь идет об их настройке. Это означает, что мы откроем канал, по которому будет осуществляться обмен данными. Число в скобках (9600) означает, что за одну секунду может быть отправлено до 9600 символов. Это наиболее часто используемая скорость передачи данных в бодах, так как она наиболее стабильна, чем выше число, тем она быстрее, но также более подвержена помехам из-за шума. Вот почему просто оставьте его на уровне 9600. Примечание: Модули Bluetooth обычно по умолчанию настроены на скорость передачи данных 9600 бод, но иногда вам может потребоваться настроить ее раньше – проверьте раздел конфигурации Bluetooth.
void loop() { }
– Как вы можете догадаться из названия, это та часть программы, в которой все, написанное внутри фигурных скобок, будет повторяться снова и снова. Это все, что необходимо для запуска любой программы Arduino. Остальное – это всего лишь ваше собственное воображение. Прежде чем я перейду к деталям в цикле и функциях, есть еще одна часть, которая находится в начале нашего кода, прямо передvoid setup() { }
В части
void setup() { }
мы назвали контакты Arduino как in и piezo, но это не их настоящие имена, это просто имена, которые мы им дали, и программа всегда будет ссылаться на эти имена при выполнении программы. Из-за этого в начале каждой программы Arduino мы можем инициализировать некоторые имена для выводов и переменных. Давайте взглянем на наш пример:
#определить в1 5
Если вы хотите определить имя для какого-либо вывода на плате Arduino, вы можете использовать #define
word, а затем написать имя после пробела. В нашем случае он находится в 1, так как это название контакта контроллера двигателя постоянного тока, которым мы собираемся управлять. За следующим пробелом следует номер данного pin-кода. В данном случае это значение равно 5, так как вывод int1 подключен к разъему с номером 5 на плате Arduino.#define in2 6
#define in3 10 #define in4 11 int state; // We can also initialize names of the pin as variables int (integer), and variables itself. int piezo = 3;
- Теперь давайте вернемся к части цикла.
пустой цикл() {если (Serial.available() > 0) {
Первый оператор в цикле начинается с if, внутри скобок мы видим условие, оно гласит Serial.available() > 0)
– просто это означает, что если доступен последовательный, в нашем случае модуль Bluetooth, больше 0, запомните двоичный код 1 – true, 0 – false, выполните следующее { } – все, что указано в этих фигурных скобках, будет выполнено.
state.read();
Помните эту переменную состояния в начале кода? Это время, когда мы присваиваем значение этой переменной (= ) , поэтому наша переменная состояния теперь равна Serial.read()
, что означает, что переменная будет изменяться в соответствии с тем, что считывается из модуля Bluetooth.
Стоп();
Эти две скобки () после имени указывают на то, что это функция, и это должно быть объяснено где-то в коде. То же самое и с этим , первая функция, которая будет выполнена в этом коде, – это функция с именем Stop, которая просто автоматически отключит питание от колес и заставит нашу радиоуправляемую машину остановиться.
переключатель (состояние)
Сразу после функции Stop у нас есть еще одна, на этот раз это глобальная функция, которая существует почти в каждом языке программирования, и она называется switch – что буквально означает, что внутри будет несколько функций, и мы просто будем переключаться между ними. На этот раз вы можете видеть, что внутри скобок () у нас есть условие, а условие – это переменная с именем state, значение которой было присвоено всему, что получено от модуля Bluetooth.
случай "F":
Как вы можете видеть, каждая возможная функция внутри переключателя будет помечена как “регистр”, а в одинарных кавычках мы можем увидеть возможное значение переменной состояния. В этом случае, если состояние равно ‘F’ – такой символ отправляется в модуль Bluetooth через мобильное приложение, некоторые функции будут выполнены.
вперед();
Первая функция, которая должна быть выполнена
Звуковые эффекты(3000.0, 30+400*(1+ грех(миллис()/5000)));
Вторая функция, которая должна быть выполнена, на этот раз с некоторыми условиями внутри скобок.
break;
break означает, что для прекращения выполнения этого случая вам всегда нужно заканчивать каждый случай с помощью инструкции break;
.
case 'G': forwardleft(); soundFX(3000.0, 60); break;
- Теперь почти все объяснено, но в коде были некоторые функции, такие как forward(), sound FX() и т.д., Но они не были объяснены ни в void setup() { }, ни в void loop() { } части кода. Если в коде есть такие функции, они должны быть объяснены в конце кода. Ниже вы можете увидеть пример.
void forward()
Опять же, для того, чтобы вызвать функцию, сначала следует записать void, а после пробела следует записать имя функции, например forward(). Внутри фигурных скобок мы видим объяснение функции.analogWrite(in1, 255); analogWrite означает, что мы отправляем сигнал, в случае, если мы получали, он должен быть записан как analogRead. Внутри скобок есть два значения (в 1 – название штыря, на который мы ссылаемся, и 255 – значение частоты электрической волны, которая может варьироваться от 0 до 255 – 0 означает 0%, а 255 означает 100%. Он также может быть записан как НИЗКИЙ – 0, ВЫСОКИЙ – 255. Как вы можете видеть, это то место, где вы можете изменять скорость каждого электродвигателя.
Аналоговая запись(in3, 255);
void sound FX (плавающая амплитуда, плавающий период)
Это та часть, которую я нашел на официальных форумах Arduino, посвященная научно-фантастическим звукам для пьезозвука. Вы можете найти этот код в последнем посте, для получения дополнительных пояснений вы можете перейти по ссылке ниже.
Вы можете найти этот код в последнем посте, для получения дополнительных пояснений вы можете перейти по ссылке ниже.
int uDelay=2+amplitude+amplitude*sin(millis()/period); for(int i=0;i<5;i++){ digitalWrite(piezo, HIGH); delayMicroseconds(uDelay); digitalWrite(piezo, LOW); delayMicroseconds(uDelay); } }
- Вот как это работает. С этого момента, надеюсь, вы также сможете внести свой собственный вклад в код, что-то изменить, добавить несколько новых функций или переписать его по-своему.
Конфигурация Bluetooth
Наконец, но не менее важно отметить еще одну важную вещь. Модули Bluetooth HC-05 и HC-06 обычно имеют настройки по умолчанию, такие как скорость передачи данных, имя, пароль и т.д. Но если вы хотите настроить свой модуль Bluetooth, вы можете использовать для этой цели программу Arduino IDE. Однако вам может потребоваться изменить контакты, к которым подключен модуль Bluetooth, и изменить код Arduino на время настройки. Кроме того, рекомендуется использовать резисторы, чтобы защитить модуль Bluetooth, так как контакты передачи данных работают при напряжении 3,3 В, в то время как выходное напряжение Arduino по умолчанию составляет 5 В. Пожалуйста, имейте все это в виду, я не буду описывать здесь весь процесс, но есть множество доступных руководств, просто погуглите их. Если есть какие-либо предложения или вопросы, пожалуйста, дайте мне знать в разделе комментариев ниже.
Еще раз благодарим вас за внимание и не забудьте поделиться своими собственными проектами ниже!
Оригинал: “https://dev.to/pawel/how-to-build-your-own-rc-car-with-arduino-arducar-12ei”