Lチカ(発光ダイオード点滅)

マイコン界におけるLチカは、ソフトウェア界におけるHello Worldのようなものです。LEDを光らせることができれば、あなたも立派なマイコン刑事(デカ)です。

使用パーツ

  • 赤色LED
  • 抵抗器330Ω
  • ジャンパーピン
  • ブレッドボード

オームの法則

LEDを光らせるためには基礎的な電気知識が必要です。下の写真を見てください。

registor

10キロオーム(=10000オーム)の抵抗(R)の両端に3ボルトの電位差(V)があるとき、流れる電流(I)は0.3ミリアンペアです。 これはオームの法則の基本式 V = I * R を変形して得られる I = V / R から計算できます。

次に、LEDのデータシートの一部を見てみましょう。 Vfというのが、LEDの両端に発生する電位差です。ここではVfが2.1Vの赤色LEDを使います。

led_datasheet

出典 http://akizukidenshi.com/download/ds/optosupply/OSXXXX3Z74A_VER_A1.pdf

このLEDと330Ωの抵抗器を直列に接続し、回路全体に3.3Vの電圧をかけます。

led_circuit

LEDは常に2.1Vの電位差を生む(←細かい議論を省略していることはおわかりいただけると思います)ので、抵抗器には1.2Vの電圧がかかります。 オームの法則 (3.3 - 2.1) / 330 = 0.0036 より、電流は3.6mAになることがわかります。

ブレッドボードに配線する

ESP32開発ボードと抵抗器、LED、ジャンパワイヤをブレッドボードで接続しましょう。 LEDは一般的に、長いピンがアノード(陽極)なので、長いピンにプラスの電位がかかるように接続してください。

上の回路図では、アノードが2番ピン、カソードが1番ピンです。 今回の回路の場合は間違えて逆に挿しても壊れませんので、光らなければ逆にしてみるというくらいの気楽さでOKです。

LED

このブレッドボード図の場合、右にアノード(陽極)、左にカソード(陰極)を挿します。

blinking_led_breadboard

上の配線図と下の写真は、おなじ接続を表現しています。

photo_led_blinking

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秒消灯する、という動作を繰り返します。