"Безумные эксперименты" выпуск 2 "Спортивный" или обзор Ардуино нано

Опубликовал | 22.02.2015

Привет, MySku!
Я вам не надоел? Ну, тогда продолжим собирать разные глупые и бесполезные устройства!

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

Ну, а какой же велосипед без ардуины…

В данной статье я потерплю фиаско, но надеюсь временное, и очень надеюсь на «светлые головы» в комментариях.

Вступление

Достался мне по родственным каналам велосипед. Не новый, но хороший. Нужно поменять шифтеры, купить новые грипсы, и поменять тросик на передний тормоз.

Отказ от курения и велосипед — восхитительно! Но есть у всего этого побочный эффект — хочется всем об этом рассказывать:
«Привет! А я курить бросил! На велосипеде катаюсь!»
«Не надоело сидеть? Лучше пойди на велосипеде прокатись! Как я.»
«Да, я тут спортом занялся…»

Купил приложение на смартфон. пишет маршрут, скорость, расстояние, еще там есть социальная сеть для тренирующихся (пользуясь случаем, хочу выразить ненависть к дополнительным покупкам внутри платного приложения) — круто!

Дополнительная информация

Persistence of vision

И катаясь по утрам в тишине чего то не хватало… Хотелось добавить что то этакое, чтобы все видели, что я катаюсь. И тут я вспомнил о такой интересной штуке как Persistence of vision дисплее — штука, которая использует недостатки нашего зрения для получения классного эффекта. Если коротко, то это способ отображения информации основанный на инертности восприятия ярких объектов нашим глазом — если вы начнете быстро махать угольком ночью, то вместо яркой точки вы увидите полосу света. Но, что если «угольков» будет несколько и мы будем иметь возможность гасить и зажигать его в определенный момент? А получится вот такая интересная штука

Примеры

И я начал искать информацию. Нашел несколько готовых устройств:

Сначала китайский

www.aliexpress.com/item/Free-shipping-Colorful-Rainbow-32-LED-Wheel-Signal-Lights-for-Bikes-Bicycles-Fixed-on-Cycle-Spoke/1009184292.html

Но он меня не впечатлил.

Еще нашел SpokePOV

А затем я увиделMonkeyLight Pro

Вау! Беру! Сколько стоит?

А не пойти бы вам н:*(%(*(%?*(

Начало

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

И старичок гугл привел меня в этот блог к Antonio Ospite

ao2.it/en/blog/2014/04/16/jmp-rope-programmable-jump-rope

Он собрал устройство для использования со своей камерой для занятия Lightpainting’ом

Одна проблема: устройство и код разработаны именно для светографики, и не имеют механизма синхронизации с частотой вращения колеса, но с этим мы разберемся (почти).

Сборка

Я приступил к сборке устройства.

Само устройство ничего сложного из себя не представляет вообще:

Arduino Nano
Лента на WS2812B
Датчик, который отмечает один оборот колеса
Для питания я временно использовал powerbank, но в дальнейшем планирую использовать батарею 18650 и dc-dc преобразователь.

С первыми двумя все понятно, а вот с датчиком пришлось покопаться. В закромах был найден датчик положения с пневмоцилиндра Hoerbiger KL3313. Такие датчики реагируют на магнит и бывают либо обычным герконом (механический контактик в стеклянной колбе), либо датчиком Холла (полностью электронным устройством). Даташит мне найти не удалось и я надеялся, что мой то датчик точно из второй категории, но я ошибся и именно это послужит причиной моего провала в дальнейшем.

А вот и датчик

И магнитик для него

Датчик прекрасно работал от 5в. При срабатывании открывался и на сигнальный пин поступало напряжение

Для его использования нужно было добавить резистор подтяжки на ардуинку. Что я и сделал

В целом первый прототип выглядел вот так

Все это очень грубо было смонтировано на колесе.

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

Повербанк завернул в изоляционный материал и закреплен пластиковыми хомутиками. Ардуинку завернул в пакетик. Советую не повторять за мной, ибо после нескольких оборотов при испытаниях мою ардуинку замотало на цепь :-) Ох, уж эта моя лень! Но, слава богу, она выжила.

Последствия

Софт

Приступил к софту.

Как я уже упоминал я использовал софт и скетч товарища Antonio Ospite. Он написал библиотеку на основе похожего проекта от BlinkyLabs, скетч и графический редактор PiPoPaint для редактирования паттернов. Скачать их вы можете у него в блоге.

Принцип работы его скетча такой:
Для начала в редакторе генерируется код наших картинок. Картинка представляется в виде последовательности цветных полос (кадров)

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

Нам необходимо было добавить замер частоты, с которой крутиться наше колесо. Я планировал использовать свой датчик для фиксирования одного оборота, т.е. мне нужно было замерять время, за которое колесо делает один оборот. Наткнулся на крошечную библиотеку FreqPeriodCounter www.avdweb.nl/arduino/hardware-interfacing/frequency-period-counter.html

Библиотека позволяет измерить время между импульсами (в моем случае между срабатываниями датчика) в микросекундах и миллисекундах.

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

Дополнительная информация
#include <FastLED.h>  #include <FastLED_animation.h>  #include "BareButton.h"  #include "animation.h"  #include <Streaming.h>  #include <FreqPeriodCounter.h>    #define debounceTime_ms 0  #define DATA_PIN 6  #define INPUT_PIN 12    const byte freqPin = 3;  static struct CRGB leds[NUM_LEDS];  static BareButton button = BareButton(INPUT_PIN);  static unsigned long frame_delay_usecs = 65000;  uint16_t frameIndex;    FreqPeriodCounter freqPeriodCounter(freqPin, millis, debounceTime_ms);    void setup()  {    FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);    pinMode(freqPin, INPUT);  }    void loop()  {      freqPeriodCounter.poll();    frame_delay_usecs = freqPeriodCounter.pulseWidthLow / NUM_FRAMES;          if (freqPin == HIGH) {             animation.reset();        }            if (button.isPressed()) {        animation.draw(leds);      }       else {        for (int i = 0; i < NUM_LEDS; i++)          leds[i] = CRGB(0, 0, 0);        FastLED.show();        animation.reset();      }          delay(frame_delay_usecs);    }  

Первые испытания

Залив скетч и тестовую картинку на ардуинку, покрутил колесо и понял, что нифига не видно. Расстояние между пикселями слишком большое и нужно модифицировать ленту.

Модификация ленты

Поскольку возиться с демонтажом и пайкой диодов совсем не хотелось, я придумал выход

Я решил просто сложить ленту «гармошкой» вот так

Чтобы зафиксировать ее в этом состоянии и заодно защитить от внешних воздействий я решил сделать для нее корпус. Дйствуя по принипу «Все гениальное — просто!», взял кусок силиконового прозрачного шланга

Pазрезал его вдоль и запихнул ленту внутрь

Сзади и с торцов решил залить все термоклеем

Получилась гибкая и довольно прочная конструкция. То, что нужно!

Повторные испытания

Смонтировал новый «светодиодные элемент» на колесо и начал испытания.

Очень трудно было запечатлеть картинку, пришлось снимать через две линзы от солнцезащитных очков.

Да уж, очевидно, что где то я допустил ошибку, и пятиконечная звезда то предстает трехконечной, то четырех. Подозреваю, что в этом виноват мой датчик. Прав ли я? Или это ардуина не справляется с формированием изображения вовремя?

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

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

И пока датчик будет добираться ко мне из поднебесной, я решил покататься с паттернами, которые не будут разваливаться и сильно страдать от неправильного формирования например разного рода цветовыми узорами

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

Спасибо, что прочитали сегодня мою очередную писанину.

Искренне ваш P43YM

P.S. Надеюсь на советы и критику по устройству в комментариях.

Источник материала.

Рекламные ссылки