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

Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie

Onderdelen en Benodigdheden

Onderdeel Aantal Opmerkingen
NeoPixel strip 1 Kan vervangen worden door individuele RGB LEDs.
Arduino 101 1
SparkFun Drukknop 12mm 1
Weerstand 10k ohm 1
Draadjes (generiek) 1 Je hebt misschien lange draden nodig om LEDs van schouder naar hand te leiden.
9V batterij (generiek) 1
9V naar Barrel Jack Connector 1
Adafruit Flora RGB Neopixel LEDs - Pak van 4 1 Kan de NeoPixel strip vervangen.
Naambare Conductieve Draad 1 Optie om sommige draden te vervangen.

Benodigde Tools en Machines

Lijmpistool (generiek)
Naaimachine (generiek)
Solderbout (generiek)

Apps en Online Diensten

Arduino IDE

Over dit Project

Inleiding

Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie
Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie

Ik ben ingenieur en kunstenaar die geniet van projecten die wetenschap en kunst combineren. Ik maak al een tijdje jurkontwerpen met ingebouwde microcontrollers, zodat bepaalde functionaliteit van elektronische componenten het ontwerpsthema kan versterken. Voor dit project wil ik de Pattern Matching Engine (PME) en de accelerometer in de Intel Curie op de Arduino 101 gebruiken. Curie is gemaakt voor PME-toepassingen omdat het neurale netwerkcapaciteiten heeft, maar er zijn nog niet veel PME-voorbeelden. Ik hoop dat dit voorbeeld je inspireert om Curie's PME-potentieel te benutten.

De jurk gebruikt een pagina uit mijn graphic novel als stof. Een wetenschapper en haar robot kijken door een telescoop. Terwijl de drager een patroon in de lucht tekent, zullen een set LEDs die in de vorm van sterrenbeelden zijn gerangschikt, in de nachtelijke hemel op de stof oplichten.

Instructies

Let op: na publicatie van dit project heb ik het elektronische circuit gedeelte verbeterd. Een verbeterde methode om de LEDs aan de stof te bevestigen en ze duurzaam te maken, is hieronder na stap 3 gepubliceerd.

Update: Het dragen van deze jurk bij een paar ganse-dag demo-evenementen gaf een schatting van de batterijduur. Om de jurk te voeden, moet de 9V-batterij ongeveer elke 3 uur worden vervangen. De batterij raakt niet leeg, maar daalt onder de 9V, wat inefficiënt is voor patroonherkenning. Je kunt de batterij voor andere doeleinden bewaren.

Stap 1

Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie

Ik gebruikte een NeoPixel strip van Adafruit, knipte deze in stukken en rangschikte ze in de vorm van sterrenbeelden. Voel je vrij om andere LED-typen te gebruiken zoals individuele RGB LEDs.lijm of naai ze op de basistof.

Stap 2

Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie

Plaats een interfacing stof erbovenop en je kunt de sterrenbeelden uitlijnen. Deze stap is optioneel, maar ik vond het handig om meerdere lagen stof te hebben voor de structuur. Ik naaide eigenlijk nog een dikke stof aan de achterkant van de basistof. Dus in totaal drie lagen als basis, met de LEDs ertussen in.

Stap 3

Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie

Solder de LEDs. Als je de naaibare individuele LEDs gebruikt, kun je ook conductieve draad gebruiken om ze te verbinden. Ofzo, het is veel handwerk en vereist geduld. Omdat ik vier sterrenbeelden heb (Orion, Grote Beer, Cygnus en Cassiopeia), verdeelde ik ze in vier sporen. Elk wordt aangesloten op een andere Arduino 101 pin.

Verbeterde Stappen

De stof die ik voor de bovenstaande stappen gebruikte was te zacht, wat het makkelijk maakt om de LEDs en draden te buigen, waardoor de soldeerverbindingen breken. Ik herhaalde het hele proces met de volgende verbeterde methode.

Positioneer de LEDs

Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie

Ik gebruikte een NeoPixel strip van Adafruit en knipte deze in stukken, gerangschikt in sterrenbeelden. Voel je vrij om andere LED-typen te gebruiken. Lijm of naai ze op de basistof.

Vilt is een mooi type dikke stof die structuur geeft en goed werkt met hete lijm. Rangschik de LEDs op de juiste posities zodat ze, wanneer ze oplichten, de sterren in de sterrenbeelden weerspiegelen.

Plan de LEDs en Draden

Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie

Lijm de LED-strips op een paar punten op het vilt. Lijm niet onder de hele strip, want je hebt ruimte nodig om krimpkousen om de soldeerplaatsen te schuiven, zoals in de figuur getoond. Knip gedraaide draden op de juiste lengte en plaats ze op hun relatieve posities op hetzelfde stuk vilt. Ik raad aan om de draden nog niet vast te lijmen. Mijn figuur hier is een fout in die zin. Beter is om de draden met tijdelijke tape in positie te houden, zodat bij het solderen de draadposities aangepast kunnen worden.

Maak Alle Stukken Klaar om te Naaien

Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie

De figuur toont dat ik vier sterrenbeelden (Orion, Grote Beer, Cygnus en Cassiopeia) op vier losse stukken voorbereidde. Na solderen en krimpkousen om de soldeerplaatsen kun je alles stevig op het vilt lijmen.

Testen!

Test je circuit voordat je verdergaat! Kan gewoon een NeoPixel Strandtest doen voor elk spoor.

Okay, ik zet het niveau op "Makkelijk" omdat wetenschappelijk gezien het niet moeilijk is zodra je de code begrijpt, maar het kost veel werk om de kabels op de stof te stabiliseren.

Zorg dat je Arduino IDE de nieuwste versie is en de Curie PME bibliotheek heeft. Ik raad de Arduino Web Editor aan. Download de bibliotheek hier.

Maak de Jurk

In parallel (figuurlijk), maak de jurk. Na het testen van het circuit, naai de basistoffen met de LEDs aan de binnenkant van de jurk. De LEDs schijnen door de graphics.

Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie
Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie
Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie
Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie

Zoals je ziet, zit de Arduino 101 in mijn hand. Ik maakte een 3D-geprinte behuizing voor de Arduino 101 en batterij. Er lopen lange draden tussen de LEDs en het bord, verborgen in de mouw.

De code hieronder geeft informatie over hoe het bord geprogrammeerd is. Na het flashen van de code, train de neuronen eerst zodat ze leren welke patronen er zijn. Bekijk de video rond 0:30:

Voor meer foto's en andere tech-fashion/schilderijen-op-stof ontwerpen, check mijn website :)

Code

PME_4LED_new.ino (Arduino)

/* 
 * Dit voorbeeld demonstreert het gebruik van de Pattern Matching Engine (CuriePME)
 * om stroomversnellingdata van CurieIMU te classificeren.
 * 
 * Eerst vraagt de sketch je om letters in de lucht te tekenen (voorstel je dat je
 * schrijft op een onzichtbaar whiteboard, met je bord als pen), en de IMU-data
 * van deze bewegingen wordt gebruikt als trainingsdata voor de PME. Eenmaal getraind,
 * kun je blijven tekenen en de PME probeert te raden welke letter je tekent.
 * 
 * Dit voorbeeld vereist een knop aangesloten op digitale pin 4
 * https://www.arduino.cc/en/Tutorial/Button
 * 
 * OPMERKING: Voor beste resultaten, teken grote letters, minimaal 30-60 cm hoog.
 * 
 * Copyright (c) 2016 Intel Corporation. Alle rechten voorbehouden.
 * Zie licentiekennisgeving aan het einde van het bestand.
 */

#include "CurieIMU.h"
#include "CuriePME.h"
#include <CurieSerialFlash.h>
#include <SPI.h>
#include <Adafruit_NeoPixel.h>

#define PINM 6  // Waar zijn de NeoPixels aangesloten?
#define PINC 3
#define PINS 9
#define PINO 5

Adafruit_NeoPixel stripM = Adafruit_NeoPixel(10, PINM, NEO_GRB + NEO_KHZ800); // 10 pixels per strip
Adafruit_NeoPixel stripS = Adafruit_NeoPixel(10, PINS, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripC = Adafruit_NeoPixel(10, PINC, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel stripO = Adafruit_NeoPixel(10, PINO, NEO_GRB + NEO_KHZ800);

int tr = 0, tg = 0, tb = 0, r = 0, g = 0, b = 0;
int rawX = 0, rawY = 0; // versnelling waarden
float angle = 0.0;

const unsigned int trainingReps = 4; // Herhalingen per letter tijdens training
const unsigned char trainingStart = 'A';
const unsigned char trainingEnd = 'D'; // Alleen A-D voor demo (4 letters)
const unsigned int buttonPin = 4;
const unsigned int sampleRateHZ = 200;
const unsigned int vectorNumBytes = 128;
const unsigned int samplesPerVector = (vectorNumBytes / 3);
const unsigned int upperStart = 0x40;
const unsigned int sensorBufSize = 2048;
const int IMULow = -32768;
const int IMUHigh = 32767;
const char *filename = "NeurDataDress.dat";

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
  CurieIMU.begin();
  CuriePME.begin();
  CurieIMU.setAccelerometerRate(sampleRateHZ);
  CurieIMU.setAccelerometerRange(2);
  
  if (!SerialFlash.begin(ONBOARD_FLASH_SPI_PORT, ONBOARD_FLASH_CS_PIN)) {
    Serial.println("Kan SPI Flash chip niet benaderen");
  }
  
  stripM.begin(); stripS.begin(); stripC.begin(); stripO.begin();
  stripM.show(); stripS.show(); stripC.show(); stripO.show();
  solidM(stripM.Color(255, 0, 0), 50); // Rood = klaar voor input
}

// Herstel netwerk kennis uit SPI Flash
void restoreNetworkKnowledge() {
  SerialFlashFile file;
  int32_t fileNeuronCount = 0;
  Intel_PMT::neuronData neuronData;
  
  file = SerialFlash.open(filename);
  CuriePME.beginRestoreMode();
  
  if (file) {
    while (1) {
      Serial.print("Neuron lezen: ");
      uint16_t neuronFields[4];
      file.read((void*)neuronFields, 8);
      file.read((void*)neuronData.vector, 128);
      
      neuronData.context = neuronFields[0];
      neuronData.influence = neuronFields[1];
      neuronData.minInfluence = neuronFields[2];
      neuronData.category = neuronFields[3];
      
      if (neuronFields[0] == 0 || neuronFields[0] > 127) break;
      
      fileNeuronCount++;
      Serial.print(fileNeuronCount); Serial.print("\n");
      Serial.print(neuronFields[0]); Serial.print("\t");
      Serial.print(neuronFields[1]); Serial.print("\t");
      Serial.print(neuronFields[2]); Serial.print("\t");
      Serial.print(neuronFields[3]); Serial.print("\t");
      Serial.print(neuronData.vector[0]); Serial.print("\t");
      Serial.print(neuronData.vector[1]); Serial.print("\t");
      Serial.print(neuronData.vector[2]); Serial.print("\n");
      
      CuriePME.iterateNeuronsToRestore(neuronData);
    }
  }
  CuriePME.endRestoreMode();
  Serial.print("Kennis Set Hersteld.\n");
}

boolean longPress = false;
int startTime = 0;
int lastOrientation = -1;
int lastReading = -1;
boolean lastPress = false;

void loop() {
  int orientation = -1;
  String orientationString;
  
  int x = CurieIMU.readAccelerometer(X_AXIS);
  int y = CurieIMU.readAccelerometer(Y_AXIS);
  int z = CurieIMU.readAccelerometer(Z_AXIS);
  
  int absX = abs(x), absY = abs(y), absZ = abs(z);
  
  if ((absZ > absX) && (absZ > absY)) {
    if (z > 0) { orientationString = "boven"; orientation = 0; }
    else { orientationString = "onder"; orientation = 1; }
  } else if ((absY > absX) && (absY > absZ)) {
    if (y > 0) { orientationString = "digitaal pinnen boven"; orientation = 2; }
    else { orientationString = "analog pinnen boven"; orientation = 3; }
  } else {
    if (x < 0) { orientationString = "connector boven"; orientation = 4; }
    else { orientationString = "connector onder"; orientation = 5; }
  }
  
  if (orientation != lastOrientation) {
    Serial.println(orientationString);
    lastOrientation = orientation;
  }
  
  int reading = digitalRead(buttonPin);
  if (lastReading != reading) {
    Serial.print("buttonPin="); Serial.println(reading);
    lastReading = reading;
  }
  
  if (reading == HIGH) {
    if (startTime == 0) startTime = millis();
    else if ((millis() - startTime) > 2000) {
      longPress = true;
      if (!lastPress) {
        Serial.println("longPress");
        solidM(stripM.Color(0, 255, 0), 50); // Groen = lange druk
        lastPress = true;
      }
    }
  }
  
  if (reading == LOW && longPress) {
    blackout(5);
    Serial.print("orientation="); Serial.print(orientation);
    Serial.print(" SerialFlash.exists(filename)="); Serial.println(SerialFlash.exists(filename));
    
    if (orientation != 4 && SerialFlash.exists(filename)) {
      restoreNetworkKnowledge();
      Serial.print("Training hersteld.");
    } else {
      trainLetters();
      blackout(5);
      Serial.print("Training voltooid.");
    }
    
    Serial.println(" Nu, teken enkele letters (onthoud de knop");
    Serial.println("ingedrukt) en zie of de PME ze kan classificeren.");
    solidM(stripM.Color(0, 0, 255), 500); // Blauw = klaar voor matchen
    blackout(5); // Uit voor matchen
    
    while (true) { match(); }
  }
}

// LED helper functies (solidM, blackout, match, colorWipe, theaterChase, trainLetter, trainLetters, saveNetworkKnowledge, etc.)
// Zie volledige code in originele bron voor alle helper functies.
// Belangrijkste: match() leest IMU vector, classify met PME, laat bijbehorende sterrenbeeld LEDs oplichten.

PME_LED (Arduino - Vereenvoudigde Versie)

/* 
 * Vereenvoudigde versie: Curie PME bestuurt LEDs.
 * Combinatie van "Draw in the Air" PME code en Adafruit NeoPixel voorbeeld.
 * Pas aan voor jouw specifieke LED-indeling.
 */

#include "CurieIMU.h"
#include "CuriePME.h"
#include <Adafruit_NeoPixel.h>

#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(54, PIN, NEO_GRB + NEO_KHZ800);

const unsigned int trainingReps = 4;
const unsigned char trainingStart = 'A';
const unsigned char trainingEnd = 'D';
const unsigned int buttonPin = 4;
const unsigned int sampleRateHZ = 200;
const unsigned int vectorNumBytes = 128;
const unsigned int samplesPerVector = (vectorNumBytes / 3);
const unsigned int upperStart = 0x40;
const unsigned int sensorBufSize = 2048;
const int IMULow = -32768;
const int IMUHigh = 32767;

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
  CurieIMU.begin();
  CuriePME.begin();
  CurieIMU.setAccelerometerRate(sampleRateHZ);
  CurieIMU.setAccelerometerRange(2);
  trainLetters();
  strip.begin();
  strip.show();
}

void loop() {
  Serial.println("Training voltooid. Teken letters (houd knop ingedrukt)...");
  
  byte vector[vectorNumBytes];
  unsigned int category;
  char letter, pattern;
  
  readVectorFromIMU(vector);
  category = CuriePME.classify(vector, vectorNumBytes);
  
  if (category == CuriePME.noMatch) {
    Serial.println("Herken niet - probeer opnieuw.");
    theaterChase(strip.Color(127, 127, 127), 50); // Wit theater chase
    strip.show();
  } else {
    letter = category + upperStart;
    pattern = letter;
    
    if (pattern == 'A') { colorWipe(strip.Color(0, 255, 0), 50); theaterChase(strip.Color(127,127,127),50); } // Groen
    else if (pattern == 'B') { colorWipe(strip.Color(255, 0, 0), 50); theaterChase(strip.Color(127,127,127),50); } // Rood
    else if (pattern == 'C') { colorWipe(strip.Color(0, 0, 255), 50); theaterChase(strip.Color(127,127,127),50); } // Blauw
    else if (pattern == 'D') { colorWipe(strip.Color(255, 0, 255), 50); theaterChase(strip.Color(127,127,127),50); } // Magenta
    
    strip.show();
    Serial.println(letter);
  }
}

// Helper functies: readVectorFromIMU, undersample, getAverageSample, trainLetter, trainLetters
// Theater chase, colorWipe, rainbowCycle, Wheel - allemaal van Adafruit Strandtest voorbeeld
// Zie originele code voor volledige implementatie

Schema's

Het is gewoon de LEDs verbinden met de Arduino 101 pinnen en een knop op pin 4 (zoals beschreven in de code: https://www.arduino.cc/en/Tutorial/Button). Het schema is vergelijkbaar met deze Fritzing van Adafruit: https://learn.adafruit.com/adafruit-neopixel-uberguide/basic-connections

Ik stopte de 9V batterij direct in de barrel jack.

Arduino 101: Bouw een Patroon-Herkenende LED Jurk met Intel Curie

Productieproces

  1. De Evolutie en Productie van Massa-geproduceerde Kledingpatronen
  2. DHT11 Temperatuur- & Vochtigheidsensor Project met LED-indicatoren en Piezo-luidspreker
  3. Bluetooth-gecontroleerde Arduino Spybot bouwen
  4. FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen
  5. DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
  6. Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
  7. Verander je MIDI-toetsenbord in een slimme pianotutor met Arduino, LEDs en MuseScore
  8. LED's bedienen met Alexa via Raspberry Pi – Eenvoudige stapsgewijze handleiding
  9. Find Me: Slimme Item Locator met Arduino en Bluetooth
  10. Geoptimaliseerde Voedingsoplossingen voor Arduino Projecten
  11. Jumper Wires Elimineren: Hoe BreadShield Arduino Direct Met Breadboards Verbindt