Собираем роботов-самоходов на Arduino
На Arduino очень легко делать разные машинки с дистанционным управлением, простыми сенсорами и логикой. Поэтому линейка эта невероятно популярна. Продается множество совместимых с ней сенсоров и плат расширения. Интернет наполнен готовыми программными библиотеками и проектами с открытым исходным кодом на все случаи жизни. Практически все вопросы, которые у тебя возникнут в процессе освоения Arduino, уже кем-то задавались, и ты всегда найдешь ответ.
Давай с чего-нибудь начнем? Главный вопрос — выбор контроллера. Существует множество ревизий Arduino, а также сторонних клонов, построенных на основе этих версий. Вот, пожалуй, два самых интересных для нас класса:
- Arduino Uno — лучший выбор новичка, самая простая, бюджетная и распространенная плата. В основе — чип ATmega328 с тактовой частотой в 16 МГц, 32 Кб флеш-памяти, 2 Кб ОЗУ и 1 Кб EEPROM. В Uno 14 цифровых входов/выходов, которые могут использоваться для управления сенсорами и сервоприводами и другими устройствами;
Другие статьи в выпуске:
. а калибруется как , кнопки куда-то выведены ?
Популярное сообщение!
Где брался, как подключался, как управляется и через что? Колхоз полезный
кнопки на руле, подключился к mode и mute т.к. один фиг я их не использую никогда))
комп состоит из:
модуль флешки для хранения расхода и тд и тп при выкл питания
Программа прошивка своя.
Подключал через адаптер elm327 к диагностической колодке, все остальное (питание, зажигание, сигнал датчика бензина) в приборной панели.
Настройка блютуз модуля HC-05 для работы
Подпаиваем провода к пинам блютуза: (картинку с выходами смотреть в описании требуемых деталей)
- 1 — это TX
- 2 — это RX
- 12 — это 3.3V
- 13 — это GND
- 34 — на этот вход тоже кидаем 3,3 V (нужен для перевода модуля в режим настройки с помощью AT команд).
Подключаем блютуз модуль к ардуине.
- 1 — TX модуля в 6 пин ардуины. (внимание будет TX в TX это не ошибка!)
- 2 — RX модуля в 7 пин ардуины. (аналогично не ошибка!)
- 12 — и 34 пин к 3,3V ардуины.
- 13 — GND ардуины.
Открываем Aduino IDE и заливаем скетч через USB порт в плату.
#include
SoftwareSerial BTSerial(6, 7); // TX | RX
void setup()
Serial.begin(9600);
Serial.println(«Enter AT commands:»);
BTSerial.begin(38400);
>
void loop()
if (BTSerial.available())
Serial.write(BTSerial.read());
if (Serial.available())
BTSerial.write(Serial.read());
>
После успешной загрузки скетча открываем: Сервис->Монитор порта. Далее снизу ставим скорость 9600 бод и NL+CR вместе.
Далее вводим команды по одной и нажимаем [Послать]. После каждого ввода должен быть ответ .
AT // (возможно 1 раз вылетит Error, не пугайтесь… это нормально, повторите опять)
AT+NAME=Car //Присваиваем имя модулю Car
AT+ROLE=1 // Переводим модуль в режим Мастер
AT+PSWD=1234 // Ставим пароль 1234 как на OBD ELM327
AT+BIND=AABB,CC,112233 //Прописываем Mac адрес OBD ELM327.
AT+CMODE=1 // Подключение модуля с фиксированным адресом
Заметьте, что mac-адрес вида: «AA:BB:CC:11:22:33» вводится как «AABB,CC,112233». MAC- адрес своего модуля ELM327 можете посмотреть, подключившись для начала на него со своего мобильника. (Стандартные пароли обычно: 1234, 6789, 0000).
Всё, настройка модуля Bluetooth закончена.
Самодельный спидометр и тахометр на базе Arduino с дисплеем 1602А
Электросхема
Прибор может работать только в автомобиле с инжекторным двигателем (в карбюраторных датчика скорости нет, а датчик зажигания есть далеко не во всех). Схема прибора показана на рисунке 1. На этом рисунке плата ARDUINO UNO показана схематично как «вид сверху».
Рис. 1. Принципиальная схема спидометра и тахометра на базе Arduino.
Для согласования портов с датчиками используются каскады на транзисторах VT1 и VT2. Так как питание поступает на прибор с выхода замка зажигания он работает только при включенном зажигании. Датчик скорости, равно как и датчик зажигания автомобиля представляют собой источники импульсов, частота которых зависит от вращения механических деталей автомобиля.
Датчик зажигания автомобиля с четырехцилиндровым бензиновым двигателем формирует два импульса за один оборот коленчатого вала. Если у двигателя не четыре цилиндра частота следования импульсов будет иной.
Датчики скорости бывают разные, но в большинстве своем, что особенно касается отечественных автомобилей, они дают 6000 импульсов за один километр пробега. Хотя, бывают, и такие что дают 2500 импульсов на километр, возможно, есть и другие.
Электросхема проекта приведена ниже.
1. Один подключен к питанию 9 вольт
2. Второй переключатель — к LCD экрану для его включения/выключения
3. Магнитный выключателя (геркон), который замыкает цепь каждый раз, когда колесо совершает полный оборот.
LCD монитор Parallax, который используется в проекте, подключается к Arduino по трем пинам. Один идет к 5 В, один к земле, третий — к серийному выходу (TX) на плате Arduino на цифровом пине 1.
Резисторы на 10 кОм подключены к переключателям и подсветке монитора, чтобы избежать превышения допустимой силы тока между 5 В и землей (ни в коем случае не подключайте 5 В и землю напрямую к Arduino).
Программа
Программа на C с подробными комментариями приведена в таблице 1. Действие программы основано на измерении периода импульсов, поступающих с датчиков, и последующего расчета скорости и частоты вращения коленвала.
Таблица 1. Исходный код программы.
Для работы используется функция pulseln , которая измеряет в микросекундах длительность положительного либо отрицательного перепада входного импульса. Так что, для того чтобы узнать период нужно сложить длительность положительного и отрицательного полупериодов.
F= 1440000/Т
Под другой датчик нужно будет рассчитать другое число, которое делится на период, и подставить его в программу вместо «600000».
Затем, результаты выводятся в соответствующие строки ЖК-дисплея. Единицы измерения указаны как «km/h» и «оЬ/тіп» (если не нравится, можете изменить).
Если входного сигнала нет, например, включили зажигание, но двигатель не завели, не поехали, то в строках, где нет сигнала, будет надпись «inf».
В принципе, налаживания не требуется. Однако, если неизвестно сколько импульсов на километр дает датчик скорости конкретного автомобиля, это нужно предварительно выяснить.
Либо заниматься экспериментальным подгоном числа, которое делится на период, сверяясь со стрелочным спидометром, что весьма хлопотно, или невозможно, если штатный спидометр неисправный (что и могло стать причиной изготовления данного прибора).
Х= 3600000000 / 2500 = 1440000
Х= 3600000000 / 6000 = 600000
Загрузите приведенный код на Arduino. Проверьте работу переключателя подсветки и насколько корректно отображается скорость.
Уточните радиус вашего коле в дюймах и вставьте это значение в строку: float radius = »»’;
В этой части кода я использовал прерывания, чтобы переменная «timer» увеличивала свое значение с частотой 1 кГц.
//Спидометр для велосипеда с использованием геркона
//скорость велосипеда отображается на LCD экране
Techno Mind » Записи из архива блога » GPS спидометр и одометр на Arduino + bluetooth трансивер
Как я уже писал, после установки в машину бортового компьютера Multitronics VC731, у меня возникла необходимость откалибровать его. Для этого нужно было проехать некоторое, точно известное расстояние, и ввести его в бортовик, после чего он произведет нужные расчеты и калибровку пробега и мгновенной скорости.
Для точного измерения пройденного пути я сразу подумал использовать GPS. Наивно полагая, что все получится, я установил в свой смартфон HTC Desire HD программу-логгер маршрута GPS и поехал.
После поездки, скинув информацию со смарта на комп, я был удивлен, насколько некачественно встроенный GPS приемник определяет свое местоположение.
Маленькая частота обновлений координат и слабая антенна привели к тому, что даже в местах, где я двигался прямолинейно, со скоростью около 50 км/час, записанный трек выглядел как ломаная линия, а порой попадались восьмерки (вроде как я разворачивался и вдруг ехал назад, после чего снова разворот). В целом, конечно маршрут и измеренный пробег были примерно похожи на правду, но для калибровки бортовика такие измерения использовать я не мог.
Поразмышляв немного на эту тему, я пришел к выводу, что соберу-ка я сам GPS спидометр-одометр (далее девайс).
Это позволит убить массу зайцев одним выстрелом: откалибровать бортовик, познать азы работы с GPS приемниками, координатами и сопутствующими расчетами, ну и наконец, пощупать вживую известную платформу Arduino – именно на ней планировалось построить девайс.
По поводу Arduino – платформа известная, раскрученная, доступная, дешевая и удобная для использования. При этом обладает одним недостатком – среда разработки просто отвратительна.
Она годится для детей и подростков, желающих познакомиться с программированием микропроцессоров, но никак для серьезной работы. К отсутствию массы, привычных в нормальных средах разработки, возможностей, можно добавить еще и омерзительный внешний вид нативной среды разработки для Arduino.
Тем не менее, на момент постройки устройства я всего этого не знал, и потому программа писалась именно в этой среде.
Забегая вперед скажу, что я стал часто использовать борды Arduino в своих проектах, но программы стал писать в своем любимом компиляторе CodeVisionAVR, и заливаю ее в Arduino с помощью разработанной мной утилиты, встраиваемой в интерфейс компилятора. Я напишу отдельную статью касательно этого вопроса в ближайшем будущем.
Ну, вернемся к нашим баранам. Сердцем прибора стал борт Arduino Uno:
В качестве приемника GPS я использовал борд SparkFun основанный на чипе Venus638FLPx:
Приемник замечательный. Из основных достоинств могу отметить его 65 канальную архитектуру, широкий диапазон напряжений питания, возможность подключения резервного питания (что обеспечить быстрый старт при возобновлении основного питания), высокую частоту обновлений координат (до 20 Гц) и т.д.
Кроме того, приемник поддерживает подключение внешнего супер-конденсатора, который позволяет поддерживать напряжение в памяти приемника в течение многих часов. В результате, при повторном включении определение местоположения занимает считаные секунды.
Для индикации измерений использовался обычный экран 16×2:
Кроме того, раз уж пошла такая пьянка, в систему был добавлен Bluetooth передатчик HC-05 (pinout):
По нему, всю информацию, полученную от GPS приемника, планировалось переправлять как есть, что позволило бы использовать девайс в качестве внешнего GPS приемника для смартфона или ноутбука.
Сам модуль HC-05 доступен по цене 5-7 долларов за штуку и продается везде. К сожалению, работа с ним полна геморроя, потому как выпускает эти модули нынче каждый третий китаец, и делают они их все немного по разному, так, что найти 100%-но соответствующий даташит нереально. В итоге Bluetooth передатчик получается нормально запустить и настроить после нескольких циклов проб и ошибок.
Важно отметить, что для работы передатчика важно подтянуть к питанию ноги reset и wake-up, а также подсоединить к земле все GND.
Питать все это дело я решил он литий-полимерного аккумулятора на 3.7 вольт. За сим потребовался преобразователь напряжения (step-up) до 5 вольт, а также зарядное устройство для аккумулятора через USB порт:
Ну и наконец – антенна, первая, что попалась под руку:
Все вышеназванные детали были соединены вот таким образом (надеюсь, я не ошибся – девайс строился на лету, так что схему я рисовал по памяти):
В итоге из рассыпухи break-up бордов получилась вот такая лапша:
После того, как девайс был готов, была написана прошивка, последнюю версию которой можно сказать здесь.
Кратенько о прошивке.
При включении, после заставки, на экране высвечивается сообщение No fix detected. Оно будет продолжать высвечиваться, пока девайс не сможет определить собственные координаты.
Как только это произойдет, они тут же высветятся на экране, вместе с текущей скоростью и азимутом движения.
Левой кнопкой можно менять режим отображения данных на экране. Возможности:
- Координаты и азимут движения
- Пробег, текущая и максимальная скорости
- Время и дата
- Напряжение на батарейке
Длительным нажатием на правую кнопку можно обнулить одометр.
Девайс постоянно мониторит напряжение батареи, и как только оно упадет ниже 3.2 вольт, девайс перейдет в режим отображения напряжения на экране. При этом перейти на другой экран станет невозможно.
В этот момент крайне рекомендуется выключить девайс или подключить его к зарядке. Никаких дополнительных средств защиты не предусмотрено, поэтому, если проигнорировать сообщение о низком напряжении, есть большой шанс безвозвратно угробить как минимум батарею.
Кроме того, если в процессе работы ухудшится прием GPS и девайс начнет терять сигнал, высветиться сообщение DATA LOSS.
Подсчет пройденного расстояния производится по методу Great Circle distance calculation – HAVERSINE. В силу специфики гражданского GPS, измерения пробега получаются наиболее точными при движении по трассе. Хотя с хорошей антенной и в городе точность получается довольно точными. При контрольной проверке по карте, погрешность составила пару сотен метров на 50 километров пути.
Передача данных по Bluetooth осуществляется параллельно основной работе девайса, и может быть полезна, к примеру, пользователям смартфонов на Android.
Точность и чувствительность девайса в разы лучше оных на встроенном в смартфон GPS модуле, и потому, при помощи бесплатной программы Bluetooth GPS можно заставить все остальные программы, пользующиеся GPS для работы использовать данные приходящие по Bluetooth, вместо данных со встроенной антенны.
Кроме того, вместо телефона к Bluetooth можно подключить компьютер и пользоваться им в качестве инструмента для записи и анализа маршрута, в том числе в реальном времени.
После окончательной сборки и проверка девайса, я смог, наконец, с большой точностью откалибровать свой Multitronics.
Теперь активно пользую девайс при путешествиях на джипах по бездорожью – удобно измерять пройденные расстояния, чтобы не сбиться с маршрута.
Ну вот пожалуй и все. Буду рад ответить на вопросы.
Установка и настройка grbl.
Как загрузить прошивку grbl в Arduino UNO уже рассказывал не однократно, например в статье: «Установка и настройка программы LaserGRBL.», но тут будем использовать немного модифицированную прошивку, как раз под данный проект. Поэтому повторю все шаги, которые нужно сделать.
1. Установка Arduino IDE.
Сперва, нужно установить среду программирования Arduino IDE. Если она у вас установлена, то можете смело пропустить данный пункт.
Я уже рассказывал, как установить и настроить программу Arduino IDE, в статье: «Программа Arduino IDE, бесплатно для Windows, Mac OS, linux. Прошиваем Arduino». Поэтому, расскажу вкратце основные этапы установки и настройки, для операционной системы Windows.
Установка драйвера ch340.
- Скачайте драйвер внизу статьи в разделе «файлы для скачивания»;
- Распакуйте архив;
- Запустите исполнительный файл «CH341SER.EXE»;
- В открывшемся окне нажмите кнопку Install;
- На этом установка завершена.
Теперь можно приступать непосредственно к загрузке библиотеки GRBL.
2. Установка библиотеки grbl.
Как и писал ранее, использовать будем не стандартную библиотеку GRBL. Найти необходимую библиотеку можно по запросу в поисковике «Grbl Pen Servo», либо скачать внизу страницы в разделе «файлы для скачивания».
Внимание. Нужно обязательно удалить библиотеку GRBL, если вы ставили раньше. Для этого заходим в папку «ДокументыArduinolibraries» и ищем папку «grbl», и удаляем ее.
Дальше нужно установить библиотеку grbl. Это можно сделать двумя способами:
Заходим в Arduino IDE и выбираем в меню: Скетч –> Подключить библиотеку –> Добавить .ZIP библиотеку…
Выбираем скаченный архив grbl.zip и нажимаем кнопку «Открыть». После установки вы увидите надпись, что библиотека успешно добавлена.
3. Загрузка grbl в Arduino UNO.
После установки библиотеки grbl, заходим в меню Файлы –> Примеры, и в списке ищем пример «grbl». Открываем пример «grblUpload».В примере ничего менять не нужно, его нужно загрузить в Arduino UNO. Для этого, в пункте меню «Инструменты», выбираем плату «Arduino UNO» и порт, к которому подключена плата. В моем случае это «COM9».
Теперь мы можем загрузить прошивку GRBL в Arduino UNO. Для этого нажимаем на кнопку «Загрузить». После компиляции скетча, код будет загружен в микроконтроллер. И вы увидите надпись «Загрузка завершена».
Также вы увидите надпись оранжевого цвета «Недостаточно памяти, программа может работать нестабильно». Но не пугайтесь, все будет работать отлично.
Скачать готовый скетч в файле можете по этой ссылке.
unsigned long micros_sp = 0, micros_th = 0;
volatile int tz;
volatile int sz;
volatile int sp; //импульсы спидометра
volatile int th; //импульсы тахометра
int analogInput [15]; //массив аналоговых значений
int digitalInput[29]; //массив цифровых значений
String resultString = «»; //строка
int i; //счетчик циклов
//********************************************************************
void setup() <
for(i=0; i digitalInput[i]=0;
>
for(i=0; i analogInput[i]=0;
>
Serial.begin(115200);
Serial2.begin(115200); //инициализация ком порта
attachInterrupt(0, speedometr, RISING); //прерывание спидометра по фронтам импульса
attachInterrupt(1, tahometr, RISING); //прерывание тахометра по фронтам импульса
>
//********************************************************************
void loop() <
analogInput[0] = analogRead(0); // B13 напряжение
analogInput[1] = analogRead(1); // B24 топливо
analogInput[2] = analogRead(2); // B21 температура охлаждения
analogInput[3] = analogRead(8); //
analogInput[4] = analogRead(7); //
analogInput[5] = analogRead(3); //
analogInput[6] = analogRead(4); //
analogInput[7] = analogRead(9); //
analogInput[8] = analogRead(10); //
analogInput[9] = analogRead(11); //
analogInput[10] = analogRead(12); //
analogInput[11] = analogRead(13); //
analogInput[12] = analogRead(14); //
analogInput[13] = analogRead(15); //
analogInput[14] = analogRead(6); //digitalInput[0] = digitalRead(4); // зажигание
// digitalInput[1] = digitalRead(5); //
//********************************************************************
digitalInput[2] = digitalRead(53) + //
digitalRead(51) * 2; //
//********************************************************************
digitalInput[3] = digitalRead(5) + // A14 левый поворот
digitalRead(6) * 2; // A13 правый поворот
//********************************************************************
digitalInput[4] = digitalRead(8) + // A18 ближний
digitalRead(9) * 2; // A17 дальний
//********************************************************************
digitalInput[5] = digitalRead(10) + // А16 птф передние
digitalRead(11) * 2; // A15 птф задний
//********************************************************************
digitalInput[6] = digitalRead(23); // A23 чек
digitalInput[7] = !digitalRead(21); // B 9 — уровень тж
digitalInput[8] = !digitalRead(31); // A19 — ручник
digitalInput[9] = digitalRead(25); // B 3 износ колодок
digitalInput[10] = !digitalRead(45); // B10 — лампа топлива
digitalInput[11] = !digitalRead(51); // B12 — уровень ож
digitalInput[12] = !digitalRead(47); // А24 — давление масла
digitalInput[13] = digitalRead(27); // A20 лампа вентилятора
digitalInput[14] = !digitalRead(29); // A23 зарядка
digitalInput[15] = digitalRead(33); // A 5 абс
digitalInput[16] = digitalRead(35); // A20 srs
digitalInput[17] = digitalRead(37); // A 3 ремень
digitalInput[18] = digitalRead(39); // B 1 двери
digitalInput[19] = 0;//digitalRead(22); // B 2 p
digitalInput[20] = 0;//digitalRead(24); // А22 r
digitalInput[21] = 0;//digitalRead(26); // A 7 n
digitalInput[22] = 0;//digitalRead(28); // B 6 d
digitalInput[23] = 0;//digitalRead(30); // B 5 s
digitalInput[24] = digitalRead(41); // A 8 резерв
digitalInput[25] = 0;//digitalRead(32); // A 9 резерв
digitalInput[26] = digitalRead(43); // A10 резерв
digitalInput[27] = 0;//digitalRead(34); // A11 резерв
digitalInput[28] = digitalRead(49); // B 4 резервresultString = String(resultString + sp);
resultString = String(resultString + «,»);
resultString = String(resultString + th*10);
resultString = String(resultString + «,»);
for(i=0; i resultString = String(resultString + analogInput[i]);
resultString = String(resultString + «,»);
>
for(i=0; i resultString = String(resultString + digitalInput[i]);
>
resultString = String(resultString + «:n»);
// Serial2.print (resultString);
Serial.print (resultString);
resultString = String(«»);
tz = tz — 1;
sz = sz — 1;
if (tz == 0)
if (sz == 0)
delay(50);
>
//********************************************************************
void speedometr() < //измеряем частоту на входе спидометра по прерыванию
sp=(900000.0/( micros() — micros_sp));
micros_sp = micros();
sz = 10;
>
//********************************************************************
void tahometr() < //измеряем частоту на входе тахометра по прерыванию
th=(2900000.0/( micros() — micros_th));
micros_th = micros();
tz = 10;
>
Перед тем как подключать Модуль ESP8266 к схеме его нужно прошить и настроить в режиме прозрачного моста Tcp2uart (tcp to uart), чтобы полученные данные с ком-порта он передавал планшету по Wi-Fi.
Прошивать лучше через USB-UART преобразователь, который должен иметь выход источника 3.3V для питания ESP8266. Так же этот источник должен обеспечить необходимый ток не менее 200мА.
Контакт CPIO0 определяет режим работы модуля. При не подключенном контакте модуль работает в штатном режиме и выполняет AT команды. При замыкании контакта на землю, модуль переводится в режим обновления встроенной прошивки. Перевод модуля в режим прошивки требует, что бы контакт CPIO0 был подключен к «земле» в момент подачи питания на модуль. Если замыкать контакт при работающем модуле, перевод модуля в режим обновления прошивки не произойдет.Теперь нужно запустить esp8266_flasher.exeПропишите КОМ порт вашего конвертера и выбирете саму прошивку fullflash_tcp2uart.bin (ссылка на архив нужных прошивок).
Нажимайте Download и дождитесь пока процесс выполнения дойдет до 99%. На этом он остановится и можно отключать модуль.Далее на ESP8266 нужно подать питание, либо сразу подключить к контроллеру Arduino по схеме. После появления на модуле питания запустите поиск wifi сетей на своем компьютере. Должна появиться сеть ESP8266. Подключитесь к ней. После этого нужно в браузере перейти по адресу http://192.168.4.1/fsupload (Ввести данные Name: ESP8266 Password: 0123456789) и загрузить в устройство файл WEBFiles.bin (он в архиве с прошивками).Осталось настроить Tcp-Uart мост. Для этого в браузере зайдите на http://192.168.4.1. Перейдите во вкладку TCP-UART Settings и установите настройки как на скриншоте снизу:
Готово! Теперь при подключении модуля ESP-8266 к ардуино он работает в режиме прозрачного моста и по Wi-Fi передает необходимые данные.