模拟输入测试
现在我们来谈谈模拟输入。
树莓派 Pico有三个模拟输入,它们都有12位的分辨率。
这三个输入端如下。
– GPIO 26 – ADC0 (31针)
– GPIO 27 – ADC1 (针脚 32)
– GPIO 28 – ADC2 (针脚34)
还有第四个ADC用于内部温度传感器。
电位计的连接
在我们的测试中,我们将使用一个电位器在模拟输入端呈现一个可变电压,然后我们将读取该电压。我们将使用ADC0作为我们的电位计输入,但你也可以使用其他两个中的一个。
请注意,虽然我将23号针脚显示为地线,这只是为了方便,但你可以使用任何Pico地线针脚。在33号针脚处还有一个特殊的模拟地,你可以使用。在我的面包板上,我将33号针脚与其他一些地线相连。
电位计读数
我们要做的第一个实验是简单地读取我们在模拟输入端得到的值,这个值应该根据我们电位器的位置而波动。
# 树莓派 Pico Analog Input Test
# analog-input.py
# POT - Pico GPIO 26 ADC0 - Pin 32
# DroneBot Workshop 2021
# https://dronebotworkshop.com
import machine
import utime
potentiometer = machine.ADC(26)
while True:
print(potentiometer.read_u16())
utime.sleep(2)
这是一个简单的脚本,像往常一样,首先导入用于GPIO操作的machine库和用于时间函数的utime库。
然后我们定义我们的电位器连接。请注意我们如何使用 “ADC “来表示我们要将GPIO 26针作为模拟输入。当然这只适用于具有模拟输入能力的三个GPIO引脚。
在True循环中,我们只需打印从电位器上得到的值,然后延迟几秒钟再做一次。
需要注意的是,我们用 “read_u16 “函数得到的值的类型是一个无符号的16位整数。这意味着它将在0和65,535之间变化,而不是你可能期望从12位ADC中得到的4095。
这可能看起来很奇怪,但正如我们将在下一个脚本中看到的那样,能够传递具有相同数值数据类型的值实际上是有用的。
运行脚本并观察Shell,你应该会看到那里的数值随着你移动电位器轴而改变。
LED PWM 控制
让我们在之前的脚本基础上进行扩展,使用电位器的输出来控制LED的亮度。
当然,我们将使用PWM进行控制,这个任务在MicroPython中非常简单。
# 树莓派 Pico LED PWM Test
# led-pwm.py
# POT - Pico GPIO 26 ADC0 - Pin 32
# RED LED - Pico GPIO 10 - Pin 14
# DroneBot Workshop 2021
# https://dronebotworkshop.com
import machine
import utime
led_red = machine.PWM(machine.Pin(10))
potentiometer = machine.ADC(26)
led_red.freq(1000)
while True:
led_red.duty_u16(potentiometer.read_u16())
在这个脚本中需要注意的一个关键项目是我们定义 “led_red “的方式。我们将其定义为 “PWM”,而不是输出。
电位器的定义与上一个脚本中的方式完全相同。
现在我们已经给输出赋予了 “PWM “的属性,它继承了许多其他参数。其中之一是PWM频率,我们将其设置为1000 Hz。
在true循环中,我们不断地从电位器中获取无符号的16位值,并将其传递给LEDs占空比,也方便地指定为无符号的16位整数。
这就说明了两者保持相同的编号方案的价值,不需要将模拟值,真的是0到4095,映射到占空比,真的是0到100。
运行程序,你应该可以顺利地控制红色LED段的亮度。
添加显示屏
我们将进行的下一个实验是将一个OLED显示器连接到我们的Pico上,当然,也可以在上面打印一些东西。
我们将使用 I2C 显示屏,因此我们也将看到 Pico 如何使用 I2C 连接工作。记住,Pico有两条I2C总线。
我们的OLED是标准的1602型OLED显示器,到处都有。如果你愿意,也可以使用与我的显示屏尺寸不同的显示屏,只需在代码中更改尺寸即可。
这是我们如何把这些东西都挂起来的,只有四根线。
我们的显示器需要一个库,我们可以使用Thonny ID安装。你可能会发现在全菜单模式下比在基本模式下更容易,但这两种方式都可以。
– 点击 “工具 “菜单
– 点击 “管理包”
– 搜索 “ssd1306”
– 找到 “ssd1306.py “并安装它。
现在我们已经安装了库,我们可以看一下演示OLED显示屏的脚本。
# 树莓派 Pico OLED Display Test
# Uses ssd1306 module
# display-ssd1306-test.py
# DroneBot Workshop 2021
# https://dronebotworkshop.com
import machine
import utime
sda=machine.Pin(20)
scl=machine.Pin(21)
i2c=machine.I2C(0, sda=sda, scl=scl, freq=400000)
from ssd1306 import SSD1306_I2C
oled = SSD1306_I2C(128, 32, i2c)
print(i2c.scan())
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.scroll(1,0)
oled.show()
utime.sleep(0.01)
我们的 OLED 显示屏是一个 I2C 设备,所以你会注意到,在脚本的开头,我们将两个 GPIO 引脚定义为 SDA (GPIO 20) 和 SCL (GPIO 21)。
Pico有两条I2C总线,你可以使用几种不同的GPIO引脚来连接它们。但它们并不是随便的引脚,例如某些引脚被指定为总线0的SDA,只有它们才能用于SDA总线0。
然后我们使用机器库的I2C函数定义一个I2C连接。我们需要给它提供以下参数。
– I2C总线号,在我们的例子中是0。
– SDA引脚
– SCL引脚
– I2C总线频率–在我们的例子中是400KHz。
然后我们添加OLED库,并创建一个I2C OLED对象。我们将大小参数和I2C连接信息传递给它。
注意,我们没有传递I2C地址。SD1306 OLED显示器有一个固定的I2C地址,所以我们不需要指定它。
不过,我在这里添加了一行与显示器无关的内容,但可以让你扫描I2C总线,并打印出它发现占用的地址。请注意,在Shell中打印出来的是十进制,而不是你更可能习惯看到的十六进制。
回到OLED脚本!
我们开始在显示屏上打印,几行文字。注意我们如何指定每行开始的像素位置。
实际上,我们并没有直接打印到显示屏上,而是将数据发送到一个缓冲区。oled.show()这一行将把该缓冲区的数据传输到显示器上。
在打印完欢迎信息并按住它四秒钟后,我们再执行oled.fill(1)。这将打开显示器中的每一个像素,或者更准确地说,是缓冲区中的每一个像素。然后我们做一个oled.show()来显示填充。
我们将填充物保持在显示屏上两秒钟,然后执行oled.fill(0),当我们显示它时,它将关闭显示屏中的每个像素。
现在进入True循环。
我们再次输入一些文本,经典的 “Hello World”。但我们没有进行 “显示 “来显示它,而是开始一个for-loop。在这个循环中,我们使用led.scroll(1,0)将显示水平移动1像素(垂直移动0像素,这就是另一个参数)。
然后我们在屏幕上显示,然后休眠一段很短的时间。然后我们再做一次。
结果将是显示屏在屏幕上滚动。你可以在for-loop中使用参数来改变它。
将脚本加载到你的Pico上,然后观看显示。你应该看到欢迎文字,然后是显示填充,然后是空。之后,只要你让实验运行,滚动的 “Hello World “就会继续。
驱动电机
微控制器比较流行的应用之一是驱动一个或几个直流电动机。
这是通过使用H-Bridge来实现的,H-Bridge是一种功率晶体管或MOSFET的排列方式,可以处理电机电流,同时允许你控制电机的方向和速度。
我们将只用一个电机来实现这一点。我们将使用TB6612FNG H-Bridge和树莓派 Pico来控制一个小型直流电机。
TB6612FNG H-Bridge
TB6612FNG H-Bridge是我们之前使用过的,一款基于MOSFET的H-Bridge,相比老款备用的L-298N有很多性能上的优势。
该设备其实有两个通道,我们只用通道A来演示。
通道A有三个输入。
– AI1 – 方向和模式
– AI2 – 方向和模式
– PWMA – 一个PWM输入,用于控制电机速度。
在它们之间,AI1和AI2引脚控制电机方向和模式。模式包括短制动和停止模式。在我们的简单演示中,我们将只处理方向模式。
TB6612FNG H-Bridge在板子的另一侧还有电源和电机的连接。
下面是我们将使用TB6612FNG H-Bridge和树莓Pico的连接方式。
请注意,由于我使用的是6V电机,我已经为它提供了一个6V电源。不要试图使用Pico的输出电压来为你的电机供电,单独的电源是必要的。我使用了四节AA型电池,这是一种简单而安全的安排。
电机的极性其实并不重要,它只是决定了哪条路是向前的,哪条路是向后的。
一旦它被全部连接起来,我们就需要一些代码来运行它。我建议这样做。
# 树莓派 Pico Motor Test
# motor-test.py
# POT - Pico GPIO 26 ADC0 - Pin 32
# RED BUTTON - Pico GPIO 15 - Pin 20
# BLACK BUTTON - Pico GPIO 2 - Pin 4
# RED LED - Pico GPIO 10 - Pin 14
# GREEN LED - Pico GPIO 11 - Pin 15
# BLUE LED - Pico GPIO 14 - Pin 19
# DroneBot Workshop 2021
# https://dronebotworkshop.com
import machine
import utime
potentiometer = machine.ADC(26)
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)
mtr_AI1.value(1)
mtr_AI2.value(0)
while True:
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)
我们要利用电位器、两个开关和RGB LED,以及电机控制器。电位器将控制电机的速度,开关将控制电机的方向,而LED将用彩色指示灯显示当前的方向。
我们使用我们的之前的两个库,并像以前一样设置电位器。
接下来,我们将Pico与TB6612FNG H-Bridge的连接定义为输出。GPIO 6上的PWMA输出被定义为PWM,它将控制电机速度。
LED和按钮的设置与之前相同。
PWM频率设置为50Hz,这是一个任意的选择。随意实验一下,看看是否能提高电机性能。
电机AI1和AI2输入被设置为正向旋转,所以电机将以正向启动。请注意,当我们启动时,RGB LED的蓝段也会被打开。
在True循环中,我们读取电位器的值,并将其传递给电机PWM信号,以控制电机的速度。我们还要看按钮的状态。
如果红色按钮被按下,我们设置AI1和AI2信号,使电机反转。我们也会点亮红色LED段。
如果黑色按钮被按下,我们设置电机方向正向,并打开绿色LED段。
加载、检查代码。它应该用一个蓝色的LED启动,你应该能够控制电机的速度。按下按钮可以控制方向,还可以改变 LED 的颜色。