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

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:
            pixels.brightness = 1
        elif (get_voltage(analog_in)) > 0.5 and (get_voltage(analog_in)) <= 1:
            pixels.brightness = 0.8
        elif (get_voltage(analog_in)) > 1 and (get_voltage(analog_in)) <= 1.5:
            pixels.brightness = 0.5
        elif (get_voltage(analog_in)) > 1.5 and (get_voltage(analog_in)) <= 2:
            pixels.brightness = 0.3
        elif (get_voltage(analog_in)) > 2 and (get_voltage(analog_in)) <= 2.5:
            pixels.brightness = 0.1
        elif (get_voltage(analog_in)) > 2.5 and (get_voltage(analog_in)) <= 3:
            pixels.brightness = 0.05
        else:
            pixels.brightness = 0.01
        if not switch.value:
            mode = (mode + 1) % 2
            time.sleep(0.01)  # debounce delay
            while not switch.value:
                time.sleep(0.1)
        if mode == 0:
            rainbow_cycle(0, 0, 11, j)
            if (j % blinkvarde == 0):
                sparkle(11, 19, WHITE)
            rainbow_cycle(0, 19, 23, j)
        else:
            color_chase (0, 11, WHITE, 0.1)
            color_chase (0, 11, BLACK, 0.1)
            color_chase (11, 19, WHITE, 0.3)
            color_chase (11, 19, BLACK, 0.3)
            color_chase (19, 23, WHITE, 0.5)
            color_chase (19, 23, BLACK, 0.5)
        pixels.show()

 

Gå på konsert

Hur det gick i säkerhetskontrollen på konserten? Fint. Jag fick frågan vad kablarna som stack ut ur tröjan var till för – min belysning i tröjan svarade jag. Sen var det bara att kliva in.

Många glada leenden och tillrop fick jag också.