Upgrade to Pro — share decks privately, control downloads, hide ads and more …

First step to PicoRuby

First step to PicoRuby

入門以前から始める PicoRuby のあそび方
2025.07.19. PicoRuby Overflow会議

Avatar for makicamel

makicamel

July 20, 2025
Tweet

More Decks by makicamel

Other Decks in Programming

Transcript

  1. RubyKaigi 2025 Lightning Talk   Road to RubyKaigi: Making Tinny Chiptunes

    with Ruby  https://rubykaigi.org/2025/presentations/lt/
  2. RubyKaigi 2025 Lightning Talk Road to RubyKaigi Rubyist による Rubyist

    のための Ruby 製のゲーム ターミナル上で遊ぶ横スクロールアクションゲーム バグを倒し〆切から逃れて RubyKaigi 参加を目指す   Road to RubyKaigi: Making Tinny Chiptunes with Ruby  https://rubykaigi.org/2025/presentations/lt/   Road to RubyKaigi  https://github.com/makicamel/road_to_rubykaigi
  3. RubyKaigi 2025 Lightning Talk Ruby で音を作って鳴らすお話をした 音は波 波形データをつくって オーディオ API

    に渡すと 音が鳴らせる   Road to RubyKaigi: Making Tinny Chiptunes with Ruby  https://rubykaigi.org/2025/presentations/lt/   Road to RubyKaigi  https://github.com/makicamel/road_to_rubykaigi
  4. 概観図 1. 電池 電圧 3V Raspberry Pi Pico の起動には約 3V

    必要[^1] 単三電池はだいたい 1 本 1.5V 2 本直列でつないだら 3V 今回はリチウム電池を使用 小さい基盤に乗せたかったので [^1]: 訂正追記 1.8V から動作します
  5. 概観図 3. 抵抗 抵抗値はオームの法則で求める V = IR 電圧(V) = 電流(A)

    * 抵抗(Ω) e.g. 電源電圧が3V、流したい電流が30mA、スピーカーの抵抗が 15Ω ・ 3V = 0.03A * (R + 15) Ω ・ R = 3 / 0.03 - 15   => 85Ω ・ 85Ωの抵抗が必要 → 100Ωの抵抗を使う
  6. 概観図 4. Raspberry Pi Pico Raspberry Pi Pico マイコンボード RP2040

    搭載 USB で電源供給とプログラム書き込み可  Raspberry Pi Pico  https://www.raspberrypi.com/products/raspberry-pi-pico/
  7. 概観図 4. Raspberry Pi Pico Raspberry Pi Pico マイコンボード RP2040

    搭載 USB で電源供給とプログラム書き込み可 RP2040 マイコンチップ  Raspberry Pi Pico  https://www.raspberrypi.com/products/raspberry-pi-pico/
  8. 概観図 4. RP2040(Raspberry Pi Pico) 7㎟ に CPU・メモリ・ペリフェラルなどがつまっている ペリフェラル: 機能専用ハードウェア

    デジタル I/O PWM 通信インターフェース etc  RP2040  https://www.raspberrypi.com/products/rp2040/
  9. 概観図 4. RP2040(Raspberry Pi Pico) PWM モジュール Pulse Width Modulation

    一定の周波数・電圧 High の比率で 信号を生成する e.g. モーター制御 - 平均電圧を変えて回転数を制御 e.g. 赤外線リモコン - 赤外線信号パターンを指定
  10. 概観図 4. RP2040(Raspberry Pi Pico) PWM モジュール PicoRuby で波形データを生成 #

    PWMモジュールで0.5秒ずつド,レ,ミの波形データを生成する require 'pwm' pwm = PWM.new(0, duty: 50) [262, 294, 330].each do |frequency| # ド,レ,ミの周波数 pwm.frequency(frequency) t = Time.now while (Time.now - t) < 0.5; end # 0.5秒ビジーループさせる end
  11. PicoRuby のあそび方 1. Raspberry Pi Pico を USB でパソコンとつなぐ 2.

    R2P2[^2]を Raspberry Pi Pico にインストール 最新リリースから uf2 ファイルをダウンロードしてドラッグ & ドロップで完了 3. シリアル通信で接続 mac だと `TERM=vt100 screen /dev/tty.usbmodem*` 4. シェル起動 [^2]: PicoRuby 用シェルシステム  https://github.com/picoruby/R2P2
  12. PicoRuby のあそび方 irb `puts 'Hello, PicoRuby!'` /home/app.rb このパスにファイルを置くと Raspberry Pi

    Pico 起動時に実行される ドキュメント https://picoruby.github.io/
  13. PicoRuby のあそび方 irb で遊んでいると Out of Memory に遭遇しやすい Raspberry Pi

    Pico のメモリは 256KB ref MacBook Pro (M3 Pro) のメモリは 32GB 1 / 125000 大きなオブジェクト生成は避けたほうがよい
  14. PicoRuby のあそび方 Road to RubyKaigi の BGM 元実装は配列を value としたハッシュの配列

    メロディー 1 音、ベース 2 音 このままだとメモリ足りないかも
  15. PicoRuby のあそび方: データ圧縮 使用する音程は 2 オクターブ 14 音 + 休符の

    15 音 2^4 => 16 なので 1 音を 4bit(16 進数 1 文字)で表してデータ圧縮する 音程に番号を割り当て 16 進数で表す e.g. E4 → 2(10 進数) → 0x2(16 進数) NOTE_MAPPING = { C4: 0, D4: 1, E4: 2, F4: 3, A4: 5, B4: 6, REST: 4, # ... }
  16. PicoRuby のあそび方: データ圧縮 音階を 16 進数の配列に変換 e.g. [C4, D4, E4]

    → [0x0, 0x1, 0x2] 左シフトしてひとつの Integer にする e.g. [0x0, 0x1, 0x2] → 0x210(16 進数) → 528(10 進数) 小さくなった!
  17. PicoRuby のあそび方: データ圧縮 音の長さも同様に圧縮 十六部音符: 0, 八分音符: 1, 四分音符: 2

    エンコードした Integer をコードに埋め込み SCORES = [ { notes: [45589323163098, 120693318330058, ...] }, # メロディー { notes: [72588760057059, 72588760057059, ...] }, # ベース 1 { notes: [85991239857509, 85991239857509, ...] }, # ベース 2 ]
  18. PicoRuby のあそび方: データ圧縮 再生時にデコード DECODER = Proc.new do |packed, shift|

    # 音程インデックスと音の長さをセットで取り出す index_duration = (packed >> (shift * NOTE_BITS)) & 0b111111 # デコード時は右シフト [ NOTE_MAPPING[index_duration & 0b1111], # 音程の番号 0.25 * 2 ** ((index_duration >> FREQUENCY_BITS) & 0b11) # 音の長さ ] end 無事音が鳴った   https://github.com/makicamel/picoruby-phrase/blob/main/player.rb
  19. 初心者のふりかえり はんだづけが下手 正しい回路のはずなのに電圧が低い はんだが溶けない・つかない やり直しすぎてランドが溶けて電導体が無 YouTube べんり How To Solder

    Electronic Component. Tutorial[^3] はとくにお勧め 自分のはんだづけがうまくいかない理由・対処法がわかる [^3]: https://www.youtube.com/watch?v=dQ7AUjb1tkA&t=1323s