Программа для машины на ардуино

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags

Nothing to show

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Cancel Create

  • Local
  • Codespaces

HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Машинка Arduino – как собрать и программа

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

Latest commit message
Commit time

README.md

Скетчи и инструкция для робота-машинки на базе Arduino.

1. Сборка машинки

На занятиях мы с вами навесили на машинку все модули, что были в комплекте, и вы можете запрограммировать робота как минимум на:

  • Управление через ИК BT.

    Распиновка (цоколевка) ардуино выглядит вот так:

    Image alt

    Мы будем использовать следующие пины:

    • Цифровые (Digital Pins) — в коде они определяются через цифры (0-13)
    • Входное питание (Vin)
    • Питание (5V, V)
    • Заземление (GND, G)

    Если поставить сверху шилд, то распиновка не изменится, но добавятся дублирующие цифровые и аналоговые выходы и появится много пинов земля+питание.

    Обратите внимание, что на каждый радиотехнический компонент, будь то диод или модуль, есть т.н. даташит (datasheet) – инструкция, которая описывает характеристики, особенности подключения, функционал и прочую необходимую об устройстве информацию. Как ее искать я объяснял на лекции, но если простым языком, то все опять же ищется в google исходя из той маркировки, что нанесена на модули. Если с маркировками все плохо, то можно использовать google картинки =)

    Image alt

    Шилд выглядит примерно вот так:

    Image alt

    Вот так выглядит ИК датчик:

    Image alt

    А вот так Bluetooth датчик:

    Подключение модулей к ардуино

    Image alt

    Как я писал ранее, при соединении модулей надо исходить из особенностей скетча. Если какой-то модуль, двигатель и т.д. не предусматривает его подключение, НЕ НАДО ЕГО ПОДКЛЮЧАТЬ. Лучше пусть провода болтаются. Например, возьмем, скетч для управления через ИК > на одной из пар двигателей. «Реакция» на ИК пульт тоже программируется. Например, при нажатии кнопки CH выдается значение 0х00FF629D. Поэтому на действие можно присвоить любую кнопку любого пульта, если вы знаете ее значение. Для нашего пульта (HX1838) значения следующие: #fmt: off PWR FFE21D CH FF629D
    |
    FFE01F

    Plus FFA857
    EQ FF906F
    0 FF6897
    100 FF9867
    200 FFB04F
    1 FF30CF
    2 FF18E7
    3 FF7A85
    4 FF10EF
    5 FF38C7
    6 FF5AA5
    7 FF42BD
    8 FF48B5
    9 FF52AD

    Можете попробовать поменять их затем в коде и посмотреть что из этого выйдет.

    Bluetooth датчик подключается через протокол UART, он задействует цифровые пины 0 и 1.

    VCC — 5V GND — GND RXD — TX (1) TXD — RX (0)

    Важно! При прошивке Ардуино RX и TX должны быть отключены, или у вас постоянно будет выскакивать ошибка загрузки.

    Image alt

    Если вам не хватает коннекторов Для этого существуют провода F-F (мама-мама) с двумя розетками. В комплекте их нет, но вы можете воспользоваться макетной платой:

    2. Прошивка Arduino

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

    2.1 Скачать и установить среду программирования Arduino IDE

    https://www.arduino.cc/en/Main/Donate (Донатить необязательно, можно “Just download”) При этом нужно одобрить установку всех необходимых драйверов.

    2.2 Скачать скетчи и библиотеки

    2.3 Распаковать библиотеки для Arduino IDE

    Иногда вам придется пользоваться библиотеками. Библиотеки используются, в основном, для того, чтобы перевести машинные функции обращения с модулем на более-менее человеческий язык. Подключение библиотеки в скетче происходит с помощью ф-ии #include, также можно посмотреть, какие библиотеки используются. Так, в скетче управления машинкой используется библиотека для ИК порта (#include ). Для того, чтобы среда ардуино не ругалась на ее отсутствие, надо распаковать IRremote.zip в папку This PC Documents Arduino libraries или С:Users#NameDocumentsArduinolibraries

    2.4 Прошивка микроконтроллера

    Запускаем среду Arduino IDE и скетч. Для этого достаточно кликнуть на желаемом скетче расширения .ino Подключаем плату Ардуино к ПК. Ардуино должно определиться в программе:

    Image alt

    В разделе “Плата” должна стоять “Arduino UNO”

    После этого мы жмем кнопку “загрузить”

    Image alt

    И ждем пока пока программа загрузится в Ардуино.

    В случае удачной прошивки все готово, можете пользоваться машинкой.

    Важный момент — если светодиоды у машинки горят, но она не двигается, то проблема, возможно, в батарейках, они быстро садятся и если тока в них недостаточно (особенно дешевые батарейки), то двигатели просто не работают. Поэтому для тестирования лучше использовать блок питания 7-12В, подключив его напрямую к входу ардуино (DC Power Jack) или к коннектору.

    Машинка управляется с пульта, для управления используются вот эти кнопки: (где квадрат это “стоп”)

    Image alt

    Если машинка не едет, нужно нажать несколько раз вперед-назад.

    Управление с помощью Bluetooth осуществляется с помощью программы BLEJoystick (Android https://github.com/dsidov/ArduinoCar» target=»_blank»]github.com[/mask_link]

    Автомобиль-робот с автопилотом на Arduino Mega 2560

    Из таких же комплектующих многие собирают свои автономные роботы-платформы, но мое решение немного отличается от того, что можно найти в интернете. В частности упор был сделан на автономность и перехват управления по Bluetooth.

    Автомобиль-робот с автопилотом на Arduino Mega 2560

    Для проекта нам понадобится плата Arduino Mega 2560. Она достаточно мощная, что бы справиться с нашими задачами. На нее отлично встает Motor Shield L293D.
    Корпус автомобиля мы взяли из набора Car Chassis Kit for Arduino. В него входят рама, колеса, двигатели.
    Основной датчик для ориентирования в пространстве — Ультразвуковой дальномер HC-SR04. Он закреплен на сервоприводе MG995.
    Для перехвата управления я использовал Bluetooth модуль. В качестве пульта использовал телефон на Android с установленной программой Bluetooth Arduino Bluetooth RC Car (скачать можно с апстора).

    Распиновка для подключения компонентов

    Моторы Motor Shield L293D Фары Arduino Mega 2560
    П.Л. М3 П.Л. «-» на GND, «+» на Pin 22
    П.П. М4 П.П. «-» на GND, «+» на Pin 24
    З.Л. М1 З.Л. «-» на GND, «+» на Pin 34
    З.П. М2 З.П. «-» на GND, «+» на Pin 35

    Дальномер HC-SR04 Arduino Mega 2560 Bluetooth HC-05 Arduino Mega 2560 Buzzer Arduino Mega 2560
    Vcc 5V VCC 5V SIG Pin A9
    Trig Pin 31 GND GND VCC Pin A8
    Echo Pin 30 TXD Pin 50 GND GND
    Gnd GND RXD Pin 51

    Сервопривод MG995 Motor Shield L293D
    тройная клема SERVO_2 (центральный провод «+» откусываем и запитываем напрямую от «+» Motor Shield; при управлении по Bluetooth — клему снимайте, чтобы серва не дёргалась)

    Если следовать указаниям по подключению проводов к пинам, то напутать что-то сложно. На плате всегда есть подписи.
    Особое внимание стоило бы обратить на подключение проводов к двигателям что бы не напутать полярность — направления вращения.

    Автомобиль-робот с автопилотом на Arduino Mega 2560

    При подключении телефона к Bluetooth нашего робота вылезет запрос пин-кода. Обычно он «1234». В программе Bluetooth Arduino Bluetooth RC Car доступны два способа управления: клавишами влево-вправо и с помощью гироскопа наклоном телефона.

    Механизм работы автопилота таков, что машина едет вперед до тех пор пока до препятствия спереди не будет 30 см, то запускаем алгоритм сканирования препятствия. Двигатели останавливаются, серво-привод начинает вращать ультразвуковой дальномер на 180 градусов с шагом 15 градусов. Если в массиве измерений находятся точки расстояние до которых больше 30 см, то мы определяем с какой стороны эти точки и разворачиваем машину в этом направлении, запускаем двигатели.

    Автомобиль-робот с автопилотом на Arduino Mega 2560Автомобиль-робот с автопилотом на Arduino Mega 2560Автомобиль-робот с автопилотом на Arduino Mega 2560Автомобиль-робот с автопилотом на Arduino Mega 2560Автомобиль-робот с автопилотом на Arduino Mega 2560Автомобиль-робот с автопилотом на Arduino Mega 2560Автомобиль-робот с автопилотом на Arduino Mega 2560

    Для зашивки программы вам необходимо будет скачать библиотеку AFMotor.

    Управление по Bluetuth:

    #include #include int ledPin1 = 22; // передние фары int ledPin2 = 24; // передние фары int ledPin3 = 34; // задние фары int ledPin4 = 35; // задние фары int ledPin5 = A8; // клаксон int ledPin6 = A9; // питание для клаксона //Создаем объекты для двигателей AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый AF_DCMotor motor4(4); //канал М4 на Motor Shield — передний правый //Время мигания Аварийки int blinkTime = 15; //частота мигания int leftTime = 0; boolean signalOn = LOW; boolean avaOn = LOW; SoftwareSerial BTSerial(50, 51); // RX, TX // Создаем переменную для команд Bluetooth char vcmd; // Создаем переменные для запоминания скорости двигателей int vspdL, vspdR; /* Создаем переменную, на значение которой будет уменьшаться скорость при плавных поворотах. Текущая скорость должна быть больше этого значения.

    В противном случае двигатели со стороны направления поворота просто не будут вращаться */ int vspd = 200; void setup() < pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); pinMode(ledPin4, OUTPUT); pinMode(ledPin5, OUTPUT); pinMode(ledPin6, OUTPUT); digitalWrite(ledPin6, HIGH); // Устанавливаем скорость передачи данных по Bluetooth BTSerial.begin(9600); // Устанавливаем скорость передачи данных по кабелю Serial.begin(9600); // Устанавливаем максимальную скорость вращения двигателей vspeed(255,255); >void loop() < // Если есть данные if (BTSerial.available()) < // Читаем команды и заносим их в переменную. char преобразует код символа команды в символ vcmd = (char)BTSerial.read(); // Отправляем команду в порт, чтобы можно было их проверить в «Мониторе порта» //Serial.println(vcmd); // Передние фары ВКЛ if (vcmd == ‘W’) < digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, HIGH); >// Передние фары ВЫКЛ if (vcmd == ‘w’) < digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); >// Задние фары ВКЛ if (vcmd == ‘U’) < digitalWrite(ledPin3, HIGH); digitalWrite(ledPin4, HIGH); >// Задние фары ВЫКЛ if (vcmd == ‘u’) < digitalWrite(ledPin3, LOW); digitalWrite(ledPin4, LOW); >// Аварийка ВКЛ if (vcmd == ‘X’) < avaOn = HIGH; >// Аварийка ВЫКЛ if (vcmd == ‘x’) < avaOn = LOW; digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); digitalWrite(ledPin3, LOW); digitalWrite(ledPin4, LOW); >if (vcmd != ‘S’) < Serial.println(vcmd); >if (avaOn) < if (leftTime == 0) < leftTime = blinkTime; signalOn = !signalOn; >Serial.print(«leftTime prettyprint»> #include #include #include int ledPin1 = 22; int ledPin2 = 24; int ledPin3 = 34; int ledPin4 = 35; //Создаем объекты для двигателей AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый AF_DCMotor motor4(4); //канал М4 на Motor Shield — передний правый // Создаем объект для сервопривода Servo vservo; // Создаем переменные для запоминания скорости левых и правых двигателей int vspdL, vspdR; /* Создаем переменную, на значение которой будет уменьшаться скорость при плавных поворотах. Текущая скорость должна быть больше этого значения. В противном случае двигатели со стороны направления поворота просто не будут вращаться */ const int vspd = 200; // Массив для хранения углов поворота сервопривода (шаг 15 градусов) const int vservo_array[13]=< 0,15,30,45,60,75,90,105,120,135,150,165,180>; // Массив для хранения данных о расстоянии под различными углами поворота сервопривода int vHC_SR04_array[13]; // Пины, используемые ультразвуковым дальномером const int vTrig = 31; const int vEcho = 30; // Переменные, для хранения данных с дальномера unsigned int vtime_us=0; unsigned int vdistance_sm=0; // Минимальное расстояние в сантиметрах, при котором нужно искать новый маршрут движения const int vmindistance = 30; // Переменная для циклов перебора значения массивов vservo_array и vHC_SR04_array int vservo_int; // Переменные для цикла поиска максимального значения в массивах int vmaxarrayindex_int; int vmaxarrayvalue_int; void setup() < pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); pinMode(ledPin4, OUTPUT); // Устанавливаем скорость передачи данных по кабелю Serial.begin(9600); // Выбираем пин к которому подключен сервопривод vservo.attach(9); // или 10, если воткнули в крайний разъём // Поворачиваем сервопривод в положение 90 градусов при каждом включении vservo.write(90); // Устанавливаем максимальную скорость вращения двигателей vspeed(255,255); // Устанавливаем значение для пинов, к которым подключен ультразвуковой дальномер pinMode(vTrig, OUTPUT); pinMode(vEcho, INPUT); >void loop() < digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, HIGH); digitalWrite(ledPin3, HIGH); digitalWrite(ledPin4, HIGH); vultrasoundmode(); >/* Режим работы с использованием ультразвукового дальномера */ void vultrasoundmode() < vservo.write(90); delay(200); Serial.print(«Now «); Serial.println(vHC_SR04()); // Если расстояние меньше наименьшего, то if (vHC_SR04() < vmindistance) < // Останавливаем двигатели vrelease(); // Крутим серву измеряя расстояния и занося данные в массив for (vservo_int = 0; vservo_int < 13; vservo_int = vservo_int + 1) < vservo.write(vservo_array[vservo_int]); delay(200); vHC_SR04_array[vservo_int] = vHC_SR04(); // Выводим данные для отладки Serial.print(vservo_int); Serial.print(» «); Serial.println(vHC_SR04_array[vservo_int]); >vservo.write(90); delay(500); // Поиск в массиве позиции с максимальным значением vmaxarrayindex_int = 0; vmaxarrayvalue_int = 0; for (vservo_int = 0; vservo_int < 13; vservo_int = vservo_int + 1) < if (vHC_SR04_array[vservo_int] >vmaxarrayvalue_int) < vmaxarrayindex_int = vservo_int; vmaxarrayvalue_int = vHC_SR04_array[vservo_int]; >> Serial.print(«Max index «); Serial.println(vmaxarrayindex_int); // Проверка — если максимальное значение массива меньше минимального расстояния, то едем назад if (vHC_SR04_array[vmaxarrayindex_int] < vmindistance) < vbackward(); delay(500); >/* Проверка — если индекс максимального значения массива меньше 6 то поворачиваем вправо, иначе влево */ if (vmaxarrayindex_int < 6) < vright(); delay(500); >else < vleft(); delay(500); >> else < // Едем прямо vforward(); >> /* Функция определения расстояния с дальномера */ int vHC_SR04() < digitalWrite(vTrig, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(vTrig, LOW); // Затем убираем vtime_us=pulseIn(vEcho, HIGH); // Замеряем длину импульса vdistance_sm=vtime_us/58; // Пересчитываем в сантиметры return vdistance_sm; // Возвращаем значение >/* Функции управления двигателями */ // Вперед void vforward() < vspeed(vspdL,vspdR); vforwardRL(); >// Вперед для RL void vforwardRL() < motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); >// Назад void vbackward() < vspeed(vspdL,vspdR); vbackwardRL(); >// Назад для RL void vbackwardRL() < motor1.run(BACKWARD); motor2.run(BACKWARD); motor3.run(BACKWARD); motor4.run(BACKWARD); >// Влево void vleft() < vspeed(vspdL,vspdR); motor1.run(BACKWARD); motor2.run(FORWARD); motor3.run(BACKWARD); motor4.run(FORWARD); >// Вправо void vright() < vspeed(vspdL,vspdR); motor1.run(FORWARD); motor2.run(BACKWARD); motor3.run(FORWARD); motor4.run(BACKWARD); >// Вперед и влево void vforwardleft() < if (vspdL >vspd) < vspeed(vspdL-vspd,vspdR); >else < vspeed(0,vspdR); >vforwardRL(); > // Вперед и вправо void vforwardright() < if (vspdR >vspd) < vspeed(vspdL,vspdR-vspd); >else < vspeed(vspdL,0); >vforwardRL(); > // Назад и влево void vbackwardleft() < if (vspdL >vspd) < vspeed(vspdL-vspd,vspdR); >else < vspeed(0,vspdR); >vbackwardRL(); > // Назад и вправо void vbackwardright() < if (vspdR >vspd) < vspeed(vspdL,vspdR-vspd); >else < vspeed(vspdL,0); >vbackwardRL(); > // Стоп void vrelease() < motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); >// Изменение скорости void vspeed(int spdL,int spdR) < if (spdL == spdR) < vspdL=spdL; vspdR=spdR; >motor1.setSpeed(spdL); motor2.setSpeed(spdR); motor3.setSpeed(spdL); motor4.setSpeed(spdR); >

    Источник: diytimes.ru

    CxemCAR на Arduino — Bluetooth управление машинкой с Android

    Arduino CxemCAR
    Первая часть статьи проекта CxemCAR находится здесь. Там же находятся исходники для Android и другая полезная информация. В этой статье я покажу сборку CxemCAR для платформы Arduino. В качестве платы Arduino можно использовать практически любую Arduino-совместимую плату: UNO, Nano, Mega, Leonardo и даже на основе STM32 — Arduino DUE. Я использовал платку Arduino Nano V3, приобретенную на eBay за 9$. Схема подключения Arduino к Bluetooth модулю HC-06 и драйверу двигателей L298N: Схема подключения Arduino к Bluetooth-модулю и драйверу двигателей
    В схеме я использовал джампер (на схеме Jmp1), т.к. при подключенном Bluetooth модуле невозможно было загрузить скетч в Arduino. На время прошивки, снятием перемычки обесточивается Bluetooth-модуль. В качестве платформы я использовал небольшую RC DIY платформу, купленную на eBay за 25$. Сама платформа представляет из себя алюминиевое основание, куда крепится два двигателя, редуктор и 4 карданные передачи для 4-х колес. Сверху, на 3-х стойках ставится макетная плата. Платформа RC DIY Mini
    Платформа не отличается высоким качеством изготовления. После того, как я ее собрал, попробовал подключить питание — двигателя даже не шевельнулись, много перекосов, недоработок и т.п. Пришлось все разбирать, немного ослабить крепления, кое-где подточить, хорошо все промазать смазкой, а также снял 2 кардана с передней оси. Получилась заднеприводная версия машинки.

    После этого, я припаял Bluetooth-модуль к Arduino и вывел для него светодиод состояния. О разновидностях Bluetooth модулей, их подключении к Arduino, работы с ними и т.п. можете почитать в данной статье: Arduino и Bluetooth. Модуль HC-06 поместил в термоусадочную трубку 10мм. Светодиод Bluetooth-состояния с токоограничительным резистором также были помещены в термоусадку, но более тонкую — 5мм. Подключаем Bluetooth модуль
    В макетной плате, которая шла вместе с платформой, я просверлил отверстия и закрепил драйвер двигателей L298N. Плату Arduino прикрепил при помощи двухстороннего скотча. CxemCAR
    Между алюминиевой платформой машинки и макетной платой я разместил 3 Li-Po аккумулятора 3.7В 1100 мА*Ч. Питание контроллера и двигателей раздельное: Arduino запитывается от одного аккумулятора 3.7В, а моторчики и драйвер L298N от двух последовательно соединенных аккумуляторов 3.7В. Предусмотрено два 2-х позиционных выключателя питания — в одном положение питание идет от аккумуляторов к потребителям, в другом положении на клеммы зарядки. Фото машинки на подзарядке: Зарядка аккумуляторов машинки
    Программное обеспечение Программа писалась в среде Arduino IDE 1.01. Код программы я постарался хорошо прокомментировать, но если будут вопросы — спрашивайте на форуме, в теме поддержке проекта CxemCAR .

    #include «EEPROM.h» #define D1 2 // направление вращение двигателя 1 #define M1 3 // ШИМ вывод для управления двигателем 1 (левый) #define D2 4 // направление вращение двигателя 2 #define M2 5 // направление вращение двигателя 2 (правый) #define HORN 13 // доп. канал 1 подключен к 13 пину //#define autoOFF 2500 // кол-во миллисекунд через которое робот останавливается при потери связи #define cmdL ‘L’ // команда UART для левого двигателя #define cmdR ‘R’ // команда UART для правого двигателя #define cmdH ‘H’ // команда UART для доп. канала 1 (к примеру сигнал Horn) #define cmdF ‘F’ // команда UART для работы с EEPROM памятью МК для хранения настроек #define cmdr ‘r’ // команда UART для работы с EEPROM памятью МК для хранения настроек (чтение) #define cmdw ‘w’ // команда UART для работы с EEPROM памятью МК для хранения настроек (запись) char incomingByte; // входящие данные char L_Data[4]; // строковый массив для данных левого мотора L byte L_index = 0; // индекс массива char R_Data[4]; // строковый массив для данных правого мотора R byte R_index = 0; // индекс массива char H_Data[1]; // строковый массив для доп. канала byte H_index = 0; // индекс массива H char F_Data[8]; // строковый массив данных для работы с EEPROM byte F_index = 0; // индекс массива F char command; // команда: передача координат R, L или конец строки unsigned long currentTime, lastTimeCommand, autoOFF; void setup() < Serial.begin(9600); // инициализация порта pinMode(HORN, OUTPUT); // дополнительный канал pinMode(D1, OUTPUT); // выход для задания направления вращения двигателя pinMode(D2, OUTPUT); // выход для задания направления вращения двигателя /*EEPROM.write(0,255); EEPROM.write(1,255); EEPROM.write(2,255); EEPROM.write(3,255);*/ timer_init(); // инициализируем программный таймер >void timer_init() < uint8_t sw_autoOFF = EEPROM.read(0); // считываем с EEPROM параметр «включена ли ф-ия остановки машинки при потере связи» if(sw_autoOFF == ‘1’)< // если таймер останова включен char var_Data[3]; var_Data[0] = EEPROM.read(1); var_Data[1] = EEPROM.read(2); var_Data[2] = EEPROM.read(3); autoOFF = atoi(var_Data)*100; // переменная автовыкл. для хранения кол-ва мс >else if(sw_autoOFF == ‘0’) < autoOFF = 999999; >else if(sw_autoOFF == 255) < autoOFF = 2500; // если в EEPROM ничего не записано, то по умолчанию 2.5 сек >currentTime = millis(); // считываем время, прошедшее с момента запуска программы > void loop() < if (Serial.available() >0) < // если пришли UART данные incomingByte = Serial.read(); // считываем байт if(incomingByte == cmdL) < // если пришли данные для мотора L command = cmdL; // текущая команда memset(L_Data,0,sizeof(L_Data)); // очистка массива L_index = 0; // сброс индекса массива >else if(incomingByte == cmdR) < // если пришли данные для мотора R command = cmdR; memset(R_Data,0,sizeof(R_Data)); R_index = 0; >else if(incomingByte == cmdH) < // если пришли данные для доп. канала 1 command = cmdH; memset(H_Data,0,sizeof(H_Data)); H_index = 0; >else if(incomingByte == cmdF) < // если пришли данные для работы с памятью command = cmdF; memset(F_Data,0,sizeof(F_Data)); F_index = 0; >else if(incomingByte == ‘r’) command = ‘e’; // конец строки else if(incomingByte == ‘t’) command = ‘t’; // конец строки для команд работы с памятью if(command == cmdL incomingByte != cmdL) < L_Data[L_index] = incomingByte; // сохраняем каждый принятый байт в массив L_index++; // увеличиваем текущий индекс массива >else if(command == cmdR incomingByte != cmdR) < R_Data[R_index] = incomingByte; R_index++; >else if(command == cmdH incomingByte != cmdH) < H_Data[H_index] = incomingByte; H_index++; >else if(command == cmdF incomingByte != cmdF) < F_Data[F_index] = incomingByte; F_index++; >else if(command == ‘e’) < // если приняли конец строки Control4WD(atoi(L_Data),atoi(R_Data),atoi(H_Data)); delay(10); >else if(command == ‘t’) < // если приняли конец строки для работы с памятью Flash_Op(F_Data[0],F_Data[1],F_Data[2],F_Data[3],F_Data[4]); >lastTimeCommand = millis(); // считываем текущее время, прошедшее с момента запуска программы > if(millis() >= (lastTimeCommand + autoOFF)) < // сравниваем текущий таймер с переменной lastTimeCommand + autoOFF Control4WD(0,0,0); // останавливаем машинку >> void Control4WD(int mLeft, int mRight, uint8_t Horn) < bool directionL, directionR; // направление вращение для L298N byte valueL, valueR; // значение ШИМ M1, M2 (0-255) if(mLeft >0) < valueL = mLeft; directionL = 0; >else if(mLeft < 0)< valueL = 255 — abs(mLeft); directionL = 1; >else < directionL = 0; valueL = 0; >if(mRight > 0) < valueR = mRight; directionR = 0; >else if(mRight < 0)< valueR = 255 — abs(mRight); directionR = 1; >else < directionR = 0; valueR = 0; >analogWrite(M1, valueL); // задаем скорость вращения для L analogWrite(M2, valueR); // задаем скорость вращения для R digitalWrite(D1, directionL); // задаем направление вращения для L digitalWrite(D2, directionR); // задаем направление вращения для R digitalWrite(HORN, Horn); // дополнительный канал > void Flash_Op(char FCMD, uint8_t z1, uint8_t z2, uint8_t z3, uint8_t z4) < if(FCMD == cmdr)< // если команда чтения EEPROM данных Serial.print(«FData:»); // посылаем данные с EEPROM Serial.write(EEPROM.read(0)); // считываем значение ячейки памяти с 0 адресом и выводим в UART Serial.write(EEPROM.read(1)); Serial.write(EEPROM.read(2)); Serial.write(EEPROM.read(3)); Serial.print(«rn»); // маркер конца передачи EEPROM данных >else if(FCMD == cmdw) < // если команда записи EEPROM данных EEPROM.write(0,z1); // запись z1 в ячейку памяти с адресом 0 EEPROM.write(1,z2); EEPROM.write(2,z3); EEPROM.write(3,z4); timer_init(); // переинициализируем таймер Serial.print(«FWOKrn»); // посылаем сообщение, что данные успешно записаны >>

    В коде используется библиотека для работы с EEPROM памятью AVR.

    В памяти хранится одна настройка: количество миллисекунд через которое машинка останавливается при потери связи. Можно эту настройку «жестко» прописать в программе, для этого раскомментируйте строчку #define autoOFF 2500 (где 2500 кол-во миллисекунд). После этого, функцию Flash_Op можно удалить, также необходимо будет внести небольшие правки в код, отвечающий за прием команд для работы с EEPROM-памятью. Плата Arduino по USART от Bluetooth модуля получает готовые данные для левого и правого двигателя. Т.е. все основные расчеты происходят в Android приложении. Код Arduino на GitHub

    • BL_4WD.ino (9 Кб)

    Источник: cxem.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru