Jump to content

Recommended Posts

Цилиндр с интерактивными световыми эффектами

563d2d7859091_.jpg.f7bebe15cfa5e07de4b38

Этот замечательный цилиндр Das Blinken, я изготовил в качестве подарка моим друзьям на их помолвку. Суть идеи заключается в том, что когда шляпа наклоняется в разные стороны, то загораются светодиодные ленты с эффектом вращения огней в различные стороны. Замечательные световые эффекты были выполнены при помощи установки белых светодиодных лент, небольшого контроллера Arduino Pro Mini и акселерометра.

52c2f048ce395f68708b4567.gif

Для выполнения проекта вам понадобятся следующие компоненты:

·         Контроллер Arduino Pro Mini 328 - 3.3V/8MHz

563d2ee4d67e2__3.jpg.a6bd7f1ed9c2fb977f5

·         Плата драйвера светодиодов SparkFun Mini FET Shield (имеет много адресуемых выходов для подключения светодиодов)

563d2ef6abdce__4.jpg.97df736adc8b3ff0842

·         Датчик акселерометр SparkFun Triple Axis Accelerometer Breakout - ADXL335

563d2f0c0aa1a__5.jpg.aa4b7db740e1357eabb

·         Пластиковый бокс для пальчиковых аккумуляторов Battery Holder - 4xAA Rectangle

563d2f1e01b7c__6.jpg.a2497b972f39fbed71a

·         Мини выключатель питания SPDT Mini Power Switch 30V/200mA

563d2f2dca768__7.jpg.c54da1917fc366d5384

·         Провод для монтажа 30 AWG

563d2f4921ace__8.jpg.69ea448a1e252e8a789

·         Светодиодная лента 12V белого свечения

563d2f605493b__9.jpg.35bfaba4deadce97719

Расположение лент на светодиодной шляпе

563d2f72e6162__10.jpg.3f65ac1ac465c89f28563d2f71d9049__11.jpg.5b9006c5a4e9dea095

Всего на цилиндре расположено 16 светодиодных полос, соединенных попарно параллельно, поэтому контроллер Arduino Pro Mini может управлять ими при помощи 8 каналов.

563d2fcbd0f5c__12.jpg.04f809dced0397247a

Каждая светодиодная полоска, держится на цилиндре благодаря самоклеющейся основе, которая надежно держит полоску, даже при самых резких движениях головой. Ленты соединяются при помощи очень тонких проводов  30 AWG, которые проходят насквозь внутрь цилиндра к элементам управления. 

Контроллер Arduino Pro Mini + Driver

563d2fe4f2f04__13.jpg.89b91f84fff8459917

Контроллер Arduino Pro Mini 3.3 / 8 МГц имеет идеальный размер для этого проекта, а также  достаточную вычислительную мощность, чтобы без труда считать данные с акселерометра и при этом контролировать 8 каналов управления светодиодами. Он потребляет очень мало энергии и может быть легко перепрограммирован через FTDI Basic, для создания различных изящных световых эффектов.

Каждая полоска содержит 15 светодиодов, а это означает, что максимальный ток одной полоски составит 300 мА (15 светодиодов х 20 мА = 300 мА). Это значение намного больше, чем может обеспечить чип ATmega328, поэтому применяется драйвер Mini FET Shield, что очень удобно в нашем случае.  Эта плата драйвера имеет напряжение питания 3,3V, которое в нашем случае можно взять с контроллера Arduino. Каждый из 8-ми каналов на плате драйвера Mini FET Shield может обеспечить нагрузку до 2 Ампер, поэтому транзисторы драйвера даже не будут сильно нагреваться. Как уже упоминалось ранее, у нас есть 16 светодиодных полос, которые соединены попарно параллельно (расположенных противоположно с каждой стороны цилиндра) и управляются 8-ю каналами, что позволяет получить действительно классный эффект.

Акселерометр

563d2ffca3748__14.jpg.99ab7e0773d659a7c8

Шляпа использует акселерометр ADXL335, это классическая рабочая лошадка, с легко читаемыми аналоговыми выходами для трех осей.  Но любые другие твердотельные акселерометры, такие как ADXL345, MMA7361, или MMA8452Q, также должны нормально работать.  

Акселерометр ADXL335 уже довольно старый (3 года в мире электроники – это большой срок), но с его выходов очень легко считывать аналоговые напряжения и преобразовывать их в 10-разрядные целые числа, используя для этого контроллер Arduino.  Для работы реального светового эффекта требуется выяснить, в каком направлении движется цилиндр. Поэтому мы возьмем три вектора  (X, Y, Z) и объединим их в один вектор направления.     

Питание от аккумуляторов

563d301284d34__15.jpg.2ff8b55f5207eb8998

Поскольку светодиодные полосы работают от 12V, то шляпа использует 8 АА аккумуляторов установленных в двух боксах для батареек. Использование двух боксов позволяет распределить вес. Когда аккумуляторы полностью заряжены, то  у нас есть номинальное напряжение 1.5V * 8 = 12В. Светодиоды потребляют значительную мощность, поэтому,  были использованы литиевые аккумуляторы, что позволяет максимизировать время работы. На практике, шляпа работает в течение десятков часов на одном наборе аккумуляторов, так что щелочные батарейки вполне можно использовать, правда время работы будет немного меньше. Встроенный микро-выключатель в линию питания, позволяет легко выключить всю электронику в конце вечера.

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

563d30472a099__16.jpg.4af5715009fa3192a2

На этой схеме показано, как выполнено подключение всех элементов. Питание контроллера Arduino  и светодиодных полосок, осуществляется от набора аккумуляторов с общим напряжением 12В, через микро-выключатель. На плате драйвера Mini FET Shield есть восемь,  индивидуально контролируемых, транзисторов,  которые обеспечивают нагрузочную способность. Для питания более мощных проектов, вы можете использовать отдельные дискретные транзисторы. Акселерометр, при помощи проводов подключается к аналоговым входам контроллера Arduino.

Векторная математика

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

A2 + B2 + C2 = Z2

В программном коде эта формула записывается так:

float magnitude = sqrt((aX * aX) + (aY * aY) + (aZ * aZ)); //Объединение всех векторов

А вот так вот выглядит фактический программный код:

float avgMag = 0;
for(int x = 0 ; x < 8 ; x++)
{
    aX = analogRead(accelX);
    aY = analogRead(accelY);
    aZ = analogRead(accelZ);

    float magnitude = sqrt((aX * aX) + (aY * aY) + (aZ * aZ)); //Combine all vectors 
    avgMag += magnitude;
}
avgMag /= 8;

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

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

Время задержки между переключением светодиодных каналов = A * xt

Это базовое показательное уравнение экспоненциального роста. Время, между переключением светодиодных лент, будет возрастать по экспоненте со временем на основе постоянной «А» и скорости роста «х».  Я хотел, чтобы светодиодные полоски замедлялись через 3-4 секунды, после того как акселерометр перестанет обнаруживать движение, и для этого мне нужно было определить переменные «А» и «х».

Я определил константу А при программировании шляпы, чтобы подобрать оптимальную скорость кругового вращения огней.  Экспериментальным путем, я определил, что оптимальная скорость переключения между лентами составляет 10 – 20мс, все, что быстрее 10мс просто не различимо для человеческого глаза.  

Для определения скорости роста «х», я использовал расчетную таблицу и обнаружил, что темп роста 1.00086 вызовет задержку,  увеличивающуюся до 500 мс в течение в течение 3,5 секунд.

long currentTime = millis() - startTime;
timeBetweenChannelChange = shortestDelay * pow(growthRate, currentTime); //Exponentially grow the delay between changes

В уравнениях выше, мы вычисляем текущее время, а затем вычисляем новый tBCC используя две константы. Это значение присваивается переменной  «timeBetweenChannelChange», измеряется в миллисекундах и оно будет возрастать по экспоненте в течении долгого времени, пока не станет больше, чем значение константы «maxTimeBetween» равное 3,5 секундам. После превышения этого времени (3,5 сек), вращение светового эффекта будет полностью остановлено.

После небольшого тестирования и несколько небольших ухищрений,  световой эффект вращения выглядел довольно хорошо.

Программа для ШИМ

До этого проекта, я уже изготавливал несколько костюмов для вечеринок, применяя светодиодные ленты. И во всех случаях мне приходилось уменьшать яркость светодиодов, иначе они светили просто ослепительно, и это было уже не так красиво. Проект шляпы не оказался исключением, светодиоды по-прежнему светят очень ярко.  Для решения этой проблемы, можно воспользоваться ресурсами широтно-импульсной модуляции, что позволит снизить яркость до необходимого предела. Но проблема в том, что контроллер Arduino Pro Mini имеет всего 6 выходов,  которые поддерживают ШИМ управление светодиодами. К счастью для нас, для решения этой проблемы есть программное решение.

Библиотека SoftPWM написанная Brett Hagman из компании Rogue Robotics, позволяет превратить любой цифровой контакт контроллера в контакт с ШИМ управлением. Это конечно не самое идеальное решение, есть свои ограничения, но для управления светодиодами работает замечательно. Скачать библиотеку можно по адресу:

https://code.google.com/p/rogue-code/wiki/SoftPWMLibraryDocumentation

SoftPWMSetPercent (chan0, brightLevel);

Эта простая функция позволяет установить уровень яркости для светодиодной ленты в пределах между 0 (OFF) и 99 (полная яркость). Опытным путем, я обнаружил, что уровня яркости 9% вполне достаточно для яркого отображения световых эффектов.

Микропрограмма Das Bliken

Есть два примера микропрограмм. Они были написаны,  чтобы вы имели представление о том, как создавать различные световые эффекты. 

Микропрограммы доступны по ссылкам:

TopHat_Basic.zip

TopHat_Original.zip

563d34a64d07a__17.jpg.640f0c79b8e8998d2d

Источник: https://learn.sparkfun.com/tutorials/das-blinken-top-hat

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...