Raspberry Pi Pico是一款具备灵活脚位,且低成本、高性能的开发板 是一款具备灵活脚位,且低成本、高性能的开发板 是一款具备灵活脚位,且低成本、高性能的开发板 是一款具备灵活脚位,且低成本、高性能的开发板 是一款具备灵活脚位,且低成本、高性能的开发板 ,价格仅 ,价格仅 4元美金, 元美金, 商品特色 商品特色 如下: 如下:
- 采用 Raspberry Pi英国设计的 RP2040微控制器 微控制器 ,双核 Arm Cortex M0 +处理器,运行频率 处理器,运行频率 处理器,运行频率 133 MHz
- 264KB的 SRAM和 2MB的片上 Flash
- 支持低功耗睡眠和休模式
- 能通过 USB使用大容量储存进行拖放式 下载程使用大容量储存进行拖放式
下载程5. 多达 26个多功能 GPIO引脚 - 2个 SPI,2个 I2C,2个 UART,3个 12位元的 ADC,16个可 程式控制的 PWM
- 精准的时钟和计器 与内建 温度感测器
- 8个可透过程式撰写 I / O(PIO)状态机,支持自定义外设备 )状态机,支持自定义外设备
- 支援 C / C ++ 和 MicroPython 开发
- 可执行 TensorFlow Lite 框架
外观与 脚位 定义如下: (※若元件需使用 ※若元件需使用 5V电压,则使用 电压,则使用 Pin40的 VBUS)
VBUS – 这是来自 这是来自 microUSB 汇流排的电源, 5 V。如果 Pico不是由 microUSB联结器供电,那么这 联结器供电,那么这 里将没有输出。
⚫ VSYS – 这是输入电压,范围为 2 至 5 V。板载电压转换器将为 Pico 将其改为 3.3 V。
⚫ 3V3 – Pico 内部调节 器的 3.3 伏输出。只要将负载保持在 伏输出。只要将负载保持在 伏输出。只要将负载保持在 300mA 以下,它就可用于为其他元件供电。以下,它就可用于为其他元件供电。以下,它就可用于为其他元件供电。以下,它就可用于为其他元件供电。以下,它就可用于为其他元件供电。
⚫ 3V3_EN – 你可以使用 此输入禁你可以使用 此输入禁Pico 的内部电压调节器,从而关闭 的内部电压调节器,从而关闭 的内部电压调节器,从而关闭 的内部电压调节器,从而关闭 Pico 和由其供电的任何元件。和由其供电的任何元件。
⚫ RUN – 可以启用 或禁RP2040 微控制器,也可以将其复位。
Pico 的 BOOTSEL 模式位于 RP2040 晶片内部的唯读存储槽中,不会被意外覆盖。任何情况下按住BOOTSEL 按钮并插入 Pico 时,都会以驱动器的模式出现,可以在其中拖动新的 UF2 韧体文件,但无法藉由软体编写程式。不过在某些情况下可能需要确保净空闪存,您可以藉由大容量存储模式将特殊的UF2 二进制文件拖放到您的 Pico 上格式化闪存。
※硬体基本测试,不可以撰写程式控制,步骤如下:
1.下载 blink.uf2 韧体档案文件。
2.按住 BOOTSEL 按钮,将 Pico 插入电脑的 USB 埠,连接 Pico 后,松开 BOOTSEL 按钮。
3.连接后会出现名为 RPI-RP2 的大容量存储设备。
4.将 blink.uf2 档案文件拖曳进 RPI-RP2 内,Pico 会重新启动,内建 GPIO25 开始闪烁。现在, MicroPython 会开始运作。
※建立 MicroPython 程式控制环境,步骤如下:
1.下载 rp2-pico-20210324-unstable-v1.14-121-g4fc2866f4.uf2 韧体档案文件。
2.按住 BOOTSEL 按钮,将 Pico 插入电脑的 USB 埠,连接 Pico 后,松开 BOOTSEL 按钮。
3.连接后会出现名为 RPI-RP2 的大容量存储设备。
4.将 rp2-pico-20210324-unstable-v1.14-121-g4fc2866f4.uf2 档案文件拖曳进 RPI-RP2 内,Pico 会重新启动,MicroPython 才能开始运作。
5.本机右键→内容→装置管理员,查看 COM?位置,若还看到应是驱动程式有误,请下载Pico_devices_cdc.inf,更新驱动程式后即可看到。
6.到 https://thonny.org/ 下载编辑软体,至少要为 3.3.3 版本以上才有支援。
- 进入 Thonny 主程式,『执行→选择直译器』,选择”MicroPython(Raspberry Pi Pico)”直译器与 COM?,最后按确定。
數位輸出測試
A01_內建 LED 閃爍.py 程式碼如下:
註 1:import machine 是用來設定 Pi Pico 所有相關硬體參數,若板子沒有正確連線或者直譯器沒有選對,則執行程式後會出現 ”import machine module named not found” 的錯誤。
註 2:import utime 目的是導入時間相關類別,因為後面 utime.sleep(0.5) 才能正常使用。
A02_RGB_LED.py 程式碼如下:(註:數位輸出僅能隨機顯示 8-1 種顏色,因為黑色代表不亮)
from machine import Pin,PWM,ADC
from time import sleep
adc = ADC(0) #ADC input (knob potentiometer) connected to A0
pwm = PWM(Pin(27))#DAC output (buzzer) connected to A1
pwm.freq(10000)
while True:
'''Analog port test'''
val = adc.read_u16()#Read A2 port adc value (65535~0)
#Drive the buzzer, turn off the buzzer when the adc value is less than 300
if val > 300:
pwm.freq(int(val/10))
pwm.duty_u16(10000)
else:
pwm.duty_u16(0)
print(val)
sleep(0.05)
from ssd1306 import SSD1306_I2C
from dht11 import *
from machine import Pin, I2C
from time import sleep
i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000)#oled connect to I2C1
oled = SSD1306_I2C(128, 64, i2c)
dht2 = DHT(18) #temperature and humidity sensor connect to D18 port
while True:
temp,humid = dht2.readTempHumid()#temp: humid:
'''I2C port test'''
''' oled display test'''
oled.fill(0)#Clear screen
oled.text("Temp: " + str(temp),0,0)#display tempearture on line 1
oled.text("Humid: " + str(humid),0,8)
oled.show()
sleep(0.5)
from machine import Pin
button = Pin(18, Pin.IN, Pin.PULL_UP)# button connect to D18
button.irq(lambda pin: InterruptsButton(),Pin.IRQ_FALLING)#Set key interrupt
led = Pin(16, Pin.OUT)#led connect to D16
relay = Pin(20, Pin.OUT)
tmp = 0
'''Key interrupt function, change the state of the light when the key is pressed'''
def InterruptsButton(): #button input
global tmp
tmp = ~tmp
led.value(tmp)
relay.value(tmp)
while True:
pass
#from lcd1602 import LCD1602_RGB #LCD1602 RGB grove
from lcd1602 import LCD1602
from machine import I2C,Pin,ADC
from time import sleep
i2c = I2C(1,scl=Pin(7), sda=Pin(6), freq=400000)
d = LCD1602(i2c, 2, 16)
#d = LCD1602_RGB.display(i2c, 2, 16)
#d.set_rgb(255, 0, 0)
sleep(1)
light = ADC(0)
sound = ADC(1)
while True:
lightVal = light.read_u16()
soundVal = sound.read_u16()
d.home()
d.print('lightvalue=')
d.print(str(lightVal))
#d.set_rgb(0, 255, 0)
sleep(1)
d.setCursor(0, 1)
d.print('soundvalue=')
d.print(str(soundVal))
#d.set_rgb(0, 0, 255)
sleep(1)
from machine import Pin,ADC,PWM
from time import sleep
import utime
miniFun = Pin(16, Pin.OUT)
miniPir = Pin(18, Pin.IN)
pwm_Servo=PWM(Pin(27))
pwm_Servo.freq(500)
Servo_Val =0
while True:
if miniPir.value() == 1 :
miniFun.value(1)
while Servo_Val<65535:
Servo_Val=Servo_Val+50
utime.sleep_ms(1)
pwm_Servo.duty_u16(Servo_Val)
while Servo_Val>0:
Servo_Val=Servo_Val-50
utime.sleep_ms(1)
pwm_Servo.duty_u16(Servo_Val)
else :
miniFun.value(0)
pwm_Servo.duty_u16(0)
第3课 第一个项目 点亮LED
在上一课中,你已经了解了一些关于如何使用Pico和编写你的第一个程序的情况。
然而,到目前为止,我们在Pico上运行程序时没有使用任何其他外部电子硬件。在本课中,我们将尝试把其他电子硬件连接到Pico上。更具体地说,我们将使用一个LED,并编写一个程序来点亮该LED。但在开始编程之前,首先让我们了解一下程序的结构。
知识库
基本程序结构
我们用MicroPython编写的程序一般由三种基本程序结构组成。复杂的程序都是由这些基本结构组合而成的,所以先学习它们是很有必要的。分别是:顺序结构、循环结构和选择结构。
顺序结构
顺序结构是最基本的程序结构。在顺序结构中,程序从上到下,逐行依次运行。例如,当下面的程序运行时,它首先打印 “Hello”,然后是 “World”。
执行结果。
如果你仔细观察就会发现,与其他语言需要用特定的终止符来结束每一行的语句不同,在MicroPython中你只需要按ENTER键就可以结束一行。
实践与操作
现在,让我们回归项目中去,实践一下我们刚刚学到的东西。为了开始本课,我们将使用Grove Shield for Pi Pico来连接Pico和其他Grove电子产品,以实现更有趣的项目。经过观察,你可能会注意到,Pico并没有附带用于连接Pi Pico的Grove Shield的金属针脚。要做到这一点,你需要焊接Pico的针头。
项目1:焊接焊头
首先,准备好你所需要的焊接头的一切:一个电烙铁,一些焊料,一块清洁海绵,一个支架,两个20针头,一块面包板,当然还有你的Pico。为了方便焊接,我们可以先用面包板来固定两个20针的头线。以针座上的黑色塑料块为界,将针座的长端慢慢插入面包板。插入时,要确保两个针座上下对齐,并与Pico间隔相同的宽度。
然后,将你的Pico右转,并确保PCB板上的预留针孔与固定在面包板上的排针对准。对准后,慢慢地将两个针脚插入Pico的预留孔中,一直推到针脚上的黑色塑料块夹在你的Pico和面包板之间。这时,你会看到每个针脚都有一小段从PCB板上的预留针孔里伸出来。
将电烙铁放在支架上,打开开关加热。烙铁的尖端需要3-5分钟才能变热。确保加热时金属尖端不靠任何东西。在加热过程中,先把清洁海绵弄湿,放在一个方便的地方,以便以后清洁烙铁。
加热后,拿起你的烙铁手柄,在你准备的海绵上反复刷洗金属尖端,直到尖端看起来有光泽和干净。
注意!电烙铁的金属部分非常、非常热。在任何情况下,你都不应该触摸电烙铁的金属部分。
清洁后,用电烙铁的尖端加热针脚和它下面离你最近的金色焊盘。用另一只手拿起一些焊料,从烙铁的相反方向慢慢推入针脚和焊盘的连接处。加热的引脚和焊盘会融化焊料,使其在焊盘周围流动。在完成一个方向的焊接后,继续向其他方向推焊料,直到焊盘完全被焊料覆盖。
注意!焊接时不要使用过多的焊料。如果焊料溢出到相邻的焊盘上,使用Pico时会发生短路。
好了,祝贺你焊好了第一个引脚!现在,你只需要用同样的方法来焊接其余的39个引脚。焊接时,记得不时地用干净的海绵擦拭你的烙铁,以保持烙铁头的清洁和光泽。
焊接完毕后,慢慢将Pico从面包板上拉出来。如果引脚和面包板插得太紧,强行将Pico拉出来很容易导致焊盘脱落。如果发生这种情况,你可以左右摇晃Pico,并尝试将Pico一点一点地移出来。
好了,我们完成了!让我们开始执行我们的第一个任务!
项目2:发光的LED模块
现在你已经完成了Pico引脚的焊接,我们终于可以使用Grove Shield for Pi Pico连接Grove模块了。让我们先试着点亮一个LED。
硬件连接
在这个项目中,我们将使用以下电子硬件。
-
树莓派Pico -
用于Pi Pico的Grove Shield -
格罗夫–LED封装
在Grove Shield for Pi Pico的帮助下,连接电子硬件的工作变得非常容易。首先,我们只需要将Pico的焊接引脚插入Shield中。
在插入时,你可以观察Pico背面的针脚屏幕打印和Shield上的屏幕打印,以检查你的插入方向是否正确。然后,用Grove电缆将Grove – LED连接到Shield的D16端口。
写一个程序
首先,用USB线连接Pico和电脑,然后打开Thonny,点击工具栏上的 “new “按钮,创建一个新程序。点击进入脚本区,用以下一行开始你的程序。
这一行代码导入了一个名为 “machine “的MicroPython函数库。为了理解这行代码的具体作用,我们需要理解 “库 “的概念。
在这行代码中,我们导入了一个名为 “machine “的MicroPython库,它包含了与特定硬件相关的各种功能。它可以不受限制地直接访问系统的硬件功能(如CPU、定时器、总线等),这样我们就可以用MicroPython更有效地控制连接到Pico的其他电子硬件。这包括为连接到Pico的各种电子硬件设置引脚。
在硬件项目的开发中,仅仅将硬件连接到Pico上是不够的。例如,我们将LED连接到Shield的D16上,但除非我们特别告知,否则Pico不会意识到这一点–你必须写一个程序来定义控制电子硬件的引脚。在机器库中,有一类名为 “引脚 “的函数。
在机器库的帮助下,你可以在程序的下一行轻松定义LED的引脚。
在这行代码中,我们创建了一个名为 “LED “的对象来帮助我们控制LED,并使用机器库中的Pin函数来定义LED的引脚编号和模式。Pin函数总共有两个参数。第一个参数16代表你定义的引脚编号。因为我们在构建项目硬件时将LED灯连接到了D16,所以我们在这里将其设置为16。第二个参数,machine.Pin.OUT,告诉Pico这个引脚应该被用作输出而不是输入。
好,现在输入最后一行。
在这行代码中,我们使用value函数为我们刚刚定义的引脚写入值,以打开灯。当控制Pin类的引脚时,我们通常使用1的值来分配一个高的级别(开)和一个0的值来指定一个低级别(关)。我们的第一个硬件程序已经完成。完整的程序代码如下。
在我们完成程序后,用USB线将Pico与电脑连接起来,如下图所示。在接下来的课程中,当我们要运行一个程序时,我们总是需要用USB线连接Pico和电脑。
点击工具栏上的 “运行 “按钮,将程序保存到任何位置,你可以看到插入D16的LED灯被点亮了。
如果你想关闭LED灯,只需将该值从1改为0。
思维扩展
尝试用程序关闭LED。
第4课 电子硬件编程中的 “你好世界”。眨眼
当我们尝试用某种语言进行软件编程时,”Hello World “往往是我们写的第一个程序。眨眼,也就是闪烁LED的任务,是电子硬件世界中的 “你好世界”。在本课中,我们将尝试编写一个Blink程序。要做到这一点,我们将需要使用三个基本编程结构中的另一个–循环结构!
知识库
循环结构
与顺序结构不同,具有循环结构的程序会重复执行一条或多条指令。根据重复执行的次数,循环结构可以细分为确定的循环结构和不确定的循环结构。当一个具有确定循环结构的程序被执行时,它只重复有限的次数;当它满足某个条件时,循环将自动终止。然而,一个具有不确定循环结构的程序将继续重复循环而不停止。在Python中,我们经常使用for-loop和while-loop。
循环
让我们先来看看一个用while-loop语句编写的程序。
该程序首先在序列结构中执行。在程序的开始,我们首先声明一个变量 “a”,并用print()打印一行字符 “loop start”。
接下来,我们使用while语句来创建一个明确的循环结构。这指定了当变量 “a “小于5时,程序应重复执行while语句中的指令。也就是说,它应该打印出 “a “的值,并给 “a “加1,直到 “a “大于或等于5。
程序的输出结果如下。
观察样本程序的执行结果,我们可以发现,该程序在执行了while语句中的几个循环后,才开始执行最后一个print()语句。
但是,计算机如何知道哪些语句需要在while循环语句中重复,哪些语句在while循环语句之外?MicroPython使用缩进和冒号”: “来区分代码块之间的层次,不像其他编程语言(如Java和C)使用大括号”{}”来分隔代码块。这一变化使得用MicroPython编写的代码清晰易懂。
循环
一个for-loop一般用于遍历一个序列中的所有元素,例如:
程序的输出结果如下。
其中,range()是MicroPython的一个内置函数,它可以生成一个整数的列表。一般来说,我们在for-loop中使用这个函数。例如,range(10)创建了一个从0到9的九个整数的列表。
在这个程序中,我们将使用for-loop进行遍历,并使用print()将所有整数输出到Shell。
实践与操作
项目1:用For-loop控制LED的开和关
在这个项目中,我们将用一个for-loop来控制LED的开和关,以实现闪烁。
硬件连接
在这个项目中,我们将使用以下电子硬件。
-
树莓派Pico -
用于Pi Pico的Grove Shield -
格罗夫–LED封装
与之前类似,我们将LED连接到D16。
在上一课中,我们已经学会了如何控制LED的开启和关闭。为了实现最终的Blink程序,我们只需要做一些轻微的修改。
写一个程序
首先,让我们试着这样修改程序。
点击 “运行 “按钮,看一下LED灯。你会发现,LED灯只是非常快地闪了一次。这是因为:
-
程序的执行速度非常快,以至于闪光效果并不明显。 -
我们没有为程序设置循环结构,程序的闪光部分只执行了一次。
让我们来解决第一个问题。既然问题是程序运行速度太快,我们可以在每个LED的开启和关闭之间设置一个延迟。
在程序的开始,我们引入了一个新的函数库:utime。
接下来,我们使用utime中的sleep函数,在每个操作LED的程序之后增加一个延迟。
除非另有说明,睡眠功能的默认单位是秒。通过修改程序,我们将每盏灯的开和关的时间设置为1秒。
让我们首先尝试使用for-loop来简单地打开和关闭LED。该程序如下。
当我们执行这个程序时,我们可以发现LED在循环10次后就不再闪烁了。这是因为使用range()函数只产生了10个整数,所以for-loop只循环了10次。当我们把range(10)改为range(20)时,LED循环了20次。
当然,不管我们把这个值设置得多大,循环总是一个定点循环。如果我们想保持程序的运行,我们需要使用不确定的循环结构来编写程序。
项目2:用While-loop实现眨眼功能
在这个项目中,我们将使用while-loop来实现连续闪烁的LED的效果。
写一个程序
使用while循环,我们可以很容易地使程序无限期地重复。我们只需要将程序中的 “for i in range(10) “改为 “while True”。
”while True “是while-loop语句的一种用法。与一般的while-loop只在满足某个条件时执行循环不同,这个 “while True “是一个不确定的循环语句,这意味着程序将被反复连续地执行,直到被人为地终止。
完整的代码如下。
再次点击 “运行 “按钮,连接到Shield的LED开始闪烁。除非人为地停止该进程,否则LED将继续闪烁。
思维扩展
尝试使用两个循环结构和sleep()函数来实现不同的照明效果。
例如,你可以减少延迟时间以产生更快速的闪烁。