Maquiagem para cyber cinderela. Projeto de fim de semana do Arduino. Cílios led

imagem

Pela primeira vez, os cílios de LED foram mostrados pelo designer Tien Pham no The Maker Faire em San Francisco. Isso foi há dois anos. Bem, e quase imediatamente na caverna do alibaba, os ladrões chineses começaram a distribuir análogos por 400 ou até 300 rublos.

Nas figuras, são duas placas de circuito impresso finas com doze LEDs conectados por cabos finos à placa de controle com uma bateria. Os cílios luminosos são presos com cola especial em cima de regular ou falso, e o controlador e a bateria ficam escondidos no cabelo. Tecnicamente, à primeira vista, nada complicado. Mas! Se você olhar atentamente para a placa dos cílios, existem 12 LEDs e apenas três fios no laço. Ao mesmo tempo, os LEDs não apenas acendem ou piscam, mas também funcionam como luzes de funcionamento. Eu me perguntei meio dia como eles fizeram isso. Revisou um monte de comerciais. E, em câmera lenta, descobriu-se que os LEDs exercem qualquer efeito em pares. Ou seja, a tarefa diminuiu imediatamente para controlar seis LEDs em três fios. Mas ainda assim, três! Seis em três! Mais uma vez - seis em três. E mais ... Então ele repetiu novamente e a resposta de alguma forma veio à tona. Aqui está - o número de todas as permutações dos três elementos é 6!

Acontece que o microcontrolador separou três sinais em um loop composto por três condutores: zero, um e terceiro estado. Temos seis combinações / permutações, o que significa que em cada uma das permutações um dos seis LEDs está aceso. Se eles estiverem incluídos neste esquema:



Por exemplo, acenda o LED D2. Em A-zero, em B - o terceiro estado, em C-unit. Apenas o LED D2 está aceso!

Agora em diante. Zero e um nas saídas do microcontrolador são fáceis. E o terceiro estado? Ainda mais fácil. Defina o modo de entrada. Agora a entrada de alta impedância, que não é puxada para zero ou unidade, é praticamente desconectada do circuito de controle.

Em seguida, o código, controlando dinamicamente as saídas do microcontrolador, acenda qualquer número de LEDs. Fazemos luzes de circulação, piscar, brilhar, extinguir no final.
Abaixo está o código para o Arduino com vários efeitos para dois cílios com seis grupos de LEDs cada.

Abrimos e olhamos
#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_7 7 #define EFFECT_LAST EFFECT_7 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, Lashes_7, }; (*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 Lashes_7() { const uint16_t ViewDelay = 70; pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); pinMode(LEFT_PIN_2, INPUT); pinMode(RIGHT_PIN_3, INPUT); pinMode(LEFT_PIN_3, OUTPUT); pinMode(RIGHT_PIN_2, OUTPUT); while(EffectCnt == EFFECT_7) { digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(RIGHT_PIN_2, HIGH); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_2, LOW); delay(ViewDelay); pinMode(LEFT_PIN_1, INPUT); pinMode(LEFT_PIN_2, OUTPUT); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(LEFT_PIN_3, LOW); pinMode(RIGHT_PIN_1, INPUT); pinMode(RIGHT_PIN_3, OUTPUT); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); pinMode(LEFT_PIN_3, INPUT); pinMode(RIGHT_PIN_2, INPUT); pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, LOW); //  delay(ViewDelay); digitalWrite(LEFT_PIN_1, HIGH); digitalWrite(RIGHT_PIN_1, LOW); digitalWrite(LEFT_PIN_2, LOW); digitalWrite(RIGHT_PIN_3, HIGH); delay(ViewDelay); pinMode(LEFT_PIN_1, INPUT); pinMode(RIGHT_PIN_1, INPUT); pinMode(LEFT_PIN_3, OUTPUT); pinMode(RIGHT_PIN_2, OUTPUT); digitalWrite(LEFT_PIN_3, HIGH); digitalWrite(RIGHT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, LOW); delay(ViewDelay); digitalWrite(LEFT_PIN_2, HIGH); digitalWrite(RIGHT_PIN_3, HIGH); digitalWrite(LEFT_PIN_3, LOW); digitalWrite(RIGHT_PIN_2, LOW); delay(ViewDelay); pinMode(LEFT_PIN_2, INPUT); pinMode(RIGHT_PIN_3, INPUT); pinMode(LEFT_PIN_1, OUTPUT); pinMode(RIGHT_PIN_1, OUTPUT); digitalWrite(LEFT_PIN_1, LOW); digitalWrite(RIGHT_PIN_1, HIGH); digitalWrite(LEFT_PIN_3, HIGH); } } //---------------------------------------- void Key_ISR() { EffectCnt++; if (EffectCnt > EFFECT_LAST) EffectCnt = EFFECT_0; 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); } 


E essa garota, Veronica, demonstra esses efeitos.


Provavelmente, para algumas pessoas, esse método de gerenciamento já é familiar e você já o está usando. Mas de qualquer maneira, realmente queria compartilhar. Os Arduins devem gostar!

Source: https://habr.com/ru/post/pt414237/


All Articles