如何使用树莓Pico的OLED屏幕和蓝牙?

博主使用树莓派Pico、0.9寸OLED显示屏和ESP32蓝牙模块,创建了一个硬件版的ScrollDigitalNote。通过Thonny编程并利用BluetoothController进行通信,实现了通过蓝牙控制OLED屏幕显示内容。遇到的问题是蓝牙模块电源需用VBUS供电,并详细列出了接线配置。代码中强调了在PICO上运行的严格性,提供了代码示例和不同指令的功能,如开关LED、清除和添加显示数据。

最近买了树莓派Pico+OLED1602和一个蓝牙ESP32就想着能能搞点小东西,就尝试了一下硬件版的ScrollDigitalNote ,看看能不能搞出来,目前只是一个小的demo吧!

前提

硬件

  • 树莓派pico
  • 0.9寸OLED显示屏
  • ESP32 蓝牙WIFI模块

软件

  • Thonny:用于编程上传代码
  • Buletooth Controller:用于和蓝牙模块进行通信

接线

  • 我这里主要说一下蓝牙模块吧,拆坑有点久,就是电源3.3V带不动,要用最大的电源VBUS。串口还是要按Pico的接口来选,不要随便连接。
模块接口PICO对应针脚
蓝牙VCCVBUS
蓝牙GNDGND
蓝牙RXGP17
蓝牙TXGP16
OLED-VCC3V3
OLED-GNDGND
OLED-SCLGP21
OLED-SDAGP20
  • PiCO 引脚说明

Code

感觉硬件上的代码编写要比软件严格多了,同一个代码在电脑上能运行不代表单独在单排机上也能运行。我这下面的cmd = uart.readline().decode()如果没写try...except...的话在PICO 上是无法运行的。

  • main.py
import machine
import utime
from ssd1306 import SSD1306_I2C

led_status = 1
data_list = ["Just Be Happy !","Hold On !","Try Your Best !"]

uart = machine.UART(0, baudrate=115200, tx=machine.Pin(16), rx=machine.Pin(17))
#print(uart)

led = machine.Pin(25, machine.Pin.OUT)
sda=machine.Pin(20)
scl=machine.Pin(21)
i2c=machine.I2C(0, sda=sda, scl=scl, freq=400000)
oled = SSD1306_I2C(128, 32, i2c) 

def OLED(string):    
    #一行最多16个字符
    #共3行
    #oled.text('****************', 0, 0)
    # 尝试居中对齐
    if len(string) < 12:
        x = int ((64-len(string)) / 2)
    else:
        x = 0
    oled.text(str(string), x, 10)
    #oled.text('****************', 0, 20)
    oled.show()
    utime.sleep(3)
 
    #oled.fill(1)
    #oled.show()
    # 防止长时间造成的烧屏
    oled.fill(0)
    oled.show()
    utime.sleep(0.1)
    

def sendBigData():
    for x in data_list:
        uart.write(x)
        OLED(str(x))
        
def clearData():
    data_list.clear()
    
def addData(data):
    data_list.append(data)


OLED("HELLO WORLD! ")
led.value(led_status)
utime.sleep(1)

led_status = 0

while True:
    led.value(led_status)
    try:
        cmd = uart.readline().decode()
        OLED("Input:" + str(cmd))
        if cmd == 'on':
            led_status = 1
        elif cmd == 'off':
            led_status = 0
        elif cmd == 'clear' :
            clearData()
        elif cmd == 'del':
            del data_list[-1]
            OLED("Del Last Data !")
        elif cmd == 'add' :
            uart.write("Please Input Your Data In 5 Seconds !\n")
            OLED("Input Your Data ")
            utime.sleep(5)
            try:                
                get = uart.readline().decode()
                addData(get)
                if get in data_list:
                    uart.write("insert successful!")
                    OLED("INSERT OK!")
                else:
                    uart.write("insert failed!")
                    OLED("INSERT FAILED")
            except:
                OLED("No Input !")
        else:
            continue
    except:
        OLED("emperinter")
    sendBigData()


led.value(1)
OLED("Something Wrong!")

如需观看演示视频,请访问: https://www.emperinter.info/2022/04/01/how-to-use-raspberry-pico-with-oled-screen-and-bluetooth/

<think>我们正在解决树莓派与Xbox手柄蓝牙连接不稳定的问题,具体表现为循环连接断开。 根据用户描述,问题发生在树莓派通过蓝牙连接Xbox手柄时,出现反复连接断开的情况。 可能的原因及解决方法: 1. **蓝牙驱动问题**:树莓派蓝牙驱动可能存在问题,导致连接不稳定。 - **解决方法**:更新系统并升级蓝牙相关驱动。 ``` sudo apt update sudo apt full-upgrade sudo reboot ``` 2. **蓝牙协议兼容性问题**:Xbox手柄使用蓝牙协议可能与树莓派蓝牙协议栈不完全兼容。 - **解决方法**:尝试使用不同的蓝牙协议栈,例如安装`pi-bluetooth`包并重启。 ``` sudo apt install pi-bluetooth sudo reboot ``` 3. **电源问题**:树莓派的USB端口可能无法为蓝牙适配器(如果使用外置)或手柄提供足够的电力,尤其是在使用多个外设时。 - **解决方法**:使用外接电源的USB集线器,或者确保树莓派的电源适配器能够提供足够的电流(至少2.5A)。 4. **干扰问题**:周围可能存在其他2.4GHz设备(如Wi-Fi路由器、无线电话等)干扰蓝牙信号。 - **解决方法**:尽量让手柄靠近树莓派,并减少其他无线设备的使用,或者将树莓派的Wi-Fi切换到5GHz频段(如果支持)以减少干扰。 5. **手柄固件问题**:Xbox手柄的固件可能需要更新。 - **解决方法**:将手柄连接到Windows PC或Xbox主机,检查并更新固件。 6. **蓝牙服务配置问题**:可能需要调整蓝牙配置。 - **解决方法**:编辑蓝牙配置文件`/etc/bluetooth/main.conf`,确保以下设置: ``` ControllerMode = dual ``` 然后重启蓝牙服务: ``` sudo systemctl restart bluetooth ``` 7. **使用bluez-utils工具手动管理连接**:有时图形界面或自动连接可能不稳定,可以尝试使用命令行工具`bluetoothctl`手动连接。 - **解决方法**: - 扫描并信任设备: ``` bluetoothctl scan on # 找到手柄的MAC地址(类似XX:XX:XX:XX:XX:XX) trust <MAC地址> pair <MAC地址> connect <MAC地址> ``` - 如果连接成功且稳定,可以设置自动连接: ``` bluetoothctl connect <MAC地址> ``` 8. **特定于Xbox手柄的解决方案**:Xbox手柄在Linux下可能需要额外的配置。 - **解决方法**:安装xpadneo驱动(一个高级的Xbox One手柄驱动): ``` sudo apt install dkms git clone https://github.com/atar-axis/xpadneo.git cd xpadneo sudo ./install.sh sudo reboot ``` 9. **检查系统日志**:查看系统日志以获取更多错误信息。 - **解决方法**:使用以下命令查看蓝牙相关的日志: ``` journalctl -u bluetooth -f ``` 在连接手柄时观察日志,可能会显示断开连接的原因。 如果以上方法都不能解决问题,可能需要考虑更换蓝牙适配器(如果使用外置)或者尝试使用USB有线连接。 请注意,树莓派3B+及以后的型号内置蓝牙,而更早的型号可能需要外置蓝牙适配器。如果使用外置适配器,请确保其兼容性。 参考引用: - 引用[2]中提到Tinker-Controller项目,它通过手机应用桥接游戏控制器微控制器,但这里我们更关注直接连接的问题。 - 引用[1]中提到Xbox手柄在PC上的兼容性较好,但在树莓派上可能需要额外配置。 希望这些方法能够帮助您解决问题。</think>### 树莓派蓝牙连接Xbox手柄不稳定的原因及解决方法 #### 问题原因分析 1. **驱动兼容性问题** Xbox手柄在Linux系统(如树莓派OS)需要特定驱动支持,默认驱动$xpad$可能不完善[^2]。 2. **蓝牙协议冲突** 手柄的$BLE$(低功耗蓝牙)与树莓派蓝牙栈存在兼容性问题,导致握手协议反复失败。 3. **电源干扰** 树莓派USB端口供电不足(尤其是Pi 3/4),导致蓝牙模块电压波动,表现为$$ \Delta V > 0.2V $$时连接中断。 4. **信号干扰** 2.4GHz频段的WiFi与蓝牙冲突,信道重叠引发$$ \text{SNR} < 10\text{dB} $$的信噪比问题。 5. **固件过时** 树莓派蓝牙固件版本低于$5.50$时,对Xbox Series X/S手柄支持不佳。 --- #### 解决方案 ##### 方法1:安装专用驱动(推荐) ```bash # 安装xpadneo驱动(支持Xbox One/Series手柄) sudo apt install dkms git clone https://github.com/atar-axis/xpadneo.git cd xpadneo sudo ./install.sh sudo reboot ``` > 此驱动优化了手柄的$$ HID \rightarrow \text{蓝牙} $$协议转换[^2] ##### 方法2:优化蓝牙配置 ```bash # 编辑蓝牙配置文件 sudo nano /etc/bluetooth/main.conf ``` 修改以下参数: ```ini ControllerMode = bredr # 强制使用BR/EDR模式 FastConnectable = true # 加速重连 AutoEnable=true # 开机自启 ``` 重启服务: ```bash sudo systemctl restart bluetooth ``` ##### 方法3:电源优化 1. **外接供电** 使用带独立电源的USB集线器连接手柄接收器 2. **降低功耗** ```bash # 关闭蓝牙省电模式 echo "options btusb enable_autosuspend=n" | sudo tee /etc/modprobe.d/btusb.conf ``` ##### 方法4:减少信号干扰 ```bash # 将WiFi切换到5GHz频段(需路由器支持) sudo iw dev wlan0 set channel 36 HT40+ # 或强制蓝牙使用自适应跳频 sudo hciconfig hci0 afhmode 1 ``` ##### 方法5:固件升级 ```bash # 更新蓝牙固件(树莓派4B+) sudo rpi-eeprom-update -a sudo reboot ``` --- #### 验证连接稳定性 ```bash # 实时监控蓝牙连接 bluetoothctl [bluetooth]# info <手柄MAC地址> # 检查输出中"Connected: yes"是否持续稳定 ``` > **注意**:Xbox Series X/S手柄需按住**配对键3秒**进入标准蓝牙模式(非Xbox专用协议),此时指示灯**快速闪烁**[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值