Arduino MicroでLチカ(その1)

## 導入

Arduino入門と言えばArduino UNOだが、UNOでなければならない理由もないのと簡単にUSBデバイスにできることからArduino Microを購入した。
Arduino Microに載っているマイコンはATmega32U4というもの。自作キーボード界隈でもよく使われていて、Alternative Controller for HHKB(参照:[Alternative Controller for HHKBのススメ](https://qiita.com/shela/items/62324752ff703bae3e74))でも使われているので、Alternative Controller for HHKBの代わりに実験用に使えそうなことも選択した理由の1つ。

購入したものはスイッチサイエンスの[Arduino Micro 5V 16MHz (ATmega32u4 - ピンヘッダ無し)](https://www.switch-science.com/catalog/1389/)。純正品でなく互換品を選んでもいいかもしれないが、5V/16MHzと3.3V/8MHzの動作電圧とクロックの違いがあったり、LEDなど一部の実装がない、マイコンから引き出されているピンの本数が少ない、ブートローダがArduinoのものではなくDFU Bootloaderになっている、といった差異があるので注意。

## 準備

とりあえずブレッドボードで使えるようにピンヘッダを半田付けした。当初はブレッドボートに刺しやすい[細ピンヘッダ 1x40(黒)](http://akizukidenshi.com/catalog/g/gC-06631/)を使う予定だったが、Arduino Microにはめてみたところピンの頭が基板の穴からはみ出ないくらい短く半田付けしづらそうだったので、[ピンヘッダ 1x40(40P)](http://akizukidenshi.com/catalog/g/gC-00167/)を使った。

ピンヘッダを半田付けする際、適当なブレッドボードにピンヘッダを刺した状態で半田付けするとピンヘッダを垂直に固定できるしピンヘッダや基板の微妙な反りを補正できるので便利。ピンの間隔が2.54mmなので細かい作業になるが、これくらいなら慣れていなくてもなんとでもなる感じ。半田付けが無理ならそもそもピンヘッダ付きのArduino Microを購入すれば良い。

![arduino micro.jpg](https://qiita-image-store.s3.amazonaws.com/0/28644/c57c40cf-95cf-89cc-e7c3-8da9ed7bcb09.jpeg)

## ソフトウェアのインストール

[Arduino IDE](https://www.arduino.cc/en/main/software)と[Visual Studio Code](https://code.visualstudio.com/)(VSCode)をインストールした。VSCodeにはMicrosoftが提供している拡張機能のArduinoを導入した。
Arduino IDEだけでもいいが、Arduino IDEはエディタが使いづらいのでVSCodeを使ってみることにした。

VSCodeは基本設定でArduino IDEのインストール先を設定しておく。

```
"arduino.path": "C:/Program Files (x86)/Arduino"
```

## Lチカ

Arduino Micro基板上のLEDでLチカをしてみる。実を言うと既にArduino MicroにLチカのスケッチ(プログラム)が書き込まれているので、Arduino MicroとPCをUSBケーブルで接続して電源供給するだけでLチカは完了している…。が、さすがに寂しすぎるのでLチカの間隔を変えてみることにした。

VSCode上でCtrl+Shift+Pを押下して「Arduino: Examples」を選択するとサンプルスケッチが表示されるので「Built-in Examples」-「01.Basics」-「Blink」と選択する。選択すると%USERPROFILE%\Documents\Arduino\generated_examplesにサンプルコードのコピーが作成されて編集できるようになる。

VSCodeのステータスバーで\<Select Board Type\>となっているところをクリックして「Arduino/Genuino Micro (Arduino AVR Boards)」を選択する。
さらに、ステータスバーの\<Select Serial Port\>をクリックしてArduino LLCと書かれているCOMポートを選択する。

.vscode/arduino.jsonを開くと設定した内容が書かれているのが分かる。
ここにoutputパラメータでビルドパスを設定しておくと、リビルド時に中間ファイルを再利用できるのでビルドが早くなる。

```json
{
    "board": "arduino:avr:micro",
    "port": "COM6",
    "sketch": "Blink.ino",
    "output": "./build"
}
```

続いて、Arduino Microの仕様を確認する。https://store.arduino.cc/usa/arduino-micro のDOCUMENTATION -> Input and Outputより

> LED: 13. There is a built-in LED connected to digital pin 13. When the pin is HIGH value, the LED is on, when the pin is LOW, it's off.

とあるように、LEDのピンは13となっているのでサンプルスケッチそのままで問題なし。ピン13をHIGHにするとLEDが点灯、LOWにするとLEDが消灯する。

動作確認用にシリアル通信を使ってONとOFFの状況をログ出力してみることにしたので、シリアル通信についても見てみる。

> Serial: 0 (RX) and 1 (TX). Used to receive (RX) and transmit (TX) TTL serial data using the ATmega32U4 hardware serial capability. Note that on the Micro, the Serial class refers to USB (CDC) communication; for TTL serial on pins 0 and 1, use the Serial1 class.

とあるように、Arduino MicroのUSB(CDC)でのシリアル通信はSerialクラスを使用する。Arduino IDEやVSCodeのシリアルモニタで閲覧できるのはUSBのものなのでSerialクラスを使う必要がある。
参考までに、RXとTXピンを使ってTTLシリアル通信を行う場合はSerial1クラスを使用することになる。

以下のようにサンプルコードを変更した。変更点は、LEDの点灯時間および消灯時間を1秒から2秒にしたことと、シリアル通信のデータ転送レートの設定、LEDが点灯した時にON、消灯した時にOFFとシリアルポートに出力する処理を追加したこと。

```c++
int led = 13;

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}

void loop() {
  digitalWrite(led, HIGH);
  Serial.println("ON");
  delay(2000);
  digitalWrite(led, LOW);
  Serial.println("OFF");
  delay(2000);
}
```

スケッチ修正後、Ctrl+Alt+R(またはCtrl+Shift+Pから「Arduino: Verify」を選択)でスケッチをビルドする。問題がなければCtrl+Alt+U(またはCtrl+Shift+Pから「Arduino: Upload」を選択)でArduino Microにスケッチを書き込む。書き込みに失敗した場合は、接続先のシリアルポートが正しいか確認する。

スケッチを書き込む時にはArduino Microをリセットしてブートローダを起動する必要があるが、

> Rather than requiring a physical press of the reset button before an upload, the Micro board is designed in a way that allows it to be reset by software running on a connected computer. 

と書かれているように、スケッチ書き込み時にソフトウェアからリセットがかかる仕組みになっているので何も気にせずスケッチを書き込めた。ArduinoのブートローダではなくDFU Bootloaderを使っているAlternative Controller for HHKBでは手動でリセットスイッチを押す必要があったので、このあたりはブートローダか書き込みに使うアプリの違いのようだ。

ブートローダの仕組みについてはしなぷすさんの[Arduinoのブートローダって何?(1)](https://synapse.kyoto/tips/bootloader/page001.html)あたりが詳しい。

なお、手動でリセットする場合はArduino Microの端の方にあるRSTと書かれている白いプッシュスイッチを押せば良い。

## 動作確認

スケッチを書き込み終わると自動的に書き込んだプログラムが実行される。Arduino Microの基板に書かれている「Arduino」という文字の隣にあるのがピン13で制御できるLED(緑)で、最初にUSB接続した時より点滅速度が遅くなっているはず。また、VSCodeのステータスバーの電源プラグアイコンをクリックしてシリアルモニタを開くと、点灯後にON、消灯後にOFFと出力されるはず。シリアル通信が行われたことは、基板上のTXと書かれているところのLED(オレンジ色に見えるが黄色らしい)が一瞬光ることでも確認できる。

ちなみにシリアル通信の内容はTeraTermでも確認できる。シリアルモニタを開いていたりして既にシリアル接続しているものがあるとダメなので注意。シリアルモニタを開いている場合は、ステータスバーの電源プラグアイコンのあったところが✕アイコンになっているのでこれをクリックしてシリアル接続を閉じる。
TeraTermでArduino MicroのCOMポート(VSCodeのステータスバーで設定したシリアルポートと同じ)に接続すれば、シリアルモニタと同じようにONとOFFが出力されるはず。