LED

Atom Matrixには25個のLEDが組み込まれています

このLEDはWS2812というチップが使われていて、少ない配線と簡単なプログラムで、非常にカラフルでダイナミックな光の表現を可能にする、マイコン工作において最も人気のあるLEDチップです

1. LED配置図

25個のLEDは、ジグザグ状に配置されていて、一本の線で繋がっています

 0  1  2  3  4
 9  8  7  6  5
10 11 12 13 14
19 18 17 16 15
20 21 22 23 24

2. gemのインストール

WS2812をESP32で使うために必要なことがあるのですが、今回は、あらかじめ、簡単に利用できるようにしたgemを使います

PCで R2P2-ESP32/components/picoruby-esp32/picoruby/build_config/xtensa-esp.rb この設定ファイルを開いて以下を追加してください

  conf.gem core: 'picoruby-pwm'

  conf.gem github: 'ksbmyk/picoruby-ws2812', branch: 'main' # 追加

  conf.picoruby(alloc_libc: false)

シリアルモニタを立ち上げている場合は一度 Ctl+] で終了してください

追加した設定ファイルの状態で、再度buildして、追加したgemを取り込みます。

rake clean build

この内容でマイコンに書き込みます。

ESPBAUD=115200 rake flash

再度シリアルモニターを立ち上げます。

rake monitor

3. IRBで点灯

まずは1つ点灯させます。 これは最初にインストールしたWS2812 gemを読み込むためのコードです。WS2812というLEDを簡単に制御できるgemを使います。

シリアルモニターで、irbを起動してください

$> irb
irb>

以下を打ち込んでください。先ほど追加したgemを使うので require 'ws2812' としています。 27というのは、AtomMatrixでLEDが繋がっているpinの番号です。

require 'ws2812'

rmt = RMTDriver.new(27)
led = WS2812.new(rmt)

led.show_rgb([255, 0, 0])

左上、0番目のLEDが赤になりました

show_hexメソッドを使うと16進でも色を指定できます

led.show_hex(0xFF0000)

好きな色に変えてみましょう

# RGB値で指定
led.show_rgb([0, 255, 0])    # 緑
led.show_rgb([0, 0, 255])    # 青
led.show_rgb([255, 255, 0])  # 黄色
led.show_rgb([255, 0, 255])  # マゼンタ

# または16進数で
led.show_hex(0x00FF00)  # 緑
led.show_hex(0x0000FF)  # 青

複数点灯させます。指定した前から順番に0番目、2番目と解釈されていきます。

# RGB値で指定
led.show_rgb([255, 0, 0], [0, 255, 0], [0, 0, 255])

# または16進数で
led.show_hex(0xFF0000, 0x00FF00, 0x0000FF)

黒を指定することで消灯させることができます。

# RGB値で指定
led.show_rgb([0, 0, 0], [0, 0, 0], [0, 0, 0])

# または16進数で
led.show_hex(0x000000, 0x000000, 0x000000)

4. ファイルを送る

長いコードをirbで書くのは大変なので(現在esp32用のR2P2ではカーソルキーが使えなかったりコピー&ペーストができなかったりします) 手元でファイルを作り、それを実行します

一度、irbを exit で終了し、シリアルモニターを Ctr+] で終了してください。

PCで以下の内容のファイルを作り、 R2P2-ESP32/storage/home/ の下に、 square.rb という名前で保存してください

require 'ws2812'

rmt = RMTDriver.new(27)
led = WS2812.new(rmt)

# 配列を使って全LEDを制御
pixels = [ # 全て消灯
  [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0],
  [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0],
  [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0],
  [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0],
  [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0],
]

# 四隅だけ光らせる
pixels[0] = [255, 0, 0]    # 左上
pixels[4] = [0, 255, 0]    # 右上
pixels[20] = [0, 0, 255]   # 左下
pixels[24] = [255, 255, 0] # 右下

led.show_rgb(*pixels)

PCに保存したファイルをマイコンに転送します

ESPBAUD=115200 rake flash

もう一度シリアルモニターを立ち上げます

rake monitor

シリアルモニターで ls を実行すると先ほど転送したファイルが見えます

$> ls
square.rb

このファイルを実行します

./square.rb

四隅が違う色で光りました

Tips

ファイルを続けて実行すると、以下のようなメッセージが表示されることがあります

W (xxxxx) rmt: GPIO 27 is not usable, maybe conflict with others

これは警告メッセージですが、LEDの制御には問題ありません。気にせず次のステップに進んでください