Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Arduino 101 - Gaun Pencocokan Pola Curie Intel

Komponen dan persediaan

strip NeoPixel
Dapat diganti dengan LED RGB individual.
× 1
Arduino 101
× 1
Sakelar Tombol Tekan SparkFun 12mm
× 1
Resistor 10k ohm
× 1
Kabel jumper (generik)
Anda mungkin memerlukan kabel panjang untuk memandu LED dari bahu ke tangan.
× 1
Baterai 9V (generik)
× 1
Konektor 9V ke Barrel Jack
× 1
Adafruit Flora RGB Neopixel LED- Paket 4
Ini dapat digunakan untuk mengganti strip Neopiksel.
× 1
Benang Konduktif yang Dapat Dijahit
Opsi untuk mengganti beberapa kabel.
× 1

Alat dan mesin yang diperlukan

Pistol lem panas (generik)
mesin jahit (generik)
Besi solder (generik)

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Pendahuluan

Saya seorang insinyur dan seniman yang menyukai proyek yang menggabungkan sains dan seni. Saya telah membuat desain pakaian dengan mikrokontroler yang tertanam di dalamnya sehingga fungsionalitas tertentu dari komponen elektronik dapat digunakan untuk menyempurnakan tema desain. Untuk proyek ini, saya ingin menggunakan mesin pencocokan pola (PME) dan akselerometer di dalam Intel Curie pada Arduino 101. Curie dibuat untuk aplikasi PME karena memiliki kemampuan jaringan saraf tetapi belum banyak contoh PME di luar sana . Saya harap contoh ini dapat menginspirasi Anda untuk mengekstrak kemampuan PME Curie.

Gaun itu menggunakan halaman novel grafis saya sebagai kainnya. Seorang ilmuwan dan robotnya sedang melihat ke dalam teleskop. Saat pemakainya menggambar pola di udara, satu set LED yang diatur dalam bentuk konstelasi akan bersinar di langit malam pada kain.

Instruksi

*Catatan:setelah proyek ini diterbitkan, saya merenovasi bagian sirkuit elektronik. Metode yang ditingkatkan untuk memasang LED ke kain dan cara membuatnya tahan lama sekarang dipublikasikan di bawah setelah langkah 3.

** Pembaruan:mengenakan gaun ini untuk beberapa acara demo sepanjang hari memberikan perkiraan masa pakai baterai. Untuk memberi daya pada gaun ini, baterai 9 V perlu diganti setiap 3 jam. Baterai tidak terkuras tetapi turun di bawah 9 V, sehingga tidak efisien untuk melakukan pencocokan pola. Anda dapat menghemat baterai untuk penggunaan lain.

Langkah 1

Saya menggunakan strip NeoPixel dari Adafruit, memotongnya menjadi beberapa bagian dan mengaturnya menjadi bentuk rasi bintang. Jangan ragu untuk menggunakan jenis LED lain seperti LED RGB individual. Rekatkan atau jahit ke kain dasar.

Langkah 2

Letakkan kain antarmuka di atas dan Anda dapat menguraikan rasi bintang. Langkah ini opsional tetapi saya merasa terbantu memiliki banyak lapisan kain untuk memperkuat strukturnya. Saya benar-benar menjahit kain tebal lain ke bagian belakang kain dasar. Jadi total tiga lapisan sebagai alas, mengapit LED.

Langkah 3

Solder LED. Jika Anda menggunakan LED individu yang dapat dijahit, Anda juga dapat menggunakan benang konduktif untuk menghubungkannya. Either way, itu banyak kerja manual dan membutuhkan kesabaran. Karena saya memiliki empat rasi bintang (Orion, Biduk, Cygnus, dan Cassiopeia), saya memisahkan mereka menjadi empat jejak. Masing-masing akan terhubung ke pin Arduino 101 yang berbeda.

Langkah yang ditingkatkan

Kain yang saya gunakan untuk langkah di atas terlalu lembut, yang membuatnya mudah untuk menekuk LED dan kabel, mematahkan sambungan solder. Saya melakukan kembali seluruh proses dengan metode yang ditingkatkan berikut ini.

Posisikan LED

Saya menggunakan strip NeoPixel dari Adafruit dan memotongnya menjadi beberapa bagian dan mengaturnya menjadi bentuk rasi bintang. Jangan ragu untuk menggunakan jenis LED lain seperti LED RGB individual. Rekatkan atau jahit ke kain dasar.

Felt adalah jenis kain tebal yang bagus yang memberi struktur dan bekerja dengan baik dengan lem panas. Atur LED ke posisi masing-masing sehingga saat menyala, posisinya memantulkan bintang di konstelasi.

Rencanakan LED dan Kabel

Rekatkan garis-garis LED pada kain kempa di beberapa titik. Jangan menempelkan lem di bawah seluruh strip karena Anda perlu sedikit waktu untuk menggeser tabung heat-shrink di sekitar, seperti yang ditunjukkan pada gambar. Potong kabel yang terdampar menjadi panjang yang tepat dan letakkan pada posisi relatifnya pada potongan kain yang sama. Saya akan merekomendasikan untuk tidak merekatkan kabel dulu. Sosok saya di sini adalah kesalahan dalam hal itu. Sebaliknya, lebih baik untuk menahan kabel pada posisinya dengan selotip sementara sehingga saat Anda menyolder kabel ke LED, posisi kabel dapat disesuaikan.

Siapkan Semua Bagian untuk Dijahit

Gambar tersebut menunjukkan bahwa saya menyiapkan empat rasi bintang (Orion, Biduk, Cygnus, dan Cassiopeia) menjadi empat bagian yang terpisah. Setelah menyolder dan menyusutkan panas di sekitar sambungan yang disolder, Anda dapat merekatkan semuanya dengan erat ke kain kempa.

Uji!

Uji sirkuit Anda sebelum melangkah lebih jauh! Hanya bisa melakukan Strandtest NeoPixel untuk setiap jejak.

Oke, saya menempatkan level sebagai "Mudah" karena secara ilmiah tidak sulit setelah Anda memahami kodenya, tetapi dibutuhkan banyak pekerjaan untuk menstabilkan kabel pada kain.

Pastikan Arduino IDE Anda adalah versi terbaru dan memiliki library Curie PME. Saya akan merekomendasikan menggunakan Arduino Web Editor. Unduh perpustakaan di sini.

Membuat Gaun

Secara paralel (kiasan), buat gaun itu. Setelah Anda menguji sirkuit, jahit kain dasar dengan LED ke bagian dalam gaun. LED akan bersinar melalui grafik.

Seperti yang Anda lihat, Arduino 101 ada di tangan saya. Saya membuat kasing cetak 3D untuk Arduino 101 dan baterai. Ada kabel panjang yang menghubungkan LED dan papan, yang tersembunyi di selongsong.

Kode di bawah ini akan memberi Anda informasi tentang bagaimana papan diprogram. Setelah Anda mem-flash kode, latih neuron terlebih dahulu sehingga mereka mempelajari pola mana yang ada. Tonton video ini di ~0:30:

Untuk lebih banyak foto dan desain tech-fashion/paintings-on-fabric, kunjungi website saya :)

Kode

  • PME_4LED_new.ino
  • PME_LED
PME_4LED_new.inoArduino
Ini adalah skrip yang diperbarui dari yang sebelumnya. Ini menyimpan data pelatihan. Saat ini, sudah diatur dengan langkah inisialisasi. Seri pertama LED menunjukkan Merah saat daya menyala. Memegang Arduino101 datar dengan port USB mengarah ke arah horizontal, sambil menekan tombol, memungkinkan penggunaan dari pelatihan sebelumnya. LED ini berubah menjadi Hijau lalu Biru ketika tombol dilepaskan, yang menunjukkan sistem siap. Jika Arduino101 dipegang dengan port USB mengarah ke arah vertikal, sambil menekan tombol, data pelatihan sebelumnya akan terhapus. Sistem dapat dilatih ulang setelah tombol dilepas.
/* * Contoh ini menunjukkan penggunaan mesin pencocokan pola (CuriePME) * untuk mengklasifikasikan aliran data akselerometer dari CurieIMU. * * Pertama, sketsa akan meminta Anda untuk menggambar beberapa huruf di udara (bayangkan * bayangkan Anda menulis di papan tulis tak terlihat, menggunakan papan Anda sebagai * pena), dan data IMU dari gerakan ini digunakan sebagai data pelatihan untuk *PME. Setelah pelatihan selesai, Anda dapat terus menggambar huruf dan PME * akan mencoba menebak huruf mana yang Anda gambar. * * Contoh ini memerlukan tombol untuk dihubungkan ke pin digital 4 * https://www.arduino.cc/en/Tutorial/Button * * CATATAN:Untuk hasil terbaik, gambarlah huruf besar, setidaknya setinggi 1-2 kaki. * * Hak Cipta (c) 2016 Intel Corporation. Seluruh hak cipta. * Lihat pemberitahuan lisensi di akhir file. */#include "CurieIMU.h"#include "CuriePME.h"#include #include #include #define PINM 6 //// pin NeoPixelsnya apa terhubung ke?#menentukan PINC 3#menentukan PIN 9#menentukan PINO 5 Adafruit_NeoPixel stripM =Adafruit_NeoPixel(10, PINM, NEO_GRB + NEO_KHZ800); /// panjang strip adalah 15 piksel. Anda dapat mengubah ini untuk jumlah piksel di masing-masing 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 =PINOPixel Adafruit_Ne stripOPixel =PINOPixel Adafruit_Ne stripo , NEO_GRB + NEO_KHZ800);int tr =0; //Beberapa variabel untuk menampung "target warna" dan "arus warna" untuk menghaluskan...int tg =0;int tb =0;int r =0;int g =0;int b =0;int rawX =0; ///// untuk menyimpan nilai dari akselerometer Curieint rawY =0;//int rawZ =0;float angle =0.0;/* Ini mengontrol berapa kali huruf harus ditarik selama pelatihan. * Lebih tinggi dari 4, dan Anda mungkin tidak memiliki cukup neuron untuk semua 26 huruf * alfabet. Lebih rendah dari 4 berarti lebih sedikit pekerjaan bagi Anda untuk melatih surat, * tetapi PME mungkin lebih sulit mengklasifikasikan surat itu. */const unsigned int trainingReps =4;/* Tingkatkan ini menjadi 'AZ' jika Anda suka-- hanya perlu waktu lebih lama untuk melatih */const unsigned char trainingStart ='A';const unsigned char trainingEnd ='D'; /* Pin input yang digunakan untuk memberi sinyal saat sebuah surat sedang ditarik- Anda * perlu memastikan tombol terpasang ke pin ini */const unsigned int buttonPin =4;/* Sample rate untuk accelerometer */const unsigned int sampleRateHZ =200;/* Jumlah byte yang dapat disimpan oleh satu neuron */const unsigned int vectorNumBytes =128;/* Jumlah sampel yang diproses (1 sampel ==accel x, y, z) * yang dapat ditampung di dalam neuron * /const unsigned int sampelPerVector =(vectorNumBytes / 3);/* Nilai ini digunakan untuk mengubah karakter ASCII AZ * menjadi nilai desimal 1-26, dan kembali lagi. */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) ); //sementara(!Serial); pinMode(tombolPin, INPUT); /* Memulai IMU (Intertial Measurement Unit) */ CurieIMU.begin(); /* Mulai PME (Mesin Pencocokan Pola) */ CuriePME.begin(); CurieIMU.setAccelerometerRate(sampleRateHZ); CurieIMU.setAccelerometerRange(2); /* Init. Chip Flash SPI */ if (!SerialFlash.begin(ONBOARD_FLASH_SPI_PORT, ONBOARD_FLASH_CS_PIN)) { Serial.println("Tidak dapat mengakses chip Flash SPI"); } stripM.begin(); // menginisialisasi strip strip neopikselS.begin(); stripC.mulai(); stripO.mulai(); stripM.tampilkan(); // Inisialisasi semua piksel ke 'off' stripS.show(); stripC.tampilkan(); stripO.show(); solidM(stripM.Color(255, 0, 0), 50); //Merah untuk siap input}/* Fungsi ini membaca file yang disimpan oleh contoh sebelumnya * File berisi semua data yang telah dipelajari, kemudian disimpan sebelumnya. * Setelah jaringan dipulihkan, ia dapat mengklasifikasikan pola lagi tanpa * harus dilatih ulang.*/void restoreNetworkKnowledge ( void ){ File SerialFlashFile; int32_t fileNeuronCount =0; Intel_PMT::neuronData neuronData; // Buka file dan tulis file data uji =SerialFlash.open(nama file); CuriePME.beginRestoreMode(); if (file) { // ulangi jaringan dan simpan data. while(1) { Serial.print("Membaca Neuron:"); 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) rusak; fileNeuronCount++; // bagian ini hanya mencetak setiap neuron saat dipulihkan, // sehingga Anda dapat melihat apa yang terjadi. 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.vektor [2] ); Serial.print("\n"); CuriePME.iterateNeuronsToRestore( neuronData ); } } CuriePME.endRestoreMode(); Serial.print("Kumpulan Pengetahuan Dipulihkan. \n");}boolean longPress=false;int startTime=0;int lastOrientation =- 1; // orientasi sebelumnya (untuk perbandingan)int lastReading =-1;boolean lastPress=false;void loop (){ orientasi int =- 1; // orientasi papan String orientationString; // string untuk mencetak deskripsi orientasi // Orientasi papan:// 0:datar, prosesor menghadap ke atas // 1:datar, prosesor menghadap ke bawah // 2:lanskap, pin analog ke bawah // 3:lanskap, analog pin ke atas // 4:potret, konektor USB ke atas // 5:potret, konektor USB ke bawah // baca akselerometer:int x =CurieIMU.readAccelerometer(X_AXIS); int y =CurieIMU.readAccelerometer(Y_AXIS); int z =CurieIMU.readAccelerometer(Z_AXIS); // menghitung nilai absolut, untuk menentukan int absX =abs(x); int absY =abs(y); int absZ =abs(z); if ( (absZ> absX) &&(absZ> absY)) { // orientasi dasar pada Z if (z> 0) { orientationString ="naik"; orientasi =0; } else { orientationString ="turun"; orientasi =1; } } else if ( (absY> absX) &&(absY> absZ)) { // orientasi dasar pada Y if (y> 0) { orientationString ="digital pin up"; orientasi =2; } else { orientationString ="pin analog ke atas"; orientasi =3; } } else { // orientasi dasar pada X if (x <0) { orientationString ="konektor ke atas"; orientasi =4; } else { orientationString ="konektor turun"; orientasi =5; } } // jika orientasi telah berubah, cetak deskripsi:if (orientasi !=lastOrientation) { Serial.println(orientationString); lastOrientation =orientasi; } // jika orientasi telah berubah, cetak deskripsi:if (orientasi !=lastOrientation) { lastOrientation =orientasi; } int membaca =digitalRead(buttonPin); if (Bacaan terakhir !=membaca) { Serial.print("buttonPin="); Serial.println(membaca); lastReading =membaca; } if (membaca ==HIGH) { if (startTime ==0) { startTime=millis(); } else if ((millis() - startTime)>2000) { longPress=true; if (!lastPress) { Serial.println("longPress"); //hijau untuk tekan lama solidM(stripM.Color(0, 255, 0), 50);// Hijau lastPress=true; } } } if ( membaca ==RENDAH &&longPress ) { pemadaman(5); Serial.print("orientasi="); Serial.print(orientasi); Serial.print("SerialFlash.exists(nama file)="); Serial.println(SerialFlash.ada(nama file)); if (orientasi!=4 &&SerialFlash.exists(nama file)) { restoreNetworkKnowledge(); Serial.print("Pelatihan dipulihkan."); } else { trainLetters(); pemadaman (5); Serial.print("Pelatihan selesai."); } Serial.println(" Sekarang, gambar beberapa huruf (ingat "); Serial.println("tahan tombolnya) dan lihat apakah PME dapat mengklasifikasikannya."); solidM(stripM.Color(0, 0, 255), 500); //Biru untuk siap untuk mencocokkan pemadaman (5); //matikan untuk pencocokan while (true) { match(); } }}void solidM(uint32_t c, uint8_t wait) { for (uint16_t i=0; i  (bil * 3) - (langkah * 3)) { ret =sampel[pos]; } else { ret =0; pos -=(langkah * 3); for (unsigned int i =0; i  sensorBufSize) { break; } } } undersample(accel, sample, vector);}void trainLetter(char letter, unsigned int repeat){ unsigned int i =0; while (i  
PME_LEDArduino
Ini menggunakan Curie PME untuk mengontrol LED. Ini pada dasarnya adalah kombinasi dari kode Draw in Air PME dan kode contoh Adafruit NeoPixel. Kode ini tidak persis seperti yang saya gunakan (yang agak rumit) karena saya ragu Anda akan membuat jenis pengaturan konstelasi yang sama persis. Sebaliknya, berikut adalah kode umum yang dapat Anda modifikasi untuk mempersonalisasi kebutuhan Anda, mis. Anda dapat mengubah cara mendistribusikan pin untuk strip LED yang berbeda. Saya dapat memperbaruinya dengan kode yang ditingkatkan nanti.
/* * Contoh ini menunjukkan penggunaan mesin pencocokan pola (CuriePME) * untuk mengklasifikasikan aliran data akselerometer dari CurieIMU. Kode ini merupakan modifikasi dari contoh Draw in the Air:* https://github.com/01org/Intel-Pattern-Matching-Technology * * Pertama, sketsa akan meminta Anda untuk menggambar pola di udara (hanya * bayangkan Anda menulis di papan tulis tak terlihat, menggunakan papan Anda sebagai * pena), dan data IMU dari gerakan ini digunakan sebagai data pelatihan untuk * PME. Setelah pelatihan selesai, Anda dapat terus menggambar huruf dan PME * akan mencoba menebak huruf mana yang Anda gambar. * * This example requires a button to be connected to digital pin 4 * https://www.arduino.cc/en/Tutorial/Button * * NOTE:For best results, draw big letters, at least 1-2 feet tall. * * Copyright (c) 2016 Intel Corporation. All rights reserved. * See license notice at end of file. */#include "CurieIMU.h"#include "CuriePME.h"#include #define PIN 6 //// what pin are the NeoPixels connected to?Adafruit_NeoPixel strip =Adafruit_NeoPixel(54, PIN, NEO_GRB + NEO_KHZ800); /// the strip is 15 pixels long. You can change this for the number of pixels in your individual strip.int tr =0; //Some variables to hold "color-target" and "color-current" for smoothing...int tg =0;int tb =0;int r =0;int g =0;int b =0;int rawX =0; ///// to hold values from the Curie's accelerometerint rawY =0;//int rawZ =0;float angle =0.0;/* This controls how many times a letter must be drawn during training. * Any higher than 4, and you may not have enough neurons for all 26 letters * of the alphabet. Lower than 4 means less work for you to train a letter, * but the PME may have a harder time classifying that letter. */const unsigned int trainingReps =4;/* Increase this to 'A-Z' if you like-- it just takes a lot longer to train */const unsigned char trainingStart ='A';const unsigned char trainingEnd ='D';/* The input pin used to signal when a letter is being drawn- you'll * need to make sure a button is attached to this pin */const unsigned int buttonPin =4;/* Sample rate for accelerometer */const unsigned int sampleRateHZ =200;/* No. of bytes that one neuron can hold */const unsigned int vectorNumBytes =128;/* Number of processed samples (1 sample ==accel x, y, z) * that can fit inside a neuron */const unsigned int samplesPerVector =(vectorNumBytes / 3);/* This value is used to convert ASCII characters A-Z * into decimal values 1-26, and back again. */const unsigned int upperStart =0x40;const unsigned int sensorBufSize =2048;const int IMULow =-32768;const int IMUHigh =32767;void setup(){ Serial.begin(9600); // while(!Serial); pinMode(buttonPin, INPUT); /* Start the IMU (Intertial Measurement Unit) */ CurieIMU.begin(); /* Start the PME (Pattern Matching Engine) */ CuriePME.begin(); CurieIMU.setAccelerometerRate(sampleRateHZ); CurieIMU.setAccelerometerRange(2); trainLetters(); //Serial.println("Training complete. Now, draw some letters (remember to "); // Serial.println("hold the button) and see if the PME can classify them."); strip.mulai(); // menginisialisasi strip strip neopixel.show(); // Initialize all pixels to 'off'}void loop (){ /// these functions are written out at the bottom of the sketch. Serial.println("Training complete. Now, draw some letters (remember to ");Serial.println("hold the button) and see if the PME can classify them."); byte vector[vectorNumBytes]; unsigned int category; char letter; char pattern; /* Record IMU data while button is being held, and * convert it to a suitable vector */ readVectorFromIMU(vector); /* Use the PME to classify the vector, i.e. return a category * from 1-26, representing a letter from A-Z */ category =CuriePME.classify(vector, vectorNumBytes); if (category ==CuriePME.noMatch) { Serial.println("Don't recognise that one-- try again."); //theaterChase(); theaterChase(strip.Color(127, 127, 127), 50); // White strip.show(); // delay(10); } else { letter =category + upperStart; pattern =letter; if ( pattern =='A' ) { //red colorWipe(strip.Color(0, 255, 0), 50); // Green theaterChase(strip.Color(127, 127, 127), 50); // White strip.show(); } else if ( pattern =='B') { colorWipe(strip.Color(255, 0, 0), 50); // Red theaterChase(strip.Color(127, 127, 127), 50); // White strip.show(); } else if ( pattern =='C') { colorWipe(strip.Color(0, 0, 255), 50); // Blue theaterChase(strip.Color(127, 127, 127), 50); // White strip.show(); } else if ( pattern =='D') { colorWipe(strip.Color(255, 0, 255), 50); // Blue theaterChase(strip.Color(127, 127, 127), 50); // White strip.show(); }Serial.println(letter); } }/* Simple "moving average" filter, removes low noise and other small * anomalies, with the effect of smoothing out the data stream. */byte getAverageSample(byte samples[], unsigned int num, unsigned int pos, unsigned int step){ unsigned int ret; unsigned int size =step * 2; if (pos <(step * 3) || pos> (num * 3) - (step * 3)) { ret =samples[pos]; } else { ret =0; pos -=(step * 3); for (unsigned int i =0; i  sensorBufSize) { break; } } } undersample(accel, samples, vector);}void trainLetter(char letter, unsigned int repeat){ unsigned int i =0; while (i   

Skema

It's just connecting the LEDs to the Arduino 101 pins and a button to pin 4 (as described in the code:https://www.arduino.cc/en/Tutorial/Button). The circuit diagram is similar to this Fritzing from Adafruit:https://learn.adafruit.com/adafruit-neopixel-uberguide/basic-connections
I plugged the 9 V battery directly into the barrel jack.

Proses manufaktur

  1. Pola Pakaian
  2. Membuat papan tempat memotong roti Arduino tanpa kabel jumper
  3. Sensor DHT11 dengan LED dan Speaker Piezo
  4. Arduino Spybot
  5. FlickMote
  6. TV Buatan Sendiri B-Gone
  7. Jam Master
  8. Arduino + LED + Keyboard MIDI + MuseScore =Tutor Piano
  9. LED Terkendali Alexa Melalui Raspberry Pi
  10. Temukan Saya