Содержание
- 1 Электронный спидометр на базе Arduino Uno — Сообщество «Arduino для автомобиля» на DRIVE2
- 2 15. Бортовой компьютер Arduino. Начало. — logbook Nissan Patrol GR Ў60 1996 on DRIVE2
- 3 Бортовой компьютер для авто на Arduino своими руками за 25$
- 4 Тахометр-спидометр на Arduino
- 5 Techno Mind » Записи из архива блога » GPS спидометр и одометр на Arduino + bluetooth трансивер
- 6 Велосипедный спидометр на Arduino
- 7 Код программы к уроку 12. arduino и электродвигатель
- 8 Машинка на arduino и Bluetooth Android
- 9 Машинка на базе Arduino
Электронный спидометр на базе Arduino Uno — Сообщество «Arduino для автомобиля» на DRIVE2
Подглядел я у одной американской машины интересную фичу. Спидометр проецировался на лобовое стекло.Жил я с мечтой о таком нештяке почти всю свою сознательную жизнь. Ну не менять же своего японца на американца из за этого?
А тут дед мороз старшему сыну комплект “Матрешка Z” подарил.
Матрёшка Z
Наборчик, развивающий познания в схемотехнике и программировании. Но сыну этот набор по боку. У него майнкрафт стынет. Ходил я бродил вокруг заветной коробочки и тут случилось. Соединилась моя мечта с возможностью реального воплощения.Ну, думаю, сделаю. Не хочу простых путей.
Зачем покупать у кого-то навороченные готовые наборы? Зачем мучить андроид, и качать на него бесплатную прогу? Сделаю САМ, Ну почти … сам.Первым делом надо понять откуда буду брать сигнал. Мест море.1) Датчик абс. Один леший ABS не работает.
2) Можно намутить проставку с датчиком скорости (сейчас такие на всех инжекторах стоят, не всегда проставки) между коробкой и тросом спидометра.Ой у меня же инжектор. А вот как ЭБУ узнает скорость авто? Да и Автоматическая коробка как с этим справляется?Книга. Вперед читать книгу. А точнее электросхемы. И тут я нашел.
Оказывается у SpaceWagon'а тоже есть эта штуковина “он прячет ее в шкафу” (цитата из кинофильма “Солярис”). И стоит она непосредственно на спидометре. Называется геркон.
Вперед за приборкой. Вот её-то и буду мучить. Снял спидометр. А вот и геркон, который управляется магнитом с четырьмя полюсами. Для наглядности я разукрасил магнит маркером, пытаясь понять как сильно отличается зона разомкнутого геркона от зоны сомкнутого.
Геркон, работает по минусу. Замыкает на массу.
Цилиндрический магнит. Разукрашен маркером. Замыкает и размыкает геркон 4 раза за оборот.
Ну теперь закипит работа. Или мой мозг.Перепробовав все предложенные производителем набора эксперименты я так и не научился не программировать, не схемотехничать. :((
После долгих раздумий и сторонней помощи родилась схема, позволяющая запихнуть-таки сигнал геркона в arduino.
Схема подключения. Нижняя часть верна.
Схему привожу в первозданном виде. Договорились о том, что я буду ваять нижнюю часть, отделенную чертой.Моё мнение заключается в том, что я думаю, что надо как-то отделить схему автомобиля от схемы arduino. Вышло это не ахти как, но уж ладно. По крайней мере мне в этой схеме всё понятно. :)) Делаю эту.
Собрав всё на монтажной плате, (прикольная штука, паять не надо, можно быстро всё переставить) я столкнулся со следующей проблемой. И эта проблема программная.
Вот такая схема
Резисторы как по схеме (вместо 600 Ом стоит 620 Ом). Диоды 1N4007. Оптрон PC817A.И так Программирование. С горем пополам выяснил, что без прерываний не обойтись. Прерывание это такая штука. которая останавливает всю программу при возникновении какого-то времени или сигнала “Ч”.
Обрабатывает приоритетные данные, а потом возобновляет выполнение программы с той точки, где остановила.Дальше круче. Если с сигналом от геркона всё оказалось просто, нашёлся оператор, который всё это (внешнее прерывание) обрабатывает, То с отсечкой времени (внутреннее прерывание) я до сих пор боюсь разбираться. Голова наверно сломается.
Но мне опять помогли. Почти дали списать. Ладно. Спасибо. Работает.
Надо бы еще скетч кинуть наверно. Он на яндекс диске. Сразу предупреждаю, у меня Arduino UNO 16МГц. За работу на других подобных не отвечаю. Во внутренних прерываниях как-то задействованы внутренние ресурсы процессора. И при портации этого скетча на другую платформу надо что-то переделывать.
И видео про то, как это работает.
Ну. Я надеюсь на продолжение. Всем добра.
15. Бортовой компьютер Arduino. Начало. — logbook Nissan Patrol GR Ў60 1996 on DRIVE2
Ну вот и прошли пару дней ковыряния интернета и перелопачивания мануалов и схем. Вопросы на драйве тоже немного пошли на пользу.
Значит быть бортовому компьютеру. Помимо восстановления всех приборов и корректировки их под новые колеса — быть современным технологиям в этом автомобиле.
На выбор был планшет в приборку или консоль, компы на базе BeagleBoard, Raspberry или Arduino.Взвесив все за и против выбор между Raspberry или Arduino пал в сторону Ардуино.
Кто не знает что это и кому интересно: ru.wikipedia.org/wiki/Arduino
Далее выбор платформы между Arduino Mega 2560 и Arduino Due (победил Мега).
С выбором экрана оказалось все сложнее. Сразу планировал в приборку спрятать двухстрочный экран с предупреждениями и показаелями, типа закрой дверь или долей тормозухи. А под потолок пророчил прочку 3,5″ цветных с кренометрами и цифрами.
Вот хороший пример кренометра в видосе:
Вот хороший пример моих будущих стрелок, точнее их проверка при каждом старте сервоприводами:
По итогу решено сварить все на одном 7″ экране по примеру ниже представленного образца. Но не хочу курочить приборку и консоль, там все по фен-шую. А вот откидной солнечный козырек как раз подходит для экрана, плюс не так заметен вандалам. Жгут не обязательно тянуть по стойке, ардуино допускает передавать сигнал без проводов, но бюджет несколько увеличивается.
Прошу не судить строго, рисовал в автокаде не больше 10 минут, ни о какой прорисовке речи быть не может. Пока не решен вопрос как собрать инфу с колес об их давлении. Все расставлено на скорую руку и примерно. В кренометры вставлен силуэт патрола, это принципиально. Вот что примерно получается:
Плюс все стрелки повесить на свои сервоприводы, это избавит их от показывания погоды. А подкорректировать коэффициенты можно простым подключением ноутбука. Всем мир!
Примерный прядок цифр:— блок питания на 9в — 7 у.е.— разветвитель для блока питания — 2 у.е.— модуль питания для макетной платы — 3 у.е.— макетная плата на 830 точек — 8 у.е.— набор перемычек (140шт) — 7 у.е.— набор проводов папа-папа (65шт) — 4 у.е.— набор проводов папа-мама (10шт) — 1 у.е.— Набор компонентов для Arduino (рассыпуха) — 9 у.е.
— Датчик температуры DS18B20 в герметичном корпусе — 5 у.е.— Матричная клавиатура 4х4 — 2 у.е.— Модуль реального времени (RTC) I2C DS3231 — 3 у. е.— DC-DC Понижающий преобразователь на базе LM2596. — 4 у. е.— Arduino Mega 2560 R3 (+ USB-кабель) — 22 у. е.— GPS-модуль GY-NEO6MV2 — 25 у. е.— дисплей 7″ — 60 у.е.— гироскоп/акселерометр — 2 у.е.— джойстик Arduino KY-023 — 2 у.е.
— Датчик температуры и влажности Arduino DHT22 — 7 у.е.
итого 171 у.е.
— Шаговый мотор + контроллер = 6 * 20 у.е.
А сколько еще мелочевки, ужас)))
arduino.ru/forum/apparatn…-mega-2560-shd10-tft01-70
www.dessy.ru/catalog-pdc386779.html
mfurkanbahat.blogspot.com…on-and-compass-using.html
www.itead.cc/display/nextion.html
Бортовой компьютер для авто на Arduino своими руками за 25$
Приветствую!
Примерно за 25 долларов мы сможем сделать бортовой компьютер, умеющий считать расход топлива, показывать температуру охлаждающей жидкости, скорость авто, расстояние поездки, потраченный за поездку бензин, обороты двигателя, давление во впускном коллекторе, температуру впускного коллектора, УОЗ, коррекции топлива, вольтаж датчиков кислорода, нагрузку двигателя и многое другое. Сброс ошибок доступен в режиме «recovery» (как зайти написано ниже). Общий цикл работы с запросом всех данных из эбу происходит примерно раз в 750 мс. (при условии паузы между запросами в 65 мс, так по умолчанию)
Список требуемых деталей для сборки БК
1) Arduino Uno R3 — 1 шт. ~ 7 долларов:
2) LCD2004 жк-модуль ~ 6 долларов:
3) Модуль Bluetooth HC-05 ~ 4 доллара:
4) OBD ELM327 Bluetooth сканер ~ 4 доллара:
5) Резистор 10 кОм подстроечный, бипер для звука, 2 кнопки для смены экранов, провода для соединений, корпус ~ 3 доллара.
Настройка блютуз модуля 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 ардуины.
- 1 — TX модуля в 6 пин ардуины. (внимание будет TX в TX это не ошибка!)
- 2 — RX модуля в 7 пин ардуины. (аналогично не ошибка!)
- 12 — и 34 пин к 3,3V ардуины.
- 13 — GND ардуины.
Открываем Aduino IDE 1.0.6 (использовал эту версию) и заливаем скетч через 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 вместе.
Далее вводим команды по одной и нажимаем [Послать]. После каждого ввода должен быть ответ ok.
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 + блютуз + LCD-экран
Схема:
1.Начнем с подключения HC-05 Bluetooth модуля.
- 1 — TX модуля засовываем в 7 Pin (Rx) арудины (именно TX в RX, не так как ранее);
- 2 — RX модуля засовываем в 8 Pin (Tx) арудины;
- 12 — Pin (3,3V) модуля в Pin 3,3V ардуины;
- 13 — Pin (Gnd) в Gnd арудуины;
- 34 — Pin мы никуда не подключаем (заизолируйте или отпаяйте).
2. Подключаем монитор LCD.
- VSS экрана к GND ардуины;
- VDD экрана к 5V ардуины;
- V0 экрана к центральному выходу резистора;
- RS экрана к 12 пину ардуины;
- RW экрана к GND ардуины;
- E экрана к 11 пину ардуины;
- DB4 экрана к 5 пину ардуины;
- DB5 экрана к 4 пину ардуины;
- DB6 экрана к 3 пину ардуины;
- DB7 экрана к 2 пину ардуины;
- A — к 5V ардуины;
- K — GND ардуины.
Одну из оставшихся ног потенциометра пустить на GND ардуины.
Переменный резистор на 10кОм нужен, чтобы управлять контрастностью монитора, так что если при первом включении вы включите и ничего не увидите, попробуйте отрегулировать контрастность шрифта поворотом резистора.
3. Подключаем дополнительную кнопку для переключения экранов с данными.
[1 кнопка]: один конец от нормально-открытой кнопки подключаем в GND ардуино, а второй конец в пин 10.
[2 кнопка]: GND + пин 9.
Бипер для звуковых предупреждений подключить по следующей схеме «+» к пину 13, а минус к GND ардуино.
Заливаем скетч в Arduino с помощью Aduino IDE 1.0.6 (использовал эту версию)
Единственное, в скетче присутствуют переменные, которую нужно подправить.
Нужно будет обязательно учесть три переменных:
1) ED=1.998 Например объем двигателя в литрах 1.398;
2) VE_correct=1.0; Корректировка объёмного КПД ДВС по таблице: (если расход реально меньше — то уменьшаем значение в процентном соотношении).
Если не хотите калибровать добейтесь чтобы при прогретом двигателе мгновенный расход в л/час был в районе половины обьема двигателя;
3) tcorrect=1.014 (калибровка времени).
4) delay_var=65 Время паузы между запросами в ЭБУ, в дастере например все работает уже на 65 мс, а в старом chrysler cirrus надо аж 235 мс ставить.
5)speed_korrect_val=1; Корректировка скорости машины, смотреть по GPS/
Возможно, Arduino будет не точно считать время с помощью комманды millis()… Тут только вручную корректировать значение. На экране «технологический 2» будет указаны секунды: например, time_start: 23. Сравните значение с реальным.
Для примера засеките 10 минут, когда значение time_start будет, например, равно 23. И выйдет, что через 600 секунд реально покажет 605. Итого 623-605=18 секунд отставание в ардуинке.
То есть поправочный коэффициент tcorrect будет равен 623/605=1,02975.
Управление
[Кнопка 1], [кнопка 2] — листать экран вперед назад.
При включении при надписи «Connecting»… держать [кнопку 1] вход в режим показывания технологических экранов и параметров отдаваемых ЭБУ в 16-чном формате.
Если будете включать БК не в машине то нужно отключить функцию опроса блютуз, надо продолжать держать две кнопки при надписи «Recovery»… до появлении надписи «All off»… а то экран будет все время пустой.
[Кнопка 1] + [кнопка 2]: 4 секунды — Сброс журнала общего пробега и потраченного бензина на втором экране, также это сброс ошибок на экране информации об ошибках.
Скетч:
доступен по ссылке: pastebin.com/eP20LeXX
(по умолчанию настройки в скетче на Рено Дастер 2.0)
Все, идем в машину, вставляем ELM327 в порт, ардуину в зарядку для авто и проверяем.
UPD 06.02.15: Обновлен расчет MAF по изменяемой объемной эффективности VE согласно графика при которое VE зависит от оборотов двигателя.
Тахометр-спидометр на Arduino
С помощью датчика Холла и платы Ардуино можно измерять скорость вращения к примеру колеса велосипеда или самоката, в общем в любых механизмах и машинах, которым необходимы измерения скорости.
В этом проекте мы делали спидометр из кольца адресных светодиодов под управлением компактной платы Ардуино Нано версии с CH340.
1. Аппаратная часть
Для реализации тахометра с применением адресных светодиодов на понадобится:
После подбора компонентов для сборки, собираем небольшую схему
Получаем
Кольцо можно временно отключить, чтобы просто не мешалось.
Проверяем схему еще раз и загружаем в Arduino следующий скетч
#include const int LED_PIN = 6; // выход на модуль const int TACH_PIN = 2; //вход тахометра const int BRIGHTNESS = 50; //яркость const int LED_COUNT = 15; //количество светодиодов const int REDLINE = 7500; //количество красных const int WARN_RPM = 6000; const int WARN_INTERVAL = 70; bool blinkState = true; unsigned long lastBlinkUpdate = 0; volatile unsigned long lastIgnitionTime = 0; void recordIgnition() { detachInterrupt(digitalPinToInterrupt(TACH_PIN)); lastIgnitionTime = millis(); attachInterrupt(digitalPinToInterrupt(TACH_PIN), calculateRpm, RISING); } void calculateRpm() { detachInterrupt(digitalPinToInterrupt(TACH_PIN)); unsigned long ignitionTimeDelta = millis() – lastIgnitionTime; int rpm = 1000.0 / ignitionTimeDelta * 60 *2; Serial.print(“RPM: “);//Пишем частоту в монитор порта Serial.println(rpm); setRpm(rpm); attachInterrupt(digitalPinToInterrupt(TACH_PIN), recordIgnition, RISING); } void setup() { Serial.begin(9600); pinMode(TACH_PIN, INPUT); strip.begin(); strip.setBrightness(BRIGHTNESS); strip.show(); // Initialize all pixels to 'off' attachInterrupt(digitalPinToInterrupt(TACH_PIN), recordIgnition, RISING); } void loop() { } void setRpm(int rpm) { int rpmPerLed = REDLINE / LED_COUNT; if(rpm >= WARN_RPM) { unsigned long currentTime = millis(); if(currentTime – lastBlinkUpdate > WARN_INTERVAL) { lastBlinkUpdate = currentTime; blinkState = !blinkState; } } else blinkState = true; for(int led = 0; led < LED_COUNT; led++) { if(!blinkState && (led+2)*rpmPerLed > WARN_RPM) { strip.setPixelColor(led, 0, 0, 0); continue; } if((led+1)*rpmPerLed rpm) { strip.setPixelColor(led, getColor(rpm, (double)(rpm-(led)*rpmPerLed)/rpmPerLed)); } else strip.setPixelColor(led, 0, 0, 0); } strip.show(); } int32_t getColor(int rpm, double intensity) { int red = rpm/(double)REDLINE * 255 * intensity; int green = (1-rpm/(double)REDLINE) * 255 * intensity; int blue = 0; return strip.Color(red, green, blue); }
После загрузки скетча можно проверить работу датчика холла, для этого подключаем осциллограф на выход тахометра и смотрим что выдает датчик холла при вращении диска с магнитом рядом с датчиком. Если сигнал отсутствуем проверяем правильность подключения датчика и при необходимости делаем подтяжку сигнала резистором 10 кОм на плюс питания.
Отсутствие сигнала
Наличие сигнала
После проверки работоспособности подключаем кольцо на светодиодах WS2812 и вращая рядом с датчиком диском с магнитом получаем частоту вращения диска.
Перед установкой в какие либо механизмы необходимо откалибровать данный тахометр, используя заведомо исправный тахометр заводского исполнения.
Смотрим что получилось.
Применение данной схемы масса.Например сделать спидометр для велосипеда закрепив магнит на колесе, а датчик на вилке или сделать модернизацию приборной панели автомобиля. В общем везде, где необходимо измерение частоты или скорости вращения механизма.
P.S. Осциллограф используемый для измерения собран на ArduinoPro micro и TFT дисплее.
Изменено: 26 Июл, 2018 20:50
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.
Теперь активно пользую девайс при путешествиях на джипах по бездорожью – удобно измерять пройденные расстояния, чтобы не сбиться с маршрута.
Ну вот пожалуй и все. Буду рад ответить на вопросы.
Велосипедный спидометр на Arduino
Представляю проект велоспидометра, который позволяет следить за скоростью езды на велосипеде при помощи Arduino.
Для измерения скорости вращения одного колеса используется магнитный выключатель (также называемый геркон). Контроллер Arduino рассчитывает скорость и выводит эту информацию на ЖК-дисплей, закрепленный на руле.
Устройство совместимо с любым велосипедом/колесом, необходимо только ввести радиус колеса в прошивку для калибровки.
Список деталей: (1x) Arduino Uno REV 3. (1x) Геркон. (1x) 10КОм 0.25Вт резистор. (1x) Батарея 9В. (1x) Разъемы для 9В батареи. (1x) Макетная плата. (1x) ЖК-дисплей с подсветкой Parallax 27977-RT. (x2) Тумблер. (2x) BLS штырьки.
(1x) BLS разъемы.
Дополнительные материалы: Провод №22. Припой. Наждак. Фанера. Столярный клей. Термоклей. Винты.
Кабельные стяжки.
Принципиальная схема
На схеме есть три тумблера: – первый на линии питания 9В. – второй для включения и выключения подсветки ЖК-дисплея.
– и один магнитный выключатель (так называемый геркон), который замыкается каждый раз, когда колесо совершает один полный оборот.
Parallex LCD подключается к Arduino при помощи только трех контактов: 5В, GND и последовательного цифрового выхода (TX) – 1 контакт Arduino.
Резисторы 10 кОм подключены к геркону и выключателю подсветки во избежание избыточного тока между 5В и GND Arduino.
Припаяйте на макетную плату три линии BLS штырьков как показано на фотографии для подключения Arduino.
Геркон
Магнитный выключатель состоит из двух частей: геркона и магнита. У геркона есть контакты, которые механически замыкаются внутри него при приближении магнита.
Припаяйте токоограничительный 10кОм резистор между A0 и GND на макетной плате. Припаяйте длинные провода к А0 и 5В – они будут проведены по велосипеду и подключены к геркону.
Установка геркона на колесо
Установите магнит и геркон на ваш велосипед при помощи изоленты (подходит любое колесо). Как видно на фотографии, магнит установлен на одну из спиц колеса, геркон на раму велосипеда.
То есть каждый раз, когда колесо делает полный оборот, магнит проходит мимо геркона, замыкая его. Подключите к геркону провода, ранее припаянные к плате.
Геркон неполярный, поэтому как его подключать – не имеет значения.
Используйте код приведенный ниже для проверки. Когда магнит на колесе будет проходит мимо геркона, Arduino будет выдавать значение ~1023, в противном случае значение будет ~0. Откройте Serial Monitor (монитор последовательного порта) (Tools >> Serial Monitor) в Arduino IDE, чтобы проверить это. Если магнит не влияет на геркон, попробуйте переставить его или использовать более мощный.
#define reed A0 //Номер пина к которому подключен геркон int reedVal; void setup(){ Serial.begin(9600);
} void loop(){ reedVal = analogRead(reed); // считываем знаение A0 Serial.println(reedVal); // выводим в Serial Monitor delay(10); // пауза 10 мс
}
Прошейте Arduino. Включите Serial Monitor (монитор последовательного порта). Он должен показывать 0.00. Начните крутить колесо, и вы увидите скорость миль/ч, изменяющуюся каждую секунду.
ЖК-дисплей
Я использовал ЖК-дисплей с последовательным интерфейсом.
Припаяйте линию BLS разъемов на обратную сторону (с контактами) макетной платы. Три разъема будут использоваться для подключения ЖК-дисплея. ЖК-дисплей хорошо в станет в эти разъемы.
Подключите 5В, GND, и TX (1 цифровой вывод Arduino) от Arduino к разъему дисплея. Смотрите на подпись выводов ЖК-дисплея, чтобы сделать всё правильно.
В нижней части ЖК-дисплея Parallax есть два переключателя и потенциометр. Потенциометром контролируется контрастность дисплея. Для правильной работы переключатели должны быть установлены как на фотографии.
Для тестирования ЖК-дисплея используйте следующий код. Почему-то на моем ЖК-дисплее начинают появляться случайные символы во время прошивки, но они исчезают после того, как я пере подключаю USB-кабель. Я думаю, что это является помехой при связи Arduino с компьютером через 1 цифровой контактный (TX) во время прошивки.
При включении на ЖК-дисплее должна отображаться надпись “Hello World”.
void setup() { Serial.begin(9600); pinMode(1,OUTPUT); // TX-линия Serial.write(12); // Очищаем Serial.write(“Hello World”); // Вывод надписи
} void loop() {
}
Подключите тумблер как показано на фотографии. Припаяйте резистор 10 кОм и зеленый провод к одному контакту, а красный провод к другому.
Подключите красный провод к 5В Arduino и к GND через резистор, а зеленый провод к D2.
Программа
Прошейте Arduino скетчем, который вы можете скачать внизу статьи. Убедитесь, что подсветка включается и выключается, а скорость отображается правильно. (Возможно, вам придется переподключить Arduino для корректной работы).
Измерьте радиус колес (в дюймах) и вставить его в строку: float radius = “”';
Я использовал прерывания по таймеру. Для отображения скорости в км/ч необходимо внести корректировку в программу.
Батарея
Соедините разъем для батареи и тумблер последовательно, как показано на фотографии. Подключите красный провод от выключателя к Vin Arduino, а черный провод от разъема для батареи к GND Arduino.
Корпус
Я вырезал корпус для своего проекта при помощи 1/4″ лазерного резака 120 Вт. Размеры корпуса 3,5″x4″x2″.
Я смоделировал корпус в AutoCAD и сделал файлы для лазерной резки (с шиповым соединением) в Autodesk 123D Make. Затем я добавил два отверстия для тумблеров и прямоугольное отверстие для ЖК-дисплея.
Также добавил несколько отверстий в нижней части корпуса для облегчения крепления к велосипеду.
Далее, склеил корпус древесным клеем, и отшлифовал края. Закончив корпус, я покрыл его лаком.
Установка компонентов в корпус
Закрепите тумблеры на корпусе при помощи гаек. Приклейте или привинтите ЖК-дисплей с внутренней стороны передней панели. Установите макетную плату, Arduino и батареи в корпусе и закрепить при на липучках или клее.
Оберните провода от геркона вокруг рамы, избегая движущихся частей велосипеда. Я использовал кабельные стяжки для крепления спидометра к рулю.
Теперь вы можете выезжать с этим спидометром, однако при движении не отвлекайтесь от дороги!
Оригинал статьи
Прикрепленные файлы:
Код программы к уроку 12. arduino и электродвигатель
/* * * Набор для экспериментов ArduinoKit * Код программы для опыта №12: sketch 12 * * Крутись мотор * * Написано для сайта http://arduinokit.ru * * * Помощь сообщества Arduino. * Посетите сайт http://www.arduino.cc * * * * КРУТИСЬ МОТОР. ARDUINO И ЭЛЕКТРОДВИГАТЕЛЬ. * * Использование транзистора для управления скоростью мотора.
* Мы также покажем вам, как вводить данные через последовательный порт * (см функцию serialSpeed() ниже). * * Двигатели одна из многочисленных вещей из нашей повседневной жизни, * и Arduino может ими управлять. Мы будем использовать Широтно * Импульсную Модуляцию (PWM) для управления скоростью двигателя.
* * Порты Arduino способны выдержать работу нескольких светодиодов * (до 40 мА), но они не достаточно мощны, чтобы справиться с нагрузкой * от двигателя и других прожорливых потребителей энергии. Двигатель * идущий в наборе потребляет приблизительно от 50 до 100 mA, а это * значительно больше чем может дать Arduino.
Поэтому мы будем * использовать транзистор, который выполнит главную работу. * Транзистор будет выполнять роль «твердотельного выключателя», мы * «дадим» ему ток маленькой величины, а будет коммутировать, гораздо * больший ток. Транзистор 2N2222 может коммутировать ток до 200 мА.
* * Вы можете управлять транзистором с помощью функции digitalWrite() * («включать» и «выключать»), а с помощью функцию analogWrite() * изменять скорость вращения двигателя, для этого Arduino использует * Широтно Импульсную Модуляцию (PWM), подавая импульсы напряжения * изменяя их ширину от 0% до 100%.
* * Имейте в виду, для уменьшения скорости, вы уменьшаете ее с помощью * ШИМ (делая паузы «СТОП» длиннее). Если в начале, длительность паузы * будет 50% и более, двигатель, просто не сможет раскрутиться, * поэтому при старте необходимо немного добавить скорости. * * Подсоединяем оборудование: * * Транзистор: * * У транзистора имеются три вывода.
Если повернуть его скошенной * стороной (с надписями) к себе, а выводами вниз, то назначения * выводов будут следующими (слева на пр.): КОЛЛЕКТОР, БАЗА, ЭМИТЕР. * * Подсоедините минусовой вывод мотора к КОЛЛЕКТОРУ транзистора. * Подсоедините БАЗУ через резистор 330 Ом к цифровому порту 9. *Подсоедините ЭМИТЕР к GND (минусовой шине).
* * Мотор: * * Вы уже должны были подсоединить минусовой вывод мотора к *КОЛЛЕКТОРУ транзистора.
* * В данном опыте не имеет большого значения как подсоединять плюс * или минус двигателя, если их перепутать двигатель просто будет * крутиться в обратном направлении, это будет иметь значение если * двигатель установлен в машинке, и вместо того, чтобы ехать вперед, * она поедет назад. * * Оставшийся вывод мотора подсоедините к +5 Вольт.
* * Полупроводниковый диод: * * Полупроводниковый диод пропускает электрический ток только в * одном направлении и блокирует его прохождение в другом. * * Когда двигатель вращается, и резко отключается, магнитное поле * внутри него падает, в результате создается всплеск напряжения. * Это может привести к повреждению транзистора.
Чтобы этого не * случилось, мы и будем использовать диод, который не пропустит * этот всплеск через себя. * * На импортных диодах, почти всегда, КАТОД, отмечен полоской — * кольцом, расположенным, как раз у этого вывода. * * Подключите один вывод диода (КАТОД) к +5 Вольт, а другой * вывод (АНОД) к минусовому контакту на двигателе. * * В данном опыте не имеет большого значения плюс или минус * двигателя, если их перепутать двигатель просто будет крутиться в * обратном направлении, это будет иметь значение если двигатель * установлен в машинке, и вместо того, чтобы ехать вперед, она * поедет назад. * * * Комментарий к программе написан * 23 ноября 2014
* специально для http://arduinokit.ru
*
*/
// Будем управлять двигателем используя цифровой порт 9 (pin 9).
// Это должен быть любой ШИМ порт Arduino
const int motorPin = 9; void setup() {
// Установим порт мотора как выходной:
pinMode(motorPin, OUTPUT);
// Активируем «Монитор порта»:
Serial.begin(9600); } void loop() { // Здесь мы использовали комментарии для отключения некоторых // примеров. Чтобы испробовать другой пример, раскомментируйте // одну из следующих строк и закомментируйте другие. См функции,
// для того чтобы узнать что они делают и как работают.
// motorOnThenOff(); // motorOnThenOffWithSpeed(); // motorAcceleration(); serialSpeed();
}
// Попробуйте разные значения.
void motorOnThenOff() { int onTime = 3000; // миллисекунд для вращения мотора
int offTime = 3000; // миллисекунд для простаивания мотора
digitalWrite(motorPin, HIGH); // включить мотор — максимальная скорость delay(onTime); // задержка, для продолжения вращения digitalWrite(motorPin, LOW); // выключить мотор delay(offTime); // задержка, для простаивания мотора
}
// Функция «motorOnThenOffWithSpeed» переключает работу мотора между
// двумя скоростями. Пробуйте разные значения, если интересно.
void motorOnThenOffWithSpeed() { int Speed1 = 200; // скорость «Speed1» 0 (остановка), 255 (полный ход)
int Time1 = 3000; // время «Time1» в миллисекундах
int Speed2 = 50; // скорость «Speed2» 0 (остановка), 255 (полный ход)
int Time2 = 3000; // время «Time2» в миллисекундах
analogWrite(motorPin, Speed1); // включаем мотор на скорости «Speed1» delay(Time1); // продолжаем вращение заданное время analogWrite(motorPin, Speed2); // включаем мотор на скорость «Speed2» delay(Time2); // продолжаем, заданное время «Time2» } // Функция «motorAcceleration» раскручивает двигатель от нуля до
// максимума, и обратно до полной остановки.
void motorAcceleration() { int speed;
int delayTime = 20; // пауза в миллисекундах
// будем раскручивать мотор, увеличивая скорости от 0 до 255 с паузой в
// 20 миллисекунд меду каждым шагом (1, пауза, 2, пауза, 3, пауза и.т.д)
for(speed = 0; speed = 0; speed—) { analogWrite(motorPin,speed); // установка новой скорости delay(delayTime); // пауза «delayTime», т.е 20 миллисекунд } } // Следующая функция позволит вам изменять скорость прямо в окне // «Монитора порта».
Для этого откройте Монитор порта, используя // значок увеличительного стекла в Arduino IDE, в правом верхнем // углу окна.
Затем введите желаемую скорость в специальном месте // для ввода текста «Type a speed (0-255) into the box above,», в // верхней части окна, и нажмите кнопку «Send» (отправить) или // «return» (возврат). Двигатель будет работать на заданной вами
// скорости. Допустимый диапазон от 0 до 255.
void serialSpeed() {
int speed;
Serial.println(«Type a speed (0-255) into the box above,»); // Т.к. с русским языком в «мониторе порта» существуют некоторые // сложности, надписи будут на английском. Serial.println(«then click [send] or press [return]»);
Serial.println(); // Распечатать пустую строку
// In order to type out the above message only once, // we’ll run the rest of this function in an infinite loop: // Для того, чтобы вывести сообщение (выше) лишь один раз, // Мы будем запускать остальную часть этой функции в // бесконечном цикле: // Вывод запроса данных осуществляется лишь раз, после этого // Функция будет проверять правильность ввода данных по кругу, пока
// данные не изменятся.
while(true) {
// Сначала мы проверяем, доступны ли входные данные:
while (Serial.available() > 0) {
// Если данные есть, выполняем parseInt() для считывания цифр:
speed = Serial.parseInt();
// Поскольку analogWrite() работает с числами от 0 до 255, // мы обязательно должны быть уверенны, что число входит в // заданный диапазон. Для этого воспользуемся функцией «constrain».
// об этой функции мы говорили в опыте №6 «Arduino и Фоторезистор»:
speed = constrain(speed, 0, 255);
// Напечатать сообщение для того, чтобы вы знали что число
// было получено:
Serial.print(«Setting speed to «);
Serial.println(speed);
// И в конце зададим скорость двигателя
analogWrite(motorPin, speed); } }
}
Машинка на arduino и Bluetooth Android
Машинка на arduino и Bluetooth без редактирования кода. Мы будем использовать специализированный бесплатный софт для составления скетча. Кроме того не надо покупать шасси для нашей поделки, подойдет практически любая неисправная радиоуправляемая модель автомобиля или танка.
Предлагаю посмотреть обзорный видеоролик про блютуз-управляемую машинку и ее начинку.
Итак, давайте разберем на живом примере как сделать своими руками дистанционно управляемую по bluetooth c android планшета или смартфона машинку. Статья, как ни странно, рассчитана на начальный уровень знаний.
Здесь нет руководства по редактированию кода в Arduino IDE, да и мы использовать его будем только для заливки нашего кода. А составлять алгоритм управления будем в программе под названием FLProg. Программа управления со смартфона — HmiKaskada_free.
Но сначала о железе, которое нам понадобится.
Машинка на arduino и Bluetooth — аппаратная часть
Первое что необходимо это шасси, то есть корпус с колесами и моторчиками, который и будет ездить на радость нам и окружающим. В моем случае был использован корпус от радиоуправляемой игрушки в которой выгорела силовая часть.
Перспектива ремонта мне показалась унылой, да и хотелось чего то нового для своих детей. Так и родился этот проект. В корпусе стоят два двигателя которые приводят в движение колеса по бортам машинки, как у танка.
Вся электронная начинка отправилась на запчасти.
Для управления электродвигателями нашего будущего творения понадобится Н-мост на микросхеме L298N Ссылка на Али, я брал у именно этот. Картинка кликабельна.
Н-мост для arduino
Может управлять двумя двигателями в диапазоне напряжений 5 — 35 вольт. Поддерживает ШИМ, то есть можно регулировать обороты двигателей. На плате есть вывод стабилизированного напряжения 5 вольт для питания ардуино.
Схема подключения проста и незатейлива:
Схема подключения L298N а arduino
Следующей неотъемлемой частью электронной начинки нашего проекта является bluetooth модуль HC-06. Самый обычный модуль для ардуино, настолько популярен что в дополнительном описании не нуждается.
HC-06 bluetooth for arduino
Основным элементом и мозгом в моем случае выступает arduino nano, тут даже фото выкладывать не буду ибо все о ней знают и умеют с ней работать. Кстати подойдет любая плата ардуино, лишь бы в корпус поместилась
Машинка на базе Arduino
Опубликовано 26.02.2015 10:14:00
Данная статья будет поистине самым простым руководством по сборке управляемой по блютуз машинки, ведь благодаря встроенным разъемам для подключения блютуз модулей на наших Z- Мотор шилдах, вся сборка производится в 5 действий:
• Состыковка платы Arduino с Шилдом • Заливка программы • Подключение моторов • Соединение Блютуз модуля с платой
• Подача внешнего питания
Управлять нашей машинкой мы будем c Android телефона через приложения Z- Car Сontroller. Написано оно в приложении App Inventor, программа и исходник прикреплены в конце статьи.
Контроллер имеет клавиши управления направлением и дополнительные четыре клавиши для произвольных целей. При нажатии на клавиши посылается уникальный символ, отрабатывает вибрация и происходит затемнение. При отпускании клавиши посылается еще один символ и клавиша приобретает изначальный вид. (Посылаемые символы)
Для соединения с блютузом предназначена кнопка “Подключить Bluetooth”, при нажатии выпадет список из сопряженных с телефоном. Для отключения предназначена, как легко догадаться, кнопка “Отключить Bluetooth”.
Минусы
Главной проблемой приложений написанных в App Inventor является невозможность отслеживания сразу нескольких нажатий. Для управления танковой платформой это не столь критично, и при старте программы по дефолту открывается режим для танкового управления.
Управление танковой платформой
(Для активации TANK режима предназначена кнопка “T”)
Пример программного кода для управления машинкой с танковым управлением
int val;
int IN1 = 4;
int EN1 = 6;
int IN2 = 7;
int EN2 = 5; void setup()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(EN1, OUTPUT);
pinMode(EN2, OUTPUT);
} void loop()
{
if (Serial.
available())
{
val = Serial.
read();
if (val == 'W') // При получении символа “W” движемся вперед
{
digitalWrite(IN1, HIGH);
analogWrite(EN1, 255);
digitalWrite(IN2, HIGH);
analogWrite(EN2, 255);
}
if (val == 'S') // При получении символа “S” движемся назад
{
digitalWrite(IN1, LOW);
analogWrite(EN1, 255);
digitalWrite(IN2, LOW);
analogWrite(EN2, 255);
}
if (val == 'A'){ // При получении символа “A” движемся влево
digitalWrite(IN1, HIGH);
analogWrite(EN1, 255);
digitalWrite(IN2, LOW);
analogWrite(EN2, 255);
}
if (val == 'D'){ // При получении символа “D” движемся вправо
digitalWrite(IN1, LOW);
analogWrite(EN1, 255);
digitalWrite(IN2, HIGH);
analogWrite(EN2, 255);
}
//———- Стоп режим —————-
// При отпускании клавиш в программе в порт шлется “T”
if ( val == 'T') // При нажатии клавиши “T”
{
// Выводы ENABLE притянуты к минусу, моторы не работают
digitalWrite(EN1, LOW);
digitalWrite(EN2, LOW);
}
}
}
Управление машинкой с рулевым устройством
A вот для управления машинкой с рулевым поворотным устройством это проблема. Выходом из данной ситуации является добавление дополнительных клавишь и их обработка в программном коде.
(Для активации CAR режима предназначена кнопка “C”)
Пример программного кода для управления машинкой с рулевым устройством
int val;
int IN1 = 4;
int EN1 = 6;
int IN2 = 7;
int EN2 = 5; void setup()
{
Serial.
begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(EN1, OUTPUT);
pinMode(EN2, OUTPUT);
} void loop()
{
if (Serial.available())
{
val = Serial.
read();
if (val == 'W') // При получении символа “W” движемся вперед
{
digitalWrite(IN1, HIGH);
analogWrite(EN1, 255);
}
if (val == 'Q') // При получении символа “Q” движемся вперед и влево
{
digitalWrite(IN1, HIGH);
analogWrite(EN1, 255);
digitalWrite(IN2, HIGH);
analogWrite(EN2, 255);
}
if (val == 'E') // При получении символа “E” движемся вперед и вправо
{
digitalWrite(IN1, HIGH);
analogWrite(EN1, 255);
digitalWrite(IN2, LOW);
analogWrite(EN2, 255);
}
if (val == 'S') // При получении символа “S” движемся назад
{
digitalWrite(IN1, LOW);
analogWrite(EN1, 255);
}
if (val == 'Z') // При получении символа “Z” движемся назад и влево
{
digitalWrite(IN1, LOW);
analogWrite(EN1, 255);
digitalWrite(IN2, HIGH);
analogWrite(EN2, 255);
}
if (val == 'C') // При получении символа “C” движемся назад и вправо
{
digitalWrite(IN1, LOW);
analogWrite(EN1, 255);
digitalWrite(IN2, LOW);
analogWrite(EN2, 255);
}
if (val == 'A'){ // При получении символа “A” движемся влево
digitalWrite(IN2, HIGH);
analogWrite(EN2, 255);
}
if (val == 'D'){ // При получении символа “D” движемся вправо
digitalWrite(IN2, LOW);
analogWrite(EN2, 255);
}
//———- Стоп режим —————-
// При отпускании клавиш движения в программе в порт шлется “T”
if ( val == 'T') // При нажатии клавиши “T”
{
// Выводы ENABLE притянуты к минусу, моторы не работают
digitalWrite(EN1, LOW);
digitalWrite(EN2, LOW);
}
}
}
Использованное в статье железо:
• Arduino UNO, Arduino Nano CH340
• Z- Mini Motor + Sensor Shield (L293D, LD1117), Z- Motor Servo + Shield (L298P, LM338T)
• Блютуз модуль HC-06
Документация:
• Приложение и исходник для App Inventor ZelectroCarController.zip
• Руководство пользователя Z- Mini Motor + Sensor Shield (L293D, LD1117)
• Руководство пользователя Z- Motor + Servo Shield (L298P, LM338T)
Купить в России Платы управления моторами для Arduino
В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.