Рубрики
Без рубрики

Как построить свой собственный радиоуправляемый автомобиль с помощью Arduino – Hardware

Электроника и программирование не так уж страшны Большинство из нас здесь пишут много кода и программ… С тегами arduino, android, cpp, java.

Большинство из нас здесь пишут много кода и очень редко имеют какое-либо взаимодействие с электроникой, которая действительно запускает наши коды. Другое дело – распространенный миф о том, что электронику очень трудно понять и что нам нужно, по крайней мере, звание инженера-электронщика, чтобы начать с ней работать. Как техник, заправщик и энтузиаст программирования, 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-контроллер

Прежде всего, нам нужно будет собрать шасси нашего автомобиля. Если у вас есть комплект, скорее всего, вы также получили инструкции к нему, но на всякий случай шаги можно найти ниже:

  1. Подготовьте основную часть шасси, 4 небольших пластиковых кронштейна, которые будут крепить двигатели к раме шасси (по 2 для каждого), винты, латунные прокладки, гайки, двигатели, бесполезный USB-кабель и 4 кабеля/соединительных провода.

  2. Подсоедините по одному проводу к каждому контакту двигателя, вы можете припаять их, но если у вас нет паяльника, просто попробуйте “связать” кабели узлом к каждому контакту.

  1. Теперь возьмите свой старый/запасной USB-кабель и отрежьте его так, чтобы осталось около 20 см кабеля.

  2. Снимите несколько сантиметров покрытия кабеля, чтобы вы могли видеть кабели внутри него; внутри должно быть 4/5 кабелей, но нас интересуют только два кабеля, GND – черный и Plus – красный. Снимите 2-4 см покрытия как с красного, так и с черного кабеля. Вы можете оставить его таким, или, чтобы сделать его прочнее, просто “завязать” его узлом или припаять более длинными и прочными кабелями/перемычками, чтобы соединение было достаточно прочным.

  1. Возьмите двигатель и прикрепите его к раме шасси с помощью пластиковых кронштейнов (по 2 для каждого), используя винты и гайки. Пожалуйста, обратите внимание, что на одной стороне каждого двигателя есть маленькая “точка”, и эта точка должна быть обращена внутрь, чтобы при установке двух двигателей эти точки были обращены друг к другу.
  1. Как только двигатели будут установлены на свои места, настанет время для 3-го нейлонового опорного колеса. Когда вы смотрите на конец рамки, там должно быть 4 маленьких отверстия рядом друг с другом, выглядящих как квадратная форма. Возьмите латунные прокладки и прикрепите их к этим отверстиям с помощью винтов, чтобы латунные прокладки находились на одной стороне рамы с двигателями.

  2. Закрепите нейлоновое опорное колесо на латунных прокладках с помощью винтов.

  1. Установите колесо на каждый двигатель. Обратите внимание, что внутри ступицы колеса есть форма, поэтому обязательно поместите ее в нужное место. Скорее всего, будет огромное сопротивление, но вы должны быть нежны с ним и в то же время использовать некоторую силу.

  2. Мы почти закончили сборку автомобиля, на данный момент вы можете установить модуль Arduino и контроллер двигателя постоянного тока на раму. Я использовал 3 винта с гайками, которые остались от комплекта, и покрыл провода электроизоляционной лентой там, где это было необходимо.

Как только мы соберем наш автомобиль с Arduino и контроллером двигателя постоянного тока на борту, пришло время для подключения. Подготовьте соединительные провода, как мужчина – мужчина, так и женщина – мужчина.

  1. Возьмите кабели, подсоединенные к двигателям, и подсоедините их к контроллеру двигателя постоянного тока. Допустим, что нижние контакты, те, что ближе к земле, являются плюсовыми контактами, а те, что ближе к раме, – минусовыми (GND). Схема должна выглядеть следующим образом:

OUT1 – Левый двигатель (-) Кабель GND

OUT2 – Левый кабель двигателя (+)

OUT3 – Кабель правого двигателя (+)

OUT4 – Правый двигатель ( -) Кабель GND

  1. Теперь давайте подключим Arduino к контроллеру двигателя постоянного тока, для этого мы будем использовать контакты с крошечными именами IN1, IN2, IN3 и IN4. Предыдущие разъемы OUT1, 2, 3, 4 отвечали за передачу питания на электродвигатели, но в пределах 1, 2, 3, 4 контактов мы будем посылать команды на контроллер с нашего устройства Arduino. На этот раз вам могут понадобиться перемычки между гнездами, но если у вас нет такого провода, просто попробуйте изменить перемычку между гнездами или припаять провода к контактам.

IN1 – ЦИФРОВОЙ 5

IN2 – ЦИФРОВОЙ 6

IN3 – ЦИФРОВОЙ 10

IN4 – ЦИФРОВОЙ 11

  1. Модуль Bluetooth – это последняя важная вещь, которая нам понадобится для нашего рулевого управления, когда вы смотрите на модуль Bluetooth, он должен иметь 4 контакта, и каждый контакт подписан следующим образом: VCC – ПИТАНИЕ, GND – Заземление (-), TXD – передача данных, RXD – прием данных. На этот раз могут снова понадобиться соединительные провода между розеткой и розеткой.

VCC – МОЩНОСТЬ 5 В

GND – МОЩНОСТЬ GND

TXD – ЦИФРОВОЙ 0 RXD

RXD – ЦИФРОВОЙ 1 TXD

Как вы можете видеть, обмен данными будет осуществляться между Arduino и нашим модулем Bluetooth, вот почему кабели передачи данных подключаются противоположным образом.

  1. Пьезозвук имеет 2 ножки, более длинную, анод (+), и более короткую, катод (-). Рекомендуется использовать резистор 330 Ом между пьезозуммером и анодом, потому что это очень чувствительный и крошечный прибор, но я его не использовал, так как резистор делает мой пьезозуммер очень тихим. Примечание: Перемычки между женским и мужским проводами снова могут оказаться полезными.

Анод(+) длинная ножка – ЦИФРА 3

Катод(-) короткая ветвь – МОЩНОСТЬ GND

  1. Мы почти на месте! Теперь нам нужно включить питание нашей платы Arduino и контроллера двигателя постоянного тока. Возьмите часть кабеля USB, которую мы подготовили в предыдущей части, и подключите эти два кабеля; красный и черный к контроллеру двигателя постоянного тока.

Красный кабель (+) – 12 В

Черный кабель (-) – GND

  1. Последний шаг – подключить два USB-кабеля, один к блоку питания и плате Arduino, а другой, подключенный к контроллеру двигателя постоянного тока, также к блоку питания. Последнее, что нужно сделать, это установить блок питания на раму, я использовал электроизоляционную ленту, чтобы приклеить его к раме, но есть много других способов его крепления. Примечание: на некоторых блоках питания может быть переключатель или кнопка, поэтому для питания схемы вам может потребоваться включить питание.
  1. Все детали и проводка находятся на своем месте, но по-прежнему нет кода в Arduino и нет приложения на мобильном телефоне для управления автомобилем.

Теперь, когда у нас готов наш радиоуправляемый автомобиль, последняя часть – загрузить код на плату Arduino и загрузить приложение на мобильный телефон Android. Для этого шага вам понадобится программа Arduino IDE на вашем компьютере, которую можно загрузить с официального сайта Arduino. Как только вы его установите, необходимо установить два параметра. Откройте программу Arduino IDE, и вы увидите несколько опций на верхней панели, выберите “Инструменты”, а затем вы должны увидеть список, найдите опцию под названием “Плата:” и выберите свою плату Arduino из списка (большую часть времени это Arduino UNO). Позже, прямо под опцией “Плата:”, нажмите на опцию “Порт”, если к вашему ПК не подключены USB-устройства, она может быть выделена серым цветом/отключена, как только вы подключите плату Arduino с помощью USB-кабеля, эта опция должна стать доступной, возможно, вам придется выбрать один порт, например, в моем случае это ПОРТ 5. Несмотря на то, что у меня есть 3 USB-порта на моем ноутбуке, только один из них работает как ПОРТ. Вы можете попробовать использовать разные USB-разъемы на вашем компьютере, пока это не сработает.

Прежде чем мы перейдем к загрузке кода в Arduino, у вас есть два варианта:

  1. Просто загрузите прикрепленный файл, откройте его с помощью программы Arduino IDE и просто загрузите его.

  2. Перейдите в программу Arduino IDE, нажмите “Файл – Создать”, скопируйте код отсюда и нажмите на значок “Загрузить”. Помните, что при загрузке вашего кода плата Arduino должна быть подключена к вашему ПК через правильный USB-разъем, на котором установлен порт.

Примечание: При загрузке кода в Arduino разъемы DIGITAL 0 RX, DIGITAL 1 TX должны быть отключены , когда эти разъемы подключены к модулю Bluetooth, Arduino может не принимать входящие данные с вашего ПК, и программа может зависнуть в состоянии “загрузка”.

Ниже вы можете найти код с пояснениями.

  1. После загрузки кода на плату 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 состоит из двух основных частей:

  1. 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.

  1. void loop() { } – Как вы можете догадаться из названия, это та часть программы, в которой все, написанное внутри фигурных скобок, будет повторяться снова и снова. Это все, что необходимо для запуска любой программы Arduino. Остальное – это всего лишь ваше собственное воображение. Прежде чем я перейду к деталям в цикле и функциях, есть еще одна часть, которая находится в начале нашего кода, прямо перед void setup() { }

  2. В части 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;

  1. Теперь давайте вернемся к части цикла.

пустой цикл() {если (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;

  1. Теперь почти все объяснено, но в коде были некоторые функции, такие как 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);

} }

  1. Вот как это работает. С этого момента, надеюсь, вы также сможете внести свой собственный вклад в код, что-то изменить, добавить несколько новых функций или переписать его по-своему.

Конфигурация 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”