どうも。
メイカー系イベント出展に入れ込むあまり、人生(の金と時間を)溶かし中の小野寺修(@SAMonodera)と申します。
#いきさつ
先日、深圳の華強北でひとつ80円のArduino互換機を60個ほど爆買いして、それをお土産として秋葉原ロボット部 第86回勉強会の参加者の皆さんにお配りしていた時のこと。
「せっかくココには半田ごてもあるんだし、いまから動かせばいいやん」と、サドンリーでエクストリームな声が、どこからともなく聞こえてきます。
ちなみにこちらの会、「あぁ、そうね。了解。では次回までに」などという社交辞令が通じるほどヤワな場ではありません。
という訳で今回は、濃すぎる 優秀すぎる皆さんが、よってたかってグイグイと チームプレイも鮮やかに、限られた僅かな時間の中で 部品の買い出し→はんだ付け→プログラミング と、未知のリーンサイクルを回して挑んだ驚愕の顛末を、尊敬の念を持って記事化したものです。
#80円Arduino互換機とは?
そもそも、本記事のお題である80円Arduino互換機とは、私が勝手に命名した正体不明な格安かつ極小サイズのArduino互換ボードのことで、オープンハードカンファレンス 2019 Tokyo/Fall の出展中に、たまたま隣のブースでお会いした にいむら ともさんに教えていただいた脅威のブツです。
私はその驚きを当時、次のように綴っています。
この #80円arduino は必要最低限の構成とはいえ、後は通信とセンサ(アクチュエータ)とバッテリをポン付けすれば、立派なIoT機器に変身する。
— Sam //「つくば Mini Maker Faire」出展 (@SAMonodera) October 7, 2019
俯瞰するとコスト的な閾値は凄い勢いで下がり続けている。IoTによるパラダイムシフトの足音が、すぐそこに聞こえている感じがして(色んな意味で)心が騒つく。 https://t.co/7RwpIa0TAe
パッケージは上の写真ような感じで、ラベルは大変読みにくいのですが、「LGT8F328P-SSOP20 MiniEVB 型号: BTE17-13 3V3版本」と記載されています。
チップに刻印の類いは一切ありません(!)でしたが、ラベルのおかげで少なくとも「ATmega328/328P」互換の3.3V駆動らしいということは分かりました。
#部品の買い出しから、PCに接続するまで
さっそく制作開始です。
まず、このボードにはUSBに接続するための(書込みやら給電やらを担当する)部品が搭載されていないため、会場からほど近いaitendoまでダッシュで買い出しに行くところから始まります。
都合、USB-URAT変換アダプタ「U2T2102MCU6P」と、相互接続用のピンヘッダケーブル(メス⇔メス)の2点を購入します。
Arduino互換ボードとUSB変換パーツにピンヘッダをはんだ付けし、ケーブルを以下の通り接続します。
USB-URAT変換アダプタ側 | Arduino互換機側 | 作例でのケーブル色 |
---|---|---|
3V3 | VCC | 赤 |
DTR | DTR | 橙 |
RXI | TXO | 黄 |
TXI | RXI | 緑 |
GND | GND | 灰 |
※ TXとRXをテレコに接続するのがポイントです。
上記の作業が終われば、PCに接続します。
はんだ付けに問題がなければ、次の写真のように互換ボードとUSB変換パーツに予め搭載されている、それぞれの赤色LEDが点灯します。
デバイスマネージャーの画面では、ポート(COM と LPT)に下のキャプチャのようなUSB-URAT変換アダプタが認識されていればOKです。
#プログラムを書き込む
今回はWindows 10のArduino IDEを使いました。
IDE上の「ボード」と「プロセッサ」の設定は、下の写真のように行いました。
試しにサンプルプログラムの「Blink」を起動させてみたところ、delayの値と実測値に乖離があるようです。
そこで、次のようにクロック分周値を変更するすることで帳尻を合わせることにしました。
CLKPR = _BV(CLKPCE); // CLKPCEビットを1にする
CLKPR = 0b0010; // 4分周にする
ちなみに、この方法がベストな解決方法かどうかは未検証です。
今回の実装はイベントの時間内に完走することが主目的だったため、あくまでも一例ということでご理解願います。
※ 先のにいむら ともさんの話によると「LGT8F328はAVR命令互換だけどIO互換とは言えないので、ボード設定やライブラリーは設定すると幸せになれる」とのことで、この件はコチラで記事化されています。
プログラム全体では、以下のようになります。
/*
Blink
http://www.arduino.cc/en/Tutorial/Blink
*/
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
CLKPR = _BV(CLKPCE); // CLKPCEビットを1にする
CLKPR = 0b0010; // 4分周にする
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(500); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(500); // wait for a second
}
このプログラムが正常に動作すると、ボードに内蔵されている青色のLEDが、プログラムの指示通り1秒周期で点滅を繰り返します。
#まとめ
以上、無茶振りから端を発した本プロジェクトですが、蓋を開けると買い出しから動作確認までを3時間弱で駆け抜けたという…。
皆さん、かっこよすぎですな!!
ちなみに、深圳やAliでこの互換機をどのように購入したのかという顛末は、別のアドベンドカレンダーで記事化しています。
"【Maker Faire Shenzhen 2019 #2】わずか80円!謎のArduino互換機の正しい買い求め方 "
宜しければ是非ご覧下さいませ <(_ _)>
(ツイッターフォローはこちら)
#参考
ATmega328/328P 完全データシート (表13-18. クロック前置分周器選択)
クロックプリスケールレジスタ