树莓派 Pico 中文站
1.板子介绍
:
- 微型usb连接器 microUSB 数据通信,提供动力
- On-board LED 板载LED 在自己专用的GPIO端口 峰值上的唯一LED
不会给出电源任何施加到上面的指示 - boot select按钮 启动模式选择 引导加载程序
- Debug Pins 调试连接器 pico支持两线串行通过这个进行调试
- rp2040微控制器芯片
- 32位双核 arm-cortex m zero plus 芯片
- 以48兆赫的的正常时钟速度运行,并可提升至133兆赫
- 2兆字节的板载外部内存
- 板载实时时钟
- 板载温度传感器
- 要么使用引脚,要么表面安装
- 8个接地点 其中一个是1个调试的一部分 接地点发布均匀
- 所有的接地连接是方行焊盘而不是圆形焊盘
- v总线和输出的微型usb电缆电压 连接5v 无连接v总线无输出
- 系统的输入功率 可以在2到5v的电压下运行该系统 尽管pico是3.3v逻辑机
- 引脚36上的3.3输出是pico的内部电压调节器的3.3输出 可以用来驱动外部设备,但不要超过3亿
- 3.3伏使能可启用 扳上的3.3伏电源 可以外部打开或关闭
- run连接 rp2040微控制器的使能连接 可以用作微控制器的复位
- 26个裸露的gpio引脚
- 内部的第27个TPIO引脚用于板载LED
- 12位模数转换器
- 3个内部模数转换器
- 内部ADC用于温度传感器
- ADC vref gnd 用于外部基准电压源 以提高模数转换器的精度
- 2个I2C总线
- 2个SPI总线
- 2个URAT
- 16个PWM通道
- 普通的微控制器运行
- 使用micro usb 端口通电
- 使用电池供电,能够在低压2伏特的电压下工作
- 作为usb 设备运行
- micro python 或 c
2.led开关
- 26个gpio引脚,大多数的引脚支持带调制的脉冲
- 3.3v的逻辑器件
- 内置上拉电阻和下拉电阻,最大限度的减少所需的电路数量
可以用3个红绿蓝LED
或者一个LED
瞬间接触开关
一红一黑
3LED 需要3个降压电阻 330欧姆的电阻
引脚14(gpio引脚10) 连接到其中一个电阻器,连接到红色LED的阳极
引脚15(gpio引脚11) 连接到其中一个电阻器,连接到绿色LED的阳极
引脚19(gpio引脚14) 连接到其中一个电阻器,连接到蓝色LED的阳极
引脚23 上的接地点;连接到LED上的公共阴极
引脚4 (gpio引脚2)连接到黑色开关的一侧
引脚20 (gpio引脚15)连接到红色开关的一侧
引脚3 接地 连接到黑色开关的另一侧
pin引脚36 3.3v输出 连接到红色开关的另一侧
循环亮3种不同颜色
import machine
import utime
# 对应引脚并打开输出
led_red = machine.Pin(10, machine.Pin.OUT)
led_green = machine.Pin(11, machine.Pin.OUT)
led_blue = machine.Pin(14, machine.Pin.OUT)
while True:
led_red.value(1)
led_green.value(0)
led_blue.value(0)
utime.sleep(2)
led_red.value(0)
led_green.value(1)
led_blue.value(0)
utime.sleep(2)
led_red.value(0)
led_green.value(0)
led_blue.value(1)
utime.sleep(2)
led_red.value(1)
led_green.value(1)
led_blue.value(0)
utime.sleep(2)
led_red.value(1)
led_green.value(0)
led_blue.value(1)
utime.sleep(2)
led_red.value(0)
led_green.value(1)
led_blue.value(1)
utime.sleep(2)
led_red.value(1)
led_green.value(1)
led_blue.value(1)
utime.sleep(2)
print("End of Loop")
led_red.value(0)
led_green.value(0)
led_blue.value(0)
utime.sleep(2)
4.开关控制:
import machine
import utime #时间有关的库
button_red = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN) # gpio15 输入 下拉电阻,因为红灯的
# 的一段是3.3v 所以一直保持低位
# 当开关接通时,它将激活并将其拉高
button_black = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP) # 上拉电阻,降低即开始
while True:
if button_red.value() == 1:
print("Red")
if button_black.value() == 0:
print("Black")
utime.sleep(0.25) # 延迟
5.中断:
import machine
import utime
led_red = machine.Pin(10, machine.Pin.OUT)
led_green = machine.Pin(11, machine.Pin.OUT)
led_red.value(0)
led_green.value(0) # 关灯
button_red = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN) # 正常下拉电阻为低,除非按他就会拉高
def in_handler(pin)
button_red.irq(handler=None) # 关闭此引脚的中断
print("Interrupt Detected!")
led_red.value(1)
led_green.value(0)
utime.sleep(4) # 休眠在中断不常见,这是个示范
led_red.value(0)
button_red.irq(handler=int_handler) # 重新设置程序,然后才能再次工作
button_red.irq(trigger=machine.Pin.IRQ_RISING, handler=int_handler)
# 修复中断请求 触发中断 我们在上升信号时触发它(低到高) 此时传入一个被称为中断处理程序的函数
# 每次按下按钮会有一个中断,就调用这个函数
# 不被中断时
while True:
led_green.toggle() # 切换函数 ,获取输出状态并将其反转
# led将开或关,就反转成
utime.sleep(2)
6.按按钮灯循环亮:
import machine
import utime
# 对应引脚并打开输出
led_red = machine.Pin(10, machine.Pin.OUT)
led_green = machine.Pin(11, machine.Pin.OUT)
led_blue = machine.Pin(14, machine.Pin.OUT)
led_red.value(0)
led_green.value(0)
led_blue.value(0)
button_black = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP) # 上拉电阻,降低即开始
while True:
if button_black.value() == 0: # 按下按钮,值为0
led_red.value(1)
led_green.value(0)
led_blue.value(0)
utime.sleep(1)
led_red.value(0)
led_green.value(1)
led_blue.value(0)
utime.sleep(1)
led_red.value(0)
led_green.value(0)
led_blue.value(1)
led_red.value(0)
led_green.value(0)
led_blue.value(0)
7.模拟输入:
- 3个内部模数转换器
- 12位adc
- 模拟基准电压源 模拟接地引脚 可与外部基准电压源配合使用
最简单组件是有效直径
这里使用10k的直线壶
- 引脚23 连接到patometer的一端
- 引脚31 gpio26 模拟转换器0 连接到patometer的一端
- 引脚36 3.3v输出 连接到patometer的一端
代码
import machine
import utime
# 定义一个称为电位计的变量,并将其定义为模拟输入,然后使用库的ADC功能
potentiometer = machine.ADC(26)
while True:
print(potentiometer.read_u16()) # 打印电位值,打印模数转换器的输出值
# 使用的是读出无符号16位输出,16位实际从0到65535
# 但是返回的值可能不是你期待的值
# 当我们需要将其传递给其它操作时
# 例如当我们使用PWM时,只要我们将所有内容
# 保持为无符号的16位数字,就不需要担心映射命令之类的
# 事情
utime.sleep(2)
8.PWM Control
从电位器中读取值用作PWM信号的控制
把信号馈送到rgbled的红色部分
import machine
import utime
led_red = machine.PWM(machine.Pin(10)) # 定于led为PWM输出
potentiomemter = machine.ADC(26) # 定义一个称为电位计的变量,并将其定义为模拟输入,然后使用库的ADC功能
led_red.freq(1000) # 工作频率为1000赫兹
while True:
led_red.duty_u16(potentiomemter.read_u16()) # 占空比是一个无符号的16位整数
# 其值是从读取电位器中的无符号的16位整数中获得的
9.OLED
- PICO内部I2c总线零号
- 两个I2C总线
- 只需要写入
- 只需3.3v
驱动显示器的脚本:
需要导入这个oled 的库
进入工具的包管理下载对应的包
import machine
import utime
sda = machine.Pin(20)
scl = machine.Pin(21)
i2c = machine.I2C(0, sda = sda, scl = scl, freq = 400000)
# 设置I2C对象,(使用哪个总线0还是1,赋值,i2c所在总线的频率 )
# 使用库
from ssd1306 import SSD1306_I2C
oled = SSD1306_I2C(128, 32, i2c)
# 不用给ssd1306分配i2c,因为这是一个固定的地址,内置在库中,不同的显示参数
# 在屏幕上打印出文本
oled.text('Welcome to the', 0, 0)
oled.text('Pi Pico', 0, 10)
oled.text('Display Demo', 0 ,20)
oled.show()
utime.sleep(4)
oled.fill(1) # 填满显示屏
oled.show()
utime.sleep(2)
oled.fill(0) # 清空显示屏
oled.show()
# 循环滚动
while True:
oled.text("Hello World", 0, 0)
for i in range (0,164):
oled.sroll(1, 0) #滚动一次只移动一个像素
oled.show()
utime.sleep(0.01)
10.H桥控制器小型直流电机
- gpio上的PWM调制脉冲来控制直流电机的速度
- 使用MOSFET 的H桥驱动器
ADC电机 6v
tb 6612 fng 8桥电机驱动器 双批次桥, 但是只使用一面
6v 的电源
import machine
import utime
# 设置电位计,作为模拟1到数字输入
potentiometer = machine.ADC(26)
# 设置H桥控制器引脚
# AI1,2控制电机的旋转方向
# PWMa控制马达的速度
mtr_AI1 = machine.Pin(8, machine.Pin.OUT)
mtr_AI2 = machine.Pin(7, machine.Pin.OUT)
mtr_PWMa = machine.PWM(machine.Pin(6))
button_red = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN) # 红色按钮下拉电阻
button_black = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP) # 黑色按钮上拉电阻
led_red = machine.Pin(10, machine.Pin.OUT)
led_green = machine.Pin(11, machine.Pin.OUT)
led_blue = machine.Pin(14, machine.Pin.OUT)
led_red.value(0)
led_green.value(0)
led_blue.value(1)
mtr_PWMa.freq(50) #输入的PWM频率1设置为50赫兹,猜测
mtr_AI1.value(1) # 让马达以特定的方向旋转
mtr_AI1.value(0)
while True:
# 当驱动LED时我们采用的是PWM的占空比,并将其与电位计的读数相匹配
mtr_PWMa.duty_u16(potentiometer.read_u16())
if button_red.value() == 1:
mtr_AI1.value(0)
mtr_AI2.value(1)
led_red.value(1)
led_green.value(0)
led_blue.value(0)
if button_black.value() == 0:
mtr_AI1.value(1)
mtr_AI2.value(0)
led_red.value(0)
led_green.value(1)
led_blue.value(0)
utime.sleep(0.25) # 防反跳按钮
11.用上全部
import machine
import utime
# 设置电位计,作为模拟1到数字输入
potentiometer = machine.ADC(26)
# 设置H桥控制器引脚
# AI1,2控制电机的旋转方向
# PWMa控制马达的速度
mtr_AI1 = machine.Pin(8, machine.Pin.OUT)
mtr_AI2 = machine.Pin(7, machine.Pin.OUT)
mtr_PWMa = machine.PWM(machine.Pin(6))
button_red = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN) # 红色按钮下拉电阻
button_black = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP) # 黑色按钮上拉电阻
led_red = machine.Pin(10, machine.Pin.OUT)
led_green = machine.Pin(11, machine.Pin.OUT)
led_blue = machine.Pin(14, machine.Pin.OUT)
sda = machine.Pin(20)
scl = machine.Pin(21)
i2c = machine.I2C(0, sda = sda, scl = scl, freq = 400000)
# 设置I2C对象,(使用哪个总线0还是1,赋值,i2c所在总线的频率 )
# 使用库
from ssd1306 import SSD1306_I2C
oled = SSD1306_I2C(128, 32, i2c)
# 不用给ssd1306分配i2c,因为这是一个固定的地址,内置在库中,不同的显示参数
oled.text('Pico Motor Test', 0 ,0)
oled.show()
utime.sleep(2)
led_red.value(1)
led_green.value(0)
led_blue.value(0)
utime.sleep(2)
led_red.value(0)
led_green.value(1)
led_blue.value(0)
utime.sleep(2)
led_red.value(0)
led_green.value(0)
led_blue.value(1)
# 设置电机频率的值
mtr_PWMa.freq(50) #输入的PWM频率1设置为50赫兹,猜测
mtr_AI1.value(1) # 让马达以特定的方向旋转
mtr_AI1.value(0)
while True:
# 500计算速度值,在oled上创建条形图
speedvalue = int(potentiometer.read_u16()/500)
# 当驱动LED时我们采用的是PWM的占空比,并将其与电位计的读数相匹配
mtr_PWMa.duty_u16(potentiometer.read_u16())
if button_red.value() == 1:
mtr_AI1.value(0)
mtr_AI2.value(1)
led_red.value(1)
led_green.value(0)
led_blue.value(0)
if button_black.value() == 0:
mtr_AI1.value(1)
mtr_AI2.value(0)
led_red.value(0)
led_green.value(1)
led_blue.value(0)
oled.fill_rect(1, 15, speedvalue, 25, 1) # oled上创建一个矩形,1,15经常启动的位置,速度值,25用来确定长度
# 11展示出来1
oled.show()
oled.fill_rect(1, 15, speedvalue, 25, 0) #
utime.sleep(0.25)