2019年5月4日土曜日

ProMicroでLチカする方法


背景

ProMicroとはSparkFunが開発したArduino Leonardoの互換機です。
LチカとはLEDを点滅させることの略称です。

ArduinoはD13にLEDが接続されていることが多いのですが、ProMicroはそれが接続されていません。(そもそもD13が引き出されていません。)
しかし、別のピンを利用することでLチカできたので、試した内容を共有します。

使ったもの

ProMicro


今回試したArduinoの互換機です。
スイッチサイエンス(Pro Micro 5V/16MHzPro micro スイッチサイエンス版)、amazonaliexpressなどで買えます。

PC + Arduino IDE + MicroUSBケーブル


Arduino IDEはArduino用のプログラム開発環境です。
下記のページからダウンロードできるので、PCにインストールしてください。

Download the Arduino IDE

MicroUSBケーブルを通してProMicroにプログラムを書き込みます。

RXはD17、TXはD30をLOWにするとLEDを点灯できる

ProMicroには、電源、RX、TXの状況確認用の3つのLEDが搭載されています。
(LEDの色は、全部赤だったり、青が使われていたり、作っているところによって変わります。)


Arduino LeonardoはRXのLEDをD17に、TXのLEDをD30に割り当てているため、該当するデジタルピンで制御可能です。
なお、どちらのLEDもLOWで点灯する回路なことに注意が必要です。

電源用のLEDはVCCの電気で点灯するように回路が組まれているため、プログラムでの制御はできません。
(光らせたくない場合はLEDか抵抗をハンダごてなどで取り外す必要があります。)

ProMicroの回路図: Pro_Micro_v13b.pdf


ということで、TXのLEDを1秒点灯、RXのLEDを1秒点灯、どちらも1秒消灯を繰り返すプログラムを書いてみました。
#define TX_LED 30
#define RX_LED 17

void setup() {
  pinMode(TX_LED, OUTPUT);
  pinMode(RX_LED, OUTPUT);
}

void loop() {
  digitalWrite(TX_LED, LOW);  // turn the TX LED on
  delay(1000);
  digitalWrite(TX_LED, HIGH); // turn the TX LED off
  digitalWrite(RX_LED, LOW);  // turn the RX LED on
  delay(1000);
  digitalWrite(RX_LED, HIGH); // turn the RX LED off
  delay(1000);
}

プログラムができたら、LeonardoとしてProMicroに書き込みます。



TXのLED 1秒点灯、RXのLED 1秒点灯、1秒消灯を繰り返す状態になりました。





マクロでも制御できる

LeonardoにはTXLED0やRXLED0で消灯、TXLED1やRXLED1で点灯させるマクロが定義されているので、それを使ってLEDを制御することも可能です。

下記のプログラムは、先ほどのD17とD30を使ったプログラムと同じ挙動になります。
(厳密に言うとマクロの方がステップ数が少ないため、こちらの方が少ないステップ数で1ループを回せます。)
void setup() {
}

void loop() {
  TXLED1;
  delay(1000);
  TXLED0;
  RXLED1;
  delay(1000);
  RXLED0;
  delay(1000);
}

USBのシリアル通信を行うと、LEDの状態が上書きされる

USBのシリアル通信でデータを送信したらTXのLEDを光らせるマクロが呼ばれたり、データを受信したらRXのLEDを光らせるマクロが呼ばれたりします。
そのため、USBで情報をやり取りする場合は、LEDの制御をしても状態が上書きされてしまいます。

シリアル通信しながらLEDで状態を表示したい場合は別途LEDをどれかのGPIOピンに繋いで利用するのが良さそうです。

まとめ

D13のLEDが無いProMicroでも、TXとRXの状況表示LEDを利用してLチカできました。
USBのシリアル通信を行う場合はLEDの状態が上書きされてしまうため、シリアル通信しながらLチカしたい場合は別途LEDが必要そうでした。

参考

Leonardo: disable TX- and RX-LED
ArduinoCore-avr/variants/leonardo/pins_arduino.h

4 件のコメント :

Unknown さんのコメント...

TXが17番ではないかと思います。

Asuki Kono さんのコメント...

なぜTXが17番だと思いますか?

なお、プログラムでは17がRX、30がTXのLEDに割り当てられています。
leonardo/pins_arduino.h#L107-L108

回路図ではTXのデジタルピン番号は分かりませんが、RXのLEDがD17に割り当てられているのが分かります。
pro microの回路図

Unknown さんのコメント...

軽率コメすみませんでした。
手元のボードと環境でもRX:17で合ってるようでした。
最初試したときは別なボード(ArduinoMicro?)設定と取り違えていたたかもしれません。
↓あと、chatgptがこんな答えだったもので。
On the SparkFun ProMicro boards, the TX LED is connected to digital pin 17. On other ProMicro boards, the TX LED may be connected to a different pin. To confirm the specific pin number for the TX LED on your ProMicro board, you can refer to the board's documentation or schematic.

Asuki Kono さんのコメント...

理由の共有ありがとうございます。
chatGPTによるそれらしい文章の嘘情報でしたか。
間違い指摘はありがたいのですが、次回機会があればそれの理由もあると問題解決が早くなって嬉しいです。
可能ならchatGPTの出力ではない間違いの根拠情報もあると嬉しいです。