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

RaspberryPi Picoの表現力の拡張 ~アナログコンピュータとの出会い~

RaspberryPi Picoの表現力の拡張 ~アナログコンピュータとの出会い~

以下の記事の発表スライド版
https://qiita.com/uproad3/items/6a4a7506edc94a446b67

Avatar for すぎうり

すぎうり

July 16, 2026

More Decks by すぎうり

Other Decks in How-to & DIY

Transcript

  1. 自己紹介 すぎうり • Twitter:@uproad3 • Ruby歴20年 • VRChat歴7年 • 仕事:Rails |

    AWS | LT芸人 • 趣味:アーキテクト | リファクタリング | 電子工作 • 言語:Ruby | C# | C | ほかいろいろ • 技術:Ubuntu | Unity | RaspberryPi Pico • 普段はRubyの森に住んでいます • 実は電子回路とか低レイヤーって結構好きなんだよね • PicoRuby Overflow会議 ショーケースセッション • ながらRuby会議01 サイネージ展示
  2. RaspberryPi Picoとは • Raspberry Piのマイコン • OSはなく、機械語を直接実行 • プロセッサー: ARM

    Cortex-M0+ • メモリ:264KB SRAM • ストレージ: 2MB Flash • 価格: 約1000円 • GPIO:26(アナログ3) • 他:UARTx2、SPIx2、I2Cx2、 PWMx16 • USB 1.1 micro-B
  3. 組み込み向け Rubyの世界(2025年) • mruby:汎用組み込み Ruby VM  マイコン内 → Rubyスクリプト +

    mrubyコンパイラ + mruby VM • mruby/c:Rubyコンパイラを含まない軽量 VM  マイコン内 → コンパイル済み mruby VMバイナリ + 機能削減版 mruby VM • PicoRuby:世界最軽量 mrubyコンパイラ +mruby/c VM  マイコン内 → PicoRuby用スクリプト + PicoRubyコンパイラ + mruby/cバーチャルマシン • R2P2:PicoRubyで書かれた Unix風シェル • R2P2配布バイナリ: PicoRubyとR2P2がセットになった .uf2          Raspberry Pi Pico用
  4. 組み込み向け Rubyの世界(2026年) • mruby:汎用組み込み Ruby VM  マイコン内 → Rubyスクリプト +

    mrubyコンパイラ + mruby VM • mruby/c:Rubyコンパイラを含まない軽量 VM  マイコン内 → コンパイル済み mruby VMバイナリ + 機能削減版 mruby VM • PicoRuby:世界最軽量 mrubyコンパイラ +mruby VM  マイコン内 → PicoRuby用スクリプト + PicoRubyコンパイラ + mruby VM • FemtoRuby:世界最軽量 mrubyコンパイラ +mruby/c VM  マイコン内 → PicoRuby用スクリプト + PicoRubyコンパイラ + mruby/c VM • R2P2:PicoRubyで書かれた Unix風シェル • R2P2配布バイナリ: PicoRubyかFemtoRubyとR2P2          セットになった多数のマイコン向けバイナリ
  5. オーディオビジュアライザー /  スペクトラムアナライザーとは • 入力音声の周波数解析を行う • 各周波数ごとの強度に応じて出力を行う • WindowsMediaPlayerに搭載されてたやつ •

    曲を流すとビカビカ光って楽しい • 写真は「ながら Ruby会議01」の展示→ • PicoRuby Overflow会議でも同様のデモ • お題:PicoRubyで作るなにか
  6. オーディオビジュアライザーを作るには 音声入力 →  周波数解析  →  信号強度検出  →  LED輝度制御 • 音声信号を解析機へ回す前に増幅する回路 • iPadの動画再生のイヤホンコードをミキサーに 入力 •

    ミキサーの出力不足で信号が取れなかったの でオペアンプを挟んだ • 電力がUSBなので、単電源駆動 • 後段も単電源駆動なのと、ラズパイ Picoも 0V~3.3Vしか取れないのでプルアップの ままで通す
  7. 音声入力 →  周波数解析  →  信号強度検出  →  LED輝度制御 オーディオビジュアライザーを作るには バンドパスフィルタ • Dual Amplifer Band Pass

    Filter(DABPF) • DABPFはQ値(Quality Factor、尖鋭度≒通過周波数幅 )が R1とR2R3で決まるので計算が楽 • 中心周波数も R2R3とC1C2で決まるので考える変数が 格段に少なくて便利 • 信号増幅度が 2倍で固定 • シリコンハウスで 2回路入りのオペアンプが安く売っていたのと、 オペアンプは 1石に2回路か4回路のものしかないのでちょうど 1 回路で1石使えてわかりやすかった
  8. 音声入力 →  周波数解析  →  信号強度検出  →  LED輝度制御 オーディオビジュアライザーを作るには バンドパスフィルタ • 回路の周波数決定についてはコンデンサの静電容量だけで受 け持つ ◦ 最初は抵抗値のほうが細かく制御できるのでそちらにしようと考えてい

    たのが、ブレッドボードに実装しているときに抵抗を置いていたケース をぶちまけてどれがどれかわからなくなったので管理は無理だと悟った • R2~R5は10kΩ固定、R1は10kにQ値を掛け算したものとし、 C1とC2を同値にして狙ったあたりの周波数に近い静電容量のも のを選定
  9. 音声入力 →  周波数解析  →  信号強度検出  →  LED輝度制御 オーディオビジュアライザーを作るには ターゲット 周波数 15/f C1=C2 R2~R5 Q値

    R1 カットオフ 周波数(下) 実装 中心周波数 カットオフ 周波数(上) 80 0.1875 0.18u 10k 3 30k 74 88 103 160 0.0937 0.10u 10k 3 30k 133 159 186 250 0.0600 0.068u 10k 3 30k 195 234 273 500 0.0300 0.027u 10k 2 20k 442 589 737 1000 0.0150 0.015u 10k 2 20k 796 1,061 1,326 2000 0.0075 6800p 10k 2 20k 1,755 2,341 2,926 4000 0.0037 3900p 10k 2 20k 3,061 4,081 5,101 8000 0.0018 1800p 10k 2 20k 6,631 8,842 11,052 15000 0.0010 1000p 10k 2 20k 11,937 15,915 19,894
  10. オーディオビジュアライザーを作るには 音声入力 →  周波数解析  →  信号強度検出  →  LED輝度制御 RaspberryPi Pico + PicoRuby • Picoのアナログ入力は

    3端子 • スペアナプロセッサの出力は 9本 • Pico3台で受け取れば OK • やっていることはピーク toピーク検出 • いい感じのビジュアライズ調整 • R2P2は /home/app.rb というファイルが あると電源投入後に直接それを実行するので、 コピペしておけば多数同時運用でも PC制御なしで動かすことができる • コードは GitHubにあるので読んでね https://github.com/uproad/picorubyoverflow2025_tenji/blob/main/app.rb
  11. オーディオビジュアライザーを作るには 音声入力 →  周波数解析  →  信号強度検出  →  LED輝度制御 ピークtoピーク検出 • PicoRubyコードの検出ループは 10msごと • 20周分の読み取り値を配列に保存

    • 配列のminmaxを取り、信号差を検出 • 10ms*20周で200ms=0.2秒の取得 • ナイキストの定理的にはダメだが、 PicoRubyが遅すぎて 10msが限界だった • 20周も取ればどっかでラッキー的な山を取れるはず • だいたい取れりゃいいんだよ
  12. オーディオビジュアライザーを作るには 音声入力 →  周波数解析  →  信号強度検出  →  LED輝度制御 ビジュアライズ調整1 • アナログピンの取得値は 0~3.3(float) • 後段のPWMは0~100制御なので正規化

    • あえて-10~110に拡大して最大 /最小付近で 点灯レベルが 0%/100%に張り付くようにする ◦ 最初0-100でやっていたら音量が大きいなあと思っていても実際には90%ぐらいで止まっていて100%点灯が ほとんど起きていなかったのに気づいたので入れた • ホントは Bカーブじゃなくてちゃんと対数カーブにすればいいような気もするけど、計算が面倒なの で伸ばしてプッツンしたほうが動作が早いしコーディングも早かったのでこうした • だいたいキレイに見えればいいんだよ
  13. オーディオビジュアライザーを作るには 音声入力 →  周波数解析  →  信号強度検出  →  LED輝度制御 ビジュアライズ調整2 • 音圧のレベル自動調整 • ちょっとづつ過去の最大値を減衰させて 曲ごとやメロ

    -サビ間の音量差を吸収する ◦ 連続稼働させていると音圧が高い曲のあとに音圧がカスの曲が来ると光らないことに気づいた ◦ かといって曲の切れ目なんか検出するの面倒だし ◦ せや、常に減らしとけばピークtoピークが高いうちは常に更新されるし、 ピークtoピークが低くなったら減衰してちょうどいい感じになるやん ◦ ついでにサビとメロで音量が違う曲とかも対応できた
  14. オーディオビジュアライザーを作るには 音声入力 →  周波数解析  →  信号強度検出  →  LED輝度制御 LED制御 • みんな大好き PWM • GPIOは3.3VなのでLEDには力不足

    ◦ GPIOはトランジスタ制御のみ • パワー供給専用 RaspberryPiPico から直接 5Vを給電 • LEDは3.2V高輝度青色 LED ◦ シリコンハウスで100個500円のバルク品 • LEDをピンあたり 3個並列に並べ、追加で輝度を確保 • 計27個、270,000mcd