デジタル水準器

LED

傾けた方向にLEDが光る、水準器のようなものを作ります

加速度センサーで傾きを検知して、その方向をLEDで表示します。段階的に作っていくので、センサーの値がどう変わるか、それをどうLEDに反映させるかを理解しながら進められます

完成したら、色を変えたり、振ったら光るようにしたり、自由にアレンジしてみましょう!

1. gemのインストール

もし、他のステップで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.gem github: 'bash0C7/picoruby-mpu6886', branch: 'main' # 追加

  conf.picoruby(alloc_libc: false)

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

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

rake clean build

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

ESPBAUD=115200 rake flash

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

rake monitor

2. 値をとる

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

require 'i2c'
require 'mpu6886'

i2c = I2C.new(
  unit: :ESP32_I2C0,
  frequency: 100_000,
  sda_pin: 25,
  scl_pin: 21
)

mpu = MPU6886.new(i2c)
button = GPIO.new(39, GPIO::IN)

puts "---"

loop do
  break if button.read == 0 

  accel = mpu.acceleration
  
  if accel[:x] > 0.3
    puts "右に傾いています! X軸: #{accel[:x]}"
  elsif accel[:x] < -0.3
    puts "左に傾いています! X軸: #{accel[:x]}"
  end
  
  if accel[:y] > 0.3
    puts "前に傾いています! Y軸: #{accel[:y]}"
  elsif accel[:y] < -0.3
    puts "後ろに傾いています! Y軸: #{accel[:y]}"
  end
  
  puts "加速度 X:#{accel[:x]} Y:#{accel[:y]} Z:#{accel[:z]} (G単位)"
  puts "---"
  
  sleep_ms 200
end

シリアルモニターを Ctr+] で終了し、 ESPBAUD=115200 rake flash で書き込み、 rake monitor でシリアルモニタで立ち上げ

転送したファイルを実行してください

./tlit_led.rb

かたむけてみてください

3 中央が光るようにする

tlit_led.rb に変更を加えて、中央が光るようにしましょう

require 'i2c'
require 'mpu6886'
require 'ws2812'

i2c = I2C.new(
  unit: :ESP32_I2C0,
  frequency: 100_000,
  sda_pin: 25,
  scl_pin: 21
)
mpu = MPU6886.new(i2c)
button = GPIO.new(39, GPIO::IN)

rmt = RMTDriver.new(27)
led = WS2812.new(rmt)
# 最初に全消灯
led.show_hex(*Array.new(25, 0x000000))

loop do
  break if button.read == 0 

  accel = mpu.acceleration
  
  pixels = Array.new(25, 0x000000)
  # 中心のみ緑で光らせる
  pixels[12] = 0x001E00
  led.show_hex(*pixels)

  if accel[:x] > 0.3
    puts "右に傾いています! X軸: #{accel[:x]}"
  elsif accel[:x] < -0.3
    puts "左に傾いています! X軸: #{accel[:x]}"
  end
  
  if accel[:y] > 0.3
    puts "前に傾いています! Y軸: #{accel[:y]}"
  elsif accel[:y] < -0.3
    puts "後ろに傾いています! Y軸: #{accel[:y]}"
  end
  
  sleep_ms 200
end

led.show_hex(*Array.new(25, 0x000000))

シリアルモニターを Ctr+] で終了し、 ESPBAUD=115200 rake flash で書き込み、 rake monitor でシリアルモニタで立ち上げ

転送したファイルを実行してください

./tlit_led.rb

中央が光りました。ボタンを押すと消えます

4. X軸(左右)の傾きで光らせる

tlit_led.rb に変更を加えて、傾けたら光るようにしてみましょう

require 'i2c'
require 'mpu6886'
require 'ws2812'

i2c = I2C.new(
  unit: :ESP32_I2C0,
  frequency: 100_000,
  sda_pin: 25,
  scl_pin: 21
)
mpu = MPU6886.new(i2c)
button = GPIO.new(39, GPIO::IN)

rmt = RMTDriver.new(27)
led = WS2812.new(rmt)
led.show_hex(*Array.new(25, 0x000000))

loop do
  break if button.read == 0 

  accel = mpu.acceleration
  
  pixels = Array.new(25, 0x000000)
  pixels[12] = 0x001E00

  if accel[:x] > 0.3
    # 右に傾いた
    pixels[13] = 0x1E0000
    if accel[:x] > 0.6
      pixels[14] = 0x1E0000
    end
  elsif accel[:x] < -0.3
    # 左に傾いた
    pixels[11] = 0x1E0000
    if accel[:x] < -0.6
      pixels[10] = 0x1E0000
    end
  end
  
  if accel[:y] > 0.3
    pixels[17] = 0x00001E
    if accel[:y] > 0.6
      pixels[22] = 0x00001E
    end
  elsif accel[:y] < -0.3
    pixels[7] = 0x00001E
    if accel[:y] < -0.6
      pixels[2] = 0x00001E
    end
  end

  led.show_hex(*pixels)
  
  sleep_ms 200
end

led.show_hex(*Array.new(25, 0x000000))

シリアルモニターを Ctr+] で終了し、 ESPBAUD=115200 rake flash で書き込み、 rake monitor でシリアルモニタで立ち上げ

転送したファイルを実行してください

./tlit_led.rb

前後左右に傾けると光ります

5. カスタマイズしてみよう

好きにカスタマイズしてみましょう

6. 作品ができたら

app.rb という名前のファイルがあれば、電源が入るとそのプログラムが自動的に実行されます

storage/home/app.rb という名前で保存して、 ESPBAUD=115200 rake flash で書き込んでみよう