備忘錄_20160105(定位) 修改 回首頁

程式 2025-10-31 00:59:56 1761843596 100
讓 raspberry pi zero 2 w 變成鍵盤

讓 raspberry pi zero 2 w 變成鍵盤




若要復原的話!
1./boot/firmware/config.txt 把 dtoverlay=dwc2 拿掉
2.sudo modprobe -r libcomposite
3.sudo reboot



  1. [micro usb] : POWER IN,就接電源
  2. [micro usb] : micro usb 公 - usb a 公 (接 Nintendo Switch 或 PC)
  3. [mini HDMI] : 空
  4. [micro sd] : micro sd 卡 (已安裝 raspberry pi os 64bit)
  5. 請用 ssh 的方式連入 pi zero 2 w 控制

sudo nano /boot/firmware/config.txt

在最後一行,通常會是 [all] 之後,加入
dtoverlay=dwc2
儲存後,重新開機 (sudo reboot)

sudo ./kb.sh
sudo python test.py

====== kb.sh (請加上 chmod +x) ======

#!/bin/bash

modprobe libcomposite
mount -t configfs none /sys/kernel/config

G=/sys/kernel/config/usb_gadget/pi_keyboard
mkdir -p $G
echo 0x1d6b > $G/idVendor  # Linux Foundation
echo 0x0104 > $G/idProduct # Multifunction Composite Gadget
echo 0x0100 > $G/bcdDevice
echo 0x0200 > $G/bcdUSB
mkdir -p $G/strings/0x409
echo "fedcba9876543210" > $G/strings/0x409/serialnumber
echo "Raspberry Pi" > $G/strings/0x409/manufacturer
echo "Pi Zero Keyboard" > $G/strings/0x409/product

mkdir -p $G/configs/c.1/strings/0x409
echo "Config 1: HID Keyboard" > $G/configs/c.1/strings/0x409/configuration
echo 120 > $G/configs/c.1/MaxPower

mkdir -p $G/functions/hid.usb0
echo 1 > $G/functions/hid.usb0/protocol
echo 1 > $G/functions/hid.usb0/subclass
echo 8 > $G/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' \
> $G/functions/hid.usb0/report_desc

ln -s $G/functions/hid.usb0 $G/configs/c.1/
ls /sys/class/udc > $G/UDC

====== test.py ======

import time

HID_DEVICE = "/dev/hidg0"

# 鍵盤對應表: https://usb.org/sites/default/files/hut1_3_0.pdf
# 例如: a = 0x04, b = 0x05, enter = 0x28
KEY_A = 0x04
KEY_ENTER = 0x28

def send_key(hid, keycode):
    report = bytearray(8)
    report[2] = keycode  # 第三個位元是 key code
    with open(hid, "wb") as f:
        f.write(report)
        f.flush()
    time.sleep(0.1)
    # 放開按鍵
    with open(hid, "wb") as f:
        f.write(b'\x00'*8)
        f.flush()

time.sleep(10)

for i in range(20):
    send_key(HID_DEVICE, KEY_A)
    time.sleep(0.01)
    send_key(HID_DEVICE, KEY_ENTER)
    time.sleep(0.01)