Полноприводная машинка на основе ардуино и roboroverm1
Содержание:
Характеристики модуля nRF24L01
На плате nRF24L01 встроен демодулятор, синтезатор частот и усилитель сигнала. Дальность действия модуля Arduino nRF24L01+ до 30 метров, а в версии с усилителем и антенной до 1000 метров в прямой видимости. Модуль может использовать 127 каналов связи, отличающихся частотой сигнала — от 2,4 ГГц до 2,483 ГГц. Скорость беспроводного соединения можно настраивать: 250kbps, 1Mbps или 2Mbps.
Дальность действия модуля сравнима с блютуз модулем HC-05/06, но с помощью nRF24L01 можно создать многоканальную связь. Т.е. можно объединить в общую сеть до 7 устройств, которые могут одновременно принимать и отправлять сигнал.
Распиновка радиомодуля nRF24L01+
Подключение nrf24l01 к Arduino MEGA 2560 (Arduino UNO)
Кроме сложной схемы подключения nrf24l01 к Arduino NANO и MEGA2560, плата требовательна к питанию (так утверждается на многих форумах и сайтах). Поэтому необходимо припаять к портам питания модуля (GND и VCC) конденсатор до 10мкФ — это снизит помехи. Если вы несколько раз проверили подключение и загрузили скетч с этой страницы, но модуль отказывается работать — то все дело в питании.
Но не торопитесь искать блок питания на 3,3 Вольта или припаивать конденсаторы (хотя он не помешает). У нас тоже модуль не сразу заработал, но после множества попыток найти подходящую библиотеку и скетч (найдете далее) — модули стабильно заработали. После этого мы загрузили скетч на модули без конденсатора, подключали их к кроне, блоку питания, компьютеру и ноутбуку — все работает стабильно.
Чтобы снизить помехи можно использовать керамический конденсатор
ARDUINO Машинка на nrf24l01
/* Данный скетч модернизация скетча AlexGyver * исходник тут https://github.com/AlexGyver/nRF24L01 */ #include <SPI.h> #include «nRF24L01.h» #include «RF24.h» RF24 radio(9,10); // «создать» модуль на пинах 9 и 10 Для Уно //RF24 radio(9,53); // для Меги byte address = {«1Node»,»2Node»,»3Node»,»4Node»,»5Node»,»6Node»}; //возможные номера труб byte recieved_data; void setup(){ Serial.begin(9600); //открываем порт для связи с ПК pinMode(4, OUTPUT); pinMode(A0, OUTPUT); pinMode(A1, OUTPUT); pinMode(5, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(6, OUTPUT); radio.begin(); //активировать модуль radio.setAutoAck(0); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0,15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openReadingPipe(1,address); //хотим слушать трубу 0 radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop() { byte pipeNo; while( radio.available(&pipeNo)){ // слушаем эфир со всех труб radio.read( &recieved_data, sizeof(recieved_data) ); //читаем присланный массив digitalWrite(4, HIGH); int x1p = constrain(map(recieved_data, 128, 255, 0, 255), 0, 255); //обрезаем и переворачиваем значения int x1b = constrain(map(recieved_data, 128, 0, 0, 255), 0, 255); //обрезаем и переворачиваем значения int y2r = constrain(map(recieved_data, 122, 255, 100, 1), 0, 100); //обрезаем и переворачиваем значения int y2l = constrain(map(recieved_data, 122, 0, 100, 1), 0, 100); //обрезаем и переворачиваем значения int stl = constrain(map(recieved_data, 123, 255, 0, 255), 0, 255); //обрезаем и переворачиваем значения int str = constrain(map(recieved_data, 122, 0, 0, 255), 0, 255); //обрезаем и переворачиваем значения //Serial.print(x1p); Serial.print(» | «); Serial.print(x1b); Serial.print(» | «); Serial.print(y2r); Serial.print(» | «); Serial.print(y2l); Serial.println(); int spr = constrain(x1p * y2r / 100, 0, 255); //скорость правого колеса int spl = constrain(x1p * y2l / 100, 0, 255); //скорость левого колеса int bspr = constrain(x1b * y2r / 100, 0, 255); //скорость правого колеса назад int bspl = constrain(x1b * y2l / 100, 0, 255); //скорость левого колеса назад Serial.print(stl); Serial.print(» | «); Serial.print(str); Serial.println(); //Serial.print(recieved_data); Serial.println(); if (recieved_data>138) { digitalWrite(A1, LOW); digitalWrite(A0, HIGH); analogWrite(5, spr); digitalWrite(7, LOW); digitalWrite(8, HIGH); analogWrite(6, spl); } else if (recieved_data<118) { digitalWrite(A1, !LOW); digitalWrite(A0, !HIGH); analogWrite(5, bspr); digitalWrite(7, !LOW); digitalWrite(8, !HIGH); analogWrite(6, bspl); }else if (118<recieved_data<138) { digitalWrite(A1, LOW); digitalWrite(A0, HIGH); analogWrite(5, str); digitalWrite(7, LOW); digitalWrite(8, HIGH); analogWrite(6, stl); } } }
Шаг 11. Код Ардуино
Программная часть довольно простая и не нужна никакая библиотека. Если вы понимаете логическую таблицу на предыдущих шагах, вы сможете написать собственный код. Скачать или скопировать код вы можете ниже:
// Код ошибки: код 01; Радиус поворота выше скорости; Код 02; Скорость выше 255; #define in1 5 //L298n Motor Driver pins. #define in2 6 #define in3 10 #define in4 11 #define LED 13 int command; //Int to store app command state. int Speed = 204; // 0 - 255. int Speedsec; int buttonState = 0; int lastButtonState = 0; int Turnradius = 0; //Set the radius of a turn, 0 - 255 Note:the robot will malfunction if this is higher than int Speed. int brakeTime = 45; int brkonoff = 1; //1 for the electronic braking system, 0 for normal. void setup() { pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); pinMode(LED, OUTPUT); //Set the LED pin. Serial.begin(9600); //Set the baud rate to your Bluetooth module. } void loop() { if (Serial.available() > 0) { command = Serial.read(); Stop(); //Initialize with motors stoped. switch (command) { case 'F': forward(); break; case 'B': back(); break; case 'L': left(); break; case 'R': right(); break; case 'G': forwardleft(); break; case 'I': forwardright(); break; case 'H': backleft(); break; case 'J': backright(); break; case '0': Speed = 100; break; case '1': Speed = 140; break; case '2': Speed = 153; break; case '3': Speed = 165; break; case '4': Speed = 178; break; case '5': Speed = 191; break; case '6': Speed = 204; break; case '7': Speed = 216; break; case '8': Speed = 229; break; case '9': Speed = 242; break; case 'q': Speed = 255; break; } Speedsec = Turnradius; if (brkonoff == 1) { brakeOn(); } else { brakeOff(); } } } void forward() { analogWrite(in1, Speed); analogWrite(in3, Speed); } void back() { analogWrite(in2, Speed); analogWrite(in4, Speed); } void left() { analogWrite(in3, Speed); analogWrite(in2, Speed); } void right() { analogWrite(in4, Speed); analogWrite(in1, Speed); } void forwardleft() { analogWrite(in1, Speedsec); analogWrite(in3, Speed); } void forwardright() { analogWrite(in1, Speed); analogWrite(in3, Speedsec); } void backright() { analogWrite(in2, Speed); analogWrite(in4, Speedsec); } void backleft() { analogWrite(in2, Speedsec); analogWrite(in4, Speed); } void Stop() { analogWrite(in1, 0); analogWrite(in2, 0); analogWrite(in3, 0); analogWrite(in4, 0); } void brakeOn() { //Here's the future use: an electronic braking system! // read the pushbutton input pin: buttonState = command; // compare the buttonState to its previous state if (buttonState != lastButtonState) { // if the state has changed, increment the counter if (lastButtonState == 'F') { if (buttonState == 'S') { back(); delay(brakeTime); Stop(); } } if (lastButtonState == 'B') { if (buttonState == 'S') { forward(); delay(brakeTime); Stop(); } } if (lastButtonState == 'L') { if (buttonState == 'S') { right(); delay(brakeTime); Stop(); } } if (lastButtonState == 'R') { if (buttonState == 'S') { left(); delay(brakeTime); Stop(); } } } // save the current state as the last state, //for next time through the loop lastButtonState = buttonState; } void brakeOff() { }
На этом всё. Хороших вам проектов.
Инструкция по сборке робота-автомобиля
В этой статье расскажем вам о том, как по шагам собрать универсального робота на колесной или гусеничной платформе. Управлять им будет микроконтроллер Ардуино нано. Если вам не нравится долго читать, посмотрите в конце статьи на видео, подготовленное нашими партнерами – каналом ArduMast Club.
Пример платформы робота-машины на Ардуино
Предлагаем инструкцию по созданию универсальной платформы, которая потом пригодится для создания самых разных проектов, независимо от выбранного контролера или типа шасси. Вы можете использовать стандартные варианты из Алиэкспресса, как на видео, можете снабдить машину гусеницами и создать вездеход, можете придумать вообще ни на что не похожий вариант. Главное, чтобы число двигателей не превышало 4 и сами ни не были слишком мощными (тогда придется менять тип управления моторами – другой драйвер двигателя).
Робот на Ардуино
Для реализации проекта нам понадобится:
- Контроллер Ардуино (в нашем случае, Arduino Nano).
- Драйвер двигателя L298N.
- Двигатели с редукторами.
- Корпус и шасси для крепления колес и оборудования
- Корпус для аккумуляторов 18650 с выключателем.
- Коммутационные провода.
Дополнительное оборудование, которое потребуется для создания полноценного проекта:
- Датчик расстояния и серво-мотор, на который он установлен.
- Инфракрасные датчики линии.
- Светодиоды для индикации и “красоты”.
- Пьезодинамик – пищалка.
- Bluetooth модуль (если собираетесь управлять машинкой дистанционно).
- Sensor shield (упрощает коммутацию).
- Модуль контроля заряда и подзарядки аккумуляторов.
- Сами аккумуляторы.
Общая схема машинки на Ардуино
Схема электропитания робота автомобиля
Вопрос организации правильного стабильного электропитания является одним из самых важных в любом проекте.В нашей модели применена рекомендованная нами схема питания, основанная на использовании литийионных аккумуляторов формата 18650 и платы защиты их от переразряда и перезаряда.
Давайте разберем самый простой вариант схемы питания электромоторов. Перед началом сборки лучше заранее припаять провода к моторам.
Схема питания и подключения двигателей в ардуино автомобиле
Все достаточно стандартно и вы найдете в интернете десятки подобных примеров. Но в этой схеме есть большой минус – в случае полного разряда аккумуляторы придут в негодность.
Машинка на Ардуино
Для добавления контроллера разряда придется внести следующие изменения в схему:
Схема питания с контролем разряда аккумулятора
Теперь аккумуляторы будут защищены, но здесь нет возможности заряжать их.
Питание робота Ардуино
Для зарядки можно использовать модуль повышения напряжения с 5v до необходимого уровня зарядки, который зависит от количества серий используемых аккумуляторов. Он имеет гнездо типа микро USB и при частом использовании оно может сломаться, поэтому мы рекомендуем установить дополнительное гнездо для последующей подзарядки пяти вольтовым блоком питания. Для зарядки двух литий-ионных аккумуляторов необходимо настроить выходное напряжение на 8,4 Вольта.
Схема питания с модулем зарядки для ардуино робота машинки
Подключаем двигатели и плату
С питанием платформы мы разобрались, теперь подключим остальные компоненты. Для начала припаиваем провода к моторам, затем обматываем их изолентой, чтобы случайно в дальнейшем не оторвать контакты. Можно сделать так, что в итоге на 2 двигателя будут идти всего два провода вместо 4х. Это немного упростит монтаж и сэкономит место на платформе.
Монтируем драйвер двигателей на платформу так, чтобы его радиатор был спереди
ЭТО ВАЖНО! В противном случае, вам придется переписывать программу для микроконтроллера. Драйвер двигателя для Ардуино робота
Затем размещаем холдер и плату БМС. Не забываем оставлять место спереди для последующего монтажа каких-либо сенсоров. Ардуиио нужно разместить так, чтобы была в дальнейшем возможность подключить его к ПК для прошивки. Это же правило относится и к модулю для зарядки аккумуляторов.
Питание для ардуино и других электронных компонентов мы возьмем от драйвера двигателей.
Подключаем Bluetooth к машинке
Мы собираемся использовать модуль Bluetooth через SoftwareSerial (библиотеку SoftwareSerial.h), поэтому подключаем модуль блютуз к 3 и 4 цифровым пинам ардуино. RX к D3, TX к D4
Схема подключения Bluetooth к ардуино машинкеПодключаем BluetoothСхема подключения драйвера двигателя к роботу
Схема подключения компонентов к Arduino
Датчик расстояния машины
Платформа робота готова! Теперь осталось загрузить прошивку для контроллера Ардуино и программу для смартфона RC CAR. Вы можете посмотреть на нашем сайте обзор Android приложений для работы с Arduino.
Устанавливаем Arduino и датчик
В корпусной части машинки надо сделать отверстия под крепеж вашего контроллера Arduino. Отверстия под крепеж зависят от габаритов подвижной платформы машинки. В данном конкретном случае плата была расположена «перпендикулярно» несущей системе. Подобное расположение удобно еще и тем, что расстояния от двигателей передней и задней подвески до пинов платы примерно одинаковое.
Над передней подвеской устанавливаем наши эмиттер и детектор. Их желательно установить повыше относительно земли. В дальнейшем можно предусмотреть сзади светодиоды, которые будут включаться во время заднего хода машинки.
Переходим к следующему шагу.
Introduction: Arduino Car Display
By RyanM415Follow
More by the author:
I built an on-board diagnostics (OBD-II) based display using a 7″ TFT LCD from Adafruit, a Teensy 3.6, the Freematics OBD-II I2C Adapter, and some cheep backup sensors I found on Amazon. The display has two pages: one for when my Honda Accord is in drive and one for when it is in reverse.
When my car is in drive, the RPM, MPH, engine load percentage, battery voltage, cabin temperature, and engine coolant temperature are displayed (there are several other vehicle statistics available to display if one does not want these).
When my car is in reverse, the Arduino IDE compatible Teensy 3.6 reads an animated bitmap image of my car I found online, displays it, and then reads the backup sensors. The four sensors each have their distance in feet plus an animation behind the car that changes color based off of how close the object is to the car (just green means < 5 feet, green and yellow means < 2.6 feet, and green, yellow, and red means < 1 foot).
Finally, I added the capability to dim the display at night.
The end result looks great and functions very well in my car. I even ended up installing it in the center console, which was a whole other process that I won’t get into in this instructable. The list of parts that I used to create this LCD display are below.
9) Wire, capacitors, and resistors.
Шаг 8. Электрические соединения
Для реализации соединений нужны перемычки. Соедините красные провода двух двигателей (с каждой стороны) вместе и черные провода вместе. Таким образом у нас теперь есть два терминала с каждой стороны. MOTORA отвечает за два правых двигателя, соответственно два левых двигателя подключены к MOTORB. Следуйте инструкциям ниже, чтобы соединить все.
Соединения двигателей
Out1 -> Красный провод левого бокового мотора (+)
Out2 -> Черный провод левого двигателя (-)
Out3 -> Красный провод правой стороны двигателя (+)
Out4 -> Черный провод правой стороны двигателя (-)
LM298 -> Arduino
IN1 -> D5
IN2-> D6
IN2 -> D9
IN2-> D10
Модуль Bluetooth -> Arduino
Rx-> Tx
Tx -> Rx
GND -> GND
Vcc -> 3,3 В
Питание
12V -> Подключите красный провод аккумулятора
GND -> Подключите черный провод аккумулятора и вывод Arduino GND
5V -> Подключение к контакту Arduino 5V
Step 4: Securing the Arduino and Sensor
After clearing some plastic off the chassis, I chose to use some small zip ties and holes in the chassis to hold my arduino to the car.
Next, you’ll want to choose a location on the front of the car for your emitter and detector. You’ll want to make sure they are level with the ground, and possibly consider adding heat shrink tubing around the emitter to prevent some light from hitting the detector before it reaches an object.
Another consideration would be to add another set of leds on the back of the car to avoid obstacles while backing, but are not included in this instructable.
Once you have glued your leds in place, go to the next step.
Шаг 6. Скетч для проекта
Вы можете скачать или скопировать код для проекта Ардуино катера ниже.
#include <Servo.h> Servo myservo; int val; int LED = 13; int IN4 = 4; // Input3 5 int IN3 = 5; int IN2 = 7; int IN1 = 6; int k = 0; void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); pinMode (IN4, OUTPUT); pinMode (IN3, OUTPUT); pinMode (IN2, OUTPUT); pinMode (IN1, OUTPUT); myservo.attach(10); } void loop() { if (Serial.available()) { val = Serial.read(); if (k == 0) { myservo.write(90); // (1 ) k++; } // "F" ( w) if (val == 'X') { myservo.write(90); } if (val == 'x') { myservo.write(90); } if (val == 'F') { digitalWrite (IN4, HIGH); digitalWrite (IN3, LOW); digitalWrite (IN2, HIGH); digitalWrite (IN1, LOW); } // "S" if ( val == 'S') { digitalWrite (IN3, LOW); digitalWrite (IN4, LOW); digitalWrite (IN2, LOW); digitalWrite (IN1, LOW); } // "B" if ( val == 'B') { digitalWrite (IN4, LOW); digitalWrite (IN3, HIGH); digitalWrite (IN2, LOW); digitalWrite (IN1, HIGH); } // if ( val == 'L') { myservo.write(50); // myservo.write(90); } // if ( val == 'R') { myservo.write(130); // myservo.write(90); } // 45 + // "G" if (val == 'G') { digitalWrite (IN4, HIGH); digitalWrite (IN3, LOW); digitalWrite (IN2, HIGH); digitalWrite (IN1, LOW); myservo.write(50); delay(1000); myservo.write(90); } // "I" if ( val == 'I') { digitalWrite (IN4, HIGH); digitalWrite (IN3,LOW); digitalWrite (IN2, HIGH); digitalWrite (IN1, LOW); myservo.write(130); delay(1000); myservo.write(90); } // "" if ( val == 'H') { digitalWrite (IN4, LOW); digitalWrite (IN3, HIGH); digitalWrite (IN1, HIGH); digitalWrite (IN2, LOW); myservo.write(130); delay(1000); myservo.write(90); } // "J" if ( val == 'J') { digitalWrite (IN4, LOW); digitalWrite (IN3, HIGH); digitalWrite (IN1, HIGH); digitalWrite (IN2, LOW); myservo.write(50); delay(1000); myservo.write(90); } } }
Итоговый результат вы можете увидеть на первой фотографии к данному уроку.
Надеемся, что у вас не возникло проблем при реализации проекта.
Подключение драйвера L298N
Припаиваем все двигатели через небольшой конденсатор и устанавливаем их.
Для правого двигателя один провод подключите к OUT3, а второй провод подключите к OUT4. Таким же образом подключите второй правый мотор.
Для левого двигателя один провод соединяется с OUT2, а второй провод соединяется с OUT1. Таким же образом подключите второй левый мотор.
Если вы сделали неправильное соединение, после загрузки программы тестирования, просто поменяйте провода так, как необходимо.
Сделайте такого рода разъем. Используйте двухпозиционный переключатель (для включения и выключения двигателей и сервопривода робота). Я думаю, вы знаете как паять. Красный разъем для батареи, проверьте, какой тип разъема установлен в вашей батарее. Рекомендуем использовать T-штекер.
Схема соединения источника питания.
Т-образный разъем. Слева разъем батареи (мама), справа (папа) разъем робота.
Не соединяйте Т-образные разъемы сейчас. Сделайте это после того, как все соединения завершены, на последнем шаге.
Затем установите всё на свой автомобиль. Если вы используете другое собственное шасси, монтаж шасси может быть другим.
Красный провод подключается к крайнему левому разъему + 12В 3-контактного разъема на драйвере L298N.
Два черных провода подключаются к среднему разъему GND 3-контактного разъема на L298N.
Затем возьмите 6 длинных проводов длиной 30-40 см и подключите их к контактам ENA, IN1, IN2, IN3, IN4, ENB на автомобильном приводе L298N.
Провод № 7 подключите к среднему разъему GND 3-контактного разъема на драйвере L298N (туда же, куда вы подключали предыдущие черные провода).
В конце концов, ваше соединение должно выглядеть так.
Если вы хотите использовать сервопривод в своем автомобиле-роботе, убедитесь, что он совместим с напряжением 7,4 В. Затем вы можете извлечь красный провод из разъема сервомеханизма и подключить провод к крайнему левому разъему + 12 В 3-контактного разъема на приводе L298N (там же, куда вы ранее подключали красный провод).
Сначала проверьте напряжение сервопривода! Если это не совместимо, просто подключите сервопривод к датчику шилда без каких-либо изменений. В моем случае сервопривод MG995R (MG995) совместим с 7,4 В, к сожалению, на фото мы забыли подключить сервопривод.