Un nouveau monde parfumé

香り立つ備忘録

Internet of こたつ

現代日本において必需の暖房器具とされているこたつ。皆さんのご家庭にもこたつは実装されているものと思います。

f:id:pikatenor:20161205234255p:plain (Figure.1 こたつ)

皆さんこのような経験はありませんでしょうか。

「一日中こたつのスイッチ入れっぱなしで外出してしまい電気代がマッハ」
「家に帰ったら即あったかいこたつにスライドインしたい」

今回はそのような問題の解決を目指すべく、インターネットに繋がったこたつを作りました。
猫も杓子もアイオオティーの時代です。流行りには乗っていきましょう。

遅くなりました。こちらは klis Advent Calendar 2016 6日目の記事、klis14のかみかみがお送りします。

方針

実は2年前にも外部から電源を入り切りできるコーヒーメーカー、というのを作ったことがあります。

f:id:pikatenor:20161205234251j:plain:w300
(Figure.2 コンテンツ表現工学で制作した「Potaw」)

その際はソリッドステートリレーを使ってAC電源を操作したのですが、こたつは強運転時には5A程度の電流が流れることもあり、直接配線をイジるにはやや不安が伴います。 そこで今回はこたつそのものには極力手を入れず、こたつのケーブル上にあるスイッチを直接操作する仕組みを考えることにします。

f:id:pikatenor:20161205234238j:plain:w300
(Figure.3 こたつのスイッチ)

物体をつくる

さて、ここに一つの廃DVDドライブがあります。筑波大学第3事務区と書いてある気がしますが気のせいです

f:id:pikatenor:20161205234226j:plain:w300
(Figure.4 トレイの開かないDVDドライブ)

解体します。

f:id:pikatenor:20161205234212j:plain:w300
(Figure.5 分解の様子1)

f:id:pikatenor:20161205234345j:plain:w300
(Figure.6 分解の様子2)

良さそうな部品がありますね。*1トレイを開閉するアクチュエータです。

トレイを取り外しさらによく見ていくと、黒色の部品と白い部品が協調して動くことでピックアップのユニットが上下することがわかります。

f:id:pikatenor:20161205234333j:plain:w300
(Figure.7 拡大)

この黒色部品の左右動を利用することにしましょう。

類似の形状にスイッチを動かすための出っ張りをつけたものを3DCADでモデリングします。*2

f:id:pikatenor:20161205234329p:plain:w300f:id:pikatenor:20161205234331p:plain:w300f:id:pikatenor:20161205234326p:plain:w300
(Figure.8-10 CAD)

3Dプリンタで出力します。

f:id:pikatenor:20161205234455j:plain:w300
(Figure.11 出力後の部品)

スウィィ〜〜ト

こたつのスイッチと合わせ、固定します。

f:id:pikatenor:20161205234443j:plain:w300
(Figure.12 固定)

これでスイッチを動かす準備ができました。

仕組みをつくる

モーターの動作にはみんな大好き Raspberry Pi とモータードライバーICのみんな大好きTA7291Pを使います。

TA7291Pのピン配列は次のようになっています。

f:id:pikatenor:20161205234441p:plain:w600
(Figure.13 TA7291Pのピン配列)

モーターは本来はDC12Vで稼働していたものと推測されます*3が、今回は9V乾電池で動作させるため、Vref、Vsには9V*4を、Vccには Raspberry Pi から5Vを、IN端子にGPIOを接続します。

f:id:pikatenor:20161205234430j:plain:h400
(Figure.14 Arduinoを使った実験の様子)

インターネット経由でしか電源の入り切りができないというのはそれはそれで不便なので、部品箱の中から見つけたLED付きスイッチMP86A1GN3H-Gもついでに付けて、最終的な回路は以下のようになりました。

f:id:pikatenor:20161205234425p:plain:w600
(Figure.15 こたつシステム)

上記回路図の注意点ですが、

  • 当初参照したデータシート(2001年版)には「Vrefを使用しない場合はVsとショートさせること」とあったのでそのようにしたのですが、後に改訂されたと思われる版(2006年版)では「Vrefを使用しない場合は保護抵抗(3kΩ以上)を介してVsと接続してください」となっているようなのでVsとVrefの間はそのようにした方が良いと思います

  • LEDの電流制限抵抗には68Ωを使用していますが、このスイッチのLEDは定格が1.9V/20mAなので手持ちがあれば75Ωを使用した方が良いでしょう

  • Vccには5Vを印加していますが、これは僕がGPIO出力を5Vだと勘違いしていた名残りなので別に3.3Vでも良いと思います でもデータシートのHIGHはVcc=12Vのとき最大5.5Vなのでどうなんだろう うーん

などがあります。まあこのままでも普通に動いているので面倒くさくて変えてません。

配線をします。

f:id:pikatenor:20161205234646j:plain:w300
(Figure.16 中の様子)

Raspberry Pi からグロテスクな物体が生えていますが、これもDVDドライブから取ったバス配線です。後で不要な毛は刈りました。

当初予定では Raspberry Pi Zero を使う予定でしたが、途中で配線をミスってお亡くなりになりました。というわけで使っているのは古のModel B+です。

f:id:pikatenor:20161205234628j:plain:w300
(Figure.17 死んだPiZero)

Pi Zero には気の利いたリセッタブルヒューズなんかも無いから、みんなも過電流には気をつけた方がいいぞ(学び)

さて、DVDドライブの外身を反転して取り付けて良い感じにハウジングを作り、これにて物体は完成です。

f:id:pikatenor:20161205234615j:plain:w300
(Figure.18 完成)

ソフトウェアを作る

GPIO17に電流を流せばモーターがスイッチの「入」方向に、GPIO18に電流を流せば「切」方向にモーターが動くように配置しています。

試しにこのようなコードを書いてみました。node.jsでGPIOを操作し、ボタンを押すと1秒間モーターを動かしてスイッチを動かし、LEDも点けるコードです。
onoffというモジュールを使っているのでnpm install onoffして動かしたら動きます。実行はgpioグループに入ったユーザーで。

var GPIO = require("onoff").Gpio;
 
var gpio0 = new GPIO(17, 'out');          // motor1
var gpio1 = new GPIO(18, 'out');          // motor2
 
var gpio3 = new GPIO(22, 'in', 'rising'); // sw1
var gpio4 = new GPIO(23, 'out');          // led1
 
var on = 0;
var count = 0;
 
gpio3.watch(function(err,value){
  console.log("button pressed:", value);
  if(err){
    throw err;
  }
//  if(value == 1){
    count++; // 何故か GPIO rising イベントが必ず2連続で発行されることへの雑なhack
    if(count == 2){
      if(!on){
        console.log("switch on");
        gpio0.writeSync(1);
        gpio1.writeSync(0);
        console.log("motor on");
        on = 1;
      }else{
        console.log("switch off");
        gpio0.writeSync(0);
        gpio1.writeSync(1);
        console.log("motor on");
        on = 0;
      }
 
      setTimeout(function(){
        gpio0.writeSync(0);
        gpio1.writeSync(0);
        console.log("motor stopped");
      },1000);
 
      gpio4.writeSync(on);
      count = 0;
    }
// }
});
 
console.log("started");
 
process.on('SIGINT', function () {
  gpio0.unexport();
  gpio1.unexport();
  gpio3.unexport();
  gpio4.unexport();
});

edgeに'rising'を指定してんのに不意にvalueが0のイベントが飛んできたりとか、ボタンを押すとほぼ毎回2連続でイベントが飛んできたりするので試行錯誤の跡が見えるコードですが、とりあえずなんか動いた

で、これをインターネットに繋げていきます。
色々な方法があると思いますが僕は自分専用Slackにbotを生やしました。Hubotというフレームワークを使って、上記のようなコードを動かしています。JSで書いたのはそのためです。

f:id:pikatenor:20161205234613p:plain
(Figure.19 kotatsubot 爆誕)

こうしてインターネットからこたつの灯がともりました。

f:id:pikatenor:20161205234602j:plain:w300
(Figure.20 It works.)

見よこれが次世代の暖かさだ

所感など

運用してみた感想・その他ですが、

  • 当初作ったものではスイッチが固すぎてモーターのプーリーが滑ってしまったためギアによる置き換えなどを検討したが、最終的にはこたつのスイッチのネジを少しゆるめ、中も削ってスイッチの滑りを良くして対処した

  • 使うのが楽しくてぶっちゃけ切り忘れは減った(本末転倒)

  • 夜の間に服をこたつに入れておいて、朝布団の中からスイッチを入れて服を温めて着る、という使い方が便利

  • なのでタイマー機能を付けた タイマー設定中はLEDを点滅させていい感じに

  • Googleカレンダーからデータを引っ張ってきて授業開始時刻になってもこたつが点けっぱなしだったときに通知するようにしたい

  • Raspberry Pi 上でやるnpm installが遅すぎてハゲそう

  • yarnを使えば多少はマシに戦えるが、動かないパッケージが多すぎてハゲた

  • まずnvmを入れただけでシェルの起動からnodeの起動までクソ遅くなって最悪

などがあり、後半は愚痴です。nodeやめときゃ良かったなあ

製作期間・予算についてですが、10月末からなんとなく作り始めて雙峰祭を挟んで1週間ちょっと間があき、11月23日にkotatsubotが初めて発言しました。そんな感じです。
ほとんど手持ちの部品(&廃DVDドライブ)を使ったので新しく買ったのは

  • TA7291P 2個入り \300
  • 9V乾電池用スナップ(ジャンパワイヤ付き) \40
  • ミニブレッドボード \150
  • 3Dプリンタのフィラメント 14g \112

ぐらいです。Raspberry Pi Zero (本体500円送料800円ぐらいした気がする) のことは考えないようにします。

✨Supported by COJT

以上ここまでお送りしてきたこたつの話ですが、これがklisと何の関係があるねんと言いますと少しだけあります。

筑波大学情報学群には組み込み技術キャンパスOJTというプログラムがあり、知識情報・図書館学類生も「GA40103 体験型システム開発A」「GA40203 体験型システム開発B」として受講することが可能です。

COJTソフトウェアコースを受講するとopenfab 創房の恵まれた機材が使い放題となります。僕は調子に乗って3Dプリンタでギアや可動部部品を出力しました。

f:id:pikatenor:20161205234709j:plain:w300
(Figure.21 soboの誇る3Dプリンタ群)

ソフトウェアコースでは前期はWebアプリ製作、後期はこのようなIoT機器の製作を体験できます。こたつプロジェクトはCOJTとは関係なく個人的にやったことですが、まあ似たようなことを今授業でもやっています。

この記事を読んで楽しそうだと思った方、Web周りの技術に興味のある方は受講をご検討されては如何でしょうか。
内部生向けの1次募集はすでに終了していますが、4月にももう一度チャンスがあります。何故か毎年内部生の受講が少なく3編生ばかりでちょっと敷居が高いように感じるかもしれませんが、まあまあ気にする必要はありません。僕自身こういうことをやっていると「高専生?」「工業高校出身?」とか訊かれますが全くそんなことはなく普通科出身です。ようはやっていき次第です。

FPGAと格闘したいという修羅の方はハードウェアコースの道に進むのもアリかと思います(実際今年度はklisから1名HWコースへの受講者が出ています)。今年は希望者が少なかったらしいので、出せば通るぞ

あ、あと教鞭を振るうのは外部企業から来た先生方なので安心してください。どの先生もすごい人で良い人です。(何に対しての安心かは聞かないでください)

以上、klis Advent Calendar 6日目の記事でした。明日はぱぷりか担当です。楽しみですね。お楽しみに。

*1:本当はピックアップを動かすステッピングモーターを使おうとしてDVDドライブを解体し始めたが、こっちの方が圧倒的に簡単だと気付いてやめた

*2:ただ3Dプリンタ使ってみたかっただけ。CADはFreeCADを使いました。

*3:DVDドライブの電源がそうなっていた

*4:後述の注意点参照