ハンズ・オン - 3
※この記事に掲載されている情報は、2019年6月時点のものです。
Lチカ(発光ダイオード点滅)
マイコン界におけるLチカは、ソフトウェア界におけるHello Worldのようなものです。LEDを光らせることができれば、あなたも立派なマイコン刑事(デカ)です。
使用パーツ
- 赤色LED
- 抵抗器330Ω
- ジャンパーピン
- ブレッドボード
オームの法則
LEDを光らせるためには基礎的な電気知識が必要です。下の写真を見てください。
10キロオーム(=10000オーム)の抵抗(R)の両端に3ボルトの電位差(V)があるとき、流れる電流(I)は0.3ミリアンペアです。 これはオームの法則の基本式 V = I * R
を変形して得られる I = V / R
から計算できます。
次に、LEDのデータシートの一部を見てみましょう。 Vfというのが、LEDの両端に発生する電位差です。ここではVfが2.1Vの赤色LEDを使います。
出典 http://akizukidenshi.com/download/ds/optosupply/OSXXXX3Z74A_VER_A1.pdf
このLEDと330Ωの抵抗器を直列に接続し、回路全体に3.3Vの電圧をかけます。
LEDは常に2.1Vの電位差を生む(←細かい議論を省略していることはおわかりいただけると思います)ので、抵抗器には1.2Vの電圧がかかります。 オームの法則 (3.3 - 2.1) / 330 = 0.0036 より、電流は3.6mAになることがわかります。
ブレッドボードに配線する
ESP32開発ボードと抵抗器、LED、ジャンパワイヤをブレッドボードで接続しましょう。 LEDは一般的に、長いピンがアノード(陽極)なので、長いピンにプラスの電位がかかるように接続してください。
上の回路図では、アノードが2番ピン、カソードが1番ピンです。 今回の回路の場合は間違えて逆に挿しても壊れませんので、光らなければ逆にしてみるというくらいの気楽さでOKです。
このブレッドボード図の場合、右にアノード(陽極)、左にカソード(陰極)を挿します。
上の配線図と下の写真は、おなじ接続を表現しています。
ESP32の「IO19」ピンに3.3Vが印加されます。 となりの「GND」ピンはグランドつまり常に0Vになるピンです。ほかにもいくつかGNDピンがあることや、3V3(3.3Vのことです)や5Vと書かれたピンがあることも確認しておきましょう。 USBケーブルから供給される電源電圧は5Vです。 開発ボード内の降圧回路がESP32の標準動作電圧である3.3Vに降圧しています。
プログラムを書く
いままでのハンズ・オンと同様にテンプレートをcloneします。
cd $HOME/esp
git clone https://github.com/hasumikin/mrubyc-template-esp32.git led-blinking
cd led-blinking
main/main.c
#include "driver/gpio.h"
#include "mrubyc.h"
#include "models/led.h"
#include "loops/master.h"
#define MEMORY_SIZE (1024*40)
static uint8_t memory_pool[MEMORY_SIZE];
static void c_gpio_init_output(mrb_vm *vm, mrb_value *v, int argc) {
int pin = GET_INT_ARG(1);
console_printf("init pin %d\n", pin);
gpio_set_direction(pin, GPIO_MODE_OUTPUT);
}
static void c_gpio_set_level(mrb_vm *vm, mrb_value *v, int argc){
int pin = GET_INT_ARG(1);
int level = GET_INT_ARG(2);
gpio_set_level(pin, level);
}
void app_main(void) {
mrbc_init(memory_pool, MEMORY_SIZE);
mrbc_define_method(0, mrbc_class_object, "gpio_init_output", c_gpio_init_output);
mrbc_define_method(0, mrbc_class_object, "gpio_set_level", c_gpio_set_level);
mrbc_create_task( led, 0 );
mrbc_create_task( master, 0 );
mrbc_run();
}
mrblib/loops/master.rb
led = Led.new(19)
while true
led.turn_on
sleep 1
led.turn_off
sleep 1
end
mrblib/models/led.rb
class Led
def initialize(pin)
@pin = pin
gpio_init_output(@pin)
turn_off
end
def turn_on
gpio_set_level(@pin, 1)
puts "turned on"
end
def turn_off
gpio_set_level(@pin, 0)
puts "turned off"
end
end
ビルド、実行
お馴染みの make flash monitor
で実行できます(menuconfig画面のシリアルポート設定もお忘れなく)。
うまくいけば、1秒点灯し、1秒消灯する、という動作を繰り返します。