M5StickC(ESP32)による「ELEGOO Arduino用UNO R3スターターキット」を利用したArduino入門 その2 LED

現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。

概要(Lesson 3 LED)

前回はツールの導入と、M5StickCの内蔵LEDをLチカしたところまでやりました。今回はキットに同梱されているLEDを使って、Lチカをしてみたいと思います。

必要な構成部品

  • ESP32ボード(M5StickCなど)
  • ブレッドボード
  • 赤色LED(5mm)
  • 220Ω抵抗
  • 1kΩ抵抗
  • 10kΩ抵抗
  • オス-オスジャンパーワイヤ2本(Male to Male jumper wires)

ESP32以外はキットに同梱されています。

ブレッドボードの解説

一時的に回路の実験をするためのボードです。

いろいろな大きさのボードがあります。実はキットのは大きいので、あまり利用していません。写真の右側にあるような小さいボードを使っています。

ちょっと回路を残したいときには、数があったほうが楽です。それほど高いものではないので、複数持っていおくと便利です。

質的には圧倒的に国産のもののほうが高いです。サンハヤトの物を買っておけばいちばん問題おこらないと思います。安いものは接触が悪くなりやすいので、消耗品と思って使ってください。

秋月電子通商さんの商品を参考にしながら、「ブレッドボードの達人」のPDFをみてみるとわかりやすいと思います。

LEDの解説

キットには5mmの大きさのLEDが付属しています。足の長い方がプラス側で、短い方がマイナス側になります。一般的には3mmの小型か、5mmの大きさが使われていると思います。

色と大きさはいろいろあるので、好きな色と大きさを使ってみてください。

秋月さんだと、上記のような製品ですね。使い方は「抵抗の計算方法」のPDFで詳しく説明されています。

LEDは基本的に抵抗とセットで利用します。抵抗の大きさで明るさを調整するのですが、抵抗がなかったり小さすぎると明るくなりすぎて、壊れてしまいます。

ただし、ESP32の場合3.3Vで動いており、あまり電流が流れない構造となっているので、抵抗無しでも壊れない場合が多いです。とはいえ、基本は抵抗も使ってください。とくに5Vで動いているArduino UNOなどの場合には、抵抗無しだと一瞬でLEDが壊れます。

おすすめは上記の抵抗内蔵LEDです。こちらは抵抗なしでも使えます。

抵抗の解説

秋月さんのLEDに添付されていた「抵抗の計算方法」のPDFがわかりやすかったですが、抵抗もキットには複数種類付属されています。

基本的にはあまり買い足す必要はないと思います。LEDの場合には大きめの抵抗を入れておけば暗く光るだけで、壊れることはないです。

キットに付属しているのは、上記のようなカーボン抵抗です。1/4Wというのが、どれぐらいの電力を流していいのかを表しています。キットで付属されているデータシートだと0.25Wと記述されていました。

こちらも秋月さんの「抵抗値の記号、色表示、標準数列、許容差記号」というPDFがわかりやすいと思います。

抵抗値は色から読み取れますが、無理に覚える必要はありません。キットのだと書いてあるのも見たほうが安全です。わからなくなった場合には色から読み取るよりは、テスターなどで測ってください。

テスターは必須ではありませんが、あったほうがトラブルが起きたときには原因特定がしやすいです。最初は安いものでかまわないと思います。

ジャンパーワイヤの解説

ブレッドボードを使う場合の配線に利用するワイヤです。

上記のような商品です。

キットにはオス-オスが65本と、メス-オスが10本入っています。メス-メスは付属していないので、必要であれば追加購入してもよいのかもしれません。ただあまり使わかないかな?

おすすめは、上記のワイヤです。あまり使わないのですが、もっているとはんだ付けをしなくても、とりあえず使うことができる便利アイテムです。ただ、このキットでは必要ありませんので、センサーなどを追加で購入

こちらはAmazonにもありますが、結構高いです。

LEDを光らせる(5V)

キット付属マニュアルでは、上記の接続図になっていました。5V端子から220Ωの抵抗を経由して、赤色LEDに接続して、GNDに接続しています。

上記が回路図です。M5StickCが汎用ICのデータのままなので、ピンの役割がわかりにくいですが、Pin2の5Vから抵抗とLEDからPin1のGNDにつながっています。

LEDの注意点としては、接続するときの向きがあります。足の長い方がプラスになります。図の場合、足の根元が曲がっている方がプラスになります。

また、抵抗の位置ですが一般的にはLEDよりプラス側に設置する場合が多いです。ただし、回路的にはどちらに設置しても構いません。

この回路の場合に、LEDに流れる電流を計算してみましょう。

抵抗の計算方法」によると、「(電源電圧[V]-順方向電圧降下[V])÷順方向電流[A]=抵抗値[Ω]」となっていますので、この式から計算してみます。

キットに付属しているLEDのデータシートによると順方向電圧降下はおそらく2.0Vのものだと思います。実際には順方向電流が増えると、順方向電圧降下も共に増えるのでもう少し複雑な計算が必要です。

  • 電源電圧 = 5V
  • 順方向電圧降下 = 2.0V
  • 順方向電流 = x
  • 抵抗値 = 220

上記から、( 5 – 2.0 ) ÷ x = 220となり、3 = 220xになり、x = 0.0136になりました。約14mA流れています。抵抗値を上のものに交換することで、さらに流れる電流が減り暗くなるはずです。

ちなみに秋月さんで、電源電圧と電流、VFから抵抗値を計算する画面が提供されています。LEDの場合には、概ね30mA前後で動かす事が多いと思います。付属しているLEDの上限値は50mAでした。

LEDを光らせる(3.3V)

実際のところESP32は3.3Vで動いているので、3.3Vに接続する場合の方が多いです。

  • 電源電圧 = 3.3V
  • 順方向電圧降下 = 2.0V
  • 順方向電流 = x
  • 抵抗値 = 220

上記から、( 3.3 – 2.0 ) ÷ x = 220となり、1.3 = 220xになり、x = 0.0059になりました。約6mA流れています。6mAだと相当暗いですが、光っているかの確認だけであればできると思います。

LEDをGPIOで光らせる(3.3V)

キットのマニュアルだと電源から接続していましたが、実際にはM5StickCのGPIOに接続する場合がほとんどです。

上記ではGPIO26に接続しました。

// 内蔵LEDが接続されているPINを指定する
int led = 26;

// リセットか電源を入れると一度だけ実行される初期化処理の関数です
void setup() {
  // デジタル出力モードに設定する
  pinMode(led, OUTPUT);
}

// 常に繰り返し実行される処理の関数です
void loop() {
  digitalWrite(led, HIGH);  // LEDをONにします(HIGHにすると点灯します)
  delay(1000);              // 1000ミリ秒(=1秒)待機します
  digitalWrite(led, LOW);   // 内蔵LEDをOFFにします(LOWにすると消灯します)
  delay(1000);              // 1000ミリ秒(=1秒)待機します
}

コードは上記になります。

  // デジタル出力モードに設定する
  pinMode(led, OUTPUT);

ピンを使う場合には、初期化時にかならずどのように利用するかを設定する必要があります。今回は3.3Vを出力するか、しないかを決めるためにOUTPUTに設定しています。

ESP32の場合には、ピンによって使える機能が違うので注意してください。特にGPIO34以降のピンは入力専用ですので、出力には利用できません。

まだ、内容を把握する必要はありませんが、用途を調べる場合には上記のページなどを参考にしてください。

  digitalWrite(led, HIGH);  // LEDをONにします(HIGHにすると点灯します)

digitalWrite()関数で、指定したピンをHIGHに設定すると3.3Vが出力されます。そのため、LEDが光ります。

  delay(1000);              // 1000ミリ秒(=1秒)待機します

delay()関数は指定時間待機する命令です。1000ミリ秒なので1秒間待機しています。

  digitalWrite(led, LOW);   // 内蔵LEDをOFFにします(LOWにすると消灯します)

digitalWrite()関数で、指定したピンをLOWに設定するとGNDに接続されます。あとで説明しますが、0Vを出力は内部的にGNDと接続していることになります。そのため、LEDは消えます。

このスケッチによって、1秒間LEDが点灯し、1秒間LEDが消灯するを繰り返すはずです。

LEDをGPIOで光らせる その2(3.3V)

今度は、3.3V出力から電源をとって、抵抗とLEDを経由してGPIO26に入っています。

// LEDが接続されているPINを指定する
int led = 26;

// リセットか電源を入れると一度だけ実行される初期化処理の関数です
void setup() {
  // オープンドレインのデジタル出力モードに設定する
  pinMode(led, OUTPUT_OPEN_DRAIN);
}

// 常に繰り返し実行される処理の関数です
void loop() {
  digitalWrite(led, LOW);   // LEDをONにします(LOWにすると点灯します)
  delay(1000);              // 1000ミリ秒(=1秒)待機します
  digitalWrite(led, HIGH);  // LEDをOFFにします(HIGHにすると消灯します)
  delay(1000);              // 1000ミリ秒(=1秒)待機します
}

こんなスケッチになります。

  // オープンドレインのデジタル出力モードに設定する
  pinMode(led, OUTPUT_OPEN_DRAIN);

オープンドレインという、特殊な出力モードに設定しています。普通のOUTPUTはHIGHで3.3V出力、LOWでGNDに接続でしたが、オープンドレインの場合にはHIGHで未接続、LOWでGNDに接続になります。

  digitalWrite(led, LOW);   // LEDをONにします(LOWにすると点灯します)

上記がLEDを点灯させるコードです。LOWを出力することでGNDに接続されるので、3.3V出力からの電源が抵抗とLEDを通ってGPIO26に流れ込みます。

  digitalWrite(led, HIGH);  // LEDをOFFにします(HIGHにすると消灯します)

HIGHにすることで、オープンドレイン状態の未接続になります。そのためLEDが消灯します。普通のOUTPUTモードの場合には3.3Vが出力されてしまいます。逆方向に3.3Vを流しても、すぐに壊れはしないのですが、無駄な電力になるのと、部品に負担がかかるのでオープンドレインを利用してください。

(非推奨)LEDをGPIOで光らせる その3(5V)

今度は、5V出力から電源をとって、抵抗とLEDを経由してGPIO26に入っています。このような回路にすることで、GPIOの3.3V以外の電源からLEDを点灯させることができます。

ただし、5Vを接続するのはおすすめしません。今回LEDを接続しているので、順方向電圧降下が2V前後あり、5V – 2Vで3V程度がGPIO26に入力されるはずです。ESP32の入力は3.6Vまでですので動きますが、LEDを接続し忘れると5VがGPIO26に接続されてしまうことになります。

また、GPIOからの出力はあまり大電流を流すことができません。GPIO出力はESP32で一度処理した電力を出力しているので、直接3.3Vに接続した方が安定した電力になります。

ちなみに内蔵LEDも内部的に3.3Vから抵抗経由に接続されており、GPIO10をLOWにすることで点灯させています。

このように電源から抵抗を経由して接続していることをプルアップと呼びます。

まとめ

抵抗とLEDの関係をかんたんに説明してみました。キットのマニュアルでは電源との接続しかしていませんでしたが、もうちょっと踏み込んだ説明を追加してみました。

続編

コメントする

メールアドレスが公開されることはありません。

管理者承認後にページに追加されます。公開されたくない相談はその旨本文に記載するかTwitterなどでDM投げてください。またスパム対策として、日本語が含まれない投稿は無視されますのでご注意ください。