树莓派Raspberry Pi Pico入门教程

Raspberry Pi Pico是一款具备灵活脚位,且低成本、高性能的开发板 是一款具备灵活脚位,且低成本、高性能的开发板 是一款具备灵活脚位,且低成本、高性能的开发板 是一款具备灵活脚位,且低成本、高性能的开发板 是一款具备灵活脚位,且低成本、高性能的开发板 ,价格仅 ,价格仅 4元美金, 元美金, 商品特色 商品特色 如下: 如下:

  1. 采用 Raspberry Pi英国设计的 RP2040微控制器 微控制器 ,双核 Arm Cortex M0 +处理器,运行频率 处理器,运行频率 处理器,运行频率 133 MHz
  2. 264KB的 SRAM和 2MB的片上 Flash
  3. 支持低功耗睡眠和休模式
  4. 能通过 USB使用大容量储存进行拖放式 下载程使用大容量储存进行拖放式
    下载程5. 多达 26个多功能 GPIO引脚
  5. 2个 SPI,2个 I2C,2个 UART,3个 12位元的 ADC,16个可 程式控制的 PWM
  6. 精准的时钟和计器 与内建 温度感测器
  7. 8个可透过程式撰写 I / O(PIO)状态机,支持自定义外设备 )状态机,支持自定义外设备
  8. 支援 C / C ++ 和 MicroPython 开发
  9. 可执行 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 版本以上才有支援。

  1. 进入 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"。
image004
    执行结果。
image005
    如果你仔细观察就会发现,与其他语言需要用特定的终止符来结束每一行的语句不同,在MicroPython中你只需要按ENTER键就可以结束一行。

实践与操作

    现在,让我们回归项目中去,实践一下我们刚刚学到的东西。为了开始本课,我们将使用Grove Shield for Pi Pico来连接Pico和其他Grove电子产品,以实现更有趣的项目。经过观察,你可能会注意到,Pico并没有附带用于连接Pi Pico的Grove Shield的金属针脚。要做到这一点,你需要焊接Pico的针头。

项目1:焊接焊头

    首先,准备好你所需要的焊接头的一切:一个电烙铁,一些焊料,一块清洁海绵,一个支架,两个20针头,一块面包板,当然还有你的Pico。为了方便焊接,我们可以先用面包板来固定两个20针的头线。以针座上的黑色塑料块为界,将针座的长端慢慢插入面包板。插入时,要确保两个针座上下对齐,并与Pico间隔相同的宽度。
image007
    然后,将你的Pico右转,并确保PCB板上的预留针孔与固定在面包板上的排针对准。对准后,慢慢地将两个针脚插入Pico的预留孔中,一直推到针脚上的黑色塑料块夹在你的Pico和面包板之间。这时,你会看到每个针脚都有一小段从PCB板上的预留针孔里伸出来。
image008
    将电烙铁放在支架上,打开开关加热。烙铁的尖端需要3-5分钟才能变热。确保加热时金属尖端不靠任何东西。在加热过程中,先把清洁海绵弄湿,放在一个方便的地方,以便以后清洁烙铁。
加热后,拿起你的烙铁手柄,在你准备的海绵上反复刷洗金属尖端,直到尖端看起来有光泽和干净。

注意!电烙铁的金属部分非常、非常热。在任何情况下,你都不应该触摸电烙铁的金属部分。

    清洁后,用电烙铁的尖端加热针脚和它下面离你最近的金色焊盘。用另一只手拿起一些焊料,从烙铁的相反方向慢慢推入针脚和焊盘的连接处。加热的引脚和焊盘会融化焊料,使其在焊盘周围流动。在完成一个方向的焊接后,继续向其他方向推焊料,直到焊盘完全被焊料覆盖。
image009

注意!焊接时不要使用过多的焊料。如果焊料溢出到相邻的焊盘上,使用Pico时会发生短路。

    好了,祝贺你焊好了第一个引脚!现在,你只需要用同样的方法来焊接其余的39个引脚。焊接时,记得不时地用干净的海绵擦拭你的烙铁,以保持烙铁头的清洁和光泽。
image010
    焊接完毕后,慢慢将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中。
20210804024421
    在插入时,你可以观察Pico背面的针脚屏幕打印和Shield上的屏幕打印,以检查你的插入方向是否正确。然后,用Grove电缆将Grove - LED连接到Shield的D16端口。
image013
写一个程序
image014
    首先,用USB线连接Pico和电脑,然后打开Thonny,点击工具栏上的 "new "按钮,创建一个新程序。点击进入脚本区,用以下一行开始你的程序。

    这一行代码导入了一个名为 "machine "的MicroPython函数库。为了理解这行代码的具体作用,我们需要理解 "库 "的概念。
20210804180041
    在这行代码中,我们导入了一个名为 "machine "的MicroPython库,它包含了与特定硬件相关的各种功能。它可以不受限制地直接访问系统的硬件功能(如CPU、定时器、总线等),这样我们就可以用MicroPython更有效地控制连接到Pico的其他电子硬件。这包括为连接到Pico的各种电子硬件设置引脚。

    在硬件项目的开发中,仅仅将硬件连接到Pico上是不够的。例如,我们将LED连接到Shield的D16上,但除非我们特别告知,否则Pico不会意识到这一点--你必须写一个程序来定义控制电子硬件的引脚。在机器库中,有一类名为 "引脚 "的函数。
20210804180244
    在机器库的帮助下,你可以在程序的下一行轻松定义LED的引脚。
image015
    在这行代码中,我们创建了一个名为 "LED "的对象来帮助我们控制LED,并使用机器库中的Pin函数来定义LED的引脚编号和模式。Pin函数总共有两个参数。第一个参数16代表你定义的引脚编号。因为我们在构建项目硬件时将LED灯连接到了D16,所以我们在这里将其设置为16。第二个参数,machine.Pin.OUT,告诉Pico这个引脚应该被用作输出而不是输入。

    好,现在输入最后一行。
image016
    在这行代码中,我们使用value函数为我们刚刚定义的引脚写入值,以打开灯。当控制Pin类的引脚时,我们通常使用1的值来分配一个高的级别(开)和一个0的值来指定一个低级别(关)。我们的第一个硬件程序已经完成。完整的程序代码如下。
image017
image018
    在我们完成程序后,用USB线将Pico与电脑连接起来,如下图所示。在接下来的课程中,当我们要运行一个程序时,我们总是需要用USB线连接Pico和电脑。
image019
    点击工具栏上的 "运行 "按钮,将程序保存到任何位置,你可以看到插入D16的LED灯被点亮了。

    如果你想关闭LED灯,只需将该值从1改为0。
image021

思维扩展

    尝试用程序关闭LED。
image023
image024

第4课 电子硬件编程中的 "你好世界"。眨眼

    当我们尝试用某种语言进行软件编程时,"Hello World "往往是我们写的第一个程序。眨眼,也就是闪烁LED的任务,是电子硬件世界中的 "你好世界"。在本课中,我们将尝试编写一个Blink程序。要做到这一点,我们将需要使用三个基本编程结构中的另一个--循环结构!

知识库

循环结构

    与顺序结构不同,具有循环结构的程序会重复执行一条或多条指令。根据重复执行的次数,循环结构可以细分为确定的循环结构和不确定的循环结构。当一个具有确定循环结构的程序被执行时,它只重复有限的次数;当它满足某个条件时,循环将自动终止。然而,一个具有不确定循环结构的程序将继续重复循环而不停止。在Python中,我们经常使用for-loop和while-loop。

循环

让我们先来看看一个用while-loop语句编写的程序。
image025
    该程序首先在序列结构中执行。在程序的开始,我们首先声明一个变量 "a",并用print()打印一行字符 "loop start"。
image026
20210804181158
    接下来,我们使用while语句来创建一个明确的循环结构。这指定了当变量 "a "小于5时,程序应重复执行while语句中的指令。也就是说,它应该打印出 "a "的值,并给 "a "加1,直到 "a "大于或等于5。
image027
    程序的输出结果如下。
image028
    观察样本程序的执行结果,我们可以发现,该程序在执行了while语句中的几个循环后,才开始执行最后一个print()语句。
    但是,计算机如何知道哪些语句需要在while循环语句中重复,哪些语句在while循环语句之外?MicroPython使用缩进和冒号": "来区分代码块之间的层次,不像其他编程语言(如Java和C)使用大括号"{}"来分隔代码块。这一变化使得用MicroPython编写的代码清晰易懂。
20210804181308

循环

    一个for-loop一般用于遍历一个序列中的所有元素,例如:
image029
程序的输出结果如下。
image030
    其中,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。
image013
在上一课中,我们已经学会了如何控制LED的开启和关闭。为了实现最终的Blink程序,我们只需要做一些轻微的修改。

写一个程序
    首先,让我们试着这样修改程序。
image031
    点击 "运行 "按钮,看一下LED灯。你会发现,LED灯只是非常快地闪了一次。这是因为:

  1. 程序的执行速度非常快,以至于闪光效果并不明显。
  2. 我们没有为程序设置循环结构,程序的闪光部分只执行了一次。

    让我们来解决第一个问题。既然问题是程序运行速度太快,我们可以在每个LED的开启和关闭之间设置一个延迟。
在程序的开始,我们引入了一个新的函数库:utime。
20210804181640
image032
    接下来,我们使用utime中的sleep函数,在每个操作LED的程序之后增加一个延迟。
image033
    除非另有说明,睡眠功能的默认单位是秒。通过修改程序,我们将每盏灯的开和关的时间设置为1秒。

    让我们首先尝试使用for-loop来简单地打开和关闭LED。该程序如下。
image034
image035
    当我们执行这个程序时,我们可以发现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"。
image036
    "while True "是while-loop语句的一种用法。与一般的while-loop只在满足某个条件时执行循环不同,这个 "while True "是一个不确定的循环语句,这意味着程序将被反复连续地执行,直到被人为地终止。
完整的代码如下。
image037
image038
    再次点击 "运行 "按钮,连接到Shield的LED开始闪烁。除非人为地停止该进程,否则LED将继续闪烁。
image039
image040

思维扩展

尝试使用两个循环结构和sleep()函数来实现不同的照明效果。

    例如,你可以减少延迟时间以产生更快速的闪烁。
image041
image042

打赏

发表评论