Мой регион: Россия

Светодиодные ресницы, Arduino проект

Ном. номер: 9000484342
Артикул: Светодиодные ресницы
Производитель: DIY
Светодиодные ресницы, Arduino проект
754 руб.
Это набор компонентов
(см.спецификацию ниже)
Добавить в корзину 1 шт. на сумму 754 руб.
В кредит от 0 руб./мес

Спецификация набора

То, что у вас уже есть, вы можете удалить в корзине.

НаименованиеЦенаКол-во
Печатная плата LashesR, Печатная плата с разводкой, FR4 32.2х12.4мм (1.5мм, 18мкм) 27 руб. 2
TO-1608BC-BF, Светодиод синий SMD 1608, 247мКд, 120°, 468нМ (Blue) 5 руб. 8
TO-1608BC-MRE, Светодиод красный SMD 1608, 112мКд, 120°, 630нМ (Ultra Bright Red) 5 руб. 8
TO-1608BC-MYF, Светодиод желтый SMD 1608, 247мКд, 120°, 592нМ (High Bright Yellow) 5 руб. 8
Ванилин, Программируемый контроллер на базе ATmega328P-AU, CP2102 (Arduino Uno) 580 руб. 1

Макияж для кибер золушки.
Перепечатка статьи на Хабре.
Впервые светодиодные ресницы показал дизайнер Тьен Фам на «The Maker Faire» в Сан-Франциско. Это было года два назад. Ну, и почти сразу в пещере алибабы, китайские разбойники начали раздавать аналоги за 400 или даже 300 рублей.
На картинках это две тонкие печатные платы с двенадцатью светодиодами, которые подключены тонкими шлейфами к плате управления с аккумулятором. Светящиеся ресницы крепятся с помощью специального клея поверх обычных или накладных, а контроллер и аккумулятор прячутся в волосах. Технически на первый взгляд ничего сложного. Но! Если присмотреться на плате-реснице 12 светодиодов, а в шлейфе только три провода. При этом светодиоды не только светятся или моргают, но и работают как бегущие огни. Я полдня ломал голову, как это они сделали. Пересмотрел кучу рекламных роликов. И, при замедленном просмотре оказалось, что любой эффект светодиоды выполняют парами. То есть задача тут же сузилась до управления шестью светодиодами по трем проводам. Но все-таки по трём! Шестью по трём! Ещё раз - шестью по трём. И ещё… Потом повторил ещё раз и ответ как-то всплыл сам по себе. Вот он - число всех перестановок из трех элементов равно 6! Оказывается микроконтроллер перебирает на шлейфе, состоящем из трёх проводников три сигнала: ноль, единицу и третье состояние. Получаем шесть комбинаций/перестановок, а значит, при каждой из перестановок горит один из шести светодиодов. Если они включены по этой схеме:

Схема

Для примера зажжем светодиод D2. На А-ноль, на B – третье состояние, на С-единица. Горит только светодиод D2!
Теперь дальше. Ноль и единица на выходах микроконтроллера это легко. А третье состояние? Ещё проще. Устанавливаем режим “вход”. Теперь высокоомный вход, не подтянутый ни к нулю, ни к единицы, практически отключается от схемы управления.
Дальше уже дело кода, динамически управляя выходами микроконтроллера, включаем любое количество светодиодов. Делаем бегущие огни, моргаем, сверкаем, гасим в конце концов.

В подвале страницы скетч для Arduino с несколькими эффектами для двух ресниц с шестью группами светодиодов в каждой.
В первых строчках скетча указаны выводы Arduino к которым подключаем ресницы. Левую LEFT_PIN_1,2,3 и правую RIGHT_PIN_1,2,3

Это схема. По 12 светодиодов на каждой ресничке.

Схема

Так выглядит печатная плата. Обратите внимание на одной стороне светодиоды для правой ресницы (R), а на дугой светодиоды для левой (L). Поэтому вам понадобятся две платы.

Схема

В ролике девушка Вероника демонстрирует эффекты. И немножко рассказывает.

Это открытый проект! Лицензия, под которой он распространяется – Creative Commons - Attribution - Share Alike license.

Скетч. Код программы


#include <PinChangeInt.h>


#define   LEFT_PIN_1       2
#define   LEFT_PIN_2       3
#define   LEFT_PIN_3       4
#define   RIGHT_PIN_1      5
#define   RIGHT_PIN_2      6
#define   RIGHT_PIN_3      7
#define   KEY_PIN          8 //кнопка


#define   EFFECT_0         0
#define   EFFECT_1         1
#define   EFFECT_2         2
#define   EFFECT_3         3
#define   EFFECT_4         4
#define   EFFECT_5         5
#define   EFFECT_6         6
#define   EFFECT_LAST      EFFECT_6



uint8_t EffectCnt = 0;

void setup()
{
  pinMode(LEFT_PIN_1, OUTPUT);
  pinMode(LEFT_PIN_2, OUTPUT);
  pinMode(LEFT_PIN_3, OUTPUT);
  pinMode(RIGHT_PIN_1, OUTPUT);
  pinMode(RIGHT_PIN_2, OUTPUT);
  pinMode(RIGHT_PIN_3, OUTPUT);
  pinMode(KEY_PIN, INPUT);
  digitalWrite(KEY_PIN, HIGH);
  PCintPort::attachInterrupt(KEY_PIN, &Key_ISR, FALLING);
}
//------------------------------------------------------
void loop()
{
  void (*EFFECTS[])(void) = { Lashes_0, Lashes_1, Lashes_2,
                              Lashes_3, Lashes_4, Lashes_5, Lashes_6};    
  (*EFFECTS[EffectCnt])();//EffectCnt

  delay(100);
  Lashes_Off();
  while(!digitalRead(KEY_PIN));
  delay(300);
  PCintPort::attachInterrupt(KEY_PIN, &Key_ISR, FALLING);
}
//------------------------------------------------------
void Lashes_0()
{
  const uint16_t ViewDelay = 5;
  
  while(EffectCnt == EFFECT_0)
  {
    digitalWrite(LEFT_PIN_1, HIGH);
    digitalWrite(LEFT_PIN_2, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_1, HIGH);
    digitalWrite(RIGHT_PIN_2, LOW);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_2, HIGH);
    digitalWrite(LEFT_PIN_3, LOW);
    digitalWrite(RIGHT_PIN_2, HIGH);
    digitalWrite(RIGHT_PIN_3, LOW);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_1, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_1, LOW);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
  }
}
//------------------------------------------------------
void Lashes_1()
{
  const uint16_t ViewDelay = 5;
  const uint8_t LashesON = 27;
  const uint16_t PauseDelay = ViewDelay * LashesON * 3;
  
  while(EffectCnt == EFFECT_1)
  {
    for (uint8_t i = 0; i < LashesON; i++)
    {
    digitalWrite(LEFT_PIN_1, HIGH);
    digitalWrite(LEFT_PIN_2, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_1, HIGH);
    digitalWrite(RIGHT_PIN_2, LOW);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_2, HIGH);
    digitalWrite(LEFT_PIN_3, LOW);
    digitalWrite(RIGHT_PIN_2, HIGH);
    digitalWrite(RIGHT_PIN_3, LOW);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_1, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_1, LOW);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
    }

    Lashes_Off();
    delay(PauseDelay);
  }
}
//------------------------------------------------------
void Lashes_2()
{
  const uint16_t ViewDelay = 5;
  const uint8_t LashesON = 17;
  
  while(EffectCnt == EFFECT_2)
  {
    for (uint8_t i = 0; i < LashesON; i++)
    {
    digitalWrite(RIGHT_PIN_1, HIGH);
    digitalWrite(RIGHT_PIN_2, LOW);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
    digitalWrite(RIGHT_PIN_2, HIGH);
    digitalWrite(RIGHT_PIN_3, LOW);
    delay(ViewDelay);
    digitalWrite(RIGHT_PIN_1, LOW);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
    }
    
    Lashes_Off();

    for (uint8_t i = 0; i < LashesON; i++)
    {
    digitalWrite(LEFT_PIN_1, HIGH);
    digitalWrite(LEFT_PIN_2, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_2, HIGH);
    digitalWrite(LEFT_PIN_3, LOW);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_1, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    delay(ViewDelay);
    }

    Lashes_Off();
  }
}
//------------------------------------------------------
void Lashes_3()
{
  const uint16_t ViewDelay = 70;

  pinMode(LEFT_PIN_1, OUTPUT);
  pinMode(RIGHT_PIN_1, OUTPUT);
  pinMode(LEFT_PIN_2, INPUT);
  pinMode(RIGHT_PIN_2, INPUT);
  pinMode(LEFT_PIN_3, OUTPUT);
  pinMode(RIGHT_PIN_3, OUTPUT);
  
  while(EffectCnt == EFFECT_3)
  {
    digitalWrite(LEFT_PIN_1, HIGH);
    digitalWrite(RIGHT_PIN_1, HIGH);    
    digitalWrite(LEFT_PIN_3, LOW);    
    digitalWrite(RIGHT_PIN_3, LOW);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_1, LOW);
    digitalWrite(RIGHT_PIN_1, LOW);  
    digitalWrite(LEFT_PIN_3, HIGH);    
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
    pinMode(LEFT_PIN_1, INPUT);
    pinMode(RIGHT_PIN_1, INPUT);
    pinMode(LEFT_PIN_2, OUTPUT);
    pinMode(RIGHT_PIN_2, OUTPUT);
    digitalWrite(LEFT_PIN_2, HIGH);
    digitalWrite(RIGHT_PIN_2, HIGH);
    digitalWrite(LEFT_PIN_3, LOW);    
    digitalWrite(RIGHT_PIN_3, LOW);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_2, LOW);
    digitalWrite(RIGHT_PIN_2, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
    pinMode(LEFT_PIN_3, INPUT);
    pinMode(RIGHT_PIN_3, INPUT);
    pinMode(LEFT_PIN_1, OUTPUT);
    pinMode(RIGHT_PIN_1, OUTPUT);
    digitalWrite(LEFT_PIN_1, HIGH);
    digitalWrite(RIGHT_PIN_1, HIGH);
    digitalWrite(LEFT_PIN_2, LOW);
    digitalWrite(RIGHT_PIN_2, LOW);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_1, LOW);
    digitalWrite(RIGHT_PIN_1, LOW);
    digitalWrite(LEFT_PIN_2, HIGH);
    digitalWrite(RIGHT_PIN_2, HIGH); //последняя пара
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_1, HIGH);
    digitalWrite(RIGHT_PIN_1, HIGH);
    digitalWrite(LEFT_PIN_2, LOW);
    digitalWrite(RIGHT_PIN_2, LOW);
    delay(ViewDelay);
    pinMode(LEFT_PIN_1, INPUT);
    pinMode(RIGHT_PIN_1, INPUT);
    pinMode(LEFT_PIN_3, OUTPUT);
    pinMode(RIGHT_PIN_3, OUTPUT);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_2, HIGH);
    digitalWrite(RIGHT_PIN_2, HIGH);
    digitalWrite(LEFT_PIN_3, LOW);
    digitalWrite(RIGHT_PIN_3, LOW);
    delay(ViewDelay);
    pinMode(LEFT_PIN_2, INPUT);
    pinMode(RIGHT_PIN_2, INPUT);
    pinMode(LEFT_PIN_1, OUTPUT);
    pinMode(RIGHT_PIN_1, OUTPUT);
    digitalWrite(LEFT_PIN_1, LOW);
    digitalWrite(RIGHT_PIN_1, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_3, HIGH);
  }
}
//------------------------------------------------------
void Lashes_4()
{
  const uint16_t ViewDelay = 30;
  randomSeed(analogRead(0));
  
  while(EffectCnt == EFFECT_4)
  {
    uint8_t randNumber = random(0, 7);
    switch(randNumber)
    {
      case 0:
        digitalWrite(LEFT_PIN_1, HIGH);
        digitalWrite(LEFT_PIN_3, HIGH);
      break;

      case 1:
        digitalWrite(RIGHT_PIN_1, HIGH);
        digitalWrite(RIGHT_PIN_3, HIGH);
      break;

      case 2:
        digitalWrite(LEFT_PIN_1, HIGH);
        digitalWrite(LEFT_PIN_2, HIGH);
      break;

      case 3:
        digitalWrite(RIGHT_PIN_1, HIGH);
        digitalWrite(RIGHT_PIN_2, HIGH);
      break;

      case 4:
        digitalWrite(LEFT_PIN_2, HIGH);
        digitalWrite(LEFT_PIN_3, HIGH);
      break;

      case 5:
        digitalWrite(RIGHT_PIN_2, HIGH);
        digitalWrite(RIGHT_PIN_3, HIGH);
      break;
    }

    delay(ViewDelay);
    Lashes_Off();
  }
}
//------------------------------------------------------
void Lashes_5()
{
  const uint8_t DelayMin = 1;
  const uint8_t DelayMax = 25;
  const uint8_t LashesON = 6;
  int8_t DelayVal = DelayMin;
  bool Direction = false;
  
  while(EffectCnt == EFFECT_5)
  {
    for (uint8_t i = 0; i < LashesON; i++)
    {
    digitalWrite(LEFT_PIN_1, HIGH);
    digitalWrite(LEFT_PIN_2, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_1, HIGH);
    digitalWrite(RIGHT_PIN_2, LOW);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(DelayVal);
    digitalWrite(LEFT_PIN_2, HIGH);
    digitalWrite(LEFT_PIN_3, LOW);
    digitalWrite(RIGHT_PIN_2, HIGH);
    digitalWrite(RIGHT_PIN_3, LOW);
    delay(DelayVal);
    digitalWrite(LEFT_PIN_1, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_1, LOW);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(DelayVal);
    }

    if (!Direction)
    {
      DelayVal++;
      if (DelayVal == DelayMax + 1)
      {
        DelayVal = DelayMax - 1;
        Direction = true;
      }
    }
    else
    {
      DelayVal--;
      if (DelayVal == DelayMin - 1)
      {
        DelayVal = DelayMin + 1;
        Direction = false;
      }
    }
  }
}
//------------------------------------------------------
void Lashes_6()
{
  const uint16_t ViewDelay = 5;
  const uint8_t LashesON_RED = 45;
  const uint8_t LashesON_RED_BLUE = LashesON_RED;
  
  pinMode(LEFT_PIN_1, OUTPUT);
  pinMode(RIGHT_PIN_1, OUTPUT);
  pinMode(LEFT_PIN_2, INPUT);
  pinMode(RIGHT_PIN_2, INPUT);
  pinMode(LEFT_PIN_3, OUTPUT);
  pinMode(RIGHT_PIN_3, OUTPUT);

  for (uint8_t i = 0; i < LashesON_RED; i++)
  {
    digitalWrite(LEFT_PIN_1, HIGH);
    digitalWrite(RIGHT_PIN_1, HIGH);
    digitalWrite(LEFT_PIN_3, LOW);
    digitalWrite(RIGHT_PIN_3, LOW);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_1, LOW);
    digitalWrite(RIGHT_PIN_1, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
  }

  for (uint8_t i = 0; i < LashesON_RED_BLUE; i++)
  {
    pinMode(LEFT_PIN_1, OUTPUT);
    pinMode(RIGHT_PIN_1, OUTPUT);
    pinMode(LEFT_PIN_2, INPUT);
    pinMode(RIGHT_PIN_2, INPUT);
    pinMode(LEFT_PIN_3, OUTPUT);
    pinMode(RIGHT_PIN_3, OUTPUT);
    digitalWrite(LEFT_PIN_1, HIGH);
    digitalWrite(RIGHT_PIN_1, HIGH);
    digitalWrite(LEFT_PIN_3, LOW);
    digitalWrite(RIGHT_PIN_3, LOW);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_1, LOW);
    digitalWrite(RIGHT_PIN_1, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
    pinMode(LEFT_PIN_1, INPUT);
    pinMode(RIGHT_PIN_1, INPUT);
    pinMode(LEFT_PIN_2, OUTPUT);
    pinMode(RIGHT_PIN_2, OUTPUT);
    digitalWrite(LEFT_PIN_2, HIGH);
    digitalWrite(RIGHT_PIN_2, HIGH);
    digitalWrite(LEFT_PIN_3, LOW);
    digitalWrite(RIGHT_PIN_3, LOW);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_2, LOW);
    digitalWrite(RIGHT_PIN_2, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
  }

  pinMode(LEFT_PIN_1, OUTPUT);
  pinMode(RIGHT_PIN_1, OUTPUT);
  
  while(EffectCnt == EFFECT_6)
  {
    digitalWrite(LEFT_PIN_1, HIGH);
    digitalWrite(LEFT_PIN_2, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_1, HIGH);
    digitalWrite(RIGHT_PIN_2, LOW);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_2, HIGH);
    digitalWrite(LEFT_PIN_3, LOW);
    digitalWrite(RIGHT_PIN_2, HIGH);
    digitalWrite(RIGHT_PIN_3, LOW);
    delay(ViewDelay);
    digitalWrite(LEFT_PIN_1, LOW);
    digitalWrite(LEFT_PIN_3, HIGH);
    digitalWrite(RIGHT_PIN_1, LOW);
    digitalWrite(RIGHT_PIN_3, HIGH);
    delay(ViewDelay);
  }
}
//----------------------------------------
void Key_ISR()
{
  EffectCnt++;
  if (EffectCnt > EFFECT_LAST)
    EffectCnt = EFFECT_1;

  PCintPort::detachInterrupt(KEY_PIN);
}
//----------------------------------------
void Lashes_Off()
{
  pinMode(LEFT_PIN_1, OUTPUT);
  pinMode(LEFT_PIN_2, OUTPUT);
  pinMode(LEFT_PIN_3, OUTPUT);
  pinMode(RIGHT_PIN_1, OUTPUT);
  pinMode(RIGHT_PIN_2, OUTPUT);
  pinMode(RIGHT_PIN_3, OUTPUT);
  digitalWrite(LEFT_PIN_1, LOW);
  digitalWrite(LEFT_PIN_2, LOW);
  digitalWrite(LEFT_PIN_3, LOW);
  digitalWrite(RIGHT_PIN_1, LOW);
  digitalWrite(RIGHT_PIN_2, LOW);
  digitalWrite(RIGHT_PIN_3, LOW);
}

Техническая документация

Kicad проект
zip, 10 КБ
Gerber файлы
zip, 13 КБ

Видео

Выберите регион, чтобы увидеть способы получения товара.

Комментарии