サンタのおもちゃをmicro:bitで制御する

この記事はニフティグループ Advent Calendar 2018の3日目の記事です。
2日目は@motaHackさんの「[MongoDBとmetabaseでローカルのjsonファイルを見やすくしたい](https://qiita.com/motaHack/items/eaea969eda56f2046e19) 」でした。

# はじめに

マイコンボードがお好き？　結構。ではますます好きになりますよ。こんにちわ。

日本でも2020年にプログラミング教育が必修化されるということでSTEM教育用という触れ込みの色々な製品が出始めていますが、イギリス生まれのmicro:bitは安価で扱い易くてコンテンツも充実、海外での実績もあるということで学校教材の有力候補ではないかと(勝手に)思っています。

参考：[Micro:bit財団は2020年までにBBC micro:bitを30万人の日本の子どもたちに届けることを目指す](https://microbit.org/ja/2017-08-03-japan-launch/)

大人(≠おおきなおともだち)もmicro:bitで遊んでほしいと思ったので、サンタのおもちゃを改造して記事にすることにしました。

# BOM
秋葉原でぶらついて適当に買い集めたので無駄が多いです。SWITCH SCIENCEとか秋月電子通商のネット通販でまとめ買いした方が時間も節約できてよいと思います。

|品名|金額|備考|
|:-----------------:|------------------:|------------------|
|サンタのおもちゃ|¥1,480|登り下りするサンタ。正式名称？は「9" musical christmas moving figure」。11月下旬にサンタのおもちゃは全然なかった。|
|micro:bit|¥2,160|参考：[micro:bit（マイクロビット）](https://www.switch-science.com/catalog/3735/)。|
|電池ボックス（単四電池2本用）|¥110|参考：[電池ボックス（単四電池2本用](http://akizukidenshi.com/catalog/g/gP-00348/)。スイッチ付きがおすすめ。|
|コードつきJST-PHコネクター|¥50ぐらい|コネクタ単体で買うと別途工具がいるのでコード付きを。|
|モータードライバ DRV8835|¥300|[ＤＲＶ８８３５使用ステッピング＆ＤＣモータドライバモジュール](http://akizukidenshi.com/catalog/g/gK-09848/)。¥500で[こっち](http://akizukidenshi.com/catalog/g/gK-10346/)を買った方が配線が楽だと思います。　|
|micro:bit用ブレークアウト基板|¥162|[MicroBit：ブレークアウト基板](http://www.aitendo.com/product/17503)。|
|エッジコネクタ|¥300|[エッジコネクタ](http://www.aitendo.com/product/17227)。コネクタにしてはなんか妙に高い。|
|LED（３色タイプ）|¥150ぐらい|何かで使った余り物。neopixelの３色LEDを使おうかと思いましたが5V仕様なので見送りました。|
|1815トランジスタ2個|¥20ぐらい|東芝の２ＳＣ１８１５は随分前に生産中止になってますが、どこも在庫がなくならない気がする。|
|抵抗各種|-|秋月電子通商の全部入りセットを随分前に購入しましたが、一生消費できない気がする。|
|ネオジウム磁石|¥100|ダイソーなど100均で安く買えます|
|配線、半田、マスキングテープ|-|適量|

大体、当初予定の予算¥5,000（micro:bit本体込み）で収まりました。楽をしたい方は[BBC micro:bit用モータードライバ v2](https://www.switch-science.com/catalog/3229/)のような製品を買うのがおすすめです。

# 実現すること（仕様のような何か）
micro:bitで以下のことを実現します。元のおもちゃで実現できていることを再現しているだけで芸がないですが、最初の一歩はこのぐらい簡単なものでいいんじゃないかと思います。

- サンタが上まで上ったらモーターを反転して下ろす(加速度センサーを使う)
- サンタが下まで下がったらモーターを反転して上らせる(磁気センサーを使う)
- サンタが上っているときはLEDで顔を赤くする
- サンタが下りているときはLEDで顔を青くする

プログラム言語はJavaScriptやpythonではなく、誰でも使えるビジュアルプログラミングの方を使うことにします。

# 配線
![santa_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/218020/eb913832-e279-a418-e5f0-f1cf2c42622e.png)

- micro:bit端子P0:モーターの反転切り替え
- micro:bit端子P1:回転速度調整
- micro:bit端子P8(P1の隣):LED赤
- micro:bit端子P12(P2の隣):LED青

電源はモーターとmicro:bit用で分けた方が無難です。
![IMG_0110.jpeg](https://qiita-image-store.s3.amazonaws.com/0/218020/db43be9b-d163-f1ee-cccd-2e557e38e1fd.jpeg)
回転方向の切り替えをしている歯車１つを外し、モーターと電源の間にモータードライバを入れてmicro:bitで回転を制御できるようにします。

![IMG_0121.jpeg](https://qiita-image-store.s3.amazonaws.com/0/218020/475268a2-1534-eb84-800a-6b23328c7998.jpeg)

単三乾電池を３、４本使うようなおもちゃのモーターの制御にはDRV8835などDRVシリーズを買っておけば失敗がないと思います。DRV8835には２つのモードがあり、「２端子で回転を制御」 or 「1端子で回転制御&もう1つの端子で回転速度制御」が選べるようになっていて、今回は１端子で回転制御の方を使用しています。DRV8835は中央にある小さい基板に乗っていますが、酷使すると発熱するので注意が必要です。

LEDは特にこれといったことはないですが、micro:bitの端子からは5mA程度しか取り出せない仕様になっていて、そのまま繋ぐとあまり光らなかったので、トランジスタを挟む形にしてmicro:bitの電源から取るようにしました。（右下の謎な塊部分）

![IMG_0139.jpeg](https://qiita-image-store.s3.amazonaws.com/0/218020/cff25f93-963c-d8aa-df07-bdb762b6c650.jpeg)
位置検出のために磁力センサーを使うので、一番下に付いていたベルの裏側にネオジウム磁石を貼り付けました。

元々付いていたメロディICやスピーカーは煩かったので取り外しました。サンタの衣装部分も含めて殆どホットボンド止めになっていて取り外すのに苦労します。（安いおもちゃあるある）

# プログラム
色々調整した結果、以下のようになりました。
![program.png](https://qiita-image-store.s3.amazonaws.com/0/218020/cb9753e2-00eb-7413-12d1-cc46155f0863.png)

## micro:bitでモーターの回転方向を制御する
一方の端子(P0)にはデジタル0/1で回転方向を入力、もう一方(P1)にはアナログ（PWM）で回転速度を入力するのですが、このおもちゃの場合、回転速度を落とすとトルク不足で登れなくなってしまうのであまり意味がなかったかもしれません。ただ、速度全開だとうるさかったので「最初だけ」のところで最大値1024から950と少しだけ落としました。

このおもちゃは上まで上がると大きく振動する仕組みになっているので加速度センサー（加速度を絶対値で取得）で振動が大きくなったらモーターを反転させ、下まで下がった時は磁気センサー　(磁力を絶対値で取得)でベルに仕込んだネオジウム磁石の磁力を検知してモーターを反転させることで上がったり下ったりする動作を実現しました。
誤作動を防ぐために閾値を超えた回数が一定以上になってから切り替えるようにしています。繰り返しの回数やセンサーの閾値は動作テストして決めたもので深い意味はありません。

「最初だけ」にある「コンパスを調整する」というのは磁力センサーのキャリブレーションを行うブロックで起動時に１回、手動でのキャリブレーションが必要になります。（結構面倒です）

## micro:bitでLEDの点灯を変える
特に説明する点もないのですが、単純に上がっているときは赤側(P8)、下がっているときは青側(P12)の端子にデジタル出力をしています。（トランジスタのベースに電圧がかかり、コレクタ-エミッタ間で電流が流れるようになるのでLEDが点灯する）

# 動作確認
基板などが見えないように袋に入れて吊るしましたが、電池ボックスがmicro:bitの磁気センサーに近い位置にあると誤作動を起こしたりしたため、ブレークアウト基板底面にマスキングテープで固定しました。赤が強すぎて分かりにくいですが、青LEDも弱いですが一応光っています。

![output.gif](https://qiita-image-store.s3.amazonaws.com/0/218020/aae1f934-5a67-53e7-7113-b8d7e67138d9.gif)

# 最後に
micro:bitは大人でも楽しめる製品ですので、年末/年始のテレビとか積みゲー消化に飽きたらmicro:bitで遊んでみるのもいいと思います。

4日目は@motaHackさんの[MongoDBとmetabaseでjsonファイルを見やすくしたい 後編](https://qiita.com/motaHack/items/49d45c07c61f286851ec)です。