Не винятком є і наш робот. В цьому пості розповімо як ми обвішували його фарами та підсвітками і що з цього вийшло.
Стандартні світлодіоди
На вибір робо-стилістів доступна незлічена кількість варіантів світлодіодів різних кольорів, розмірів і потужностей. Зовсім вже малі світлодіоди, які можна впаювати в плату, ми не розглядали, бо просто не вміємо працювати з настільки дрібними деталями.
Коли ви поставите собі за мету ознайомитися зі звичними доступними світлодіодами невеликої потужності - скоріш за все до рук потраплять циліндричні світлодіоди стандартних розмірів 3, 5 та 10 мм.
Існують навіть спеціальні тренувально-експериментальні набори для тих, хто хоче порозважатися вдосталь зі світлодіодним світлом:
|
|
Наш підхід був більш прагматичним - щоби надовго закрити це питання, ми купили в Geekcreit скриньку із майже чотирма сотнями світлодіодів різних розмірів:
Geekcreit® 375pcs 3MM 5MM LED |
При потребі можна знайти й інші форми - наприклад прямокутні:
2*5*7mm Square Green LED |
Підключення світлодіодів до Arduino
Світлодіоди можна підключати напряму до виходів Arduino. Лише пам'ятайте про два важливі нюанси:
- Світлодіод може пропускати струм лише в одному напрямку. Пильнуйте за полярністю підключення. Під'єднуйте плюс напруги до довшої ніжки а мінус - до коротшої. Якщо напруга є, а світлодіод чомусь не загорається - спробуйте підключити його іншим боком.
- Світлодіод має дуже малий опір. Якщо його підключити між виводом Arduino та землею і подати напругу, струм, який проходитиме через світлодіод, буде дуже великим. В результаті - почнеться змагання "хто швидше згорить" - світлодіод, чи саме Arduino. Щоб цього уникнути, послідовно із світлодіодом підключають резистор. Для приведення рівня струму до пристойних меж достатньо навіть резистора на 220 Ом (струм тоді буде 5 В / 220 Ом = 23 мА). Багато світлодіодів просять не перевищувати струм 20 мА, тому резистор можна брати і більший.
І взагалі - виробіть у собі звичку завжди пам'ятати про цю особливість і використовувати схему із додатковим опором на рівні автоматизму.
Підключивши 8 світлодіодів до восьми виходів Arduino ми легко отримали різдвяну гірлянду, програму керування якою можуть написати навіть школярі молодшої школи, використовуючи Scratch чи Ardublock.
Програмка тут не зовсім проста. В головному циклі Arduino (лівий верхній куток) випадковим чином вибираємо один з трьох режимів миготіння (номер режиму зберігаємо у змінну r). Потім, залежно від обраного режиму, викликаємо 5 або 10 разів відповідну функцію зі своїм алгоритмом блимання (mode1, mode2, mode3). Кількість повторів для кожної функції вибирали виключно з точки зору красивості. Після відпрацювання обраного режиму все починається спочатку.
Файл з програмою - тут.
Як видно з цього прикладу, підключення світлодіодів безпосередньо до виходів Arduino є досить затратним задумом. Без використання ощадних технологій можна дуже швидко вичерпати як вільні виводи Arduino, так і запас по живленню. Якщо пригадуєте, ми показували як вирішити цю проблему за допомогою регістра зсуву і протоколу SPI в одному з попередніх дописів (9. Діодне освітлення з використанням регістра зсуву).
Фари для роботів і моделей
В комплекті із шасі нашого робота ішло дві фари з класними великими 10-мм світлодіодами, які штатно монтуються в спеціальні отвори. Чомусь ті фари були червоними - довелося поставити їх ззаду.Шукаючи щось схоже на це але для передніх фар, ми придбали готовий набір з фарами, світлодіодами і навіть під'єднаними провідниками.
Model Drift Car LED Head and Rear Lights With Lamp Cups |
Нажаль, виявилося, що то фари під 5-мм світлодіоди, і вони рівно вдвічі менші ніж ті, під які розраховане шасі робота. Було б надійніше купити окремо великі світлодіоди, і окремо гільзи фар. Або хоча б перепитати продавця про розмір. 😕
Щоб виправити ситуацію - довелося з банківської картки зробити проставочки, і з ними вже монтувати фари на робота. Маючи MEGA-багато вільних виводів на платі мікроконтролера ми з легкістю пожертвували двома, щоб керувати напряму передніми і задніми фарами. Головне - не забудьте послідовно під'єднати додатковий резистор на 220+ Ом до кожного виводу Arduino, який подає живлення на світлодіоди.
RGB світлодіоди
Кроком вперед у світлодіодній справі є RGB світлодіоди. В найпростішому випадку - це три звичайні світлодіоди, червоний, зелений та синій, впаяні в один модуль.
RGB 3 Color LED Module |
Змінюючи напругу, яка подається на контакти R, G та B можна змінювати інтенсивність кожної з трьох складових, таким чином утворюючи світіння різних кольорів та відтінків. Незручність роботи з такими світлодіодами в тому, що кожен з них треба підключати до трьох виводів Arduino і ті виводи повинні вміти працювати в режимі PWM (тобто мати можливість змінювати рівень вихідної напруги).
В сучасних пристроях такі світлодіоди використовуються в одиничних екземплярах для індикації стану пристрою (наприклад зелений - штатний режим, червоний - пристрій розряджено, жовтий - пристрій заряджається).
Любителі світлових ефектів зазвичай не обмежуються одиничними блималками. Спеціально для їхніх потреб придумали світлодіодні стрічки - довгі (потенційно безконечні) гнучкі або жорсткі конструкції з одноколірними або RGB світлодіодами під'єднаними в ряд.
Треба чітко усвідомлювати, що існує два типи RGB стрічок, і дуже бажано їх не плутати:
|
|
RGB-одноколірні | RGB-багатоколірні незалежні |
Під'єднання: 4 контакти - R, G, B, GND (-) | Під'єднання: 3 контакти - живлення (+), GND (-), сигнал цифрового керування (D) |
Всі світлодіоди у стрічці світяться одним кольором, заданим рівнями напруги на лініях R, G і B. | Кожен світлодіод може світитися своїм кольором. Керування відбувається по спеціальному протоколу, який опрацьовується мікросхемами WS2812, вбудованими в кожен елемент. |
Керування RGB-стрічками з незалежними світлодіодами
Нас зацікавили саме стрічки, де кожен світлодіод може світити незалежно від інших. Як це працює можна почитати тут: WS2812 Breakout Hookup Guide (англ.). Шукайте по ключовому слову WS2812 - і ви легко знайдете десятки статей іншими мовами, якщо англійська вам не дуже підходить.
Ми не планували обмотувати робота довгими стрічками з десятками світлодіодів, тому вибрали варіант стрічки у жорсткому виконанні:
Geekcreit® DC 5V 3MM x 10MM WS2812B SMD LED Board |
По-перше - виробник Geekreit зарекомендував себе дуже добре в усіх попередній покупках.
По-друге - жорсткі елементи можна групувати довільним чином і не обов'язково вистроювати їх в одну лінію.
Недоліком можна вважати необхідність припаювання кожного елемента до сусіднього вручну. На складання такої стрічки доведеться потратити більше часу, ніж на під'єднання класичної гнучкої стрічки.
Для проби - під'єднали один світлодіод щоб хоча би зрозуміти як ним керувати в принципі.
Як виявилося - все дуже просто. Спеціально для платформи Arduino, фірма Adafruit створила бібліотеку NeoPixel. Використовуючи її, можна не заморочуватися з нюансами протоколу, а просто вказувати - який світлодіод засвітити яким кольором.
Ця бібліотека підртимується і середовищем програмування Ardublock, тому ми зразу ж написали пробну програмку, яка кожну секунду перемикає колір світлодіода на новий, вибраний випадково.
Програма очікує, що керуючий контакт стрічки під'єднано до виходу Arduino #2. Код цієї програми для Ardublock можна скачати тут.
RGB-підсвітка робота
Експериментальним шляхом було виявлено, що для красивості підсвітки нашого робота достатньо закріпити на днищі два блоки по три світлодіоди. Елементи з'єднували припаявши до них шматки міцного дроту.
Крайні контакти (+ та -) можна було з'єднати і одним суцільним дротом. Центральні контакти мають бути з'єднані як показано на фото - з розривами. Саме це дозволить чіпам передавати команди послідовно по ланцюжку.
Для зручності монтування і додаткової міцності, ми розмістили світлодіоди на пластиковій підкладці. Ця підкладка також захищає від закорочування контактів корпусом робота.
Живлення для світлодіодів взяли прямо з Arduino (+5 V та GND). Керуючі контакти під'єднали до виводів Arduino MEGA #42 та #43 для правої та лівої сторони відповідно.
Зміни в коді робота
Повне керування підсвіткою на роботі вимагало змін і до коду програми віддаленого керування RoboRemoteFPV, і в прошивці самого робота.
Зміни в коді RoboRemoteFPV були мінімальні - їх аналізувати не будемо.
На стороні робота все трохи цікавіше.
В модулі штучного інтелекту з'явився блок, який розпізнає команди керування світлом і пересилає ті команди в модуль керування світлодіодами:
case 'L': // Команди керування світлом // Довжина команди - рівно 3 символи if(strlen(remoteCommand)==3) { // останній символ визначає вмикання чи вимикання bool turnOn = (remoteCommand[2] == '1'); switch (remoteCommand[1]) { case 'F': // керування передніми фарами robotLights->turnFrontLED(turnOn); // підтверджуємо виконання команди, // посилаючи її назад на пульт керування robotConnector->sendMessage(remoteCommand); break; case 'R': // керування задніми фарами robotLights->turnRearLED(turnOn); robotConnector->sendMessage(remoteCommand); break; case 'S': // керування боковою підсвіткою robotLights->turnSideLED(turnOn); robotConnector->sendMessage(remoteCommand); break; } } break;
В модулі керування світлодіодами з'явилося кілька нових фрагментів.
Ініціалізація:
// переводимо виводи передніх і задніх фар // в режим виводу сигналу pinMode(frontPin, OUTPUT); pinMode(rearPin, OUTPUT); // ініціалізуємо бібліотеку NeoPixel // для керування лівою і правою RGB стрічкою leftPix = new Adafruit_NeoPixel(3, in_leftPin, NEO_RGB + NEO_KHZ800); rightPix = new Adafruit_NeoPixel(3, in_rightPin, NEO_RGB + NEO_KHZ800); leftPix->begin(); rightPix->begin();
Код керування передніми та задніми фарами простий - вмикаємо на відповідних виводах високий або низький рівень напруги, і фари будуть вмикатися, або вимикатися.
void RobotLights::turnFrontLED(bool turnOn) { digitalWrite(frontPin, turnOn); } void RobotLights::turnRearLED(bool turnOn) { digitalWrite(rearPin, turnOn); }
Керування боковою підсвіткою виглядає ще простіше. Ми зберігаємо у внутрішній змінній інформацію, чи хочемо ми щоб бокове освітлення працювало чи ні. Раз на секунду це значення перевіряється і підсвітка або буде увімкнена, або вимкнена.
void RobotLights::turnSideLED(bool turnOn) { sideLedsActive = turnOn; }
Найцікавіша магія відбувається в методі processTask(). Легко бачити, що тут в нас є код, один в один взятий з попереднього Ardublock прикладу, де ми блимали випадковими кольорами. От лише то блимання виконується двома стрічками по три світлодіоди в кожному. Зміна кольору відбувається регулярно і керує тим система багатозадачності, реалізована нами раніше.
void RobotLights::processTask() { // чи вже пора змінювати колір? if(reachedDeadline()) { // якщо підсвітка була активована - // вибираємо кольори світлодіодів випадково if(sideLedsActive) { leftPix->setPixelColor(0, random(0,255),random(0,255),random(0,255)); leftPix->setPixelColor(1, random(0,255),random(0,255),random(0,255)); leftPix->setPixelColor(2, random(0,255),random(0,255),random(0,255)); leftPix->show(); rightPix->setPixelColor(0, random(0,255),random(0,255),random(0,255)); rightPix->setPixelColor(1, random(0,255),random(0,255),random(0,255)); rightPix->setPixelColor(2, random(0,255),random(0,255),random(0,255)); rightPix->show(); } else { // якщо була команда погасити підсвітку - гасимо обидві стрічки leftPix->clear(); leftPix->show(); rightPix->clear(); rightPix->show(); } // повторити все ще раз, через якийсь час (1 секунду) scheduleTimedTask(LED_DELAY); } }
Нарешті, завдяки новій підсвітці, ми змогли розкрити характер нашого робота повністю.
Передні фари дають достатньо світла, щоб пересуватися в режимі віддаленого керування в темряві. Також робот став помітнішим, що збільшує шанси, що ніхто на нього не наступить випадково.
Немає коментарів:
Дописати коментар