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

Instagramにだけ載せてすっかり満足してしまった ”組込実務経験の少ない初心者も4日間でC言語まるっと覚えちゃおう♡” という先生も生徒も疲弊しまくる恐ろしい研修2日目の終わりにとんでもない課題が出た

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

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

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

Arduinoの名前は聞いていたもののどんなものかも知らない 裁縫ならハンダ付けよりずっと楽しい

早速部品を注文


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

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

sh2

stussy…stus…????

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

…………。

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

sh1

以降の部品は本物

LilyPad USBの中に電源ONOFF用のスライドスイッチとリチウムイオン充電器の役割は備わっており 随分無駄な買い物をしたと凹んでいたのだが 製作過程で部品に余裕があることは精神的な余裕にも繋がった またこのミニリチウムイオン電池充電器 リチウムイオン電池が満タンだとFULLの緑色のランプが付くようになっている

sh8

一目でわかるので大変役に立っている 必要な部品を仮付けして動作確認

sh3

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

sh9

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

#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 ポートどうしぶつかってしまう恐れがある 取り寄せたスナップボタンは直径5mm これなら心配は要らない

sh6

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

sh4

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

シャツのボタンをつける要領でポート1つ1つに導電糸で固定していく お?意外といい仕上がり?

sh5

チャコペンで回路図を下書き スナップボタンを取り付けてから回路図を縫い付ける ショートしないように+とマイナスの回路が交差する箇所は注意して縫う

部品を取り付けられるか確認して縫製完了♡ 下地となる布(ニット)の伸縮性が高いものであれば スナップボタンの位置が想定より多少ずれてもどうにかなる(笑)

制御プログラムを実装


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

今回私はLilyPad Arduino USBを使っているので ”ツール”タブ→ボード→LilyPad Arduino USBを選択すれば設定完了 ソースをマイコンに書き込めるようになる 一応、研修前日に絶望しながら3時間で書いたクソコードを晒しておく

動くには動くけど正しく動作しない

shiny.c
/***  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);
}

あとがき(懺悔)


スイッチでパターンが変えられてイルミネーションっぽく光るようにしたかった

どのみち接触が極端に悪くなってしまったから縫い直して再挑戦する その時にクソコードも改訂する…予定。 sh7