m5_bala2 - gfd-dennou-club/mrubyc-esp32 GitHub Wiki

M5stack BALA2 fire のサンプル

BALA2 の DC モータとサーボモータは ESP32 マイコンで直接制御されているのではなく,コントローラ (STM32F030C8T6) を介して制御される.ESP32 とコントローラ間は I2C で通信する.コントローラの I2C アドレスは 0x3a.

コントローラの仕様の詳細が分かる資料が見つからず,結局 GitHub 上のコードを読みながら何となく動くようにした.

# モーターの制御.スピードは 0 ~ 3 の 4 段階で設定する.マイナスを付けると反転する.
def set_motor(i2c, wheel_left, wheel_right)
  data = Array.new
  data[0] = 0x00
  data[1] = [wheel_left, 0x03].min
  data[2] = 0x00
  data[3] = [wheel_right, 0x03].min
  data[4] = 0x00
  i2c.write(0x3a, data)
end

# サーボモータの制御.pos はサーボモータの ID (1~8).angle は角度.
def set_servo(i2c, pos, angle)
  if pos < 1
    pos = 1
  elsif pos > 8
    pos = 8
  end
  pos = pos - 1
  i2c.write( 0x3a, [0x20 | pos, angle * 2 & 0xFF] )
  puts "Servo #{pos + 1} angle set to: #{angle}"
end

# 初期化
i2c = I2C.new()
sen = ADC.new( 36 )

# サーボ 1 の角度を 0 度に.
set_servo( i2c, 1, 0 )
sleep 0.1

# 約 10 秒間ライントレース
100.times do
  $val = sen.read_raw
  if $val > 300
#    set_motor( i2c, -2,  0 ) # right course
    set_motor( i2c,  0, -2 ) # left course
  else
#    set_motor( i2c,  0, -2 ) # right course
    set_motor( i2c, -2,  0 ) # left course
  end
  sleep 0.02
end
set_motor( i2c, 0, 0 ) # DC モーター停止
sleep 0.5

set_servo( i2c, 1, 90 )  # サーボモータの角度を 90 度に
sleep 1
set_servo( i2c, 1, 0 )   # サーボモータの角度を 0 度に