わずか80円！謎のArduino互換機を動かしてみた

どうも。
[メイカー系イベント出展](https://profiee.com/i/_SAM)に入れ込むあまり、人生(の金と時間を)溶かし中の小野寺修([@SAMonodera](https://twitter.com/SAMonodera))と申します。


#いきさつ

　　**80円Arduino互換機のパッケージ：**
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318815/dd097664-3d31-70db-163f-1522e02940b9.jpeg" width=50%>

先日、深圳の華強北で**ひとつ80円のArduino互換機**を60個ほど爆買いして、それをお土産として[秋葉原ロボット部 第86回勉強会](https://akbrobot.connpass.com/)の参加者の皆さんにお配りしていた時のこと。

「せっかくココには半田ごてもあるんだし、いまから動かせばいいやん」と、サドンリーでエクストリームな声が、どこからともなく聞こえてきます。
ちなみにこちらの会、「あぁ、そうね。了解。では次回までに」などという[社交辞令が通じるほどヤワな場ではありません](https://togetter.com/li/1369426)。

という訳で今回は、~~濃すぎる~~ 優秀すぎる皆さんが、~~よってたかってグイグイと~~ チームプレイも鮮やかに、限られた僅かな時間の中で **部品の買い出し→はんだ付け→プログラミング** と、未知のリーンサイクルを回して挑んだ驚愕の顛末を、尊敬の念を持って記事化したものです。
 
　
#80円Arduino互換機とは？

そもそも、本記事のお題である[80円Arduino](https://twitter.com/hashtag/80%E5%86%86arduino?src=hashtag_click)互換機とは、私が勝手に命名した**正体不明な格安かつ極小サイズのArduino互換ボード**のことで、[オープンハードカンファレンス 2019 Tokyo/Fall](http://oshwc.project2108.com/event/oshwc2019tokyofall/)​ の出展中に、たまたま隣のブースでお会いした [にいむら とも](https://www.facebook.com/tomon777)さんに教えていただいた脅威のブツです。
私はその驚きを当時、次のように綴っています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">この <a href="https://twitter.com/hashtag/80%E5%86%86arduino?src=hash&amp;ref_src=twsrc%5Etfw">#80円arduino</a> は必要最低限の構成とはいえ、後は通信とセンサ(アクチュエータ)とバッテリをポン付けすれば、立派なIoT機器に変身する。<br><br>俯瞰するとコスト的な閾値は凄い勢いで下がり続けている。IoTによるパラダイムシフトの足音が、すぐそこに聞こえている感じがして(色んな意味で)心が騒つく。 <a href="https://t.co/7RwpIa0TAe">https://t.co/7RwpIa0TAe</a></p>&mdash; Sam //「つくば Mini Maker Faire」出展 (@SAMonodera) <a href="https://twitter.com/SAMonodera/status/1181066932172120064?ref_src=twsrc%5Etfw">October 7, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318815/0fa56833-96be-57a9-82d6-55559aa0483a.jpeg" width=30%>
パッケージは上の写真ような感じで、ラベルは大変読みにくいのですが、「LGT8F328P-SSOP20 MiniEVB 型号: BTE17-13 3V3版本」と記載されています。
チップに刻印の類いは一切ありません（！）でしたが、ラベルのおかげで少なくとも「ATmega328/328P」互換の3.3V駆動らしいということは分かりました。


#部品の買い出しから、PCに接続するまで

さっそく制作開始です。
まず、このボードにはUSBに接続するための(書込みやら給電やらを担当する)部品が搭載されていないため、[会場](https://granica.io/)からほど近い[aitendo](http://www.aitendo.com/)まで**ダッシュで買い出しに行く**ところから始まります。
都合、USB-URAT変換アダプタ「U2T2102MCU6P」と、相互接続用のピンヘッダケーブル(メス⇔メス)の2点を購入します。
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318815/a935505b-8cfb-eafa-bfb7-3fb94b389618.jpeg" width=55%>
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318815/c0fecea0-12eb-28c2-6984-a6c9aa00d6f8.jpeg" width=55%>

Arduino互換ボードとUSB変換パーツにピンヘッダをはんだ付けし、ケーブルを以下の通り接続します。

|USB-URAT変換アダプタ側|Arduino互換機側|作例でのケーブル色|
|---|---|---|
|3V3  |VCC  |赤|
|DTR　|DTR  |橙|
|RXI  |TXO  |黄|
|TXI  |RXI  |緑|
|GND  |GND  |灰|

※ TXとRXをテレコに接続するのがポイントです。

　　**USB-URAT変換アダプタ側：**
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318815/3b99ed92-7b6b-cb33-79b9-541288d6c08f.jpeg" width=70%>

　　**Arduino互換機側：**
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318815/4322b856-bc62-c457-0c0e-5242155ae2ab.jpeg" width=70%>

上記の作業が終われば、PCに接続します。
はんだ付けに問題がなければ、次の写真のように互換ボードとUSB変換パーツに予め搭載されている、それぞれの赤色LEDが点灯します。
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318815/b75abdc7-ec29-3117-e738-d7df8f533a11.jpeg" width=70%>

デバイスマネージャーの画面では、ポート(COM と LPT)に下のキャプチャのような**USB-URAT変換アダプタ**が認識されていればOKです。
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318815/e57a677e-c5ab-9912-fd57-d2e45ac2e6a7.png" width=70%>


#プログラムを書き込む

今回はWindows 10のArduino IDEを使いました。
IDE上の「ボード」と「プロセッサ」の設定は、下の写真のように行いました。
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318815/331cf437-1ad2-398d-1210-b901e805bc69.png" width=70%>

試しにサンプルプログラムの「Blink」を起動させてみたところ、delayの値と実測値に乖離があるようです。
そこで、次のように**クロック分周値を変更するすることで帳尻を合わせる**ことにしました。

```C++
  CLKPR = _BV(CLKPCE);  // CLKPCEビットを1にする
  CLKPR = 0b0010;       // 4分周にする
```

ちなみに、この方法がベストな解決方法かどうかは未検証です。
今回の実装はイベントの時間内に完走することが主目的だったため、あくまでも一例ということでご理解願います。

※ 先の[にいむら とも](https://www.facebook.com/tomon777)さんの話によると「LGT8F328はAVR命令互換だけどIO互換とは言えないので、ボード設定やライブラリーは設定すると幸せになれる」とのことで、この件は[**コチラで記事化**](https://qiita.com/tomonnn1/items/9cde658f80cb8b077c0f#_reference-ebf48612573286a80205)されています。

プログラム全体では、以下のようになります。

```C++:Blink.ino
/*
  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秒周期で点滅を繰り返します。
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318815/e8e9cd5c-e660-aae2-e309-729cf46967a6.jpeg" width=50%>


#まとめ

以上、無茶振りから端を発した本プロジェクトですが、蓋を開けると**買い出しから動作確認までを３時間弱で駆け抜けた**という…。
皆さん、かっこよすぎですな！！

　　**モブプログラミングに入れ込む皆さんの雄姿：**
　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318815/96a294e0-5889-272e-9927-0d75570bbd49.jpeg" width=50%>

ちなみに、深圳やAliでこの互換機をどのように購入したのかという顛末は、[別のアドベンドカレンダー](https://adventar.org/calendars/4718)で記事化しています。
["【Maker Faire Shenzhen 2019 #2】わずか80円！謎のArduino互換機の正しい買い求め方 "](https://www.linkedin.com/pulse/maker-faire-shenzhen-2019-osamu-onodera/)
宜しければ是非ご覧下さいませ <(_ _)>

（ツイッターフォローは<a href="https://twitter.com/SAMonodera?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-show-count="false">**こちら**</a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>）


#参考
[ATmega328/328P 完全データシート (表13-18. ｸﾛｯｸ前置分周器選択)](
https://avr.jp/user/DS/PDF/mega328P.pdf)
[クロックプリスケールレジスタ](
https://blog.goo.ne.jp/sim00/e/092640e25c64f5de4b9188009241b7d2)