Тахометр + температура двигателя на Arduino для МиниМото

    Купил я сыну в прошлом сезоне его первый мотоцикл. Радости не было предела.

    Катались мы катались, всё хорошо, но т.к. на минибайках нет ни спидометра, ни тахометра, ничего, пришла идея это исправить. Есть конечно же в продаже готовые варианты, но весь интерес в том, чтобы попробовать сделать что-то самому, а купить можно всегда. Что у меня из этого вышло, читайте ниже.



    Для фиксации оборотов двигателя использую датчик Холла NJK-5002C, при появлении в зоне срабатывания постоянного магнита датчик на выход подаёт сигнал. Магнитные полосы присутствуют на маховике двигателя, приклеивать/прикручивать магниты не нужно.



    Для определения температуры двигателя использую водонепроницаемый датчик температуры DS18B20, который вставляется в специальную шайбу под свечу зажигания.



    В моей реализации устройства по кнопке циклически переключаются режимы: при включении отображаются обороты, нажали на кнопку — обороты сменились на температуру, ещё раз нажали — температура сменилась на обороты и т.д. по кругу.

    Необходимые детали:
    Arduino UNO/Nano
    Датчик Холла NJK-5002C
    Датчик температуры DS18B20
    7-ми сегментный дисплей на чипе TM1637
    Кнопка без фиксации
    Резистор 100 Ом
    Макетная плата
    Провода

    Схема подключения


    Поясню один момент в скетче, для чего я использую таймер: так вот, получить данные температуры с датчика (sensor.getTemp()) мы можем только отправив запрос (sensor.requestTemp();) и подождав (delay(1000);). Как всегда delay всё портит и если без таймера опрашивать кнопку в loop, то переключив один раз режим на отображение температуры (сработает delay) — сменить режим мы уже не сможем, т.к. микроконтроллер ждёт и нажатие на кнопку не обработает. Чтобы этого избежать я и опрашиваю кнопку по таймеру.


    На видео показано как это всё работает, для установки на мотоцикл я немного не угадал с диаметром датчика NJK-5002C, который будет устанавливаться в корпус инерционного стартера и чтобы всё было ровно, диаметр нужен поменьше, планирую использовать датчик LJ8A3 или LJ6A3. К следующему мотосезону постараюсь всё оформить в какой-нибудь корпус и установить на МиниМото, соответственно по готовности дополню статью фотками и видео.

    Ссылка на скетч и библиотеки.

    Для тех, кому интересны покатушки на МиниМото, ссылка на канал моего сына на YouTube.

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 18

      0
      Как насчет помех, насколько чистый сигнал приходит от датчика Холла, не покажете? Очень интересно глянуть
        0
        Автор использует ДХ который уже имеет логический выход, т.е. нет длинного провода с аналоговым сигналом, должно быть все отлично.
        +1
        получить данные температуры с датчика (sensor.getTemp()) мы можем только отправив запрос (sensor.requestTemp();) и подождав (delay(1000);). Как всегда delay всё портит и если без таймера опрашивать кнопку в loop, то переключив один раз режим на отображение температуры (сработает delay) — сменить режим мы уже не сможем
        Зачем плодить сущности? В loop уже есть активный таймер, зовётся millis(). С ним легко решается обход delay, пусть датчик ждёт своей секунды, а программа работает параллельно.
          0
          Да и вообще, концепция суперцикла это зло, которое заставляет выдумывать костыли и порождает непонятные проблемы. Достаточно взять любой планировщик, коих под ардуину много, и ценой 5кб памяти решить любые подобные проблемы, перейдя на концепции отдельных задач-потоков.
            +3

            А можно также взять другой контроллер. Или на дискретной логике сделать. Или на raspberry с линуксом.
            Для 2 датчиков планировщик как то из пушки по воробьям.

              –3
              Вы передергиваете.
              Во-первых, реализация этого на логике — это еще больший оверинжиниринг, ибо влечет за собой десяток плат с микросхемами. Малину и жирные контроллеры с линуксом я не предлагал, как не предлагал и смену контроллера.

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

              В-третьих, нет никакого понятия «из пушек по воробьям»: все определяется стоимостью часа разработки и экономией денег после этой разработки. Если я делаю устройство в тираж 1м, то я буду биться за каждый рубль стоимости контроллера, и если надо, посажу разрабов писать на ассемблере прошивку, чтобы уложиться в более дешевый контроллер (разумеется, если меня удовлетворит стоимость поддержки такого ПО): там стоимость разработки сильно-сильно ниже стоимости партии. Если я делаю устройство в тираж 1 (прописью: одну) штуку, то мне абсолютно пофиг, стоит контроллер 10 рублей или 50 рублей, но очень-очень не пофиг на свое время: если +40 рублей к цене устройства экономят мне неделю работы за счет RTOS, планировщика, готовых жирных библиотек и так далее, то выбор очевиден. Тратить неделю на непрофильную работу, если это можно сконвертировать в небольшие затраты смысла ноль, лучше в свободное время какой-нибудь другой девайс сделать. Тут же даже не надо менять контроллер, просто прочитать и понять некоторые концепции, и разобраться, как добавить в проект либу.

              В-четвертых, вы неправильно воспринимаете ситуацию. Это не планировщик усложняет конкретную разработку, это из-за отсутствия планировщика конкретная разработка останавливается на одном уровне сложности и не идет дальше, потому что в суперцикле сложная логика превращается в простыни кода, сотни счетчиков и кучу вложенных if-ов. Да, два датчика можно реализовать и так. Но в какой-то момент разработчик упрется в то, что n-ый датчик реализовать уже не получается, все, нафиг надо, уйду в проститутки. Это плохо, так как ограничивает полет фантазии и возможности разработчика. Пока в голове сидит это «RTOS это оверкилл для этого проекта, он же маленький», удел разработчика это поделки на ардуиновском суперцикле. Вырасти в своем хобби или профессиональном плане можно только после того, как мышление сменится на «я знаю, что есть такой инструмент как RTOS, и если я сейчас не смогу (или думаю, что не смогу в будущем) реализовать этот функционал на суперцикле, я просто возьму необходимый инструмент, не загоняясь на тему потраченных пяти килобайт»
                0
                У каждого есть свой набор микроскопов с удобными ручками ;)

                реализация этого на логике — это еще больший оверинжиниринг, ибо влечет за собой десяток плат с микросхемами


                Нет, всё значительно проще. Аналоговый датчик (1 операционник) + интегратор для импульсов (ещё один) + линейный светодиодный индикатор на компаторах (по 1 на светодиод), например. Операционники бывают и по 4 в одном корпусе. Или АЦП на сдвиговых регистрах — тоже ничего сложного. Конечно, если задаться целью сделать I2C на мелкой логике, это будет страшно…

                все определяется стоимостью часа разработки и экономией денег после этой разработки

                в какой-то момент разработчик упрется в то, что n-ый датчик реализовать уже не получается


                Вы правы. Но это же хобби-проект. Совершенно не факт, что автор планирует сильно упарываться в микроконтроллеры. А ардуиновский суперцикл — проще всего для понимания.
              0
              Ну для 328p целых 5 кб — непозволительно много.
                0
                Ардуиновска библиотека занимает не сильно меньше.
            +1
            Есть два вопроса: 1) этого датчика хватит только до +125 градусов, Вам этого хватит? Не совсем понимаю что именно Вы собрались мониторить. Есть смысл смотреть температуру масла и температуру выхлопа.
            2) обороты минимото ниже 10 тысяч?
              0
              Не знаю, как на мото, но на автомобиле, если темперутура ушла за 125 градусов, то уже без разницы сколько там точно, нужно срочно останавливаться и глушить двигатель, да и поздно уже скорее всего, без необратимых последствий для двигателя врядли обошлось.
                0

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

              +2
              обороты можно еще считывать по индуции провода свечи — рапространенное решение. а в комбинации с уже существующим датчиком холла можно понять если искры нет
                +5
                Спидометр/тахометр в виде цифр — не думаю что это удобно. Привычно — шкала с делениями и «зеленой зоной» — чтобы с одного взгляда было понятно, разумные обороты или нет ;) Цифры удобнее при регулировке.
                Прочитать долгоиграющий датчик без delay()
                unsigned int start_read_temp = 0;
                
                void loop()
                {
                 
                 if (start_read_temp == 0)
                    {
                        // begin read temp code here
                        start_read_temp = millis();
                    };
                if (start_read_temp != 0 && (millis - start_read_temp) > 1000)
                   {
                      start_read_temp = 0;
                      // final read temp code here
                   };
                // other code in loop()
                
                }
                

                  0

                  Сюда идеально впишется вариант с круглым дисплеем, типа такого: https://drive.google.com/file/d/1en2UMwhEnxgcWEULq-M5SGpxSyn9qdtz/view?usp=sharing

                    0
                    Круче всего — теплый ламповый стрелочный индикатор ;) А круг можно нарисовать и на прямоугольном дисплее — их (в отличие от круглых) много.
                  0

                  Смотрите в стоорону прерываний. Она решает проблемы с задержками токого рода.

                    0
                    датчик холла лучше всего вешать на прерывание:
                    const byte interruptPin = 2;
                    pinMode(interruptPin, INPUT_PULLUP);
                    attachInterrupt(digitalPinToInterrupt(interruptPin), mesure, CHANGE);

                    Only users with full accounts can post comments. Log in, please.