工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduino101-インテルキュリーパターンマッチングドレス

コンポーネントと消耗品

>
NeoPixelストリップ
個々のRGBLEDに置き換えることができます。
× 1
Arduino 101
× 1
SparkFunプッシュボタンスイッチ12mm
× 1
抵抗10kオーム
× 1
ジャンパー線(汎用)
LEDを肩から手に導くには、長いワイヤーが必要になる場合があります。
× 1
9Vバッテリー(汎用)
× 1
9Vからバレルジャックコネクタ
× 1
Adafruit FloraRGBネオピクセルLED-4個入り
これは、Neopixelストリップの代わりに使用できます。
× 1
縫製可能な導電性スレッド
一部のワイヤーを交換するオプション。
× 1

必要なツールとマシン

>
ホットグルーガン(汎用)
ミシン(汎用)
はんだごて(汎用)

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

はじめに

<図> <図>

私は科学と芸術を組み合わせたプロジェクトを楽しんでいるエンジニア兼アーティストです。私は、電子部品の特定の機能を使用してデザインテーマを強化できるように、マイクロコントローラーを組み込んだドレスデザインを作成してきました。このプロジェクトでは、Arduino101のIntelCurie内のパターンマッチングエンジン(PME)と加速度計を使用したいと思います。Curieはニューラルネットワーク機能を備えているため、PMEアプリケーション用に作成されていますが、PMEの例はあまりありません。 。この例が、キュリーのPME機能を抽出するきっかけになることを願っています。

ドレスは私のグラフィックノベルのページを生地として使用しています。科学者と彼女のロボットが望遠鏡を調べています。着用者が空中に模様を描くと、星座の形に配置されたLEDのセットが、生地の夜空に輝きます。

手順

※注:本プロジェクト公開後、電子回路部分をリニューアルしました。 LEDを布に取り付けるための改善された方法と、LEDを耐久性のあるものにする方法は、ステップ3の後に以下に公開されています。

**更新:このドレスを数日間のデモイベントで着用すると、バッテリー寿命の見積もりが得られました。このドレスに電力を供給するために、9V電池は約3時間ごとに交換する必要があります。バッテリーは消耗しませんが、9 Vを下回るため、パターンマッチングを行うのは非効率的です。他の用途のためにバッテリーを節約できます。

ステップ1

<図>

私はAdafruitのNeoPixelストリップを使用し、それを細かく切り分けて星座の形に配置しました。個々のRGBLEDなど、他のタイプのLEDを自由に使用してください。それらをベースファブリックに接着または縫い付けます。

ステップ2

<図>

インターフェースファブリックを上部に配置すると、星座の輪郭を描くことができます。この手順はオプションですが、構造を強化するために複数のファブリックのレイヤーを用意すると便利であることがわかりました。私は実際に別の厚い生地をベース生地の裏に縫い付けました。つまり、LEDを挟んで、合計3つの層をベースにします。

ステップ3

<図>

LEDをはんだ付けします。縫製可能な個別のLEDを使用する場合は、導電性のスレッドを使用してそれらを接続することもできます。いずれにせよ、それは多くの肉体労働であり、忍耐が必要です。私は4つの星座(オリオン座、北斗七星、はくちょう座、カシオペア座)を持っているので、それらを4つのトレースに分けました。それぞれが異なるArduino101ピンに接続されます。

改善された手順

上記の手順で使用した生地は柔らかすぎたため、LEDやワイヤーが曲がりやすく、はんだ接合部が破損していました。次の改善された方法でプロセス全体をやり直しました。

LEDを配置します

<図>

私はAdafruitのNeoPixelストリップを使用し、それを細かく切り分けて星座の形に配置しました。個々のRGBLEDなど、他のタイプのLEDを自由に使用してください。それらをベースファブリックに接着または縫い付けます。

フェルトは、構造を与え、ホットグルーでうまく機能する素晴らしいタイプの厚い生地です。 LEDをそれぞれの位置に配置して、LEDが点灯したときに、それらの位置が星座の星を反映するようにします。

LEDとワイヤーを計画する

<図>

LEDストライプをフェルトに数点接着します。図に示すように、熱収縮チューブをスライドさせるための余裕が必要になるため、ストリップ全体の下に接着剤を入れないでください。撚り線を適切な長さに切断し、同じフェルトの相対的な位置に配置します。まだワイヤーを熱接着しないことをお勧めします。ここでの私の姿は、その点で大失敗です。むしろ、一時的なテープでワイヤーを所定の位置に保持して、ワイヤーをLEDにはんだ付けするときに、ワイヤーの位置を調整できるようにすることをお勧めします。

すべてのピースを縫う準備をします

<図>

この図は、4つの星座(オリオン座、北斗七星、はくちょう座、カシオペア座)を4つの別々のピースに準備したことを示しています。はんだ付けして、はんだ付けされた接合部の周りを熱収縮させた後、すべてをフェルトにしっかりと接着できます。

テスト!

先に進む前に回路をテストしてください!トレースごとにNeoPixelストランドテストを実行できます。

さて、コードを理解すれば科学的に難しいことではないので、レベルを「簡単」と設定しますが、ファブリック上のケーブルを安定させるには多くの作業が必要です。

Arduino IDEが最新バージョンであり、CuriePMEライブラリが含まれていることを確認してください。 ArduinoWebエディターの使用をお勧めします。こちらからライブラリをダウンロードしてください。

ドレスを作る

並行して(比喩的に)、ドレスを作ります。回路をテストした後、ドレスの内側にLEDでベース生地を縫います。グラフィックを通してLEDが光ります。

<図>

<図> <図> <図>

ご覧のとおり、Arduino101が私の手にあります。 Arduino101とバッテリー用に3Dプリントされたケースを作りました。 LEDとボードを接続する長いワイヤーがあり、スリーブに隠されています。

以下のコードは、ボードがどのようにプログラムされているかについての情報を提供します。コードをフラッシュした後、最初にニューロンをトレーニングして、どのパターンが存在するかを学習させます。このビデオを〜0:30に見る:

その他の写真やその他のハイテクファッション/ファブリック上の絵画のデザインについては、私のウェブサイトをチェックしてください:)

コード

  • PME_4LED_new.ino
  • PME_LED
PME_4LED_new.ino Arduino
これは前のスクリプトから更新されたスクリプトです。トレーニングデータを保存します。現在、初期化ステップで設定されています。最初の一連のLEDは、電源がオンのときに赤で表示されます。 USBポートを水平方向に向けてArduino101を平らに持ち、ボタンを押すと、以前のトレーニングからの使用が可能になります。ボタンを離すと、これらのLEDが緑色、青色に変わり、システムの準備ができたことを示します。 USBポートを垂直方向に向けてArduino101を押したままボタンを押すと、以前のトレーニングデータが消去されます。ボタンを離すと、システムを再トレーニングできます。
 / * *この例は、パターンマッチングエンジン(CuriePME)*を使用して、CurieIMUからの加速度計データのストリームを分類する方法を示しています。 * *最初に、スケッチは空中にいくつかの文字を描くように促します(*ペンとしてボードを使用して、目に見えないホワイトボードに書いていると想像してください)。これらのモーションからのIMUデータは、のトレーニングデータとして使用されます。 * PME。トレーニングが終了すると、文字を描き続けることができ、PME *はあなたが描いている文字を推測しようとします。 * *この例では、ボタンをデジタルピン4に接続する必要があります* https://www.arduino.cc/en/Tutorial/Button * *注:最良の結果を得るには、少なくとも1〜2フィートの高さの大きな文字を描画します。 * * Copyright(c)2016 IntelCorporation。全著作権所有。 *ファイルの最後にあるライセンス通知を参照してください。 * /#include "CurieIMU.h" #include "CuriePME.h" #include  #include  #include  #define PINM 6 //// NeoPixelsのピン接続先?#definePINC 3#define PINS 9#define PINO 5 Adafruit_NeoPixel stripM =Adafruit_NeoPixel(10、PINM、NEO_GRB + NEO_KHZ800); ///ストリップの長さは15ピクセルです。これは、個々のストリップのピクセル数に応じて変更できます。 、NEO_GRB + NEO_KHZ800); int tr =0; //スムージングのために「color-target」と「color-current」を保持するいくつかの変数... int tg =0; int tb =0; int r =0; int g =0; int b =0; int rawX =0; ///// Curieの加速度計からの値を保持するintrawY =0; // int rawZ =0; float angle =0.0; / *これは、トレーニング中に文字を描画する必要がある回数を制御します。 * 4を超えると、アルファベットの26文字すべてに十分なニューロンがない可能性があります。 4未満は、文字をトレーニングするための作業が少ないことを意味します*が、PMEはその文字を分類するのに苦労する可能性があります。 * / const unsigned int trainingReps =4; / *必要に応じて、これを 'AZ'に増やします-トレーニングにかなり時間がかかります* / const unsigned char trainingStart ='A'; const unsigned char trainingEnd ='D'; / *文字が描画されているときに信号を送るために使用される入力ピン-ボタンがこのピンに接続されていることを確認する必要があります* / const unsigned int buttonPin =4; / *加速度計のサンプルレート* / const unsigned int sampleRateHZ =200; / * 1つのニューロンが保持できるバイト数* / const unsigned int vectorNumBytes =128; / *処理されたサンプルの数(1サンプル==accel x、y、z)*ニューロン内に収まる* / const unsigned int samplesPerVector =(vectorNumBytes / 3); / *この値は、ASCII文字AZ *を10進値1〜26に変換し、また元に戻すために使用されます。 * / 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 ); // while(!Serial); pinMode(buttonPin、INPUT); / * IMU(Intertial Measurement Unit)を開始します* / CurieIMU.begin(); / * PME(パターンマッチングエンジン)を起動します* / CuriePME.begin(); CurieIMU.setAccelerometerRate(sampleRateHZ); CurieIMU.setAccelerometerRange(2); /* 初期化。 SPIフラッシュチップ* / if(!SerialFlash.begin(ONBOARD_FLASH_SPI_PORT、ONBOARD_FLASH_CS_PIN)){Serial.println( "SPIフラッシュチップにアクセスできません"); } stripM.begin(); //ネオピクセルストリップを初期化しますstripS.begin(); stripC.begin(); stripO.begin(); stripM.show(); //すべてのピクセルを 'off'に初期化しますstripS.show(); stripC.show(); stripO.show(); solidM(stripM.Color(255、0、0)、50); //入力の準備ができている場合は赤} / *この関数は、前の例で保存されたファイルを読み取ります*ファイルには、学習されてから以前に保存されたすべてのデータが含まれています。 *ネットワークが復元されると、再トレーニングせずに*パターンを再度分類できます。* / void restoreNetworkKnowledge(void){SerialFlashFile file; int32_t fileNeuronCount =0; Intel_PMT ::neuronData NeuronData; //ファイルを開き、テストデータを書き込みますfile =SerialFlash.open(filename); CuriePME.beginRestoreMode(); if(file){//ネットワーク上で反復し、データを保存します。 while(1){Serial.print( "Reading 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)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( "Knowledge SetRestored。\ n");} boolean longPress =false; int startTime =0; int lastOrientation =-1; //前の方向(比較用)int lastReading =-1; boolean lastPress =false; void loop(){int direction =-1; //ボードの向きStringorientationString; //向きの説明を印刷するための文字列//ボードの向き:// 0:フラット、プロセッサを上に向ける// 1:フラット、プロセッサを下に向ける// 2:横向き、アナログピンを下に// 3:横向き、アナログピンアップ// 4:ポートレート、USBコネクタアップ// 5:ポートレート、USBコネクタダウン//加速度計の読み取り:int x =CurieIMU.readAccelerometer(X_AXIS); int y =CurieIMU.readAccelerometer(Y_AXIS); int z =CurieIMU.readAccelerometer(Z_AXIS); //絶対値を計算して、最大のintを決定しますabsX =abs(x); int absY =abs(y); int absZ =abs(z); if((absZ> absX)&&(absZ> absY)){// Zに基づく方向if(z> 0){orientationString ="up";向き=0; } else {orientationString ="down";向き=1; }} else if((absY> absX)&&(absY> absZ)){// Yに基づく方向if(y> 0){orientationString ="デジタルピンアップ";向き=2; } else {orientationString ="アナログピンアップ";向き=3; }} else {// Xに基づく方向if(x <0){orientationString ="connector up";向き=4; } else {orientationString ="コネクタダウン";向き=5; }} //向きが変更された場合は、説明を出力します。if(orientation!=lastOrientation){Serial.println(orientationString); lastOrientation =オリエンテーション; } //向きが変更された場合は、説明を出力します。if(orientation!=lastOrientation){lastOrientation =direction; } int reading =digitalRead(buttonPin); if(lastReading!=reading){Serial.print( "buttonPin ="); Serial.println(読み取り); lastReading =読書; } 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); //緑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( "トレーニングが復元されました。"); } else {trainLetters(); blackout(5); Serial.print( "トレーニングが完了しました。"); } Serial.println( "ここで、いくつかの文字を描画します("); Serial.println( "ボタンを押したまま)、PMEがそれらを分類できるかどうかを確認します。"); solidM(stripM.Color(0、0、255)、500); //一致するblackout(5);の準備ができている場合は青//マッチングをオフにしますwhile(true){match(); }}} void solidM(uint32_t c、uint8_t wait){for(uint16_t i =0; i (num * 3)-(step * 3)){ret =samples [pos]; } else {ret =0; pos-=(ステップ* 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 <繰り返し){バイトベクトル[vectorNumBytes]; if(letter =='A'){colorWipeM(stripM.Color(0、255、0)、50); //緑のtheatreChaseM(stripM.Color(127、127、127)、50); //白いstripM.show(); } else if(letter =='B'){colorWipeS(stripS.Color(255、0、0)、50); //赤いtheatreChaseS(stripS.Color(127、127、127)、50); //白いstripS.show(); } else if(letter =='C'){colorWipeC(stripC.Color(0、0、255)、50); //青いtheatreChaseC(stripC.Color(127、127、127)、50); //白いstripC.show(); } else if(letter =='D'){colorWipeO(stripO.Color(255、0、255)、50); //青いtheatreChaseO(stripO.Color(127、127、127)、50); //白いstripO.show(); } if(i)Serial.println( "And again ..."); readVectorFromIMU(vector); CuriePME.learn(vector、vectorNumBytes、letter-upperStart); Serial.println( "了解しました!"); delay(1000); ++ i; }} bool create_if_not_exists(const char * filename、uint32_t fileSize){if(!SerialFlash.exists(filename)){Serial.println( "Creating file" + String(filename)); SerialFlash.createErasable(filename、fileSize);を返します。 } Serial.println( "ファイル" +文字列(ファイル名)+ "はすでに存在します"); return true;} void saveNetworkKnowledge(void){// const char * filename ="NeurData.dat"; SerialFlashFileファイル; Intel_PMT ::neuronData NeuronData; uint32_t fileSize =128 * sizeof(neuronData); Serial.print( "保存するファイルサイズは="); Serial.print(fileSize); Serial.print( "\ n"); create_if_not_exists(filename、fileSize); //ファイルを開き、テストデータを書き込みますfile =SerialFlash.open(filename); file.erase(); CuriePME.beginSaveMode(); if(file){//ネットワーク上で反復し、データを保存します。 while(uint16_t nCount =CuriePME.iterateNeuronsToSave(neuronData)){if(nCount ==0x7FFF)break; Serial.print( "Saving Neuron:"); Serial.print(nCount); Serial.print( "\ n"); uint16_t NeuronFields [4]; NeuronFields [0] =NeuronData.context; NeuronFields [1] =NeuronData.influence; NeuronFields [2] =NeuronData.minInfluence; NeuronFields [3] =NeuronData.category; file.write((void *)neuronFields、8); file.write((void *)neuronData.vector、128); }} CuriePME.endSaveMode(); Serial.print( "ナレッジセットが保存されました。\ n");} voidtrainLetters(){for(char i =trainingStart; i <=trainingEnd; ++ i){Serial.print( "ボタンを押したまま、文字を描画します'"); Serial.print(String(i)+ "'in the air。ボタンをすぐに離します"); Serial.println( "完了したとおりです。"); trainLetter(i、trainingReps); Serial.println( "OK、この手紙で終わりました。"); delay(2000); } // 初期化。 SPIフラッシュチップif(!SerialFlash.begin(ONBOARD_FLASH_SPI_PORT、ONBOARD_FLASH_CS_PIN)){Serial.println( "SPIフラッシュチップにアクセスできません"); } saveNetworkKnowledge();} / * Adafruit Strandtestサンプルコードの特殊なライト関数*色の値を取得するには、0〜255の値を入力します。上記のレインボー効果に使用されます。 * Adafruitストランドテストのサンプルコードからのシアターチェイスライト。これは、現在のRGB値が何であれ、それを使用して「シアターチェイス」効果を実行します。 * // *シアタースタイルのクロールライト。* / voidtheatreChasePIN(uint8_t p、uint32_t c、uint8_t wait){Adafruit_NeoPixel strip =Adafruit_NeoPixel(10、p、NEO_GRB + NEO_KHZ800); for(int j =0; j <10; j ++){// 10サイクルの追跡を行うfor(int q =0; q <3; q ++){for(uint16_t i =0; i にご連絡ください。 
PME_LED Arduino
これは、CuriePMEを使用してLEDを制御しています。これは基本的に、Draw in the AirPMEコードとAdafruitNeoPixelサンプルコードの組み合わせです。このコードは、私が使用したものとはまったく異なります(少し複雑です)。まったく同じ種類の星座の配置を作成することはできないと思います。むしろ、ここにあなたがあなたの必要性を個人化するために修正することができる一般的なコードがあります、例えば。さまざまなLEDストリップのピンの配置方法を変更できます。後で改善されたコードで更新する可能性があります。
 / * *この例は、パターンマッチングエンジン(CuriePME)*を使用してCurieIMUからの加速度計データのストリームを分類する方法を示しています。コードはDraw in theAirの例を変更したものです。 * https://github.com/01org/Intel-Pattern-Matching-Technology * *最初に、スケッチは空中にパターンを描くように促します(*ボードを使用して、目に見えないホワイトボードに書いていると想像してください。 *ペン)、およびこれらのモーションからのIMUデータは、* PMEのトレーニングデータとして使用されます。トレーニングが終了すると、文字を描き続けることができ、PME *はあなたが描いている文字を推測しようとします。 * *この例では、ボタンをデジタルピン4に接続する必要があります* https://www.arduino.cc/en/Tutorial/Button * *注:最良の結果を得るには、少なくとも1〜2フィートの高さの大きな文字を描画します。 * * Copyright(c)2016 IntelCorporation。全著作権所有。 *ファイルの最後にあるライセンス通知を参照してください。 * /#include "CurieIMU.h" #include "CuriePME.h" #include  #define PIN 6 //// NeoPixelsはどのピンに接続されていますか?Adafruit_NeoPixel strip =Adafruit_NeoPixel(54、PIN、NEO_GRB + NEO_KHZ800); ///ストリップの長さは15ピクセルです。これは、個々のストリップのピクセル数に合わせて変更できます。inttr=0; //スムージングのために「color-target」と「color-current」を保持するいくつかの変数... int tg =0; int tb =0; int r =0; int g =0; int b =0; int rawX =0; ///// Curieの加速度計からの値を保持するintrawY =0; // int rawZ =0; float angle =0.0; / *これは、トレーニング中に文字を描画する必要がある回数を制御します。 * 4を超えると、アルファベットの26文字すべてに十分なニューロンがない可能性があります。 4未満は、文字をトレーニングするための作業が少ないことを意味します*が、PMEはその文字を分類するのに苦労する可能性があります。 * / const unsigned int trainingReps =4; / *必要に応じて、これを 'AZ'に増やします-トレーニングにかなり時間がかかります* / const unsigned char trainingStart ='A'; const unsigned char trainingEnd ='D'; / *文字が描画されているときに信号を送るために使用される入力ピン-ボタンがこのピンに接続されていることを確認する必要があります* / const unsigned int buttonPin =4; / *加速度計のサンプルレート* / const unsigned int sampleRateHZ =200; / * 1つのニューロンが保持できるバイト数* / const unsigned int vectorNumBytes =128; / *処理されたサンプルの数(1サンプル==accel x、y、z)*ニューロン内に収まる* / const unsigned int samplesPerVector =(vectorNumBytes / 3); / *この値は、ASCII文字AZ *を10進値1〜26に変換し、また元に戻すために使用されます。 * / 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); / * IMU(Intertial Measurement Unit)を開始します* / CurieIMU.begin(); / * PME(パターンマッチングエンジン)を起動します* / CuriePME.begin(); CurieIMU.setAccelerometerRate(sampleRateHZ); CurieIMU.setAccelerometerRange(2); trainLetters(); //Serial.println( "トレーニングが完了しました。ここで、いくつかの文字を描画します("); // Serial.println( "ボタンを押したまま)、PMEがそれらを分類できるかどうかを確認します。"); strip.begin(); //ネオピクセルストリップを初期化しますstrip.show(); //すべてのピクセルを 'off'に初期化します} void loop(){///これらの関数はスケッチの下部に書き出されます。 Serial.println( "トレーニングが完了しました。ここで、いくつかの文字を描画します("); Serial.println( "ボタンを押したまま)、PMEがそれらを分類できるかどうかを確認します。");バイトベクトル[vectorNumBytes]; unsignedintカテゴリ。文字; charパターン; / *ボタンを押している間にIMUデータを記録し、*適切なベクトルに変換します* / readVectorFromIMU(vector); / * PMEを使用してベクトルを分類します。つまり、A〜Zの文字を表すカテゴリ* 1〜26を返します* / category =CuriePME.classify(vector、vectorNumBytes); if(category ==CuriePME.noMatch){Serial.println( "それを認識しないでください-再試行してください。"); // TheaterChase(); TheaterChase(strip.Color(127、127、127)、50); //白いstrip.show(); // delay(10); } else {文字=カテゴリ+ upperStart;パターン=文字; if(pattern =='A'){// red colorWipe(strip.Color(0、255、0)、50); //緑のtheatreChase(strip.Color(127、127、127)、50); //白いstrip.show(); } else if(pattern =='B'){colorWipe(strip.Color(255、0、0)、50); //赤いtheatreChase(strip.Color(127、127、127)、50); //白いstrip.show(); } else if(pattern =='C'){colorWipe(strip.Color(0、0、255)、50); //青いtheatreChase(strip.Color(127、127、127)、50); //白いstrip.show(); } else if(pattern =='D'){colorWipe(strip.Color(255、0、255)、50); //青いtheatreChase(strip.Color(127、127、127)、50); //白いstrip.show(); } Serial.println(letter); }} / *単純な「移動平均」フィルターは、データストリームを平滑化する効果で、低ノイズやその他の小さな異常を削除します。 * / 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-=(ステップ* 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 <繰り返し){バイトベクトル[vectorNumBytes]; if(i)Serial.println( "And again ..."); readVectorFromIMU(vector); CuriePME.learn(vector、vectorNumBytes、letter-upperStart); Serial.println( "了解しました!"); delay(1000); ++ i; }} void trainLetters(){for(char i =trainingStart; i <=trainingEnd; ++ i){Serial.print( "ボタンを押したまま文字を描く '"); Serial.print(String(i)+ "'in the air。ボタンをすぐに離します"); Serial.println( "完了したとおりです。"); trainLetter(i、trainingReps); Serial.println( "OK、この手紙で終わりました。"); delay(2000); }} /////////////// AdafruitStrandtestサンプルコードの特別なライト関数// Rainbow!注-この関数は、終了するまで新しい位置入力をブロックします。voidrainbowCycle(uint8_t wait){uint16_t i、j; for(j =0; j <256 * 5; j ++){//ホイール上のすべての色の5サイクルfor(i =0; i にご連絡ください。 

回路図

LEDをArduino101ピンに接続し、ボタンをピン4に接続するだけです(コードで説明されているように:https://www.arduino.cc/en/Tutorial/Button)。回路図は、Adafruitの次のFritzingに似ています:https://learn.adafruit.com/adafruit-neopixel-uberguide/basic-connections
9V電池をバレルジャックに直接接続しました。

製造プロセス

  1. 服のパターン
  2. ジャンパー線なしでArduinoブレッドボードを構築する
  3. LEDとピエゾスピーカーを備えたDHT11センサー
  4. Arduino Spybot
  5. FlickMote
  6. 自家製テレビB-Gone
  7. マスタークロック
  8. Arduino + LED + MIDIキーボード+ MuseScore =ピアノチューター
  9. RaspberryPiを介したAlexa制御LED
  10. Find Me
  11. Arduino Power