如何用电脑键盘(W/A/S/D)通过蓝牙控制ESP32小车?
可行实现方法
方案1:Python(键盘监听)+蓝牙串口通信
利用你熟悉的Python keyboard库监听键盘输入,通过蓝牙串口把控制指令发送给Arduino,Arduino端解析指令执行对应动作。
步骤:
- 给Arduino搭配蓝牙模块(如HC-05),完成串口通信接线(蓝牙TX接Arduino RX,蓝牙RX接Arduino TX,注意电平转换)。
- 电脑连接蓝牙模块对应的串口(可在设备管理器中查看COM口编号)。
- Python端代码示例:
import keyboard import serial import time # 替换为你的蓝牙串口COM口和波特率 ser = serial.Serial('COM3', 9600, timeout=1) time.sleep(2) # 预留蓝牙连接时间 def send_command(cmd): ser.write(cmd.encode()) while True: if keyboard.is_pressed('w'): send_command('F') # 发送前进指令 elif keyboard.is_pressed('s'): send_command('B') # 发送后退指令 elif keyboard.is_pressed('a'): send_command('L') # 发送左转指令 elif keyboard.is_pressed('d'): send_command('R') # 发送右转指令 else: send_command('S') # 发送停止指令 time.sleep(0.1) # 避免指令发送过于频繁
- Arduino端代码示例:
#include <SoftwareSerial.h> // 定义蓝牙串口引脚(RX接蓝牙TX,TX接蓝牙RX) SoftwareSerial btSerial(10, 11); char receivedCmd; void setup() { // 初始化电机驱动引脚(根据你的硬件修改) pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); btSerial.begin(9600); } void loop() { if (btSerial.available() > 0) { receivedCmd = btSerial.read(); switch(receivedCmd) { case 'F': Forward(); break; case 'B': Backward(); break; case 'L': Left(); break; case 'R': Right(); break; case 'S': Stop(); break; } } } // 电机控制函数(根据你的驱动电路调整逻辑) void Forward() { digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, LOW); } void Backward() { digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, HIGH); } void Left() { digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); } void Right() { digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, HIGH); } void Stop() { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); }
方案2:Processing软件监听键盘+蓝牙通信
如果你不想用Python,Processing是Arduino官方配套工具,内置键盘监听功能,可直接与蓝牙串口通信。
Processing端代码示例:
import processing.serial.*; Serial btSerial; void setup() { // 打印所有可用串口,选择蓝牙模块对应的端口 println(Serial.list()); btSerial = new Serial(this, Serial.list()[0], 9600); } void draw() { if (keyPressed) { switch(key) { case 'w': btSerial.write('F'); break; case 's': btSerial.write('B'); break; case 'a': btSerial.write('L'); break; case 'd': btSerial.write('R'); break; } } else { btSerial.write('S'); } }
Arduino端代码与方案1完全一致,无需修改。
注意事项
- 蓝牙模块的波特率需与代码设置一致(默认多为9600)。
- 电机驱动部分需根据你使用的硬件(如L298N、L293D)调整引脚和逻辑。
- 测试时可先通过串口监视器验证指令传输是否正常,再连接电机。
内容的提问来源于stack exchange,提问作者Matrodsilver
相关产品推荐
相关产品推荐

