Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

Onderdelen en Benodigdheden

Arduino UNO 1

Nodige Tools en Machines

Lasersnijder (generic) Niet *verplicht* maar super handig

Over dit Project

Intro

Allereerst: we houden van familie-kostuums.

Vorig jaar deden we "ruimte-aliens" – eigenlijk mensen in zilver met LED-strip accents. We vonden de LEDs geweldig: uniek en de kinderen zijn 's nachts goed zichtbaar. We wilden weer iets met licht, maar wat? Mijn dochter stelde Pac-Man voor, omdat ze het Namco-klassieker recentelijk in een bowlingzaal had gespeeld. Dat was alles wat we nodig hadden. Een geweldig idee dat we moesten realiseren.

Planning

Eerste stap is altijd plannen, zeker als je een ander 8-bit personage wilt maken.

We kozen Pac-Man personages voor het gezin: Pac-Man, Ms. Pac-Man, en de spookjes Blinky en Pinky. Ik wilde het accuraat en authentiek aan de originele 8-bit sprites, dus keek ik de originele game-sprites op.

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

Deze helpen bij het correcte pixel-layout en tonen elke animatieframe. Je ziet de verschillende frames van de spootpoten en Pac-Mans mond.

Vervolgens legde ik elke animatieframe in Excel uit, zodat we het aantal LED's en het totale lay-out van elk bord wisten. De individuele LED-nummers zijn later nodig voor de Arduino-programmering.

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

Uit de layout: Spookjes zijn 14x14 pixels, Pac-Man 13x13, Ms. Pac-Man 14x14.

Na breedte/hoogte in pixels te weten, beslisten we de panelgrootte. Ik wilde ze allemaal dezelfde relatieve grootte. Elke pixel even groot op elk kostuum. We schaaldden op basis van de kleinste gezinslid (mijn zoon). Ik meet hem en hield karton knipjes om te testen wat hij comfortabel kon dragen en nog kon lopen. We kwamen uit op 22" (56 cm) als hoogte/breedte van de spookjes.

Schaal: 22" / 14 pixels = 1.57" (40 mm) per pixel.

Materialen

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

We wilden de kostuums comfortabel draagbaar, dus lichte materialen gekozen.

  • Basis: 1/8" (3mm) karton, lasersnijden en lijmpistool
  • Translucide afdeklaag: Tekenpapier (Vellum of Mylar)
  • LED's: 12mm DC5V WS2811 individueel adresseerbare LED's (reeksen van 50)
  • Bord: Arduino Uno R3
  • Voeding: 5V DC Powerbank (zoals telefoonlader) + USB naar DC adapter
  • Diversen: DC voedingsjack adapters, breadboard draadjes, 5V voeding voor testen, Velcro, geweven duct strap, duct tape

De Basis

Gelukkig had ik toegang tot een lasersnijder. Je hebt er geen eigen nodig: je kunt het laten snijden door een bedrijf, of handmatig knippen met de PDF als sjabloon.

De basis is 1/8" karton van de lokale hobbywinkel. Onze lasersnijder heeft een 32"x18" bed, dus vellen daarop gesneden.

Paneel Het paneel bestaat uit: basis, lamellen, afdeklaag, en band. De basis houdt de LED's, lamellen vormen de pixels en geven stabiliteit, de afdeklaag diffuseert het licht, en de band maakt het draagbaar.

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

Modelleren

Voor de lasersnijder modelleerde ik de basis in Rhino. Alle paneelonderdelen accuraat gemodelleerd om de lasersnijder zoveel mogelijk werk te laten doen.

Elk paneel zo dat verticale en horizontale lamellen in elkaar schuiven en ook in de basis notch. Zo schuiven en notch de onderdelen samen zonder veel lijm, met perfecte vierkante pixels.

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

Lasersnijden

Onze lasersnijder is 32"x18", dus CAD-bestanden op die maat. Ik heb het .dwg bestand voor het spookkostuum toegevoegd. Je kunt het gebruiken voor lasersnijden, of uitprinten als sjabloon voor handmatig knippen.

Handmatig: leg uit en knip kartonstroken. Pixels zijn ~1.5" vierkant en 2" diep met 12mm gat voor LED's. De PDF kan als sjabloon dienen.

Assemblage

De basis in twee stukken gesneden (bed te klein voor 22"x22"). Eerst met duct tape samengehouden. Zodra lamellen erin zaten, gaven die de echte steun.

Elk lamel gelabeld met "H#" of "V#" (Horizontaal/Verticaal + nummer). Lamellen schuiven mooi door 1/32" clearance. Eerste tests hadden te weinig ruimte en gingen niet samen. Alles geschoven, op basis gezet (notches in plus-vormige gaten). Lamellen aan basis vastgetaped aan de uiteinden. Klein beetje lijmpistool linksboven waar lamellen samenkomen, en aan de tabs aan de achterkant van de basis.

Nadenken

Zoals in het 3D-model te zien: geen afsluiting achteraan gepland. Dit was een fout! Paar uur voor "snoep of je leven" haastig 2.5" kartonstroken achteraan gezet als rugsteun.

Hielp, maar had volledig afgesloten moeten zijn. Met open achterkant duwen LED's naar binnen bij lopen. Op foto's zie je pixels die geen pixels meer zijn maar puntlichtjes – LED's geduwd/gevallen. Ik stopte het gezin een paar keer om te repareren.

LED Lay-out

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

De planning van de LED-reeksen gebeurde in Excel: 170 individuele LED's genummerd 0-169 voor de spookjes.

Excel Lay-out

Belangrijk: afstanden tussen pixels en startpunt.

Als je de voorgekabelde reeksen niet wilt knippen/herkabelen, moet je kunnen reiken van gat tot gat in je volgorde. Bij mij was afstand tussen LED's op de reeks ~3 inch (75mm). Dus pixels moesten aan elkaar grenzen in de layout.

Startpunt: kies dicht bij waar Arduino en voeding gemonteerd worden.

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

LED's Plaatsen

Volg het Excel-patroon: duw LED's van achteren in de karton. De kleine flens houdt ze vast. Karton is wat slordig, dus LED's bewegen bij lopen. Voor extra vastzetten: klompje lijmpistool.

Bedrading

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

Voeding

Beste manier: 5V DC oplaadbare powerbank (telefoonlader) + USB naar DC adapter aan de lampen (nu met vrouwelijke DC jack).

Ik maakte een fout: 8xAA batterijpak met aan/uit schakelaar van vorig jaar gebruikt. Pas nu besef ik dat het 12V uitgaf en ik 5V LED's had. (Ik ben geen rakketenwetenschapper, maar dit is slecht). Toch werkte alles en twijfelde ik niet.

De batterijpakken gaven ~2 uur brandtijd. Na ontdekking dat ze verkeerd waren, testte ik met juiste 5V powerbanks: 2200 mAh → 3u40m, 7800 mAh → 12u43m. Met een goedkope "lipstick-lader" haal je bijna 4 uur.

LED's

Gebruikte 12mm WS2811 individueel adresseerbare LED-reeksen voor buitenreclame. Gekocht via Amazon, reeksen van 50.

Bedrading

Stroomschema: eerste LED van de eerste reeks heeft stroom-in (rood/zwart). Aangesloten op vrouwelijke voedingsjack. Voeding erin. Vervolgens stroom, ground, data van die eerste LED naar 5V en GND op Arduino, DATA (midden) naar pin 3.

Check je LED-kleuren vooraf! Mijn draden: Rood(5V), Groen(DATA), Wit(GND). Jullie kunnen anders zijn.

Code

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

Na bedrading knipperen de lichten misschien kort. Ze moeten verteld worden wat ze moeten doen.

Ik leg niet uit hoe je een Arduino programmeert. Zie Arduino Getting Started.

FastLED Bibliotheek

Ik gebruikte FastLED. Makkelijk, veel voorbeelden. Handig: ze gebruiken Web Colors, dus elke LED elke kleur instelbaar via naam.

Mijn Code

Logica: vul alle LED's met hoofdkleur, verander kleur van/zet uit individuele sets voor elke "frame". Een set per frame, loop ze door met X snelheid X keer voor volledige animatie. Misschien slimmer mogelijk, maar dit werkte.

Spook (Ghost) Animatie Code


// ANIMATED PACMAN GHOST LED
#include "FastLED.h"
#define NUM_LEDS 170
#define DATA_PIN 3
CRGB leds[NUM_LEDS];

void setup() {
  delay(2000);
  FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
  FastLED.setBrightness(40); // 0-255
  FastLED.clear();
}

// Kijk links
int eyes_pixels_l[] = {17, 20, 21, 24, 37, 38, 39, 40, 41, 47, 48, 49, 94, 102, 103, 106, 119, 120, 121, 122, 123, 129, 130, 131};
int pupils_pixels_l[] = {15, 16, 22, 23, 92, 93, 104, 105};

// Kijk rechts
int eyes_pixels_r[] = {38, 39, 40, 46, 47, 48, 49, 50, 63, 66, 67, 75, 120, 121, 122, 128, 129, 130, 131, 132, 145, 148, 149, 152};
int pupils_pixels_r[] = {64, 65, 76, 77, 146, 147, 153, 154};

// Pixels rond voeten verwijderen
int void_pixels_1[] = {8, 29, 30, 31, 83, 84, 85, 86, 138, 139, 140, 161};
int void_pixels_2[] = {7, 31, 55, 56, 57, 112, 113, 114, 138, 162};

// Verdrietige spook (gegeten)
int sad_ghost[] = {11, 26, 35, 48, 49, 53, 60, 64, 65, 80, 89, 104, 105, 109, 116, 120, 121, 134, 143, 158};

int eyes_seconds = 2;
int reg_ghost_seconds = 10;
int feet_delay = 120; // ms tussen voetversies
int eye_loop = (eyes_seconds * 1000) / feet_delay;
int reg_ghost_loop = reg_ghost_seconds / eyes_seconds;
int sad_ghost_loop = 50;
int sad_ghost_blink_loop = 10;

void loop() {
  // Normale spook: ogen kijken links/rechts, voeten animeren
  for (int i = 0; i < reg_ghost_loop; i++) {
    for (int i = 0; i < eye_loop; i++) {
      // Lijk links
      fill_solid(leds, NUM_LEDS, CRGB::Red);
      for (int i = 0; i < 24; i++) leds[eyes_pixels_l[i]] = CRGB::White;
      for (int i = 0; i < 8; i++) leds[pupils_pixels_l[i]] = CRGB::DarkBlue;
      for (int i = 0; i < 12; i++) leds[void_pixels_1[i]] = CRGB::Black;
      FastLED.show(); delay(feet_delay);

      fill_solid(leds, NUM_LEDS, CRGB::Red);
      for (int i = 0; i < 24; i++) leds[eyes_pixels_l[i]] = CRGB::White;
      for (int i = 0; i < 8; i++) leds[pupils_pixels_l[i]] = CRGB::DarkBlue;
      for (int i = 0; i < 10; i++) leds[void_pixels_2[i]] = CRGB::Black;
      FastLED.show(); delay(feet_delay);
    }
    for (int i = 0; i < eye_loop; i++) {
      // Kijk rechts
      fill_solid(leds, NUM_LEDS, CRGB::Red);
      for (int i = 0; i < 24; i++) leds[eyes_pixels_r[i]] = CRGB::White;
      for (int i = 0; i < 8; i++) leds[pupils_pixels_r[i]] = CRGB::DarkBlue;
      for (int i = 0; i < 12; i++) leds[void_pixels_1[i]] = CRGB::Black;
      FastLED.show(); delay(feet_delay);

      fill_solid(leds, NUM_LEDS, CRGB::Red);
      for (int i = 0; i < 24; i++) leds[eyes_pixels_r[i]] = CRGB::White;
      for (int i = 0; i < 8; i++) leds[pupils_pixels_r[i]] = CRGB::DarkBlue;
      for (int i = 0; i < 10; i++) leds[void_pixels_2[i]] = CRGB::Black;
      FastLED.show(); delay(feet_delay);
    }
  }

  // Verdrietige spook (gegeten) - blauw met gele ogen
  for (int i = 0; i < sad_ghost_loop; i++) {
    fill_solid(leds, NUM_LEDS, CRGB::Blue);
    for (int i = 0; i < 20; i++) leds[sad_ghost[i]] = CRGB::Yellow;
    for (int i = 0; i < 12; i++) leds[void_pixels_1[i]] = CRGB::Black;
    FastLED.show(); delay(feet_delay);

    fill_solid(leds, NUM_LEDS, CRGB::Blue);
    for (int i = 0; i < 20; i++) leds[sad_ghost[i]] = CRGB::Yellow;
    for (int i = 0; i < 10; i++) leds[void_pixels_2[i]] = CRGB::Black;
    FastLED.show(); delay(feet_delay);
  }

  // Verdrietige spook knipperen
  for (int i = 0; i < sad_ghost_blink_loop; i++) {
    fill_solid(leds, NUM_LEDS, CRGB::Yellow);
    for (int i = 0; i < 20; i++) leds[sad_ghost[i]] = CRGB::Red;
    for (int i = 0; i < 12; i++) leds[void_pixels_1[i]] = CRGB::Black;
    FastLED.show(); delay(feet_delay);

    fill_solid(leds, NUM_LEDS, CRGB::Blue);
    for (int i = 0; i < 20; i++) leds[sad_ghost[i]] = CRGB::Yellow;
    for (int i = 0; i < 10; i++) leds[void_pixels_2[i]] = CRGB::Black;
    FastLED.show(); delay(feet_delay);
  }
}

Ms. Pac-Man Code


// ANIMATED MS PACMAN LED
#include "FastLED.h"
#define NUM_LEDS 151
#define DATA_PIN 3
CRGB leds[NUM_LEDS];

void setup() {
  delay(2000);
  FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
  FastLED.setBrightness(40);
  FastLED.clear();
}

int void_pixels_opened[] = {6,7,22,23,24,25,26,27,28,29,30,43,44,45,46,47,48,49,50, 51,52,53,54,55,56,57,58,68,69,70,71,72,73,74,75,76,77, 78,79,80,81,82,83,84,85,86,98,99,100,101,102,103,104, 105,106,107,108,109,127,128,129,130,131,132};
int void_pixels_mid[] = {5,150,45,46,47,48,49,50,51,52,53,54,55,56,57,58,68,69,70,71,72, 73,74,75,76,77,78,79,80,81,82,83,84,85,100,101,102,103,104};
int void_pixels_closed[] = {5,150};

int red_opened[] = {92,93,115,116,117,118,119,121,137,138,140,141,142,143,144,145,5,8,133,150};
int red_mid[] = {92,93,115,116,117,118,119,121,137,138,140,141,142,143,144,145,27,26,105,106};
int red_closed[] = {92,93,115,116,117,118,119,121,137,138,140,141,142,143,144,145,50,76,77,78};

int blue_opened[] = {120,139,96};
int blue_mid[] = {120,139,97};
int blue_closed[] = {120,139};

int black_opened[] = {40,95,111,112,124};
int black_mid[] = {40,96,110,111};
int black_closed[] = {40,95,96,97,98};

int frame_rate_ms = 100;

void loop() {
  // MOND OPEN
  fill_solid(leds, NUM_LEDS, CRGB::Yellow);
  for (int i = 0; i < 64; i++) leds[void_pixels_opened[i]] = CRGB::Black;
  for (int i = 0; i < 20; i++) leds[red_opened[i]] = CRGB::Red;
  for (int i = 0; i < 3; i++) leds[blue_opened[i]] = CRGB::Blue;
  for (int i = 0; i < 5; i++) leds[black_opened[i]] = CRGB::Purple;
  FastLED.show(); delay(frame_rate_ms);

  // MOND HALF
  fill_solid(leds, NUM_LEDS, CRGB::Yellow);
  for (int i = 0; i < 39; i++) leds[void_pixels_mid[i]] = CRGB::Black;
  for (int i = 0; i < 20; i++) leds[red_mid[i]] = CRGB::Red;
  for (int i = 0; i < 3; i++) leds[blue_mid[i]] = CRGB::Blue;
  for (int i = 0; i < 4; i++) leds[black_mid[i]] = CRGB::Purple;
  FastLED.show(); delay(frame_rate_ms);

  // MOND DICHT
  fill_solid(leds, NUM_LEDS, CRGB::Yellow);
  for (int i = 0; i < 2; i++) leds[void_pixels_closed[i]] = CRGB::Black;
  for (int i = 0; i < 20; i++) leds[red_closed[i]] = CRGB::Red;
  for (int i = 0; i < 2; i++) leds[blue_closed[i]] = CRGB::Blue;
  for (int i = 0; i < 5; i++) leds[black_closed[i]] = CRGB::Purple;
  FastLED.show(); delay(frame_rate_ms);

  // MOND HALF
  fill_solid(leds, NUM_LEDS, CRGB::Yellow);
  for (int i = 0; i < 39; i++) leds[void_pixels_mid[i]] = CRGB::Black;
  for (int i = 0; i < 20; i++) leds[red_mid[i]] = CRGB::Red;
  for (int i = 0; i < 3; i++) leds[blue_mid[i]] = CRGB::Blue;
  for (int i = 0; i < 4; i++) leds[black_mid[i]] = CRGB::Purple;
  FastLED.show(); delay(frame_rate_ms);
}

Pac-Man Code


// ANIMATED PACMAN LED
#include "FastLED.h"
#define NUM_LEDS 137
#define DATA_PIN 3
CRGB leds[NUM_LEDS];

void setup() {
  delay(2000);
  FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
  FastLED.setBrightness(40);
  FastLED.clear();
}

int void_pixels_opened[] = {19,20,21,22,23,24,25,26,27,28,29,42,43,44,45,46,47,48,49,50,51,52,53,54,55, 56,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,94,95,96,97,98,99,100, 101,102,103,104,105,121,122,123,124,125,126};
int void_pixels_mid[] = {46,47,48,49,50,51,52,53,54,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,98,99,100};
int frame_rate_ms = 100;

void loop() {
  // MOND OPEN
  fill_solid(leds, NUM_LEDS, CRGB::Yellow);
  for (int i = 0; i < 61; i++) leds[void_pixels_opened[i]] = CRGB::Black;
  FastLED.show(); delay(frame_rate_ms);

  // MOND HALF
  fill_solid(leds, NUM_LEDS, CRGB::Yellow);
  for (int i = 0; i < 27; i++) leds[void_pixels_mid[i]] = CRGB::Black;
  FastLED.show(); delay(frame_rate_ms);

  // MOND DICHT
  fill_solid(leds, NUM_LEDS, CRGB::Yellow);
  FastLED.show(); delay(frame_rate_ms);

  // MOND HALF
  fill_solid(leds, NUM_LEDS, CRGB::Yellow);
  for (int i = 0; i < 27; i++) leds[void_pixels_mid[i]] = CRGB::Black;
  FastLED.show(); delay(frame_rate_ms);
}

Afdeklaag Toevoegen

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

Laat de afdeklaag tot het einde: het is papier en scheurt snel. Ook handig om LED's vanaf voren nog te kunnen bereiken.

Ik gebruikte een rol tekenpapier (waarschijnlijk vellum, misschien mylar). Wat je zoekt: translucide papier, breed genoeg voor het hele paneel zonder naad. Verkrijgbaar in kunstwinkels of online.

Om het papier te fixeren: lijn wit lijm (Elmers) langs de bovenrand van de verticale lamellen. Horizontale niet nodig. Papier erop leggen, zware boeken erop voor droging.

Na drogen: overschot afknippen. Laat een beetje extra om randen om te vouwen en te tapen, zodat randen niet oplossen.

Klaar voor de Weg

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

  • Arduino en voeding achteraan met Velcro bevestigen
  • Verbindingen vasttapen zodat ze niet loskomen
  • Band om te dragen: geweven duct strap (had ik liggen als het tekenpapier)
  • Pac-Man muziek en geluidseffecten op telefoon + Bluetooth speaker

Resultaat

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

Klaar! Stuur je 8-bit gezin de buurt in om de buren te imponeren en je zoete zoete snoepwinst te bemachtigen.

Bedankt voor lezen! Vragen? Stel ze gerust!

Aangepaste Onderdelen en Behuizingen

  • ghostlaser-1_8th_v5_feTmMAM4r0.dwg – Laserbestanden voor spookkostuum uit 1/8" karton, ingesteld voor 32"x18" lasersnijder bed.
  • pacman-mspacman-laser_KVFskMrPk4.dwg – Laserbestanden voor Ms. Pac-Man en Pac-Man.

Schema's

Hoe LED's, Arduino en powerbank aan te sluiten:

DIY Pac-Man LED Pixels Paneel Kostuum: Bouw een Gloeiende Halloween Klassieker

Productieproces

  1. Light-Emitting Diodes: Van Ontstaan tot 100-Jarige Levensduur
  2. Arduino Nano Flight Simulator 2020 Bedieningspaneel – LCD & CDI Display
  3. Arduino-gebaseerd schakelaar- & LED-paneel voor Microsoft Flight Simulator 2020
  4. Arduino Coffin Dance Melodie Project – Bouw & Speel de Virale Tune
  5. DIY Wolk Kostuum: LED-strip, Arduino Nano & SparkFun Onderdelen
  6. Bouw een Indrukwekkende 5x5x5 LED-kubus met Arduino Mega
  7. Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
  8. Geluidsgeactiveerd 8-LED Lichtdisplay met Arduino
  9. Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding
  10. Pixel Chaser: Interactieve één-tik LED-spel met Arduino Nano
  11. Arduino RGB LED Kleurmixer – Beginner-vriendelijk DIY-project