Raspberry Pi 4 BをWindows PCに接続して、Raspberry Piをキーボードとして動作させる方法を紹介します。
この記事は次の人におすすめ
- Raspberry Piをキーボードとして使用させたい人
- Windows PCに独自の外部キーボードを接続させたい人
必要なもの
- Raspberry Pi 4 B
- Windows PC
- Type-A to C 充電/転送ケーブル
- SDカード
以下は動作確認のために使用したものです。
- mini HDMI
- 外部ディスプレイ
手順
1. Windows PCに以下サイトからRaspberry Pi Imagerを使用してSDカードに64bitのRaspberry Pi OSをインストール
2. SDカード内の /boot/config.txt の末尾に以下を追記する
dtoverlay=dwc2
3. SDカード内の /boot/cmdline.txt のrootwait の後ろに書きを追記する
modules-load=dwc2,libcomposite
3. Raspberry Pi OSを入れたSDカードをRaspberry Piに挿入してRaspberry Piを立ち上げる
4. /usr/local/bin/setup_usb_gadget.sh を作成して以下のファイルを作成する
#!/bin/bash
# libcomposite をロード
modprobe libcomposite
# configfs の設定
cd /sys/kernel/config/usb_gadget/
mkdir -p g1
cd g1
# デバイスディスクリプタの設定
echo 0x1d6b > idVendor
echo 0x0104 > idProduct
echo 0x0100 > bcdDevice
echo 0x0200 > bcdUSB
# ストリングディスクリプタの設定
mkdir -p strings/0x409
echo "12345678" > strings/0x409/serialnumber
echo "KeyboardTestCCN." > strings/0x409/manufacturer
echo "Generic USB Keyboard" > strings/0x409/product
# HID 設定
mkdir -p functions/hid.usb0
echo 1 > functions/hid.usb0/protocol
echo 0 > functions/hid.usb0/subclass
echo 8 > functions/hid.usb0/report_length
echo -ne '\x05\x01\x09\x06\xa1\x01\x05\x07\x19\xe0\x29\xe7\x15\x00\x25\x01\x75\x01\x95\x08\x81\x02\x95\x01\x75\x08\x81\x03\x95\x05\x75\x01\x05\x08\x19\x01\x29\x05\x91\x02\x95\x01\x75\x03\x91\x03\x95\x06\x75\x08\x15\x00\x25\x65\x05\x07\x19\x00\x29\x65\x81\x00\xc0' > functions/hid.usb0/report_desc
# コンフィグレーションディスクリプタの設定
mkdir -p configs/c.1
echo 250 > configs/c.1/MaxPower
mkdir -p configs/c.1/strings/0x409
echo "Config 1" > configs/c.1/strings/0x409/configuration
# HID をコンフィグにリンク
ln -s functions/hid.usb0 configs/c.1
# ガジェット有効化
ls /sys/class/udc > UDC
# 権限変更
chmod 777 /dev/hidg0
5. sudo chmod +x /usr/local/bin/setup_usb_gadget.sh を実行して実行可能にする
6. /etc/systemd/system/usb_gadget.service にサービスファイルを作成する
[Unit]
Description=Setup USB Gadget
After=network.target sysinit.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/setup_usb_gadget.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
7. 以下コマンドを実行してサービスを有効化する
sudo systemctl enable usb_gadget.service
sudo systemctl start usb_gadget.service
もしも上記でサービスを有効化できない場合は、古い手法ですが sudo nano /etc/rc.local を実行して /usr/local/bin/setup_usb_gadget.sh をexit 0 の前に記載し、sudo chmod +x /etc/rc.local を実行してください。
8. sudo reboot を実行して再起動します
9. 再起動後に ls /sys/kernel/config/usb_gadget/g1 を実行してg1フォルダが作成できていることを確認します
私が試したときはg1フォルダが作成されておらず、改行コードがUnix形式になっていなかったので下記コマンドを実行したところうまくいきました。
sudo dos2unix /usr/local/bin/setup_usb_gadget.sh
10. 次にキーボードに操作を送るコマンドを作成します。
/usr/local/bin/send_command_to_hid.sh というファイルを作成し、下記のような内容にします。
#!/bin/bash
# 起動後30秒待つ
sleep 30
# Tabキーを押す
echo -ne "\0\0\x2b\0\0\0\0\0" > /dev/hidg0
sleep 0.1
# キーを離す
echo -ne "\0\0\0\0\0\0\0\0" > /dev/hidg0
# 5秒待つ
sleep 5
# スペースキーを押す
echo -ne "\0\0\x2c\0\0\0\0\0" > /dev/hidg0
sleep 0.1
# キーを離す
echo -ne "\0\0\0\0\0\0\0\0" > /dev/hidg0
# 5秒待つ
sleep 5
# Enterキーを押す
echo -ne "\0\0\x28\0\0\0\0\0" > /dev/hidg0
sleep 0.1
# キーを離す
echo -ne "\0\0\0\0\0\0\0\0" > /dev/hidg0
11. sudo chmod +x /usr/local/bin/send_command_to_hid.sh を実行してスクリプトを実行可能にします
12. /etc/systemd/system/send_command_to_hid.service というファイルを作成し、下記内容にします
[Unit]
Description=Send "a" to HID device
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/send_command_to_hid.sh
[Install]
WantedBy=multi-user.target
13. sudo systemctl enable send_command_to_hid.servic を実行してサービスを有効化しておきます
14. Windows PCにUSBケーブルを使用してRaspberry Piを接続してRaspberry Piを再起動します
手順としては以上です。
今回はRaspberry Piが起動後30秒待ち、Tab、スペース、Enterの順で押させるようにしました。