RasPberryPi Pico 从0打造蓝牙智能小车

写在前面

本篇文章只介绍了小车的运动和使用蓝牙的控制,其他拓展功能以及传感器的连接在后续都可以拓展起来。

万事开头难,让我们先让小车动起来吧!

在这里插入图片描述

需要的设备

  1. RasPberryPi Pico 开发板
  2. Hc-06 蓝牙模块
  3. L298N 电机驱动模块
  4. 小车框架
  5. 杜邦线
  6. 电池

RasPberryPi Pico自己焊针脚的话大概20元,Hc-06比较好的要9元,L298N基本都是5元钱,小车框架看自己需求选择一个喜欢的外表炫酷大概15元,我买的是20多元的四驱小车框架,电池2元钱。

接线细节

L298N与Pico的连接

L298N和pico的连接:L298N的IN1、IN2、IN3、IN4与pico的GPIO0、GPIO1、GPIO2、GPIO3分别相接,L298N的ENA和ENB与pico的GPIO5和GPIO4连接。

我对L298N的一个out输出控制两个电机,如果想要更大的动力,使用两块L298N,分别控制四个电机。

给使能端(ENA/ENB)输入PWM脉冲信号可以控制电机的转速,如果不使用使能的话,要将L298N的使能端各自短接,否则电机不转。

L298N给Pico供电

用电池(我的电池是7.8V)的正极和L298N的12V连接,GND和L298N的GND连接,这时候L298N的5V为输出电压,可以接到pico的VSYS,给Pico供电,Pico的地线也要和L298N的地线连接,这很重要!

HC-06与Pico的连接

Pico和HC-06是全双工串口通信,Pico的RXD、TXD和HC-06的TXD、RXD相连,注意是相互连接。HC-06的输入电压是3.3V直接用Pico的3.3v给它输入电压,地线也直接和Pico的地线连接,我用的是Pico的GPIO12和GPIO13,它们分别是TX0和RX0。

蓝牙模块HC-06还需要调试一下。

蓝牙模块HC-06的使用

HC-06是蓝牙2.0,iPhone手机由于安全性质,是无法连接HC-06的(我的手机就是iPhone的,连不上呜呜呜)。

我用了一个TTL转USB的工具和HC-06连接,在不配对的情况下,直接将USB插入电脑中就是进入了HC-06的AT模式,在AT模式我们就可以调试HC-06了。

常用的AT指令与调试

在电脑上下载一款串口调试软件,然后选择波特率为9600(HC-06默认的波特率),点击打开串口后就可以发送AT指令了,如果有响应就说明蓝牙模块没问题。

AT指令很多,可以网上搜一下。

指令  响应
AT -> OK
AT+BAUD6 -> OK38400 //这个是改波特率为38400
AT+NAMEname -> OKsetname //改蓝牙名称为name
AT+PIN1234 -> OKsetPIN //改蓝牙密码为1234(默认就是1234)
AT+ROLE=S -> OK+ROLE:S //设置模块为从模块,HC-06好像只能作为从机

建议在安卓手机上下一个e调试app,然后可以自定义按键给蓝牙模块发消息,可以定义一个Ui界面然后控制小车的前进后退。

有的安卓手机由于安全性能,也是无法和HC-06连接的(之前我就被室友的手机坑过,还以为是蓝牙模块坏了呢)

写代码的过程

我建议参考官方文档来写代码:MicroPython 库 — MicroPython中文 1.17 文档

有一个必须用到的库就是machine,它是与硬件相关功能的库。

machine.PWM:有关脉宽调制类

machine.UART:全双工串行通信总线类

基本上结合下面的代码再参考官方文档就能读懂啦!

我觉得PWM的调制会比较难一点,下面是官方的示例代码:

from machine import PWM

pwm = PWM(pin)          # create a PWM object on a pin

# 获取或设置 PWM 输出的当前占空比,作为 0 到 65535 范围内的无符号 16 位值
pwm.duty_u16(32768)     # set duty to 50%

# reinitialise with a period of 200us, duty of 5us
pwm.init(freq=5000, duty_ns=5000)

pwm.duty_ns(3000)       # set pulse width to 3us

pwm.deinit() # 禁用 PWM 输出。

有关Pico的upload经验

我是直接在vscode上下载了一个microPico的插件,所以可以在vscode写代码然后调试,vscode写代码是非常的爽,但是upload的时候得要注意了,先要调试好,保证程序没有问题再upload到Pico里面,不然会导致Pico死掉的!

我当时就大意把Pico玩死了,然后我一直连接不上板子了,只能重新把uf2删除再装一个。

有关电机运动的Car类

import machine
import utime

class Motor:
    # speed_pin:用PWM控制小马达的引脚编号
    def __init__(self, speed_pin, clockwise_pin, anti_clockwise_pin):
        self.pwm = machine.PWM(machine.Pin(speed_pin))
        self.cw = machine.Pin(clockwise_pin, machine.Pin.OUT)
        self.acw = machine.Pin(anti_clockwise_pin, machine.Pin.OUT)
        self.pwm.freq(2000)
        self.speed = 0
        
    def set_speed(self, speed):
        self.speed = speed    
        if self.speed > 100: self.speed = 100
        if self.speed < 60: self.speed = 60
        self.pwm.duty_u16(int(self.speed / 100 * 65535))    
       
    def forward(self):
        self.pwm.duty_u16(int(self.speed / 100 * 65535))
        self.cw.value(1)
        self.acw.value(0)

    def backward(self):
        self.pwm.duty_u16(int(self.speed / 100 * 65535))
        self.cw.value(0)
        self.acw.value(1)

    def stop(self):
        self.pwm.duty_u16(0)
        self.cw.value(0)
        self.acw.value(0)

主程序main

from Car import Motor
import utime, machine

motor1 = Motor(5, 0, 1)
motor2 = Motor(4, 2, 3)

def run():
    motor1.set_speed(100)
    motor2.set_speed(100)
    
    motor1.forward()
    motor2.forward()
    utime.sleep(0.5)

def stop():
    motor1.stop()
    motor2.stop()
    utime.sleep(0.5)

def left():
    motor1.set_speed(80)
    motor2.set_speed(80)
    motor2.backward()
    motor1.forward()
    utime.sleep(0.5)

def right():
    motor1.set_speed(80)
    motor2.set_speed(80)
    motor2.forward()
    motor1.backward()
    utime.sleep(0.5)

def backward():
    motor1.set_speed(100)
    motor2.set_speed(100)
    
    motor1.backward()
    motor2.backward()
    utime.sleep(0.5)

uart = machine.UART(0, baudrate=9600, tx=machine.Pin(12), rx=machine.Pin(13))
print(uart)

led = machine.Pin(25, machine.Pin.OUT)
while True:
    if uart.any():
        cmd = str(uart.readline())[5]
        print(cmd)
        if cmd == '1':
            led.value(1)
            run()
        if cmd == '2':
            led.value(0)
            stop()
        if cmd == '3':
            led.value(1)
            left()
        if cmd == '4':
            led.value(1)
            right()
        if cmd == '5':
            led.value(1)
            backward()
    utime.sleep(0.1)
  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Keven1Duan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值