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会議

makicamel

July 20, 2025

Transcript

59 slides
  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

More Decks by makicamel

Other Decks in Programming