GR-PEACHでディジタル時計を作った

今年の夏,セキュリティ・キャンプに参加した.
そのとき参加した講義の一つで,GR-PEACHがもらえるというものがあった.ただし,「事前学習や趣味で使った内容を,ネット媒体(ブログやウェブサイト,twitter,Qiita等)に書くこと。」,「年内くらいに掲載、公開してほしい」とのことで,さっき思い出して慌ててこの記事を書いている.
今記事を書いている日付を確認すると12月24日,つまりクリスマスだ.
メリークリスマス.私は今年のクリスマス,時計を作って過ごしたよ.

 
構想
今回の目的はGR-PEACHで何かを作ることだった.また,昔Amazonで売っていた10個250円のレーザーポインタを使いたかった(レーザーってなんかかっこいい).
レーザーポインタが10個ということは,単純に考えて10[bit]の情報を表すことができる(点滅パターンによりn倍にできるが,面倒かつ見にくいので今回はなし).
適当に考えた結果,ディジタル時計を作ることにした.
設置場所はベッドの近くとし,寝ながらでも見ることができるようにした.
 
概要
今回作成したのはレーザーポインタを10個使用した2進数のディジタル時計.
レーザーを4[bit]と6[bit]に分け,それぞれ時と分を2進数で表す.
設置はベッドの近く,投影は2[m]ほどの距離がある天井とした.
また,時計合わせについてはオンボードのスイッチで行うこととした.
 
設計
レーザーを10個使用するにあたり,一番に心配になったのは過電流によるボードへのダメージだ.商品ページによると5[V]で使用し,20[mA]以下の電流が流れるということだった.何も考えずにGPIOに接続すると,各ピンに最大20[mA],合計で最大200[mA]が流れることになる.ボードに搭載されているマイコン(R7S721001VLBG)の仕様書を読んでみたところ,どうも定格を超えるように見える.そのため,PowerMOSFETを間にかませることにした.たまたまIRF9540が10個余っていたので,それを使う.
時計のプログラムに関しては,特に工夫する点もなく,1秒周期の割り込みをカウントアップする方式で作成した.時計合わせについては通常,編集(時),編集(分)の3つの状態を用意し,長押しで状態遷移,普通の押しでカウントアップを行うようにした.たぶんソースを見たほうが早い.
 
実装
GR-PEACHを使うのは久々なので,最初にLチカでGPIOが正しく扱えるかどうかを確認した.ブレッドボードに抵抗とLEDを刺し,GPIOと配線をつなぐだけの単純なもの.時計のプログラムはWebコンパイラからArduino互換のプロジェクトを元に作成した.
 

 
ひとまず,GPIOが正しく動作することがわかったので,LEDと抵抗をレーザーに置き換える.以下の写真は置き換え途中でGPIOの配線はまだであるが,既に配線がごちゃごちゃとしていることが分かる.
 

 
だんだんと配線をしていく…
 

 
この時点でレーザー単体でのテスト,GPIOを含めたテストを行い,正しく制御できることを確認した.そのため,レーザーを配置するための台座を作ることとした.台座は,ルーズリーフに印をつけ,それをダンボールの切れ端に重ね,シャーペンで上から突き刺して穴を開け,その後レーザーが入るまで拡張するという雑な手法を取った.
 

 
しかし,これでは2[m]離れた天井にレーザーを照射すると,位置があっていないために変なプラネタリウムのようになることがわかった.
 

 
そこで,押し入れの中で眠っていた桐の木片に,同じく押し入れの中で眠っていたドリルで穴を開けることとした.
 

 
この状態でも正しい位置に照射できなかったため,角度をつけてセメダインで固定を行い,ある程度正しい位置に見えるようにした.
 

 
 
最後に電源としてモバイルバッテリーをつけることで,完成(2時15分ごろ撮影).
 

 
今後の課題
各レーザーの位置を相対位置で判別する必要があるので,目印などを天井につけたい.また,モバイルバッテリーがどれほど持つのか,実測により調べていきたい.
 
感想
GR-PEACHの開発環境として,Webコンパイラが使えるの強い.あと,実行ファイルをGR-PEACHに入れるときもドラッグ&ドロップでいけるの強い.
ただ,Webコンパイラに関しては,コンパイルに失敗したら赤字で堂々と「コンパイルに失敗!」って表示してほしい.ただ「コンパイルが完了しました」とだけ表示され,下の方にスクロールするとやっとエラーメッセージが見えるのはなんかだるい.
とはいえ,今回はGR-PEACHの性能を活かせるものだったとは到底思えない(足の多いPICでいい)ので,次は内部で処理をゴリゴリ動かす感じのモノを作っていきたい.