Raspberry Pi ZERO OTG

  1. Raspberry Pi ZERO OTG
  2. Ubuntu 23.10
  3. Ubuntu 24.04
  4. オーバーレイ
  5. Raspberry Pi ZEROとPCを接続する
  6. コマンドラインで確認

Raspberry Pi ZeroをOTGモードを使って、PCからMIDIデバイスとして認識できるように設定します。OTGはUSB On-The-Goの略です。 OTGを使うとPCがUSBのHost(親側)、Raspberry Pi ZeroをFunction(子供側)にすることができます。 普通のRaspberry Pi 2 Raspberry Pi 3はこのモードに対応していません。 ここではRaspberry Pi ZeroをMIDIデバイスにしてみます。 設定はLinuxの扱いに慣れていないとちょっと難しいかもしれません。


config.txtとのcmdline.txtの2つのファイルを書き換えます。

  1. /boot/config.txtの最終行に、dtoverlay=dwc2をLinuxのエディタを用いて、書き加えます。 私は"vi"を使ってファイルを編集しています。

    > pi@raspberrypi:~ $ sudo vi /boot/config.txt
    

    私の場合、config.txtの一番最後の行は以下のようになりました。

    ...
    ...
      [pi4]
    # Run as fast as firmware / board allows
    arm_boost=1
    
    [OTG]
    dtoverlay=dwc2
    

  2. /boot/cmdline.txtをエディタで開きます。rootwaitを探して、rootwait modules-load=dwc2,g_midiと修正します。

    > pi@raspberrypi:~ $ sudo vi /boot/cmdline.txt
    

    私の場合cmdline.txtを書き加えた結果、以下のようになりました。

      console=serial0,115200 console=tty1 root=PARTUUID=fe7ff3ab-02 
      rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles 
      cfg80211.ieee80211_regdom=JP rootwait modules-load=dwc2,g_midi quiet
    

コマンドラインで、以下の2つの命令を実行することでも書き換えられます。

> pi@raspberrypi:~ $ sudo sed -i -e '$ a dtoverlay=dwc2' /boot/config.txt
> pi@raspberrypi:~ $ sudo sed -i s/rootwait/rootwait\ modules-load=dwc2,g_midi/ /boot/cmdline.txt

2つのファイルを書き換えたらrebootします。

> pi@raspberrypi:~ $ sudo reboot


Ubuntu 23.10

Ubuntu 23.10では設定ファイルの場所(ディレクトリ)が変わっていました。 私はUbuntu 23.10をRaspberry Pi Zero2にインストールしました。

config.txtとcmdline.txtの2つのファイルは、/boot/firmwareにあります。

  > cd /boot/firmware
  > sudo vi config.txt

config.txtの最終行は以下の様に書かれていました。

  [cm4]
  # Enable the USB2 outputs on the IO board (assuming your CM4 is plugged
  # into such a board)
  dtoverlay=dwc2,dr_mode=host

以下のようにdr_mode=hostを削除して下さい。

  [cm4]
  # Enable the USB2 outputs on the IO board (assuming your CM4 is plugged
  # into such a board)
  dtoverlay=dwc2

cmdline.txtの修正は上と同じです。rootwaitを探して、 rootwait modules-load=dwc2,g_midiと修正します。

参考にUbuntuのバージョンは/etc/os-releaseをcatすることで確認できます。

> cat /etc/os-release
PRETTY_NAME="Ubuntu 23.10"
NAME="Ubuntu"
VERSION_ID="23.10"
VERSION="23.10 (Mantic Minotaur)"
...


Ubuntu 24.04

Raspberry Pi Zero 2において Ubuntu 24.04の場合、config.txtとcmdline.txtの2つのファイルは、/boot/firmwareにあります。 config.txtを見ると以下のようにdtoverlay(Device Tree オーバーレイ)が何回か設定されています。


  # Config settings specific to arm64
  arm_64bit=1
  dtoverlay=dwc2
  
  # Enable the KMS ("full" KMS) graphics overlay, leaving GPU memory as the
  # default (the kernel is in control of graphics memory with full KMS)
  dtoverlay=vc4-kms-v3d
  disable_fw_kms_setup=1
  
  [pi3+]
  # Use a smaller contiguous memory area, specifically on the 3A+ to avoid an
  # OOM oops on boot. The 3B+ is also affected by this section, but it shouldn't
  # cause any issues on that board
  dtoverlay=vc4-kms-v3d,cma-128
  
  [pi02]
  # The Zero 2W is another 512MB board which is occasionally affected by the same
  # OOM oops on boot.
  dtoverlay=vc4-kms-v3d,cma-128
  
  [all]
  
  [cm4]
  # Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into
  # such a board)
  dtoverlay=dwc2,dr_mode=host
  
  [all]

OTGモードで動作させるには、以下の行をコメントアウトします。

[cm4]
# Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into
# such a board)
# dtoverlay=dwc2,dr_mode=host

一般に、Raspberry PiをUSBデバイス(クライアント)として使いたい場合は、 dr_mode=deviceのように設定を変更する必要があります。この設定で、Raspberry Piは、 コンピュータのUSBポートに接続されるデバイスとして動作します。


オーバーレイ

わかる範囲で記載しておきます。

  • vc4-kms-v3d:
    Raspberry Piのグラフィックススタックを有効にするオーバーレイです。 このオーバーレイを使用すると、Raspberry Piでの3Dアクセラレーションが有効になります。 特に、グラフィックスを多用するアプリケーションやデスクトップ環境で役立ちます。
  • cma-128:
    「Contiguous Memory Allocator (CMA)」のサイズを128MBに設定するオプションです。 CMAは、システムメモリから連続した大きなメモリ領域を確保するために使用されます。 特に、ビデオメモリとして利用されることが多いです。この設定により、3Dグラフィックスやビデオの再生がスムーズに行えるようになります。
  • dr_mode:
    「Dual Role mode」の略で、USBポートがデバイス(クライアント)またはホストとして動作できることを指します。 Raspberry Piのようなデバイスは、USBポートをホストとして使うことも、デバイスとして使うことも可能です。
  • host:
    USBポートをホストモードで動作させることを指定します。 ホストモードでは、Raspberry PiがUSBキーボード、マウス、フラッシュドライブなどのUSBデバイスを接続して操作することができます。 通常、ホストモードは、デフォルトの設定として使用されます。

disable_fw_kms_setup=1

ブートプロセスに関連する設定で、ファームウェアによる KMS (Kernel Mode Setting) の設定を無効にします。 KMSは、カーネルが直接グラフィックスモードの設定を制御する方式です。無効の場合、ファームウェアがKMS設定を行わず、 代わりにLinuxカーネルがこれらの設定を担当します。 これにより、特定のハードウェアや設定で起こり得る互換性の問題や、 メモリの管理が異なる形で行われる可能性があります。
この設定が有効になっていると、Raspberry Pi のファームウェアが起動時にディスプレイの解像度やグラフィックスモードを設定します。

OOMエラーとは

Zero 2Wは512MBのメモリを搭載していますが、起動時にメモリ不足によるエラー(「Oops」)が発生することがあります。 OOMエラーとは、システムが利用可能なメモリを使い果たし、必要な処理が実行できなくなる状況を指します。



Raspberry Pi ZEROとPCを接続する

Raspberry Pi Zeroでは、Ubuntuのデスクトップが立ち上がっていて、Chrmiumが使える場合を想定しています。 デスクトップが立ち上がっていない場合は、コマンドラインで確認を参照して下さい。

PCとUSB接続します。Raspberry Pi Zeroには2つのUSBポート付いています。 この内、内側ののUSBと記載されている端子とつないで下さい。

PCでデバイスマネージャーを開くと、サウンド、ビデオ、および…の項目にMIDI functionが追加されています。


一方、Raspberry Pi Zeroでは、amidi -lコマンドを使って、f_midiという名前でMIDIデバイスが認識できます。

> pi@raspberrypi:~ $ amidi -l
Dir Device    Name
IO  hw:0,0    f_midi

Web MIDIを使って、MIDIの送受信をチェックします。PCのChromeで、このページを開きます。MIDI IN:/MIDI out:の両方にMIDI functionを設定します。


Raspberry Pi Zeroでも同じページを開きます。MIDI IN:/MIDI out:の両方にMIDI functionを設定します。


PC側のPushを押します。Raspberry Pi ZeroのブラウザでMIDIが受信できます。


Raspberry Pi Zero側のPushを押します。PCのブラウザでMIDIが受信できます。




コマンドラインで確認

Raspberry Piではデスクトップが立ち上がっていない場合、コマンドラインでMIDIメッセージ のやりとりを確認します。

PC側の準備は上と同じです。PCとデバイスをUSBで接続します。

PCでデバイスマネージャーを開くと、サウンド、ビデオ、および…の項目にMIDI functionが追加されています。


Web MIDIを使って、MIDIの送受信をチェックします。PCのChromeで、このページを開きます。MIDI IN:/MIDI out:の両方にMIDI functionを設定します。MIDI Gadgetと表示される場合もあります。


デバイス側ではamidi -d -p hw:0,0,0のコマンドでMIDIの受信待ちになります。PC側でPushをクリックするとデバイス側でMIDIを受信できます。

> pi@raspberrypi:~ $ amidi -l
Dir Device    Name
IO  hw:0,0    f_midi

> pi@raspberrypi:~ $ amidi -d -p hw:0,0,0
90 30 7F
80 30 00
90 34 7F
80 34 00
90 37 7F
80 37 00
90 30 7F
90 34 7F
90 37 7F
80 30 00
80 34 00
80 37 00

反対に、デバイス側からMIDIを送信する場合は、以下の2つのコマンドを使います。 まずechoコマンドで、MIDIのバイナリファイルを作成します。

> pi@raspberrypi:~ echo -n -e "\x90\x66\x77" > midi.bin

次に、amidiコマンドでメッセージを送信します。

> pi@raspberrypi:~ amidi -p hw:0,0,0 -s midi.bin

PC側で受信したMIDIメッセージが表示されます。