【LilyPad】光るニット帽を作ってみた

post-hero-image

社内研修2日目。講義の終わりにとんでもない宿題が出た。


「なんでもいいから作ってきて」


『なんでも』ってなにすればいいんだ...?
夕飯みたいなノリで言うなよ。いや、夕飯のオーダーでもキレるわ。

私は悩み続けた。

こんなんテキトーに終わらそ…
そう思っていた矢先にこんな記事を見つけた。

半田付け不要?!縫い付けて使うArduinoで激iLLな音で光るニット帽作ってみた!

Arduinoの名前は聞いていたものの、いったいどんなものかも知らない 。しかし裁縫ならわたしにもできそうだ。

部品の注文

何を揃えたらいいかわからないが、上記記事とLilyPad研究会さんの作品で使われている部品を参考に取り寄せてみた。

届いたので一つ一つを見てみる。まずはフリマアプリで安かった、こちら。



stussy…stus…????

本物のロゴはこちらで確認いただくことにして。
この帽子、縫製が汚すぎる。


…………。


悔しい!余計な刺繍は要らん!取ってしまえ!!



以降の部品は本物。

よく見たらLilyPad USBの中に「電源ONOFF用のスライドスイッチ」と「リチウムイオン充電器」の役割は備わっているではありませんか。

無駄な買い物をしたと凹んでいたのだが、製作過程で部品に余裕があることは精神的な余裕に繋がる。

またこのミニリチウムイオン電池充電器、充電が満タンだとFULLの緑色のランプが付くようになっている。



これなら一目でわかる。
必要な部品を仮付けして動作確認。


ショート防止のため回路は慎重に考える。
今回は+と-が交差する場所をひとまとまりにした。



テストプログラムを書き込んで、無事光ることを確認。

#define RED 9             //赤LED PIN番号
#define BLUE 10           //青LED PIN番号
#define GREEN 11          //緑LED PIN番号
#define RED_TIME 5        //赤LED 周期
#define BLUE_TIME 6       //青LED 周期
#define GREEN_TIME 7      //緑LED 周期

int red = 0, blue = 0, green = 0;
int flg_red = 0, flg_blue = 0, flg_green = 0;
// 初期化
void setup() {

  // LEDのピンを出力に
  pinMode(RED, OUTPUT);
  pinMode(BLUE, OUTPUT);
  pinMode(GREEN, OUTPUT);
}

// メインループ
void loop() {

  if (flg_red == 0) {
    red = red + RED_TIME;
    if (red >= 250) {
      flg_red = 1;
    }
  }
  else {
    red = red - RED_TIME;
    if (red <= 0) {
      flg_red = 0;
    }
  }
  analogWrite(RED, red);
delay(50);

  if (flg_blue == 0) {
    blue = blue + BLUE_TIME;
    if (blue >= 200) {
      flg_blue = 1;
      blue=200;
    }
  }
  else {
    blue = blue - BLUE_TIME;
    if (blue <= 0) {
      flg_blue = 0;
      blue=0;
    }
  }
  analogWrite(BLUE, blue);
delay(30);

  if (flg_green == 0) {
    green = green + GREEN_TIME;
    if (green >= 200) {
      flg_green = 1;
      green=200;
    }
  }
  else {
    green = green - GREEN_TIME;
    if (green <= 0) {
      flg_green = 0;
            green=0;
    }
  }
  analogWrite(GREEN, green);
delay(20);
}


本番作業へ

もったいないけど全ての導電糸を外して本番へ移行する。

時差で届いたのはハイジオット社製スナップボタン。人形の洋服に縫い抜けるのが本来の用途だ。

通常のスナップボタンは直径8~13mm。これでは大きすぎてLilyPad USBのポートどうしがぶつかってしまう恐れがある。

取り寄せたスナップボタンは直径5mm。これなら心配は要らない。



さあこいつらをハンダ付け……



できなかった。小さすぎた…。



シャツのボタンをつける要領で、ポートひとつひとつに導電糸で固定していく。

お?意外といい仕上がり?



ニット帽本体に、スナップボタン(凸)を取り付けてから、チャコペンで書いた回路図に沿って縫い付ける。

ショートしないように+とマイナスの回路が交差する箇所は注意して縫う。

部品を取り付けられるか確認して縫製完了。



下地となる布(ニット)の伸縮性が高いものであれば、スナップボタンの位置が多少ずれてもどうにかなる(笑)

制御プログラムを実装

Arduino開発環境の構築は簡単。
Ardiono公式サイトからファイルをダウンロードしてウィンドウの指示通りインストールを行う。

今回私はLilyPad Arduino USBを使っているので ”ツール”タブ→ボード→LilyPad Arduino USBを選択すれば設定完了。ソースをマイコンに書き込めるようになる。

一応、研修前日に絶望しながら3時間で書いたクソコードを晒しておく。
動くには動くけど正しく動作しない。

/***  Shiny nit cap 光るニット帽     ***/
/***  Date : 2017.12.3 ~ 2017.12.18 ***/

/*Definition of port ポートの定義*/
#define RED 11                  //赤LED ポート red led port
#define BLUE 10                 //青LED ポート blue led port
#define GREEN 9                 //緑LED ポート green led port
#define SW 3                    //スライドスイッチ ポート Slide switch port

#define PERIODSTART 0  //1周期の始まり

#define ON 0
#define OFF 1
#define PATTERNNUM 2   //光るパターンの数

/*Declaration function 関数の宣言 (setupとloopはArduinoデフォルトの関数 "setup" and "loop" are Arduino default functions.)*/
void pattern(int);
int intensity(int,int);
void analogwrite_led(int,int);

/*Declaration variable 変数の宣言*/
typedef struct {
short red;
short blue;
short green;
}tLed;

tLed ledintensity = {0,0,0};

/*以下の構造体の要素はそろえる The elements of the following structure are aligned.*/
/*Definition of period width 周期の幅の定義 何ステップずつ光を強くするかもしくは弱くするか How many steps should the light be made stronger or weaker?*/
tLed ledperiodwidth[PATTERNNUM] = {{5,5,5},
                                 {5,6,7}};
/*Definition of delay time DUTY比調整*/
tLed leddelaytime[PATTERNNUM] = {{50,50,50},
                               {50,30,20}};
/*Definition of period end 何カウントしたら光を強くするかもしくは弱くするか How many counts will you make the light stronger or weaker?*/
tLed ledperiodend[PATTERNNUM] = {{50,50,50},
                               {250,200,200}};

// 初期化
void setup() {
// put your setup code here, to run once:
pinMode(GREEN, "OUTPUT");
pinMode(BLUE , "OUTPUT");
pinMode(RED  , "OUTPUT");
pinMode(SW   , "INPUT");

/*initialize 初期化*/
digitalWrite(GREEN, OFF);
digitalWrite(BLUE , OFF);
digitalWrite(RED  , OFF);
digitalWrite(SW  , OFF);
}

void loop() {
// put your main code here, to run repeatedly:
static int index = 0;
static int swflg = ON;

if(digitalRead(SW) != swflg){
  swflg = ~swflg;
  index = (index>PATTERNNUM - 1)?index=0:index+=1;
  pattern(index);
}
}

void pattern(int index){
/*LED RED 赤*/
ledintensity.red = intensity(ledperiodwidth[index].red,ledperiodend[index].red);
analogwrite_led(ledintensity.red,leddelaytime[index].red,RED);
/*LED RED 青*/
ledintensity.blue = intensity(ledperiodwidth[index].blue,ledperiodend[index].blue);
analogwrite_led(ledintensity.blue,leddelaytime[index].blue,BLUE);
/*LED RED 緑*/
ledintensity.green = intensity(ledperiodwidth[index].green,ledperiodend[index].green);
analogwrite_led(ledintensity.green,leddelaytime[index].green,GREEN);
}

/*Adjust the strength to shine 光る強さを調整*/
int intensity(int periodwidth,int periodend){
static int intensity = 0;               //light intensity  光の強さ
static int foldedflag   = 0;               //折り返しフラグ

if(intensity >= periodend){
  foldedflag = ON;
}else if(intensity <= PERIODSTART){
  foldedflag = OFF;
}

if (foldedflag == OFF) {
  intensity = intensity + periodwidth;
}else if(foldedflag == ON){
  intensity = intensity - periodwidth;
}

return intensity;
}

/*A function that glows based on a value determined by another function 他の関数で決定した値を基に光らせる関数*/
void analogwrite_led(int intensity,int delaytime,int ledport){
analogWrite(ledport, intensity);
delay(delaytime);
}




* * *





スイッチ切替でイルミネーションパターン変更する実装が間に合わなかったのが課題。

どのみち接触が極端に悪くなってしまったから、縫い直して再挑戦する。

その時にクソコードも修正する…、たぶん。