Taula de continguts:

Barret LED de luxe: 5 passos (amb imatges)
Barret LED de luxe: 5 passos (amb imatges)

Vídeo: Barret LED de luxe: 5 passos (amb imatges)

Vídeo: Barret LED de luxe: 5 passos (amb imatges)
Vídeo: Праздник. Новогодняя комедия 2024, Desembre
Anonim
Image
Image
Barret LED de luxe
Barret LED de luxe

Sempre he volgut fer un projecte Arduino, però mai no he tingut cap idea fantàstica fins que la meva família va ser convidada a una festa de barrets de luxe. Amb dues setmanes de temps, tenia curiositat si podia planificar i executar un barret d’animació LED sensible al moviment. Resulta que podria! Probablement em vaig endur una mica, però el projecte total va costar uns 80 dòlars. Amb l’experimentació i una mica de codificació, podríeu fer-ho per menys.

L’objectiu amb el barret era el següent:

  1. Feu que es desplacin un conjunt de llums des del centre davanter del barret cap a la part posterior, una llum a cada costat
  2. Canvieu la velocitat del recorregut de la llum dictada per la inclinació del barret cap endavant i cap enrere
  3. Permetre que els llums inverteixin quan la banda del barret es va inclinar cap avall (és a dir, emula l’efecte de la gravetat sobre els llums)
  4. Canvieu el color segons la inclinació del barret d’esquerra a dreta
  5. Sentiu els xocs i mostreu un efecte especial
  6. Sentiu que el portador gira i mostra un efecte especial
  7. Feu-lo completament contingut al barret

Pas 1: parts necessàries

Parts necessàries
Parts necessàries
Parts necessàries
Parts necessàries
Parts necessàries
Parts necessàries

He utilitzat els components principals següents (inclosos els enllaços d'Amazon no afiliats):

  • Microcontrolador Teensy LC: el vaig triar per sobre d’un Arduino normal a causa de la seva petita mida i amb una connexió especial per controlar els meus LEDs, així com un fort suport bibliotecari i comunitari.
  • Sensor de posició basat en Bosch BNO055: sincerament, un dels primers documents que he trobat. Hi ha opcions molt menys costoses, però, una vegada que esbrineu el Bosch, fa molt per vosaltres que d'altra manera hauríeu de fer en codi
  • Tira LED dirigible WS2812: he triat una longitud d'1 metre amb 144 LED per metre. Tenir aquesta densitat ajuda la llum a semblar més com si es mogués, en lloc d’il·luminar-se els elements individuals en seqüència.

I els components menors següents:

  • Un barret: qualsevol barret amb una barretina ho farà. Es tracta d’un barret de 6 dòlars d’una botiga local. Si té una costura a la part posterior, serà més fàcil fer passar el cablejat. Presteu atenció a si la banda del barret està enganxada, ja que també provocarà alguna dificultat addicional. Aquest es cus al llarg de la part superior, però la part inferior s’estira fàcilment.
  • Resistències de 4,7 K ohm
  • 3x carcassa de bateria AAA: mitjançant 3 bateries AAA es produeix un voltatge exactament en el rang desitjat per l'electrònica, cosa que simplifica les coses. AAA s'adapta a un barret més fàcil que AA i encara té un bon temps d'execució.
  • Filferro de calibre petit: he utilitzat filferro sòlid que tenia posat al voltant d’un projecte LED anterior.
  • Soldador i soldador
  • Alguns spandex que coincideixen amb el color interior del barret i el fil

Suggerit, però opcional:

  • Connectors ràpids per als cables de la bateria
  • L'eina Mans ajudants és molt petita i difícil de soldar

Pas 2: Modifiqueu el barret

Modifiqueu el barret
Modifiqueu el barret
Modifiqueu el barret
Modifiqueu el barret
Modifiqueu el barret
Modifiqueu el barret
Modifiqueu el barret
Modifiqueu el barret

Necessitareu un lloc al barret per muntar l'electrònica i un lloc per a la bateria. La meva dona treballa professionalment amb la roba, així que li vaig demanar consell i ajuda. Vam acabar creant dues butxaques amb spandex. La primera butxaca més petita cap a la part davantera apunta com el barret de manera que, quan s’instal·la l’electrònica, el sensor de posició es manté bastant bé, tot i que es pot treure fàcilment si cal. La segona butxaca cap a la part posterior és mantenir la bateria al seu lloc.

Les butxaques estaven sembrades amb fils que coincidien amb el color del barret, tot allargant la línia de la corona. Depenent de l'estil del barret i els materials, es fa de YMMV amb aquesta tècnica.

També vam descobrir que la banda del barret s’enfonsa per si mateixa per un costat i es va cosir completament al barret en aquell lloc. Vam haver de treure la costura original per fer funcionar els LED sota la banda. Durant la construcció es va mantenir al seu lloc amb agulles, i després es va cosir amb el fil coincident quan es va completar.

Finalment vam obrir la costura a la part posterior del barret si estava cobert per la banda. Vam ficar l’arnès de filferro que venia amb els LED a través d’aquesta costura i vam folrar el primer LED de la tira que es trobava just a la costura. Després vam embolicar els LED al voltant del barret i vam tallar la tira de manera que l’últim LED quedés just al costat del primer. La tira LED es pot mantenir al seu lloc només amb la banda del barret, però, depenent de la banda i del material, és possible que hàgiu de fixar els LED cosint o enganxant.

Pas 3: connecteu-lo

Wire It Up
Wire It Up

La placa Teensy i els LEDs funcionaran amb qualsevol lloc des de 3,3v fins a 5v per obtenir energia. És per això que vaig optar per utilitzar 3 bateries AAA, el voltatge de sortida de 4,5 v està molt bé en aquest rang i tenen molt temps d’execució perquè funcionin els LEDs. Hauríeu de poder superar les 8 hores d’execució.

Cablatge de l'alimentació

Vaig connectar els cables positius i negatius de la caixa de bateries i els LED junts, i després vaig soldar al Teensy en els llocs adequats. El positiu de la bateria s’ha de connectar al pin superior dret del Teensy del diagrama (etiquetat amb Vin al tauler) i el negatiu es pot connectar a qualsevol pin etiquetat GND. Convenientment, n’hi ha un directament al costat oposat del tauler o just al costat del pin Vin. Es pot trobar el diagrama complet de la taula al final d'aquesta pàgina. I en alguns casos s’inclou una còpia en paper quan demaneu el tauler.

Si teniu previst executar un codi que només tingui uns quants LED encesos alhora, podeu alimentar els LED des del propi Teensy mitjançant una sortida de 3,3 V i un GND, però si proveu d’extreure massa pot danyar el tauler. Per tant, per donar-vos la major quantitat d’opcions, és millor connectar directament els LED a la font de la bateria.

Cablatge dels LED

Vaig escollir el Teensy LC per a aquest projecte, ja que té un pin que fa molt més fàcil connectar LEDs adreçables. A la part inferior del tauler, el pin que es troba al segon dels miralls esquerres del Pin # 17, però que també té 3.3v. Això es coneix com un pull-up, i en altres plaques hauríeu de connectar-vos a una resistència per proporcionar aquesta tensió. En el cas del Teensy LC, podeu connectar-vos directament des d'aquest pin al cable de dades del vostre LED.

Cablatge del sensor de posició

Algunes de les plaques BNO055 disponibles són molt més estrictes quant a la tensió i només volen 3.3v. Per això, vaig connectar el Vin a la placa BNO055 des de la sortida dedicada de 3,3 V del Teensy, que és el tercer pin de la dreta. A continuació, podeu connectar el GND del BNO055 a qualsevol GND del Teensy.

El sensor de posició BNO055 utilitza I2c per parlar amb el Teensy. I2c requereix pull-ups, de manera que he connectat dues resistències de 4,7 K ohmios des d’una sortida de 3,3 V al Teensy als pins 18 i 19. Després he connectat el pin 19 al pin SCL de la placa BNO055 i 18 al pin SDA.

Consells / trucs sobre el cablejat

Per fer aquest projecte he utilitzat filferro sòlid en lloc de varat. Un dels avantatges del filferro sòlid és soldar amb prototips de taules com aquestes. Podeu despullar una mica de filferro, doblegar-lo a 90 graus i inserir-lo per la part inferior d'un dels terminals, de manera que l'extrem tallat del filferro s'enganxi per sobre del tauler. Llavors només necessiteu una petita quantitat de soldadura per subjectar-la al terminal i podreu tallar l'excés fàcilment.

El cable sòlid pot ser més difícil de treballar, ja que tendeix a voler mantenir-se com es doblega. Tanmateix, per a aquest projecte això era un avantatge. Vaig tallar i donar forma als meus cables de manera que l'orientació del sensor de posició fos coherent en inserir i treure l'electrònica del barret per ajustar-la i programar-la.

Pas 4: Programació

Ara que tot està muntat, necessitareu una eina de programació compatible amb Arduino. He utilitzat l'IDE Arduino real (funciona amb Linux, Mac i PC). També necessitareu el programari Teensyduino per connectar-vos amb la placa Teensy. Aquest projecte utilitza en gran mesura la biblioteca FastLED per fer la programació de color i posició dels LED.

Calibratge

El primer que voldreu fer és anar a l’excel·lent dipòsit GitHub de Kris Winer per al BNO055 i descarregar el seu esbós BNO_055_Nano_Basic_AHRS_t3.ino. Instal·leu aquest codi amb el monitor de sèrie en funcionament i us indicarà si la placa BNO055 es connecta correctament i supera les seves proves automàtiques. També us guiarà per calibrar el BNO055, cosa que us donarà resultats més consistents més endavant.

Introducció a l’esbós LED Fancy

El codi del barret Fancy LED està específicament adjunt, i també al meu dipòsit GitHub. Tinc previst fer més modificacions al codi i aquestes es publicaran al repositori de GitHub. El fitxer aquí reflecteix el codi quan es va publicar aquest instructable. Després de descarregar i obrir l'esbós, heu de canviar algunes coses. La majoria dels valors importants a canviar es troben a la part superior com a sentències #define:

Línia 24: #define NUM_LEDS 89: canvieu-ho pel nombre real de LEDs de la vostra banda de LED

Línia 28: #define SERIAL_DEBUG false: probablement voldreu que això sigui cert, de manera que pugueu veure la sortida al monitor sèrie

Codi de detecció de posició

La detecció de posició i la major part de la vostra modificació comença a la línia 742 i passa a la 802. Obtenim dades de Pitch, Roll i Yaw del sensor de posició i les fem servir per establir valors. Depenent de com es muntin els vostres components electrònics, és possible que hàgiu de canviar-los. Si munteu el sensor de posició amb el xip cap a la part superior del barret i la fletxa al costat de X impresa al tauler apuntant cap a la part frontal del barret, hauríeu de veure el següent:

  • Pitch assenteix amb el cap
  • El rotlle és inclinar el cap, p. toca l’orella a l’espatlla
  • El desviament és quina direcció. que esteu davant (nord, oest, etc.).

Si el tauler està muntat en una orientació diferent, haureu de canviar Pitch / Roll / Yaw perquè es comportin com vulgueu.

Per ajustar la configuració del roll, podeu canviar els valors #define següents:

  • ROLLOFFSET: amb el barret estable i tan centrat com pugui, si el rotlle no és 0, canvieu-ho per la diferència. És a dir, si veieu Roll a -20 quan el barret està centrat, feu aquest 20.
  • ROLLMAX: el valor màxim que cal utilitzar per a la mesura del rotlle. El més fàcil de trobar portant el barret i movent l’orella dreta cap a l’espatlla dreta. Necessitareu un cable USB llarg per fer-ho mentre utilitzeu el monitor sèrie.
  • ROLLMIN: el valor més baix que s’utilitzarà per a la mesura del rotlle, quan inclini el cap cap a l’esquerra

De la mateixa manera, per a Pitch:

  • MAXPITCH: el valor màxim en mirar cap amunt
  • MINPITCH: el valor mínim quan es mira cap avall
  • PITCHCENTER: el valor del to quan es mira directament

Si configureu SERIALDEBUG a true a la part superior del fitxer, hauríeu de veure els valors actuals de la sortida Roll / Pitch / Yaw al monitor sèrie per ajudar a ajustar aquests valors.

Altres paràmetres que és possible que vulgueu canviar

  • MAX_LED_DELAY 35: el més lent que pot moure la partícula LED. Això és en mil·lisegons. És el retard de passar d'un LED al següent de la cadena.
  • MIN_LED_DELAY 10: el dejuni que pot moure la partícula LED. Com a dalt es troba en mil·lisegons.

Conclusió

Si heu arribat fins aquí, hauríeu de tenir un barret LED completament divertit i funcional. Si voleu fer-ne més, la pàgina següent conté informació avançada sobre com canviar la configuració i fer les vostres coses. així com alguna explicació del que fa la resta del meu codi.

Pas 5: avançat i opcional: dins del codi

Detecció d’impactes i rotacions

La detecció d’impactes / rotacions es fa mitjançant les funcions del sensor d’alta G del BNO055. Podeu ajustar-ne la sensibilitat amb les línies següents a initBNO055 ():

  • Línia núm. 316: BNO055_ACC_HG_DURATION: quant de temps ha de durar l'esdeveniment
  • Línia núm. 317: BNO055_ACC_HG_THRESH: quant de dur ha de ser l'impacte
  • Línia núm. 319: BNO055_GYR_HR_Z_SET: llindar de velocitat de rotació
  • Línia núm. 320: BNO055_GYR_DUR_Z: quant de temps ha de durar la rotació

Tots dos valors són binaris de 8 bits, actualment l'impacte s'estableix en B11000000, que és 192 de 255.

Quan es detecta un impacte o rotació, el BNO055 estableix un valor que el codi busca al principi del bucle:

// Detectar les interrupcions activades, és a dir, a causa de l’alt estat de byte G intStatus = readByte (BNO055_ADDRESS, BNO055_INT_STATUS); if (intStatus> 8) {impact (); } else if (intStatus> 0) {spin (); }

Cerqueu la línia void impact () anterior al codi per canviar el comportament en l'impacte, o void spin () per canviar el comportament de la rotació.

Ajudants

He creat una senzilla funció d’ajuda (void setAllLeds ()) per configurar ràpidament tots els LEDs a un sol color. Un l’utilitza per desactivar-los tots:

setAllLeds (CRGB:: Negre);

O podeu triar qualsevol color reconegut per la biblioteca FastLED:

setAllLeds (CRGB:: Red);

També hi ha una funció fadeAllLeds () que apagarà tots els LED en un 25%.

La classe Particle

Per simplificar enormement el cablejat, volia utilitzar una sola cadena de LED, però que es comportessin com diverses cadenes. Com que aquest va ser el meu primer intent, volia que fos el més senzill possible, de manera que tracto l’única cadena com dues, amb el LED (s) central (s) que hi estaven, la divisió seria. Com que podríem tenir un número parell o un número senar, hem de donar-ne compte. Començo per algunes variables globals:

/ * * Variable i contenidors per a LEDs / LEDs CRGB [NUM_LEDS]; static unsigned int curLedDelay = MAX_LED_DELAY; static int centerLed = NUM_LEDS / 2; static int maxLedPos = NUM_LEDS / 2; static bool oddLeds = 0; particula boolera estàticaDir = 1; direct bool estàtic dir = 1; dirCount llarg sense signar; hueCount llarg sense signar;

I algun codi a setup ():

if (NUM_LEDS% 2 == 1) {oddLeds = 1; maxLedPos = NUM_LEDS / 2; } else {oddLeds = 0; maxLedPos = NUM_LEDS / 2 - 1; }

Si tenim nombres senars, volem utilitzar el punt 1/2 com a mig, en cas contrari volem el punt 1/2 - 1. Això és fàcil de veure amb 10 o 11 LED:

  • 11 LED: 11/2 amb nombres enters haurien d’avaluar-se a 5. i els ordinadors compten de 0. Per tant, 0 - 4 és la meitat, 6 - 10 és l’altra meitat i 5 es troba entre ells. En aquest cas, tractem el número 5 com si formés part de tots dos, és a dir, és el número 1 per a les dues cadenes virtuals de LED
  • 10 LED: 10/2 és 5. Però com que els ordinadors compten a partir de 0, n’hem d’eliminar un. Llavors tenim 0 - 4 per a la meitat i 5 - 9 per a l’altra. El número 1 de la primera cadena virtual serà el 4 i el número 1 de la segona cadena virtual serà el número 5.

A continuació, al nostre codi de partícules hem de fer un recompte des de la nostra posició general fins a les posicions reals de la cadena de LED:

if (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centreLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centreLed -1) - currPos; }

El codi també té condicions en què la partícula pot canviar de direcció, de manera que també hem de tenir-ho en compte:

if (particleDir) {if ((currPos == NUM_LEDS / 2) && oddLeds) {currPos = 0; } else if ((currPos == NUM_LEDS / 2 - 1) && (! oddLeds)) {currPos = 0; } else {currPos ++; }} else {if ((currPos == 0) && oddLeds) {currPos = centerLed; } else if ((currPos == 0) && (! oddLeds)) {currPos = centerLed - 1; } else {currPos--; }}

Per tant, fem servir la direcció prevista (particleDir) per calcular quin LED s’hauria d’encendre a continuació, però també hem de tenir en compte si hem arribat a l’extrem real de la cadena de LED o al nostre punt central, que també actua com a final per a cadascuna de les cadenes virtuals.

Un cop descobert tot això, il·luminarem la següent llum quan sigui necessari:

if (particleDir) {if (oddLeds) {Pos1 = centerLed + currPos; Pos2 = centreLed - currPos; } else {Pos1 = centerLed + currPos; Pos2 = (centreLed -1) - currPos; }} else {if (oddLeds) {Pos1 = centerLed - currPos; Pos2 = centreLed + currPos; } else {Pos1 = centerLed - currPos; Pos2 = (centreLed -1) + currPos; }} leds [Pos1] = CHSV (currHue, 255, 255); leds [Pos2] = CHSV (currHue, 255, 255); FastLED.show ();}

Per què fer d'aquesta classe una classe? Tal com és, això és bastant senzill i no necessita estar realment en una classe. Tanmateix, tinc plans futurs d'actualitzar el codi per permetre que es produeixin més d'una partícula a la vegada i que algunes funcionin a l'inrevés mentre que d'altres avancin. Crec que hi ha unes possibilitats realment fantàstiques per a la detecció d’espín mitjançant múltiples partícules.

Recomanat: