Maquillage pour cyber cendrillon. Projet de week-end Arduino. Cils LED

image

Pour la première fois, des cils LED ont été montrés par le designer Tien Pham à The Maker Faire à San Francisco. C'était il y a deux ans. Eh bien, et presque immédiatement dans la grotte d'alibaba, les voleurs chinois ont commencé à distribuer des analogues pour 400 voire 300 roubles.

Dans les images, il s'agit de deux cartes de circuits imprimés minces avec douze LED qui sont connectées par des câbles minces à la carte de commande avec une batterie. Les cils lumineux sont attachés à l'aide d'une colle spéciale sur le dessus de régulier ou faux, et le contrôleur et la batterie sont cachés dans les cheveux. Techniquement, à première vue, rien de compliqué. Mais! Si vous regardez attentivement le tableau des cils, il y a 12 LED et il n'y a que trois fils dans la boucle. En même temps, les LED s'allument ou clignotent non seulement, mais fonctionnent également comme des feux de circulation. Je me suis demandé une demi-journée comment ils l'ont fait. Révisé un tas de publicités. Et, au ralenti, il s'est avéré que les LED effectuent n'importe quel effet par paires. Autrement dit, la tâche s'est immédiatement rétrécie pour contrôler six LED sur trois fils. Mais encore, trois! Six sur trois! Encore une fois - six sur trois. Et plus ... Puis il a répété à nouveau et la réponse est apparue d'une manière ou d'une autre. La voici - le nombre de toutes les permutations des trois éléments est 6!

Il s'avère que le microcontrôleur a trié trois signaux sur une boucle composée de trois conducteurs: zéro, un et le troisième état. Nous obtenons six combinaisons / permutations, ce qui signifie qu'à chacune des permutations, l'une des six LED est allumée. S'ils sont inclus dans ce schéma:



Par exemple, allumez la LED D2. Sur A-zéro, sur B - le troisième état, sur l'unité C. Seule la LED D2 est allumée!

Maintenant. Zéro et un sur les sorties du microcontrôleur est facile. Et le troisième état? Encore plus facile. Réglez le mode d'entrée. Maintenant, l'entrée haute impédance, qui n'est pas tirée à zéro ou à l'unité, est pratiquement déconnectée du circuit de commande.

Ensuite, le code, contrôlant dynamiquement les sorties du microcontrôleur, allume un nombre illimité de LED. Nous faisons tourner les lumières, clignoter, scintiller, éteindre à la fin.
Voici le code de l'Arduino avec plusieurs effets pour deux cils avec six groupes de LED chacun.

Nous ouvrons et regardons
#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); } 


Et cette fille Veronica démontre ces effets.


Probablement, pour certaines personnes, cette méthode de gestion est connue depuis longtemps et vous l'utilisez déjà. Mais de toute façon, je voulais vraiment partager. Les Arduins devraient aimer!

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


All Articles