Велосипедный спидометр на ардуино схемы
Представляю проект велоспидометра, который позволяет следить за скоростью езды на велосипеде при помощи 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, чтобы проверить это. Если магнит не влияет на геркон, попробуйте переставить его или использовать более мощный.
Прошейте Arduino. Включите Serial Monitor (монитор последовательного порта). Он должен показывать 0.00. Начните крутить колесо, и вы увидите скорость миль/ч, изменяющуюся каждую секунду.
ЖК-дисплей
Я использовал ЖК-дисплей с последовательным интерфейсом.
Припаяйте линию BLS разъемов на обратную сторону (с контактами) макетной платы. Три разъема будут использоваться для подключения ЖК-дисплея. ЖК-дисплей хорошо в станет в эти разъемы.
Подключите 5В, GND, и TX (1 цифровой вывод Arduino) от Arduino к разъему дисплея. Смотрите на подпись выводов ЖК-дисплея, чтобы сделать всё правильно.
В нижней части ЖК-дисплея Parallax есть два переключателя и потенциометр. Потенциометром контролируется контрастность дисплея. Для правильной работы переключатели должны быть установлены как на фотографии.
Для тестирования ЖК-дисплея используйте следующий код. Почему-то на моем ЖК-дисплее начинают появляться случайные символы во время прошивки, но они исчезают после того, как я пере подключаю USB-кабель. Я думаю, что это является помехой при связи Arduino с компьютером через 1 цифровой контактный (TX) во время прошивки.
При включении на ЖК-дисплее должна отображаться надпись "Hello World".
Подключите тумблер как показано на фотографии. Припаяйте резистор 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 и батареи в корпусе и закрепить при на липучках или клее.
Оберните провода от геркона вокруг рамы, избегая движущихся частей велосипеда. Я использовал кабельные стяжки для крепления спидометра к рулю.
Теперь вы можете выезжать с этим спидометром, однако при движении не отвлекайтесь от дороги!
Мой отец увлекался электроникой. Дома был паяльник, провода, куча радиодеталей. Он с лёгкостью чинил телевизоры, холодильники — в качестве хобби. Я всегда был рядом.
В 10 лет мне подарили радио конструктор, я думаю у многих такой был.
Купили плату и стали заниматься программированием, и изучать электронику. Поделав различные задания, накупив кучу датчиков, встал вопрос — чего делать дальше. Сын спросил— а что можно реальное сделать на Arduino? Мы провели мозговой штурм и составили перечень интересных, полезных приборов, которые было бы интересно сделать. Начали думать, как мы их будем делать. Первым нашим прибором стал велокомпьютер. У нас как раз были велосипеды на всю семью, вот их и надо было оснастить мощным вычислительным центром на микроконтроллере. Мы набросали программу в Arduino, датчики — кнопки, все отлично работало. Осталось дело за малым — собрать все в коробочку и пользоваться.
Мне хотелось научить сына паять, и показать, что если захотеть, то можно сделать красивый компактный современный прибор самостоятельно, а не покупать его. Пришлось вспоминать былые навыки. Как же все изменилось…
Мои знакомые выводные резисторы заменились на SMD компоненты. Очень сложные платы можно было делать дома с помощью лазерного принтера. Схемы можно тестировать в симуляторах. В интернет очень много информации, схемы, курсы по программированию. Я стал во всем этом разбираться.
Все должно быть недорого. Если сгорит, то не жалко. Это ведь первый прибор. Посмотрели, что продаётся на рынке. Как правило, все велокомпьютеры крепятся на руле, имеют экран, защищены от дождя, имеют один или два датчика (на колесо и на педали). Они могут посчитать пробег, показать текущую скорость, каденс (количество оборотов педалей), время поездки, потраченные калории и другие показатели.
Экран решили исключить. Как правило они или дорого стоят (в виде готовых плат) или их сложно припаять (например экран от сотового), да и программу он сильно усложняет. У нас уже была практика общения с bluetooth модулем. Его решили и взять на замену экрана.
Экраном, в итоге, будет смартфон, но смотреть туда будем редко, прибор автономный, а экран нужен будет, в основном, чтобы посмотреть итоги поездки или промежуточные данные. Bluetooth модуль позволяет на ходу программировать прибор, начать замер, устроить соревнование — все это легко.
Решили добавить звук — пищалку, так можно сигнализировать о разных событиях. Очень понравилась идея, что каденс должен быть не меньше 80, вот об этом и будем пищать. В качестве пищалки — динамик от сотового телефона:
Батарейки порядком надоели, решили осваивать аккумуляторы. У нас был небольшой аккумулятор от детского вертолёта — его и берём, потом оказалось? что такой тяжело купить, поменяли на LIR2450.
Выбираем корпус. Понравился вот такой от компании Gainta.
У них очень широкий выбор корпусов. Правда есть минимальная сумма покупки, купили сразу наперёд, и на другие приборы тоже.
Микроконтроллер — конечно ATMEGA, как на Arduino. Сколько же он стоит — больше 100р в москве. Странно, в китае готовая Arduino всего 200р. Решил выбрать замену — Attiny, но она не очень понравилась. Я стал копать, и случайно наткнулся на серию stm8, stm8s003f3p всего 20руб, при том, что есть вся периферия. Отлично! Будем делать на нем. Правда среда другая, но там Си, который я знал. Так же плюсом стало наличие нормального отладчика, чем в Arduino очень не хватало!
Подбираем схемы зарядки li-ion. Довольно быстро я вышел на микросхему TP4056 — 10р, правда в Китае — заказываем десяток — пригодятся. Плата защиты от переразряда встроена в аккумулятор — так что не нужна. Но в принципе, у STM8 порог включения 3в, так что плат защиты особенно не нужна.
Все — схема готова, компоненты выбраны. Нужен программатор ST-link, купил готовый в Москве, как оказалось потом дорого, ну да ладно. Наша первая схема:
Сделали плату. ЛУТ методом не получилось. Нашли новый метод — путём холодного переноса тонера, с помощью ацетоном. Получилась отличная плата, правда конечно с небольшими косяками, метод потом довели до идеала. Пользуемся до сих пор. Плата готова. Ждём микросхемы из китая (TP4056 у нас купить не реально). Все приехало. Начинаем паять и видим, что при разводке микросхемы зарядки выбрали не тот корпус, очень похожи названия SO8, MSOP8! Но плата уже готова, переделывать лень, во второй версии учтём! Убираем функцию зарядки и делаем ее на отдельной плате. Проводками все замыкаем как надо.
Собираем все в корпус — обе дырки крепёжные не там. Ладно не беда, крепим вверх ногами, и подбиваем поролоном. Крепим кнопку — не крепится. Заливаем термоклеем — отваливается. В итоге делаем так:
На будущее — лучше было делать кнопку на плате сразу! Крепим пищалку — куча проводов, все мешается, но работает.
Для облегчения работы сыну, пришлось провести небольшую лекцию, что вместо одной функции надо писать другую:
- digitalWrite = GPIO_WriteHigh
- digitalRead = GPIO_ReadInputPin
- pinMode = GPIO_Init
- Delay — написали сами
- millis() — не нужен, перешли на миллисекундный таймер и прерывания, очень удобно.
Готова первая тестовая мини программа — пищим, считаем скорость и выдаём на телефон. Включаем — писк еле слышно. Оказалось питание у нас не 5в и потому тихо. Добавляем на отдельной мини платке — тразистор — отлично — слышно громко.
Прикручиваем на велосипед, планируем крепить на руль, припаяли длинные провода, сделали два датчика из ручки, залили термоклеем. Попробовали, и оказалось, что проще крепить на задней вилке. Провода собрали и связали — не нужны. В качестве магнита — детский конструктор.
Итак поехали. Вместо одного оборота — тысячи. Что за ерунда. Разбираемся, ага, дребезг контактов, ставим задержки — отлично работает. Проверяем скорость совпадает с GPS на телефоне. Начинаем заниматься энерго сбережением. Прибор должен спать очень долго и работать экономно.
Основная цель, на одном заряде прибор должен работать очень долго. Выключателя нет, будем использовать спящий режим. Прибор должен сам включаться, внешние прерывания от геркона, сам выключаться, если нет движения 2 минуты, то выключаемся. И самое главное, он должен сам собирать статистику по поездкам и хранить ее в памяти. Долго думали как определить, что такое одна поездка? И решили, что если в течение 3 часов не было движения, то поездка закончилась, и велосипед дома. Чтобы 3часа не работать в полном режиме, решено использовать режим сна, с таймером автопробуждения. Таймер можно завести максимум на 30 секунд, так что просыпаемся каждые 30 сек, уменьшаем счётчик, и так, пока не пройдет 3ч. Как прошло — поездка закончена фиксируем данные. Отладить данный алгоритм было не легко, компилятор пытался каждый раз помешать оптимизацией кода. Но, в итоге, все получилось.
По теоретическому расчёту, прибор должен спать больше года, МК в спящем режиме 4мка, если все отключить, отлично. Программируем спящий режим — проверяем. Спит 3 недели и батарея садится. Вместо 4мка — откуда то имеем больше 200мка. Опять все проверяем, и видим, что LDO потребляет в пассивном режиме 200мка. Нашли. Надо менять схему! Пока тестируем дальше.
В отличие от велокомпьютеров, которые есть на рынке, решили добавить функционал. Наш прибор должен уметь:
- вести статистику за последние 4 поездки, и хранить это все в энергонезависимой памяти
- считать калории, только когда крутятся педали
- считать активное время поездки, когда скорость была больше 4 км\ч
- иметь возможность контролировать скорость и каденс, и при нарушении выбранного режима оповещать звуком
- программироваться по bluetooth: очистка памяти, вывод информации о прошлых поездках, установка параметров — вес, диаметр колеса, параметры контроля скорости
- учитывать не среднюю скорость, а скорость, с которой ехали большую часть времени. Это необходимо, например, для случая, когда вы едете час, потом отдыхаете 30 минут, потом опять едете, опять постояли 5 минут. Всегда была разная скорость. 5 минут ехали в гору, 10 секунд с горы. В итоге средняя скорость будет совсем не показательна. А вот скорость, с которой ехали наибольшее время — то, что надо
Отдельно стоит рассказать про сам микроконтроллер STM8. Все это время он показывал себя просто отлично. Чего только с ним не делали, по ошибке. И питание подавали плюс на минус — жив, и на ножки подавали HIGH, при коротком замыкании на землю, тоже жив. В общем довольно надёжный микроконтроллер. Очень понравилось работать в отладчике. Почти как на компьютере. Симулятор помог отладить сложные функции, тоже удобно. В общем при такой цене, микроконтроллер просто отличный. А ещё есть версия с 32к флеша на борту, за 60 рублей, вообще супер.
Сын очень доволен, прибор работает как хотели! Устраиваем гонки, все лето катаемся с ним, оказалось за одну прогулку мы проезжали больше 14 км, раньше не задумывались об этом. По функциям прибор получился лучше покупного, жаль только не хватает экрана! Но буквально через месяц пользования про экран забываешь, изредка смотришь статистику, об остальном прибор сам оповещает. Отлично работает функция контроля каденса, помогает выбирать нужный скоростной режим.
Для остальных членов семьи делаем новую схему и переделываем плату. Учитываем ошибки:
- заменяем пищалку на более громкую HC0903A
- убираем LDO с МК, оставляем его для bluetooth, для сопряжения простой делитель на резисторах
- Добавляем usb разъем — так заряжать удобнее
- Добавляем угловую кнопку сразу на плату — проводов лишних нет
- Один геркон убрали в корпус, а второй, для педалей оставили на проводе, разъем убрали — почти полное отсутствие проводов.
Проектом очень довольны. Оказалось от макета на Arduino, до конечного изделия — как океан переплыть, даже на таком просто приборе. Столько много мелких недоработок никто не ожидал встретить. Зато на практике проверили, что не так сложно перейти на другой класс микроконтроллеров, они оказались очень похожи между собой. Жалко, что smt8 не так распространён. Но, если писать простую программу, то хватает стандартной библиотеки от ST, все драйвера там есть — UART, I2C, SPI, ADC, EEPROM.
Подведём итоги. Готов реальный прибор, приносит пользу, работает до сих пор. Новый вариант полностью устраивает. Сын показал его всем своим друзьям — он просто молодец. Чего и вам желаем! Если вы все еще тестируете на что способна ваша Arduino, то подумайте, какой прибор вам нужен, чтобы вы хотели купить — и сделайте его сами! Вы получите море удовольствия и опыта.
Если же вам интересно сделать такой же велокомпьютер, то вся информация по проекту есть на github. Единственное, очень рекомендую, написать прошивку самостоятельно, чтобы заработать опыт! Делая этот прибор, вы научитесь:
Если дома есть Arduino, в гараже машина или мотоцикл, а то и хоть мотособака, в голове туманные представления о программировании — возникает желание измерить скорость движения или обороты двигателя, посчитать пробег и моточасы.
В данной статье я хочу поделиться своим опытом по изготовлению подобных поделок.
Немного физики
Для измерения частоты вращения нам понадобится датчик положения колеса/вала/круга/итп. Датчик ставится как правило один. Возможно, что он будет срабатывать не один раз на каждый оборот. Например, у вас датчик Холла и 4 магнита на колесе. Таким образом, для правильного вычисления частоты нужно знать:
- количество срабатываний датчика на один оборот К;
- минимальная ожидаемая частота Мин.
- максимальная ожидаемая частота Макс.
То есть, если частота меньше разумного минимума, то считаем, что она равна нулю, если больше максимума — игнорируем показания.
С количеством срабатываний понятно, но зачем ещё эти мины и максы? Давайте рассмотрим сначала варианты расчёта частоты.
Со скоростью всё проще, достаточно знать число π, диаметр колеса, а частоту вращения мы уже знаем.
Болванка для кода
Так как мы имеем дело с такими нежными величинами как время и пространство, то лучше сразу освоить прерывания.
Обратите внимание на модификатор volatile у переменной counter. Все переменные, которые будут изменяться в обработчике прерывания (ISR) должны быть volatile. Это слово говорит компилятору, что переменная может изменяться неожиданно и доступ к ней нельзя оптимизировать.
Функция ISR() вызывается каждый раз, когда появляется единица на ноге fqPin. Мы эту функцию не вызываем, это делает сам контроллер. Он это делает, даже когда основная программа стоит в ступоре на функции delay(). Считайте, что ISR() обслуживает событие, от вас не зависящее и данное вам свыше как setup() и loop(). Контроллер прерывает выполнение вашей программы, выполняет ISR() и возвращается обратно в ту же точку, где прерывал.
Тело функции ISR() должно быть максимально коротким, точнее, сама функция должна выполняться максимально быстро. Это важно, так как прерывается выполнение вашего кода, который может оказаться чувствительным к непредвиденным задержкам. Некоторые библиотеки отключают прерывания для выполнения чувствительных с задержкам операций, например для управления светодиодной лентой WS2812.
Считаем обороты за единицу времени.
Первое, что приходит в голову, это взять интервал времени и посчитать количество измерений.
Как и у многих простых решений, у этого есть неочевидные минусы. Для повышения точности измерений вам необходим довольно большой интервал времени. Принцип тот же, что и у Шума квантования. При времени оборота колеса сравнимом с временем подсчёта, существенные изменения скорости вращения не будут замечены. Показания такого частотомера будут различаться до двух раз на каждый отсчёт.
Для повышени точности на малой скорости можно увеличить число К, как это сделано, скажем, в автомобильной технике для датчика ABS. Можно увеличить время подсчёта. Делая и то и другое мы подходим ко второй проблеме — переполнению счётчика. Да, переполнение легко лечится увеличением количества бит, но арифметика процессора Arduino не умеет считать 64-битные числа столь быстро, как хотелось бы и как она это делает с 16-разрядными.
Увеличение времени расчёта тоже не очень хорошо тк нам надо знать частоту прямо сейчас, вот при нажатии на газ, а не через пару секунд. Да и через пару секунд мы получим скорее некое среднее значение. За это время можно несколько раз сделать врумм-врумм.
Есть другой метод. Он лишён вышеописанных недостатков, но, как водится, имеет свои.
Считаем интервал между отсчётами
Мы можем засечь время одного отсчёта и другого, вычислить разницу. Величина, обратная вычисленному интервалу и есть частота. Круто! Но есть минусы.
Что делать, если наше колесо крутится еле-еле и измеренный интервал превышает разумные пределы? Выше я предложил считать частоты ниже разумного минимума за ноль.
Определённым недостатком метода можно считать шумы квантования на высоких частотах, когда целочисленный интервал снижается до нескольких двоичных разрядов.
Так же хотелось бы некую статистику подсчётов для улучшения показаний, а мы берём лишь последнее значение.
Методом проб и ошибок я подобрал интервал отображения данных на дисплее в 250мс как оптимальный. Если чаще, то цифры размазываются, если реже — бесит тормознутость.
Комбинированный метод
Можно попробовать объединить достоинства обоих методов.
То есть, мы засекаем время не просто между отсчётами, а время между проверками данных и делим на количество отсчётов за это время. Получается усреднённый интервал между отсчётами, обратная величина от которого есть частота. Предоставим компилятору оптимизировать вычисления.
Обратите внимание, что за интервал считается не время опроса, как в первом примере, а время от последнего отсчёта до предыдущего последнего отсчёта в прошлом опросе. Это заметно поднимает точность вычисления.
Таким образом, мы можем получать вполне достоверные данные как на низких так и на высоких частотах.
Если использовать кооперативную многозадачнось, то можно сделать подсчёт, скажем раз 100мс, а вывод на дисплей раз в 250мс. Очень короткий интервал опроса снизит чувствительность к низким частотам.
Как говорят в рекламе, "но это ещё не всё".
Ошибки дребезга
Для устрашения вас предположу, что измеряем частоту вращения двигателя от индуктивного датчика зажигания. То есть, грубо говоря, на высоковольтный провод намотан кусок кабеля и мы измеряем индукцию в нём. Это довольно распространённый метод, не правда ли? Что же здесь сложного может быть? Самая главная проблема — современные системы зажигания, они дают не один импульс, а сразу пачку.
Но даже обычная система зажигания даёт переходные процессы:
Старинные же кулачковые контактные вообще показывают замечательные картинки.
Как с этим бороться? Частота вращения не может вырасти мгновенно, не даст инерция. Кроме того, в начале статьи я предложил ограничить частоту сверху разумными рамками. Отсчёты, что происходят слишком часто можно просто игнорировать.
Другой вид помех — это пропадание отсчётов. Из-за той же инерции у вас не может измениться частота в два раза за одну миллисекунду. Понятно, что это зависит от того, что вы собственно измеряете. Частота биения крыльев комара может, вероятно и за миллисекунду упасть до нуля.
Статистическая обработка в данном случае становится уже достаточно сложной для маленькой функции обработки прерывания и я готов обсудить варианты в комментариях.
Особенности измерения скорости движения и скорости вращения.
При измерении скорости вращения бензинового двигателя надо обязательно учесть величину К, которая совсем не очевидна. Например, вы намотали провод на кабель свечи и ожидаете, что там будет одна искра на один оборот. Это совсем не так. Во-первых, у 4-тактного двигателя вспышка происходит один раз на два оборота, у 2-тактного один раз на оборот коленвала. Во-вторых, для упрощения системы зажигания коммутатор подаёт искру на неработающие в данный момент цилиндры, типа на выпуске. Для получения правильного К надо почитать документацию на двигатель или подсмотреть показания эталонного тахометра.
При измерении скорости движения частота обновления дисплея не имеет большого значения, особенно, если вы рисуете цифры, а не двигаете стрелку. Даже обновление информации раз в секунду не вызовет отторжения. С оборотами двигателя всё наоборот, индикатор должен откликаться гораздо быстрее на изменение оборотов.
Вывод информации
Типичная обида начинающего разработчика автомобильной и мотоциклетной электроники "стрелки дёргаются, цифры нечитабельны" лечится простым способом — надо обманывать клиента. Вы что думаете, автомобильный тахометр всегда показывает вам правду? Конечно же нет! Хотя вам этот обман нравится и вы хотите, чтобы ваш прибор дурил голову так же.
Стрелки
Если включить зажигание на новом модном автомобиле или мотоцикле, стрелки приборов сделают красивый вжух до максимума и медленнее опадут до нуля. Вот! Вот это нам и надо сделать. Надо, чтобы при показе максимальной величины стрелка не метнулась к ней мгновенно и не упала как акции лохотрона в ноль.
Итак, нам надо учитывать максимальную скорость стрелки на увеличение и максимальную на уменьшение показаний. Совсем хорошо сделать эти скорости нелинейными, чтобы стрелка сначала двигалась быстрее, а потом чуть помедленнее приближалась к заданному значению.
Вот пример с нелинейным выводом показаний:
Вы можете поиграть с коэффициентами. Этот же принцип используется при выводе громкости сигнала, например, у любого аналогового индикатора: стрелки, полоски, яркость, цвет, размер итп. Приведённый пример самый простой, но и не самый красивый. Предлагайте ваши варианты в комментариях.
Цифры
С цифрами всё намного сложнее. Быстрые изменения показаний приводят к тому, что несколько порядков сливаются в мутное пятно. Для скорости, как и писал выше, можно задать интервал раз в секунду и глаз успеет прочитать три цифры.
В мототехнике не зря делают аналоговые индикаторы оборотов, точные цифры не нужны, важна относительная близость к оборотам максимального крутящего момента, к максимальным вообще и холостые.
Я предлагаю менять частоту вывода информации на дисплей в зависимости от степени изменения величины. Если обороты меняются, скажем, на 5% от последнего подсчёта, а не показа — можно затупить и показывать раз в 300-500мс. Если на 20%, то показывать раз в 100мс.
Можно огрубить шкалу и показывать только две значащие цифры
С учётом мототематики, можно довольно точно показывать обороты холостого хода как описано чуть выше и огрублять вывод на оборотах от двух холостых. На высоких оборотах для гонщиков важнее делать блинкеры типа "передачу вниз", "передачу вверх" и "ты спалишь движок". То есть держать двигатель около максимального крутящего момента и не дать ему крутиться выше максимальных разрешённых оборотов. Блинкеры замечательно делаются с помощью SmartDelay когда можно унаследовать от этого класса свой с заданной ногой контроллера и частотой мигания, там есть методы для переопределения и они вызываются раз в заданное время.
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.
Последние посетители 0 пользователей онлайн
Типа как раньше было кадр в кадре. дополнительное изображение можно разместить в любом месте основного экрана и отрегулировать его размер. Плюс дополнительные входа YPb,Pr-in, S-in, A.V-in, Audio in-out, выход на наушники. AVerMedia стабильно работает с абсолютно любыми мониторами и телевизорами у которых есть дополнительные входа HDMI,VGA.
У меня 300 объектов в месяц , 15 из которых пожаротушение . ***** . и удалённость примерно 5 000 КМ )))
Почему же ошибся? Там трабл был в следующем: при сетевом 210 - ТЛка закрыта, стабилизации нет. 220 сетевого - ТЛка начинает открываться, и при этом появлялся сильный фон ( похож на белый шум, только пожесче) 225- стабилизация работает, шума нет. Вот этот момент откр/закр/откр/закр при сетевом 220В очень напрягал. Я перемотал трансформатор, чтобы при всех сетевых напряжениях ТЛка была открыта - и теперь стабилизация работает с 200 вольт сетевого, шума нет.
Ну вот простой вопрос как часто новичку требуется точность во втором знаке после запятой, для домашних целей, ну например регулятор для болгарки или для инкубатора? Вполне хватит тестера с ближайшего рынка. А вот если тот же тновичек решит ремонтировать сотовые то там тестер совсем не на первом месте там без знаний делать нех.
@35house Было-бы неплохо составить список приборов с защитой и прикрепить где нибудь для начинающих или у кого уже склероз.
Похожий контент
Рисунок (1) интерфейс режима ожидания зарядной сваи
Рисунок (2) страница мониторинга параметров зарядки в реальном времени
Рисунок (3) страница благодарности
2. Создание виджета интерфейса
Сначала создайте новый проект в платформе STONE designer, заполните имя проекта, разрешение выбранного экрана последовательного порта 640*480, путь к проекту и т.д. Заполненное здесь имя проекта будет использоваться в последующей отладочной загрузке для создания скомпилированных файлов (имя peoject используется как имя папки компиляции). См. рисунок (4)
рисунок(4) создание интерфейса нового проекта
Работа включает в себя:
1) Добавить окно
2) Импортировать изображение
3) Вставить цифровые часы
4) Кнопка переключения производственного интерфейса
5) Параметры отображения макета этикетки
6) График аддитивного GIF
Ниже приведены подробные сведения по порядку.
1) Окно добавления
В части настройки проекта в верхней левой части проекта щелкните правой кнопкой мыши по названию проекта. В это время во всплывающем меню выберите новое окно, чтобы добавить по очереди окна Window1, Window2, а также автоматически создаваемую при создании нового проекта домашнюю страницу_ Page - стартовую страницу. Когда вы щелкаете правой кнопкой мыши на windows1, во всплывающем меню можно выбрать Копировать, Удалить и Установить как домашнюю. Выберите Установить как домашнюю, чтобы заменить начальную страницу. Дважды щелкните windows1, чтобы развернуть или сохранить виджеты в windows1.
2) Импорт изображения
Этот проект начинается с дома на трех страницах_ Импортируйте фоновые изображения в страницу, окна1 и окна2. Этот шаг должен быть выполнен первым, потому что это фон! Перед импортом фонового изображения, все сделанные виджеты будут "заблокированы" фоном. Если это кнопка, то вы обнаружите, что они не могут реализовать функцию дизайна. Поэтому не забывайте сначала импортировать фон, а затем создавать другие виджеты.
Нажмите и удерживайте значок изображения в строке меню списка деталей и перетащите его на интерфейс. Фоновое изображение, конечно же, имеет размер 640 * 480 пикселей. Нет необходимости использовать мышь для наведения, а работа с клавиатурой быстрее и точнее. Как показано на рисунке (5), заполните X, y, W и h в верхней правой части параметров. Кроме того, в нижней части рисунка (5) можно выбрать фоновое изображение. Перед выбором необходимо добавить фоновое изображение на платформу. Способ добавления - нажать "+" во вкладке изображения внизу слева и выбрать по очереди картинки UI, сделанные художником, в соответствии с руководством (о копировании этих картинок в память дисплея будет сказано при загрузке интерфейса позже).
Рисунок (5) координаты начальной точки и позиционирование высоты ширины
3) Поместите цифровые часы
Нажмите и удерживайте значок цифровых часов в строке меню списка деталей и перетащите его на место проектирования в интерфейсе. Обратитесь к рисунку (6), чтобы установить цвет текста, размер шрифта и формат для атрибутов цифровых часов. Обратите внимание, что библиотека шрифтов для ПК не обязательно совпадает с библиотекой шрифтов для дисплея. Эффект, отображаемый на интерфейсе ПК, будет отличаться от эффекта, отображаемого на экране дисплея последовательного порта. Время и дата здесь отображаются в двух виджетах, как показано на рисунке (1), рисунке (2) и рисунке (3). Если место позволяет отображать их вместе, установите формат y-mm-dd HH: mm: SS. Если вы не хотите отображать секунды, можно использовать формат: HH: mm можно использовать.
Рисунок (6) атрибуты цифровых часов
4) Кнопка переключения производственного интерфейса
На странице мониторинга параметров зарядки windows1, как показано на рисунке (2), внизу справа есть кнопка full changed / end. При нажатии на нее происходит переключение на страницу благодарности windows2. Аналогично, нажмите и удерживайте значок кнопки в строке меню списка деталей и перетащите его в проектное место в интерфейсе. Ее свойства показаны на рисунке (7). Чтобы переключить страницу на window2, нужно выбрать open window для user define, а затем выбрать window2 для target name Убедитесь, что положение кнопки на рисунке и на фоне не совпадают. Кроме того, ширина дома, заднее окно, установленное значение и другие опции доступны в пользовательском определении.
5) Параметры отображения макета этикетки
Аналогично, нажмите и удерживайте значок этикетки в строке меню списка деталей и перетащите его на место проектирования в интерфейсе. Установите цвет текста и размер шрифта в разделе атрибутов этикетки, отрегулируйте положение и размер шрифта в соответствии с отображаемым в реальном времени напряжением (этикетка7), током (этикетка8), временем зарядки (час -- этикетка10, минута -- этикетка11, секунда -- этикетка12), стоимостью (этикетка9) и другим фоном. Здесь важным моментом является название. Названия каждого модуля должны быть разными. Данные, загружаемые из модуля зарядки, должны располагаться в соответствии с названием. Не будьте самонадеянными.
6) Аддитивный график GIF
На рисунке (2) значок батареи справа - это динамическая GIF-диаграмма, показывающая текущее состояние заряжаемой батареи. Аналогично, нажмите и удерживайте значок GIF в строке меню списка деталей и перетащите его в проектное место в интерфейсе. Импорт Gif-изображений аналогичен импорту изображений. Аналогично, добавьте GIF-изображение с помощью "+" под ярлыком изображения слева. Затем выберите изображение GIF в разделе "Изображение" раздела "Свойства".
3. Загрузка интерфейса
Существует два метода: A и B.
A. Копирование через флэш-диск USB;
B. Копирование через USB-кабель.
Метод a:
Выполните следующие действия:
1. Сохраните файл проекта человеко-машинного интерфейса;
2. Нажмите debug - "download" в главном меню, выберите целевую папку, и в выбранной папке будет создана вложенная папка с тем же именем, что и проект;
3. Скопируйте папку "default" во вложенной папке shell в каталог STONE на флэш-диске USB;
4. Отключите питание экрана дисплея и поверните переключатель на задней панели экрана дисплея в положение "host";
5. Вставьте флэш-диск USB в интерфейс USB экрана дисплея, отключите другие ненужные соединения и включите питание;
6. После стабильного запуска нажмите кнопку сброса на задней панели экрана дисплея. После того как индикатор снова станет стабильным, выключите питание и верните переключатель в положение "устройство", указанное выше;
7. Проверьте, успешно ли прошла загрузка. В противном случае повторите шаги 4, 5 и 6 выше до успешного завершения.
Метод B:
Нажмите отладка -- "скачать" в главном меню, выберите целевую папку, и выбранный файл будет отображен
В папке будет создана подпапка с тем же именем, что и проект; Используйте автономный кабель связи USB для прямого соединения компьютера и интерфейса USB экрана дисплея (интерфейс USB USB накопителя в методе a), и скопируйте папку raw / default / в подпапке с тем же именем проекта в папку "default" каталога хранения экрана дисплея! Обратите внимание, что сначала можно удалить остальные семь папок, кроме папки с изображениями в папке "по умолчанию". Папка изображений может быть занята системой при включении аппарата, и при записи будет выдана ошибка. Вы можете видеть, что папка image содержит стандартные изображения этикеток. Если добавляются новые этикетки и картинки, вы можете вручную скопировать их после сравнения файлов папки image / XX. Этот метод похож на отладку реальной машины, что более удобно и быстро!
4. Инструкция взаимодействия человека и компьютера
Используются следующие инструкции STONE:
A. Настройка цифровых часов
B. Обновление значения метки
C. Преобразование страницы
A. Настройка цифровых часов
Часто бывает необходимо установить часы при первом включении. В трех интерфейсах этого проекта есть шесть виджетов цифровых часов с разными именами. При включении питания достаточно сбросить часы clock1, и остальные будут синхронизированы автоматически. Обратите внимание, что формат атрибута цифровых часов установлен на y-mm-dd HH: mm: SS, который может быть изменен в зависимости от фактической ситуации на дисплее. Если вы не хотите отображать секунды, выберите формат: HH: mm. Инструкции по настройке унифицированы следующим образом:
ST>ET
B. Tag value update
Напряжение (метка7), ток (метка8), время зарядки (час -- метка10, минута -- метка11, секунда -- метка12) и стоимость (метка9), отображаемые на странице Window1, являются компонентами меток, которые передаются модулем зарядки, а MCU посылает их на сенсорный экран последовательного порта через инструкции, связанные с метками. Инструкции, связанные с метками:
set_ text Установить текст, отображаемый меткой
set_ value Установить значение, отображаемое этикеткой
get_ text Получить текст, отображаемый меткой
get_ value Получить значение, отображаемое меткой (float)
привести пример:
Set text:
ST>ET
ST>ET
Set value:
St < > et set fee 1.23
ST>ET
Set current 25 A
Get text:
ST>ET
Format values: %d,%02d,%03d,%04d,%05d,%06d,%f,%.1f,%.2f,%.3f,%.4f,%.5f,%.6f
C. Преобразование страницы
Окна, связанные с командой:
open_ win Открыть любое окно (Windows, работающие в фоновом режиме, также могут быть открыты с помощью этой команды, рекомендуется)
close_ win Закрыть любое окно (не рекомендуется, используйте с осторожностью)
back_ win Вернуться в верхнее окно и закрыть текущее окно (не кэшировать данные текущего последовательного порта)
back_ win_ to Вернуться в любое окно верхнего уровня, при этом другие открытые окна работают в фоновом режиме
back_ home Вернуться в главное окно, не закрывать ранее открытое окно, а другие окна запускать в фоновом режиме;
привести пример:
Открыть окно Window1
1. Программирование связи между MCU и сенсорным экраном STONE
Программирование в среде Arduino, метод ввода baidu выгружается, чтобы реализовать нормальный английский ввод. Кроме того, вышеприведенные инструкции должны быть изменены в среде Arduino. Как показано ниже:
St < > et the above setting fee is 1.23, which should be written in Arduino program as:
Serial. println(F("ST>ET"));
Себестоимость является переменной с плавающей точкой, а метод передачи - последовательный Print (price, 2), с резервированием 2 десятичных знаков. Последовательный. Write (price) может передавать только 0-9, одиночные цифры. А поскольку это переменная, ее нужно передавать отдельно. Смотрите программный код ниже.
Программный код видеоэффекта выглядит следующим образом:
/* frank13 STONE and arduino COMM Turns on an LED on for one second, then off for one second, repeatedly. This example code is in the file of frank. */ // Pin 13 has an LED connected on most Arduino boards. // give it a name: int led = 13; unsigned int count_ i=0; //------charged station use----------2022.03.23------ unsigned int led1s=0; unsigned int time_ 1s=0; unsigned int time_ 1m=0; unsigned int time_ 1h=0; float price=0.001; // Expenses$ // the setup routine runs once when you press reset: void setup() < // initialize the digital pin as an output. pinMode(led, OUTPUT); Serial. begin(115200); // Turn on the serial communication function and wait for the serial port to open while (!Serial) < ; // wait for serial port to connect. Needed for Leonardo only >> // the loop routine runs over and over again forever: void loop() < //---Cumulative time + +------ time_ 1s = time_ 1s + 1; if(time_1s >= 60)< time_ 1s = 0; time_ 1m = time_ 1m + 1; if(time_1m >= 60) < time_ 1m = 0; time_ 1h = time_ 1h + 1; >> //------time display ----- Serial. print("ST<<\"cmd_code\":\"set_value\",\"type\":\"label\",\"widget\":\"label12\",\"value\":"); //sec Serial. print(time_1s); // Serial. write(time_1s); . The write value is specified as single byte only out 0-9, Serial. println(",\"format\":\"%02d\">>ET"); // sec delay(100); Serial. print("ST<<\"cmd_code\":\"set_value\",\"type\":\"label\",\"widget\":\"label11\",\"value\":"); //min Serial. print(time_1m); // Serial. write(time_1s); only out 0-9, Serial. println(",\"format\":\"%02d\">>ET"); // min Serial. print("ST<<\"cmd_code\":\"set_value\",\"type\":\"label\",\"widget\":\"label10\",\"value\":"); //hour Serial. print(time_1h); // Serial. write(time_1s); only out 0-9, Serial. println(",\"format\":\"%d\">>ET"); // hour delay(100); price = (time_1h * 120) + (time_1m * 2) + (time_1s * 0.036); // Simple algorithm of charging cost //Here is the floating point charge price$ Serial. print("ST <<\"cmd_code\":\"set_value\",\"type\":\"label\",\"widget\":\"label9\",\"value\":"); Serial. print(price,2); // 1.2356 --- >1.23 floating point number takes 2 decimal places Serial. println(",\"format\":\"%.2f\">>ET"); // price $ Serial.println(F("ST>ET")); digitalWrite(led, LOW); // turn the LED off by making the voltage LOW led1s = led1s + 1; if(led1s >= 2)< led1s = 0; digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) Serial.println(F("ST>ET")); //current out > delay(1000); // wait for a second, range:200-2000 >
Как из AV сигнала создать файл mp4 с помощью ардуино или другим
способом без покупки специализированных комплектующих?
Помогите пожалуйста разобраться с питанием
1) надо ли тут понижайка/ повышайка DC-DC?
2) как предохранить плату от помех при нагрузке.
Скетч прошивки тоже могу выложит, он максимально простой.
Также печатную плату тоже выложу как доделаю схему.
Доброго времени суток, господа. Никик я не могу прошить атмегу. Всегда выводится такая ошибка:
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
Раньше у меня получалось прошивать ее, но на 16 МГц. Решил, что способен прошить и на 8 МГц. Скачал пару библиотек и. ничего, выдало ошибку. Первым делом я подумал, что все плохо с проводкой. У меня, кстати, TQFP32 адаптер, но я подумал, что контакт через макетную плату и UNO слишком слаб, поэтому припаял к выводам адаптера провода и вставил их в UNO. Как итог - ничего не поменялось. Менял я и UNO на NANO, переделывал схему (вставлял резистор от RES до VCC и наоборот, вставлял конденсатор между RES и GND у UNO), подключал резонатор на 16 МГц. А ошибка вся таже. Чё делать?
Читайте также: