Kategori: Wearables
Lysande konserttröja
Våren 2011 fick jag mitt första wearables-projekt i present. Ett kit som jag raskt bestämde mig för att pimpa en tröja med till en konsert.
Våren 2018 var det dags för ny konsert med samma band och jag tyckte det var dags för en rejäl uppdatering av projektet eftersom både tekniken och mina kunskaper utvecklats sedan dess.
Blir du också sugen? Så här gör du:
Material
1 Gemma M0
1 Batteri
23 Neopixlar
1 vridpotentiometer
1 tryckknapp
Kablage
Tyg
Pennor
Nål och tråd
Material för ljusspridning
Textilfärg
Låda för elektronik
Krympslang för skarvar
Vill du också ge bort ett wearables-projekt till någon i din närhet? Den här länken lägger smidigt allt i det här projektet i din kundkorg hos oss, så du har något att utgå ifrån.
Introduktion
Liksom många av våra wearables-projekt så börjar även detta med en Gemma M0 och ett gäng lysdioder (Neopixlar).
Dessutom ingår en vridpotentiometer för att reglera ljusstyrkan och en knapp för att välja program.
Projektet är modulärt och således flyttbart mellan olika plagg. Allt för att göra det lättare att tvätta plagget utan att behöva tvätta elektroniken.
Projekt av den här typen kan kopplas ihop genom att sy ledarna med ledande sytråd, men för så här stora projekt är det trevligare att löda tunn silikonklädd kabel.
Skissa
Börja med att skissa hur du vill att dioderna ska sitta och hur många de ska vara. Jag utgick från en gammal konsert-t-shirt och skissade av den på ett nytt tyg med några justeringar.
Jag bestämde mig för tre olika zoner varav den översta och understa hänger ihop och den i mitten styrs för sig. I mitt projekt går det åt 23 Neopixlar (11 + 8 + 4).
Bygg
Jag placerade ut pixlarna på min skiss och måttade ungefär hur långa kabelsnuttar jag behövde ha emellan dem. Sen väntade en del lödande. Tre kablar ska gå mellan alla Neopixlarna (Vout, D0 och GND från Gemma M0). Jag valde den tunnaste silikonklädda kabeln vi säljer och tänkte att vitt blir minst synligt (även om det är lättare att felsöka om kablarna har olika färg och jag egentligen rekommenderar det).
På topptyget fyllde jag först i alla konturer med svart textilpenna. Därefter fyllde jag i motivet med textilfärg. I det här fallet en extremt glittrig variant, så tröjan blir presentabel även i solsken (lysdioder blir inte alls så effektfulla i solsken nämligen).
På bottentyget fästs lysdioderna och deras kablage med vanlig sytråd. Sedan sys bottentyget fast på plagget. Slutligen fästs ett mellanlager som är till för att sprida ljuset tillsammans med det översta tyget med snabb tråckling på plagget. Jag gjorde motivet lite större en bottentyget. Mellanlagret råkade i det här fallet bli en bit packmaterial (tunn och böjlig cellplast), men det kan vara ett extra lager tyg också. Mitt bottentyg är t-shirt-tyg och mitt topptyg är lakansväv.
För att skydda styrelektroniken placeras den i en liten låda med lock. Jag skar ut hål för kablarna på sidan. Lådan kunde jag sedan stoppa i byxfickan. Jag borrade även hål så jag kunde sticka ut potentiometern och knappen, så de blev åtkomliga från utsidan. Det hade varit trevligt att även kunna dra ut Gemmans on/off-knapp på utsidan av lådan, men det får bli ett senare projekt. En bit tyg agerar dragavlastning och skyddar kablarna på väg in i lådan.
Lådan är mysigt inredd med cellplast och kartongbitar.
Programmera
Det är alltid en avvägningsfråga att välja styrenhet. Gemma M0 är visserligen liten, smidig och lättprogrammerad, men den har bara tre in/utgångar. I det här projektet används en utgång till Data in på Neopixlarna, en ingång används till potentiometern och en till knappen, så det räcker precis.
Programmet är skrivet i micropython på Gemma M0, på samma sätt som beskrivs i armbandsprojektet. Den största skillnaden är tillägget med trimpotentiometer för att justera ljusstyrkan. Jag valde att göra justeringen i diskreta steg (som jag själv kunde välja) efter att först ha testat att justera ljusstyrkan linjärt. I det fallet prioriterar jag snyggare funktion framför snyggare kod. 🙂
Mitt program har två olika lägen för olika mönster. I det första växlar pixlarna under texten med regnbågsfärger medan mittenblocket blinkar i vitt. I det andra tänds (och släcks) de olika blocken med vitt ljus, en lysdiod i taget. Filmsekvenserna nedan visas med förhöjd hastighet.
Koden:
#Konserttröja
import time
import board
import neopixel
import random
from digitalio import DigitalInOut, Direction, Pull
from analogio import AnalogIn
switch = DigitalInOut(board.D0)
switch.direction = Direction.INPUT
switch.pull = Pull.UP
analog_in = AnalogIn(board.A1)
pixel_pin = board.A0
num_pixels = 23
blinkvarde = 9 # hastighet på blinkandet på de vita dioderna, ju högre desto
# långsammare blink
mode = 0 # vad ska hända med pixlarna? 0 sparkle, 1 color_chase
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.1,
auto_write=False)
sparkles = [-1 for x in range(4)]
def wheel(pos):
# Input a value 0 to 255 to get a color value.
# The colours are a transition r - g - b - back to r.
if pos < 0 or pos > 255:
return (0, 0, 0)
if pos < 85:
return (255 - pos * 3, pos * 3, 0)
if pos < 170:
pos -= 85
return (0, 255 - pos * 3, pos * 3)
pos -= 170
return (pos * 3, 0, 255 - pos * 3)
def rainbow_cycle(wait, start, stop, j):
for i in range(start, stop):
rc_index = (i * 256 // num_pixels) + j
pixels[i] = wheel(rc_index & 255)
time.sleep(wait)
def color_chase(start, stop, color, wait):
for i in range(start, stop): # intervallet måste inkludera nästa pixel efter
pixels[i] = color
time.sleep(wait)
pixels.show()
time.sleep(0.01)
def sparkle(start, stop, color):
for i in range(len(sparkles)):
old_led = sparkles[i]
new_led = random.randrange(start, stop)
# turn of old led, if lit
if old_led != -1:
pixels[old_led] = (0, 0, 0)
# turn on new led and store it
pixels[new_led] = color
sparkles[i] = new_led
def get_voltage(pin):
return (pin.value * 3.3) / 65536
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
while True:
for j in range(0, 256, 3):
if (get_voltage(analog_in)) 0.5 and (get_voltage(analog_in)) 1 and (get_voltage(analog_in)) 1.5 and (get_voltage(analog_in)) 2 and (get_voltage(analog_in)) 2.5 and (get_voltage(analog_in))
Elektrisk textilslöjd på nytt sätt
Projektet kan fästas på valfri textil: en väska, ett gosedjur, en tröja eller, som i vårt exempel i filmen, på ett pennfodral.
(Det går att tvätta projektet försiktigt för hand när det är klart, men batteriet måste tas bort först. Att tvätta sliter dock på ledningarna, så det är bättre att placera elektroniken på något som inte måste tvättas.)
Produkter som används:
Gemma m0
Neopixlar
Batterihållare
Batterier 2 st CR2032
Ledande sytråd
Nålar
Testkablage
Vanlig sytråd
Papper och pennor
Pennfodral eller annan textil
Här är en smidig länk till en färdig varukorg med de varor vi säljer till det här projektet: textilslöjdsprojekt
Vill du köpa en klassuppsättning för 15 elever och 1 lärare, använd den här länken istället.
Kolla gärna vår inspirationsfilm.
Lektion 1: Sy ihop
Börja med att skissa hur du tänker att kretsen ska se ut och fundera på hur du tänker fästa det på din textil. Observera att ledningarna inte får korsa varandra (då blir det kortslutning). (Det går att bygga korsningar om man verkligen vill genom att isolera trådarna i korsningen (enklast med krympslang), men det är säkrare att låta bli.)
Koppla därefter upp kretsen med testkablaget för att se att allt fungerar som du tänkt.
Testa en prototypkoppling först:
När du köper paketet är styrkretsen redan programmerad med ett medföljande program, men det känner inte till de extra två lysdioderna vi ska sy dit, så vi behöver lägga till ett annat program.
Koppla in Gemman med en USB-kabel till datorn. Gemman kommer dyka upp som en extern disk. Var alltid noggrann med att mata ut den externa disken innan du drar ur kontakten, så slipper du eventuella problem med att Gemman fastnar i ett konstigt mellanläge.
Kopiera hem filen som presenteras nedan och spara den med namnet code.py
# elektrisk textilslöjd del 3
import time
import board
import neopixel
import adafruit_dotstar as dotstar
# led på Gemma M0
dot = dotstar.DotStar(board.APA102_SCK, board.APA102_MOSI, 1, brightness=0.1)
pixel_pin = board.A0 # neopixlarnas utgång
num_pixels = 2 # antal neopixlar i slingan
num_leds = num_pixels + 1 # antal leds inklusive den på Gemma M0
pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.1, auto_write=False)
def wheel(pos):
# Input a value 0 to 255 to get a color value.
# The colours are a transition r - g - b - back to r.
if pos < 0 or pos > 255:
return (0, 0, 0)
if pos < 85:
return (255 - pos * 3, pos * 3, 0)
if pos < 170:
pos -= 85
return (0, 255 - pos * 3, pos * 3)
pos -= 170
return (pos * 3, 0, 255 - pos * 3)
def calc_wheel_pos(led_index, j):
return ((led_index * 256 // num_leds) + j) & 255
def rainbow_cycle(wait):
for j in range(255):
for i in range(num_pixels):
pixels[i] = wheel(calc_wheel_pos(i, j))
pixels.show()
dot[0] = wheel(calc_wheel_pos(num_pixels, j))
dot.show()
time.sleep(wait)
while True:
rainbow_cycle(0) # Increase the number to slow down the rainbow
Dra och släpp den till Gemma-disken, så ska det nya programmet börja köras automatiskt.
Stäng av Gemman innan du börjar prototypkoppla och koppla även bort USB-kabeln.Anslut en svart kabel från GND på Gemma till – på första neopixeln.Anslut en röd kabel från Vout på Gemma till + på första neopixeln.Anslut en kabel av någon annan färg (till exempel blå) från Gemmas digitala utgång D1 till anslutningen med en pil in mot dioden på första neopixeln.
Anslut en micro-USB-kabel som ger Gemman +5V till micro-USB-ingången på Gemman. Alternativt stoppa i två CR2032 i batterihållaren och koppla in den på Gemmans batteriingång.Sätt switchen på Gemma till On.Njut av den blinkande dioden!
Stäng av Gemman och koppla ifrån strömmen. Koppla därefter in även nästa neopixel på samma sätt.
Dags att sy:
Fäst tråden på undersidan av tyget till exempel genom att slå en knut. Börja med exempelvis jordledningen. Sy några extra varv i Gemmans anslutning så den säkert får kontakt. Sy därefter med förstygn till den första dioden. Sy några varv i neopixelns -ingång och sy vidare mot nästa neopixel. Fäst tråden några varv i andra neopixelns -ingång och fäst den därefter på baksidan.Sy övriga ledare på samma sätt. Observera att den blå ledaren sys i två delar och inte kopplas ihop hela vägen.Ledarna får inte korsa varandra eller ha kontakt – då blir det kortslutning och dioderna kommer inte lysa.Det är viktigt att sy några varv extra runt anslutningspunkterna för att det säkert ska bli kontakt.Sy fast Gemman med vanlig sytråd i underlaget. Använd några av de oanvända anslutningarna.Sy fast batterihållaren och fäst gärna kablarna mellan den och Gemman lite på vägen som dragavlastning.
Tips:
Skissa först hur kretsen är tänkt att sys för att ha kontroll på att inga trådar behöver korsas. Det går utmärkt att använda sömmen som ett dekorativt inslag, så det är inte nödvändigt att sy kortaste vägen.Vaxa gärna tråden så håller den ihop bättre och blir enklare att sy med.Klipp tråden med något annat än den finaste sysaxen – det är metalltråd.Klipp av ungefär så lång bit som behövs till just den slinga som ska sys. Tråden slits snabbt och fransas lätt upp för varje gång den dras genom tyget.Om något behöver repas upp är det bättre att ta ny tråd än försöka återanvända den.Testa ofta så blir det lättare att felsöka. Sy till exempel en anslutning och testa resten med kablar. Funkar det fortfarande? Fortsätt sy.
Felsökning:
Har tråden fransats upp någonstans så att något får kontakt som inte borde ha det?Klipp bort lösa småtrådar och limma eventuellt sömmen med textillim.Är kretsen glapp? Det vill säga funkar den ibland och om du böjer på tyget?Du kan behöva fästa komponenterna ytterligare med sytråd för att de ska sitta stilla och kanske sy lite extra runt paddarna (anslutningspunkterna på komponenterna) med ledande tråd.
Om du dekorerar ett pennfodral, tänk på att inte lägga metallsaker i det som skulle kunna kortsluta kretsen. Alternativt, sy ett foder!
Lektion 2: Programmera hela härligheten
Kolla gärna in vår inspirationsfilm först.
Vårt program använder den inbyggda lysdioden på Gemman samt de två ditsydda och växlar dem alla i en kontinuerlig regnbåge.
Programmeringsspråket som används heter Python. Vi har skrivit en introduktion till programmering i Python här om du vill fördjupa dig.
Annars är det bara att kasta sig in och redigera koden försiktigt. Du kan använda valfri texteditor, men en lättanvänd variant är mu som även Adafruit själva rekommenderar. Du kan läsa mer om den här.
Det fiffiga med Gemma M0 är att koden automatiskt kompileras och laddas upp varje gång du trycker på spara, så det har blivit väsentligt mycket enklare att programmera själv än det var med tidigare versioner av Gemma.
Det du ska vara uppmärksam på är att Python använder indentering för att hålla reda på hur funktionerna hänger ihop (istället för exempelvis parenteser som är vanligt i andra programmeringsspråk) och är därför extremt känsligt för antalet mellanslag och tab:ar. Tänk på detta när du börjar redigera koden eftersom så lite som ett mellanslag på fel ställe kan få koden att sluta fungera.
Ett annat exempel som du kan testa istället fokuserar bara på de ditsydda dioderna, men går igenom olika färger och blinkmönster.
# CircuitPython demo - NeoPixel
import time
import board
import neopixel
pixel_pin = board.A0
num_pixels = 2 # Antalet ditsydda dioder
pixels = neopixel.NeoPixel(pixel_pin, num_pixels,
brightness=0.3, auto_write=False) # brightness anger ljusstyrkan i procent, 0.3 = 30%
def wheel(pos):
# Input a value 0 to 255 to get a color value.
# The colours are a transition r - g - b - back to r.
if pos < 0 or pos > 255:
return (0, 0, 0)
if pos < 85:
return (255 - pos * 3, pos * 3, 0)
if pos < 170:
pos -= 85
return (0, 255 - pos * 3, pos * 3)
pos -= 170
return (pos * 3, 0, 255 - pos * 3)
def color_chase(color, wait):
for i in range(num_pixels):
pixels[i] = color
time.sleep(wait)
pixels.show()
time.sleep(0.5)
def rainbow_cycle(wait):
for j in range(255):
for i in range(num_pixels):
rc_index = (i * 256 // num_pixels) + j
pixels[i] = wheel(rc_index & 255)
pixels.show()
time.sleep(wait)
# Här kan du definiera egna färger, eller byta nyansen på de förprogrammerade
RED = (255, 0, 0)
YELLOW = (255, 150, 0)
GREEN = (0, 255, 0)
CYAN = (0, 255, 255)
BLUE = (0, 0, 255)
PURPLE = (180, 0, 255)
while True:
pixels.fill(RED)
pixels.show()
# Increase or decrease to change the speed of the solid color change.
time.sleep(1)
pixels.fill(GREEN)
pixels.show()
time.sleep(1)
pixels.fill(BLUE)
pixels.show()
time.sleep(1)
color_chase(RED, 0.1) # Increase the number to slow down the color chase
color_chase(YELLOW, 0.1)
color_chase(GREEN, 0.1)
color_chase(CYAN, 0.1)
color_chase(BLUE, 0.1)
color_chase(PURPLE, 0.1)
rainbow_cycle(0) # Increase the number to slow down the rainbow
Lycka till!

Kul att du gillar vår blogg!
Skriv upp dig på vår maillista för att få allt det senaste från m.nu - Nya produkter, kampanjer och mycket mer!
Wohoo! Du är nu med på maillistan!