Ленивый (вежливый) указатель поворота на Arduino своими руками (видео)


Бегущие поворотники на ленте WS2812 и Arduino

Arduino: 1.8.6 Hourly Build 2017/10/20 02:33 (Windows 7), Плата:«Arduino/Genuino Uno» D:\arduino\iop\arduino-nightly\arduino-builder -dump-prefs -logger=machine -hardware D:\arduino\iop\arduino-nightly\hardware -tools D:\arduino\iop\arduino-nightly\tools-builder -tools D:\arduino\iop\arduino-nightly\hardware\tools\avr -built-in-libraries D:\arduino\iop\arduino-nightly\libraries -libraries D:\arduino\iop\arduino-nightly\libraries\libraries -fqbn=arduino:avr:uno -ide-version=10806 -build-path C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607 -warnings=none -build-cache C:\Users\305E~1\AppData\Local\Temp\arduino_cache_271047 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -verbose D:\arduino\arduino-nightly\libraries\ad\ad.ino D:\arduino\iop\arduino-nightly\arduino-builder -compile -logger=machine -hardware D:\arduino\iop\arduino-nightly\hardware -tools D:\arduino\iop\arduino-nightly\tools-builder -tools D:\arduino\iop\arduino-nightly\hardware\tools\avr -built-in-libraries D:\arduino\iop\arduino-nightly\libraries -libraries D:\arduino\iop\arduino-nightly\libraries\libraries -fqbn=arduino:avr:uno -ide-version=10806 -build-path C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607 -warnings=none -build-cache C:\Users\305E~1\AppData\Local\Temp\arduino_cache_271047 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=D:\arduino\iop\arduino-nightly\hardware\tools\avr -verbose D:\arduino\arduino-nightly\libraries\ad\ad.ino Using board ‘uno’ from platform in folder: D:\arduino\iop\arduino-nightly\hardware\arduino\avr Using core ‘arduino’ from platform in folder: D:\arduino\iop\arduino-nightly\hardware\arduino\avr Detecting libraries used… «D:\arduino\iop\arduino-nightly\hardware\tools\avr/bin/avr-g++» -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10806 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\cores\arduino» «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\variants\standard» «C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607\sketch\ad.ino.cpp» -o «nul» «D:\arduino\iop\arduino-nightly\hardware\tools\avr/bin/avr-g++» -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10806 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\cores\arduino» «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\variants\standard» «-ID:\arduino\iop\arduino-nightly\libraries\Adafruit_NeoPixel-master» «C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607\sketch\ad.ino.cpp» -o «nul» «D:\arduino\iop\arduino-nightly\hardware\tools\avr/bin/avr-g++» -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10806 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\cores\arduino» «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\variants\standard» «-ID:\arduino\iop\arduino-nightly\libraries\Adafruit_NeoPixel-master» «-ID:\arduino\iop\arduino-nightly\libraries\Adafruit_ADXL345-1.0.0» «C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607\sketch\ad.ino.cpp» -o «nul» «D:\arduino\iop\arduino-nightly\hardware\tools\avr/bin/avr-g++» -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10806 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\cores\arduino» «-ID:\arduino\iop\arduino-nightly\hardware\arduino\avr\variants\standard» «-ID:\arduino\iop\arduino-nightly\libraries\Adafruit_NeoPixel-master» «-ID:\arduino\iop\arduino-nightly\libraries\Adafruit_ADXL345-1.0.0» «C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607\sketch\ad.ino.cpp» -o «C:\Users\305E~1\AppData\Local\Temp\arduino_build_878607\preproc\ctags_target_for_gcc_minus_e.cpp» In file included from D:\arduino\arduino-nightly\libraries\ad\ad.ino:3:0:

D:\arduino\iop\arduino-nightly\libraries\Adafruit_ADXL345-1.0.0/Adafruit_ADXL345_U.h:26:29: fatal error: Adafruit_Sensor.h: No such file or directory

#include

compilation terminated.

Используем библиотеку Adafruit_NeoPixel-master версии 1.0.3 из папки: D:\arduino\iop\arduino-nightly\libraries\Adafruit_NeoPixel-master Используем библиотеку Adafruit_ADXL345-1.0.0 версии 1.0.0 из папки: D:\arduino\iop\arduino-nightly\libraries\Adafruit_ADXL345-1.0.0 exit status 1 Ошибка компиляции для платы Arduino/Genuino Uno.

Сетевой адаптер, как выбрать

Подойдет сетевой адаптер с характеристиками – 15 Вт\ 5 В \ 3 А не герметичный, пластиковый. Такой адаптер (5 вольт 3 ампера 15 ватт) – это решение для небольших проектов с быстрым подключением и отсутствием “возни” с проводами. Отличается адаптер от блока питания, в первую очередь, наличием провода с разъемом – 5,5 х 2.5 мм, который используется, в частности, для светодиодной ленты.

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

Из минусов такого источника питания можно привести его относительно высокую стоимость в пересчете на 1 ватт мощности и меньшую надежность по сравнению с металлическими блоками питания. Если у вас будет крупный проект, то лучше рассмотреть более мощные металлические блоки 60, 100 или даже 200 ватт.

Подключение блока питания: Вставить штекер от адаптера в контроллер Подключить ленту к контроллеру Вставить адаптер в розетку

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

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

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

Или взять такую же как у меня, от старой гирлянды, туда как раз все помещается.

Принцип действия

Устройство будет собрано на Arduino и установлено на задней панели монитора. Для определения направления мы будем использовать акселерометр. В стационарном режиме акселерометр интерпретирует гравитацию как ускорение вверх, равное 9,8 м/с2. Акселерометр будет взаимодействовать с Arduino через интерфейс I2C. Arduino будет постоянно следить (опрашивать), в каком направлении акселерометр думает, что он ускоряется. При изменении Arduino через USB отправит сигнал на компьютер. Скрипт на python, запущенный на компьютере, прочитает это изменение и сообщит компьютеру о необходимости повернуть дисплей в соответствующем направлении.


Макет поворотного устройства

В данной статье объясняется, как реализовать это на Windows и Linux. Вероятно это можно сделать и на Mac. Однако, поскольку у меня нет Mac, я не могу попробовать. Единственное отличие – это системная команда, вызываемая скриптом Python.

Пояснения к коду

Понимание деталей интерфейса I2C для этого проекта необязательно. Но если вы хотите узнать о нем больше, то посмотрите нашу статью «Шина I2C. Основные понятия».

Посмотрим на MMA7455.h.

typedef enum {Y_POS, Y_NEG, X_POS, X_NEG, Z_POS, Z_NEG, NOT_SURE} orientation;

Перечисление enum в C представляет собой тип данных, как int или char. Оно используется для переменных, которые точно могут быть одним из значений из короткого списка нечисловых переменных. В данном случае мы используем enum для сохранения ориентации устройства в переменной.

Посмотрите на акселерометр. Вы увидите на нем стрелки x и y. Когда стрелка x указывает на верх, то мы должны указать X_POS. Когда стрелка x указывает вниз, мы должны указать X_NEG. Ось z указывает на плату. Когда плата лежит на столе в горизонтальном положение, это состояние обозначается Z_POS.

При установке на заднюю панель монитора устройство должно всегда по x-оси или по y-оси быть направлено вверх или вниз. В monitor.ino мы создали макрос под названием VALID_ORIENTATION для проверки, соответствует заданная ориентация одному из 4 возможных вариантов. Как вы можете видеть, можем проверить значение перечисления, как и значения любого другого типа данных.

#define VALID_ORIENTATION(o) ((o==Y_POS) || (o==Y_NEG) || (o==X_POS) || (o==X_NEG))

В функции setup() в основном диагностика. В ней три важных строки:

Serial.begin(9600);

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

Wire.begin();

Инициализирует связь по шине I2C, через которую мы будем взаимодействовать с акселерометром. Она инициализирует настройки только на стороне Arduino. Акселерометр мы инициализируем с помощью следующей строки:

error = MMA7455_init(START_ORIENTATION);

Когда вы нажимаете кнопку, ее контакты не замыкаются идеально. Они «дребезжат», и сигнал выглядит так, как если бы пользователь в течение нескольких миллисекунд нажал кнопку несколько раз. Мы ждем 100 мс, чтобы убедиться, что наш код не интерпретирует этот дребезг как последовательность нажатий. Существует два подхода борьбы с дребезгом контактов. Мы можем реализовать либо аппаратное, либо программное подавление дребезга контактов. Аппаратный метод включает в себя добавление в схему фильтра нижних частот, либо активного, либо пассивного. Поскольку это связано с покупкой и пайкой дополнительных компонентов, вместо него я выбрал программное подавление дребезга.

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

Каждый раз в цикле мы проверяем, нажата ли кнопка в данный момент. Если это так, и она была не нажата в предыдущий раз, то мы знаем, что поьзователь нажал ее только что, и поэтому мы запускаем функцию setup() снова и отправляем START_ORIENTATION на компьютер. Затем, прежде чем продолжить, мы ждем 100 мс. Эта задержка нужна, чтобы перед продолжением работы Arduino дождалась, чтобы контакты установили конечное состояние. По общему признанию, это довольно небрежный и ленивый подход к программному подавлению дребезга контактов, потому что Arduino ничего не делает во время задержки. Более сложный подход будет включать в себя таймеры, чтобы, пока Arduino ждет установления состояния контактов, мог выполняться другой код. В этом конкретном случае единственное, что мы упускаем, используя задержку вместо таймера, – это изменение показаний акселерометра. Поскольку, когда пользователь нажимает кнопку, этого происходить не должно, то этот неаккуратный метод можно считать приемлемым. Единственное преимущество метода задержки – это простота. Аппаратное подавление дребезга контактов требует дополнительных компонентов, а написание кода для прерываний и задержек может оказаться сложным.

}else if(!digitalRead(BUTTON_PIN) // кнопка была нажата && previous_button_state) // и это первый раз, когда она нажата { // послать, даже если ориентация на была изменена setup(); // перекалибровать sendOrientation(START_ORIENTATION); delay(100); //программное подавление дребезга контактов previous_button_state = 0; }

Принцип работы транзистора для плавного управления светодиодной лентой

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

Подключив транзистор к аналоговому порту Ардуино, присваиваем ему значение от 0 до 255, изменяем напряжение, подаваемое на коллектор либо сток от 0 до 5В. Через цепочку коллектор-эмиттер будет проходить от 0 до 100% опорного напряжения нагрузки.

Для управления светодиодной лентой arduino необходимо подобрать транзистор подходящей мощности. Рабочий ток для питания метра светодиодов 300-500мА, для этих целей подойдет силовой биполярный транзистор. Для большей длины потребуется полевой транзистор.

Схема подключения LED ленты к ардуино:

Это интересно: Выбираем потолочные люстры с вентилятором

Рейтинг
( 2 оценки, среднее 4.5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]