LoginSignup
4
1

PicoRuby から始めるたのしい電子工作

Last updated at Posted at 2023-12-19

PicoRuby から始めるたのしい電子工作

大阪Ruby会議03PicoRuby から始めるたのしい電子工作 を発表したときに時間の都合で割愛したコードの紹介と説明です。
また、告知していた PicoRuby Follow-up Osaka は開催することができましたので少し様子を紹介しています。

電子工作 のおさらい

電子工作は、電子部品や半導体素子を用いた工作のことです。

  • 入力部品:スイッチ(人が操作)、センサー(周囲を調べる)
  • 出力部品:LED(人に伝える)、モーター(何かを動かす)

image.png

秋月電子通商共立エレショップ で電子パーツを購入できます。

mruby

image.png

mruby は、Ruby 言語の軽量実装で組み込みシステムに利用されます。

  • コンパイルが必要なので環境構築や利用方法が手間
  • バイナリ(.mrb)をマイコンに送信し、実行するエディタが便利

image.png

Crione というエディタを作って使っていました。

PicoRuby

image.png

PicoRuby は、mruby の軽量実装で組み込みシステムに利用されます。

  • ワンチップマイコンで動作するので環境構築が簡単
  • ファイルをドラッグ&ドロップするだけで実行

image.png

Seeed Studio XIAO RP2040 のマイコンで動作します。

PicoRuby の Hello World

プログラミングの hello, world は電子工作では Lチカ です。

irb の対話形式でプログラムを実行することができます。

$ screen /dev/tty.usbmodem*
$> irb
$> puts "hello, world"

GPIO クラスで入出力するピンを指定して write を 10 に指定すると Lチカ ができます。

pin = GPIO.new(29, GPIO::OUT)
pin.write(1)
pin.write(0)

loop や puts や sleep など Ruby と同じメソッドが利用できます。

def hello_world(pin, items=10)
  i = 0
  loop do
    i += 1
    puts i
    pin.write(i % 2)
    sleep 0.5
    return "hello, world" if i >= items
  end
end

pin = GPIO.new(29, GPIO::OUT)
puts hello_world(pin)

PicoRuby で 電子工作

Ruby は、オブジェクト指向スクリプト言語なのでクラスを利用

  • クラスやメソッドでプログラミングが捗る
  • ブレッドボードの回路を Ruby で制御できる

Dice クラス には number の属性と turn や lighten の振る舞いを定義しています。

HIGH = 1
LOW = 0

class Dice
  attr_reader :number

  def initialize(pin1=0, pin2=1, pin3=5, pin4=7)
    @pin1, @pin2 = GPIO.new(pin1, GPIO::OUT), GPIO.new(pin2, GPIO::OUT)
    @pin3, @pin4 = GPIO.new(pin3, GPIO::OUT), GPIO.new(pin4, GPIO::OUT)
    @min, @max = 1, 7
    @number = 0
  end

  def turn
    @number = random
    puts "Dice is #{@number}"
    lighten
  end

  def lighten
    [@pin1, @pin2, @pin3, @pin4].each { |pin| pin.write(LOW) }
    @pin1.write(HIGH) if [1, 2, 3].include? @number
    @pin2.write(HIGH) if [1, 2, 3, 4, 5].include? @number
    @pin3.write(HIGH) if [2, 4, 6].include? @number
    @pin4.write(HIGH) if [1].include? @number
  end

  def random
    loop do
      number = Machine.rand.to_s[2].to_i
      return number if @min <= number && number < @max
    end
  end
end

switch_pin = GPIO.new(10, GPIO::IN)
dice = Dice.new

loop do
  if switch_pin.read == LOW
    5.times do
      dice.turn
      sleep 0.5
    end
  end
end

image.png

IchigoJam 電子工作パーツセット 電子さいころ で電子パーツの一式を購入できます。

PRK Firmware の RGBLED

PRK Firmware は、DIY キーボード ファームウェア フレームワーク

  • マイコンの PR2040 で動作し、マウスなどの制御可能
  • RGBLED(フルカラー LED) では RGB Matrix もサポート

Keyboard や RGB などのクラスが用意されています。

kbd = Keyboard.new

kbd.init_pins(
  [   1,  2,  3  ],   # row0, row1,... respectively
  [  28, 27, 26  ]    # col0, col1,... respectively
)

kbd.add_layer :default, %i[
  KC_7    KC_8    KC_9
  KC_4    KC_5    KC_6
  KC_1    KC_2    KC_3
]

rgb = RGB.new( 0, 54, 0 )
rgb.effect     = :circle
rgb.speed      = 10
rgb.hue        = 0
rgb.saturation = 100
rgb.value      = 2

[
  [ 28, 0], [ 14, 0], [  0, 0],
  [  0,16], [ 14,16], [ 28,16],
  [ 28,32], [ 14,32], [  0,32],
].each do |p|
  rgb.add_pixel(p[0], p[1])
end

kbd.append rgb
kbd.start!

PicoRuby Follow-up Osaka

naniwa.rb で 自作キーボードを組み立てるイベントを開催

  • 開催日:2023 年 10 月 28 日(土曜日)
  • 会場: シリコンハウス 共立電子産業 セミナールーム

RubyKaigi 2023 で配布された RK2023 や 無限の可能性 のビルドアップをサポートしてから
新世界に串カツを食べに行きました。

image.png

Enjoy Ruby, Enjoy Hackathon

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1