- Модифікація плати зі світлодіодами
- «Обважування» моторчика
- Плата з мікро контролером
- збірка
- прошивка
- Інші варіанти
Наши партнеры ArtmMisto
Коли я вперше шукав інформацію про світлодіодні механічні дисплеї, то був одночасно здивований і переляканий винахідливістю розробників - хтось використовував мотори витягнуті з раритетних 5,25 дисководів з приробленими до них легкими контактами, хто-хто намотував котушки обертового трансформатора, а хабраюзер Derailed взагалі зробив годинник-пропелер з жорсткого диска .
Надивившись на все це різноманітність я почав намотувати котушки :) В результаті вийшло добре працюючий пристрій, яке, однак, було кілька переусложненность. Після його ізтоговленія мене не покидало відчуття що подібний світлодіодний вентилятор можна зробити набагато простіше.
Під катом велику кількість зображень.
По суті, ось основне що потрібно:
- Моторчик.
- Плата з мікро контролером і підключеними до нього світлодіодами, яка буде вдягатися на вісь моторчика, обертатися і світити.
- Харчування до цієї плати, що подається одним із таких способів: ковзний контакт, що обертається трансформатор, батарейка або лазер сфокусований системою дзеркал на орбіті.
- Що-небудь для підрахунку оборотів, наприклад, пара з підключеного до мікроконтролеру фототранзистор і ІК-світлодіода, що знаходиться на нерухомої частини.
Через деякий час підходить механічна частина попалася на очі - китайський USB LED вентилятор. Купити можна за ~ 3.5 $ в якомусь з китайських інтернет-магазинів, наприклад, в DealExtreme . Також можна знайти в локальних магазинах за 200-300 рублів, одне з найменувань - MobileData UF-211-06 .
У ньому є багато чого з необхідного і навіть більше: моторчик, ковзаючі контакти у вигляді пружин, корпус, кнопка і харчування від USB. Залишається тільки додати регулятор напраженія, рахунок оборотів, а також або поміняти верхню частину на власну плату з мікро контролером і світлодіодами, або підключити мк до вже наявних. Я зробив обидва варіанти, але описувати буду тільки другий, тому що фотографії робив під час його виконання.
Список використаних компонентів:
- Власне, вентилятор.
- Мікроконтролер STM32F100C4.
- Регулятор напруги LD1117S33.
- Фототранзистор KP-3216P3C.
- Інфрачервоний світлодіод BL-L314IRBC.
- Резистори 150 Ом - 5 шт.
- Резистор 68 Ом.
- Резистор 10 КОм.
- Конденсатори 0,1 мкФ - 3 шт.
Модифікація плати зі світлодіодами
Для початку розбираємо пристрій - акуратно стягуємо верхню частину з осі моторчика. Потім відокремлюємо кришку від корпуса і знімаємо прозорі лопаті з плати зі світлодіодами. Далі чимось тонким піддягаємо плату знизу і акуратно витягуємо її з корпусу разом зі світлодіодним платою.
На платі перерубувати доріжку харчування мікросхеми (відзначено жовтим на фотографії нижче) і доріжки йдуть до неї від світлодіодів (також відзначено жовтим, але на фотографії не перерубана, т. К. Зробив це пізніше коли зрозумів що мікросхему «пробиває»).
Резистор на платі (відзначено зеленим) необхідно випаять, а контакти замкнути або поставивши резистор номіналом 0 Ом, або просто дротом \ припоєм.
До майданчиків, які знаходяться на доріжках підключення резисторів, припаюємо проводки, зручно використовувати відрізаний від шлейфу шматочок.
Також припаюємо по проводку до майданчиків з харчуванням і землею (відзначено червоним і синім відповідно), а потім втставляем плату назад в корпус, протягнувши проводки в якісь отвори. Дана частина тепер готова до підключення до мікроконтролеру.
«Обважування» моторчика
Акуратно витягуємо моторчик з корпусу, ніяких засувок усередині немає, досить просто витягнути його. Для зручності можна отпаять проводки. З боку, де проходить контакт від центральної пружинки ставимо регулятор напруги. Припаюємо контакт від пружинки до Vout, до Vin і GND - харчування і землю відповідно.
За даташіту регулятора напруги між Vin і GND необхідно поставити конденсатор на 0,1 мкФ, а між Vout і GND - на 10мкФ. На жаль, електролітична бочка на 10мкФ, яка була у мене в наявності, була занадто великою, тому довелося обійтися без неї.
З іншого боку моторчика встановлюємо інфрачервоний світлодіод. До однієї з ніжок припаюємо резистор на 68 Ом. Потім припаюємо до цього резистору і інший ніжці харчування і землю (що куди залежить від того до чого підключати резистор - до анода або катода світлодіода).
Далі необходимо пріпаяті проводки з корпусу назад до моторчика и Вставити его в корпус. Можна перевіріті мультиметром напругу между пружинками (природно у включеному стані), має буті 3,3. Інфрачервоний світлодіод можна перевірити подивившись на нього через камеру телефону.
Плата з мікро контролером
Тепер необхідно зробити плату з мікро контролером. Особливих вимог до його вибору немає, головне щоб вистачало портів для підключення світлодіодів і фототранзистор, так желатально щоб корпус був меншим. Я використовував STM32 в корпусі LQFP48, т. К. Вони були під рукою. Схема Виглядає так:
Емітер фототранзистор підключається до живлення через резистор в 10КОм і до ніжки мікроконтролера, колектор підключається до землі. Про фотодатчики можна почитати в статті на easyelectronics.ru .
Аноди світлодіодів підключаються до харчування, катоди через резистори підключаються до ніжок мікроконтролера. Ніжки обрані через одну щоб зменшити шанс замкнути їх при пайку, але взагалі це не обов'язково. Про підключення світлодіодів і багато чого іншого до мк також є стаття на easyelectronics.ru .
На схемі не став відображати, але у STM32 треба обов'язково підключати всі ніжки харчування і землі (Vdd і Vss), бажано і аналогові (Vdda і Vssa). Також рекомендується ставити по кутах якомога ближче до ніжок харчування конденсатори по 0.1 мкФ.
SWDIO і SWCLK (а також харчування та земля) виводяться на штирі, щоб підключати до них програматор.
Розведення приведена нижче. До майданчиків близько резисторів підключаються проводки до світлодіодів. Велике коло це просто обрис корпуса плати зі світлодіодами.
Схему і плату в форматі DipTrace можна скачати тут .
Плата виконується за технологією ЛУТ, яка відмінно описана у статті DIHALT 'А. Опис коротко виглядає так:
- Друкуємо малюнок на фотопапері за допомогою лазерного принтера.
- Переводимо малюнок на плату шляхом пропрасовування праскою яка додається до плати паперу з малюнком.
- Відмочують і віддираємо папір, тонер залишається на платі.
Далі труїв плату, залужівает доріжки. Потім припаюємо компоненти і з'єднуємо землю і харчування з різних сторін плати проводками.
збірка
На гнучку плату зі світлодіодами надягаємо відрізану половинку лопаті. Встановлюємо плату з мікро контролером зверху корпусу і припаюємо проводки світлодіодів і харчування. Шматки зубочисток там для того щоб плата рівно трималася :) Потім надягаємо конструкцію на вісь моторчика до моменту коли пружинки почнуть щільно стосуватися контактних майданчиків. Підгинаємо інфрачервоний світлодіод так щоб він був спрямований на фототранзистор.
Далі милуємося зібраної конструкцією і підключаємо її до программатору, в якості якого в даному випадку використовувалася STM32VLDISCOVERY. Для того щоб плата працювала в режимі програматора зовнішніх чіпів необхідно прибрати з неї дві перемички і підключити мікроконтролер до гнізда SWD. Про STM32VLDISCOVERY можна почитати в статті хабраюзера ALPINE63rus . Через утиліту ST-LINK можна підключитися до мікроконтролеру і подивитися чи все з ним в порядку, якщо підключення не відбувається - перевіряйте чи нормально припаяти ніжки землі і харчування до доріжок і чи немає де-небудь замикання.
прошивка
Алгоритм для розрахунку положення лопаті досить простий. При детектуванні зміни рівня напруги на ніжці, підключеної до фототранзисторами, встановлюється прапор turn. Також регулярно перевіряється за таймером встановлено цей прапор, якщо немає, то лічильник count инкрементируется, якщо так, то кількість відліків за оборот rate прирівнюється до лічильника count, який скидається разом з прапором turn. Далі кут повороту лопаті розраховується виходячи із значення кількості відліків за оборот і поточного значення лічильника.
Виводити за допомогою такого «дисплея» можна що душі завгодно, але для початку нехай буде просто текст. Букви виводяться по заздалегідь записаним стовпцях точок. «Шрифт» виходить не дуже гарний, зате просто :)
Для написання коду і прошивки я користувався середовищем розробки CoIDE, про яку можна прочитати в уже згаданої раніше статті .
код:
#include "stm32f10x.h" #include <stm32f10x_rcc.h> #include <stm32f10x_gpio.h> #include <stm32f10x_exti.h> #include <misc.h> unsigned int turn, // прапор завершення обороту angle, // поточний кут лопаті count, // лічильник відліків rate; // кількість відліків за оборот // текст "Хабре" uint16_t text [] = {0x0085, 0x002c, 0x0008, 0x002c, 0x0085, // Х 0x0000, 0x0000, 0x0000, // пробіл 0x002d, 0x0084, 0x0084, 0x0084, 0x002d, // А 0x0000, 0x0000, 0x0000, // пробіл 0x00ad, 0x0089, 0x0089, 0x0089, 0x0085, // Б 0x0000, 0x0000, 0x0000, // пробіл 0x00ad, 0x0088, 0x0088, 0x0088, 0x0028}; // Р void EXTI15_10_IRQHandler (void) // обробник зовнішнього переривання {if (EXTI_GetITStatus (EXTI_Line12)! = RESET) // перевіряємо конкретну лінію {turn = 1; // встановлюємо прапор завершення обороту EXTI_ClearITPendingBit (EXTI_Line12); // скидаємо біт переривання}} void SysTick_Handler (void) {if (turn == 1) // перевіряємо чи був здійснений повний оборот {// якщо так, turn = 0; // то скидаємо прапор обороту, rate = count; // зберігаємо значення кількості відліків за оборот, count = 0; // скидаємо лічильник angle = 0; // і уставлівается положення лопаті на 0 градусів} else {// якщо оборот ще не досконалий, count ++; // то додаємо лічильник if (rate! = 0) // перевіряємо чи не варто вентилятор на місці {angle = count * 360 / rate; // розраховуємо поточний кут положення лопаті angle / = 5; // це для швидкої розтяжки тексту, зменшуємо кількість "градусів" в колі :)}} if (angle> = 0 && angle <29) // якщо поточний кут лопаті знаходиться в потрібному нам місці, GPIOA-> ODR = ~ text [angle]; // то виводимо текст по стовпцях // інверсія застосовується через те що світлодіоди запалюються при низькому рівні на ніжках else GPIOA-> ODR = 0xFFFF; // а інакше просто гасимо світлодіоди високим рівнем на ніжках} int main (void) {turn = angle = count = rate = 0; // ---------------------------- Налаштування системного таймера ----------------- -------------- SysTick_Config (800); // --------------- Налаштування ніжок, підключених до світлодіодів --------------------------- - // включаємо тактирование портів A, B і альтернативних функцій RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; // структура для настройки портів GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // налаштовуємо ніжки на висновок GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // встановлюємо швидкість їх роботи GPIO_Init (GPIOA, & GPIO_InitStructure); // записуємо значення в регістри настройки порту A GPIOA-> ODR = 0xFFFF; // встановлюємо високий рівень на ніжках, світлодіоди не горять // ----------- Налаштування на переривання ніжки, підключеної до фототранзисторами -------------- // вибираємо 12 ніжку як джерело зовнішнього переривання GPIO_EXTILineConfig (GPIO_PortSourceGPIOB, GPIO_PinSource12); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // використовуємо наявну структуру для настройки 12 ніжки GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // на вхід GPIO_Init (GPIOB, & GPIO_InitStructure); // записуємо значення в регістри настройки порту B EXTI_InitTypeDef EXTI_InitStructure; // структура для настройки зовнішніх переривань EXTI_InitStructure.EXTI_Line = EXTI_Line12; // вибираємо 12 лінію зовнішніх переривань EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // вибираємо режим переривання EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // спрацьовування по одному з фронтів EXTI_InitStructure.EXTI_LineCmd = ENABLE; // включаємо лінію EXTI_Init (& EXTI_InitStructure); // записуємо значення в регістри NVIC_InitTypeDef NVIC_InitStructure; // структура для настройки контроллера переривань NVIC_InitStructure.NVIC_IRQChannel = 40; // вибираємо канал обробляє лінії з 10 по 15 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // пишемо якесь значення пріоритету NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // і субпріорітета NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // включаємо канал переривання NVIC_Init (& NVIC_InitStructure); // записуємо значення в регістри контролера переривань // ----------------------------- Порожній нескінченний цикл -------- --------------------------- while (1) {}}Компліруем і завантажуємо прошивку, потім підключаємо пристрій до USB і натискаємо кнопку.
Оборотів вистачає, контакт стабільний. Мінус - вібрує сильніше ніж до модифікації, треба врівноважувати. Також з різнокольоровими світлодіодами текст читається набагато гірше, ніж з однаковими. Взагалі можна зробити навіть ще простіше;)
Інші варіанти
Нижче зліва показаний варіант з повністю заміненої верхньою частиною вентилятора. Справа ж варіант на основі звичайного кулера і обертового трансформатора. Якщо кому-небудь буде цікаво, можу написати аналогічну статтю про його виготовлення.