樹莓派 Pico

出自YFRobotwiki
在2022年4月11日 (一) 15:46由Allblue對話 | 貢獻所做的修訂版本

跳轉到: 導覽搜尋
樹莓派 Pico控制器

產品簡介

Raspberry Pi Pico 是一款樹莓派官方設計的低成本,高性能的微控制器開發板,具有靈活數字接口。硬件上,採用 Raspberry Pi 官方自主研發的 RP2040 微控制器芯片,搭載了ARM Cortex M0 + 雙核處理器,高達 133MHz 的運行頻率,內置了 264KB 的 SRAM 和 2MB 的內存,還板載有多達 26 個多功能的 GPIO 引腳。軟件上,可選擇樹莓派提供的 C/C++ SDK,或者使用 MicroPython 進行開發,且配套有完善的開發資料教程,可方便快速入門開發,並嵌入應用到產品中。


產品特性

  • 採用了 Raspberry Pi 官方自主設計的 RP2040 微控制器芯片
  • 搭載了雙核 ARM Cortex M0 + 處理器,運行頻率高達 133MHz 靈活時鐘
  • 內置了 264KB 的 SRAM 和 2MB 的片上 Flash
  • 郵票孔設計,可直接焊接集成到用戶自主設計的底板上
  • USB1.1 主機和設備支持
  • 支持低功耗睡眠和休眠模式
  • 可通過 USB 識別為大容量存儲器進行拖放式下載程序
  • 多達 26 個多功能的 GPIO 引腳
  • 2 個 SPI,2 個 I2C,2 個 UART,3 個 12 位 ADC,16 個可控 PWM 通道
  • 精確的片上時鐘和定時器
  • 溫度傳感器
  • 片上加速浮點庫
  • 8 個可編程 I/O (PIO) 狀態機,用於自定義外設支持


引腳分布

File:Raspberry-Pi-Pico-Spec-680px.jpg



尺寸圖

Raspberry-Pi-Pico-Spec-size.jpg


軟件環境配置

為了方便在電腦上使用MicroPython開發Pico板,建議下載Thonny IDE.

  • 安裝完成之後,第一次要配置語言和主板環境,由於我們是為了使用Pico,所以注意主板環境選擇Raspberry Pi 選項。

Pico-R3-Tonny1.png

  • 配置Micrpython環境及選擇Pico端口。
    • 先將Raspberry Pi Pico 接入電腦,左鍵點擊Thonny右下角的配置環境選項--》選擇configture interpreter
    • 在彈出的窗口欄中選擇MicroPython(Raspberry Pi Pico),同時選擇對應的端口。

Raspberry-Pi-Pico-Basic-Kit-M-2.png

Raspberry-Pi-Pico-Basic-Kit-M-3.png

  • 點擊ok後返回到Thonny主界面,下載固件庫到Pico裡面,然後點擊停止按鈕,在Shell窗口中即可顯示當前使用到的環境。
  • Pico在windows下載固件庫方法: 按住BOOT鍵後連接電腦後,鬆開BOOT鍵,電腦會出現一個可移動磁盤,將固件庫複製進去即可。
  • RP2040在windows下載固件庫方法: 連接電腦後,同時按下BOOT鍵跟RESET鍵,先鬆開RESET鍵再鬆開BOOT鍵,電腦會出現一個可移動磁盤,將固件庫複製進去即可(用Pico的方式也可以)。

Raspberry-Pi-Pico-Basic-Kit-M-4.png

示例實驗

  • 下載示例程序到電腦桌面即可進行一些幾個有趣的實驗。

External LED 實驗

  • 按照下圖連接好硬件,連接好接入電腦的Micro USB,在Thonny打開示例程序Lesson-5 External LED中的python文件,運行示例程序可以看到紅燈有在閃爍的現象。
  • 使用注意事項:LED較長的引腳為正極,較短的為負極,負極應該接GND,正極應該和GPIO輸出口相連,使用時必須接上電阻。

Raspberry-Pi-Pico-Basic-Kit-External-LED-blink.png

  • 代碼解析
led_external = machine.Pin(15, machine.Pin.OUT) #设置GP15为输出模式
while True: 
   led_external.toggle() #每过5秒钟让LED灯的状态改变一次
   utime.sleep(5)

Traffic Light System 實驗

按照下圖連接好硬件,連接好接入電腦的Micro USB,在Thonny打開示例程序Lesson-9 Traffic-Light-System中的python文件,運行程序可以看到交通燈帶正常的運行,當按下按鍵時會觸發蜂鳴器。 使用注意事項:LED較長的引腳為正極,較短的為負極,負極應該接GND,正極應該和GPIO輸出口相連,使用時必須接上電阻;蜂鳴器的紅線接GPIO口輸出,黑線接GND。 Raspberry-Pi-Pico-Basic-Kit-Traffic-Light-System.png 代碼解析 def button_reader_thread(): #檢測按鍵是否被按下

  global button_pressed 
  while True:
      if button.value() == 1: 
          button_pressed = True
          

_thread.start_new_thread(button_reader_thread, ()) #用開啟線程的方式去檢測按鍵 while True:

  if button_pressed == True: #如果按键被按下,红灯亮起,蜂鸣器响闹
      led_red.value(1) 
      for i in range(10): 
          buzzer.value(1) 
          utime.sleep(0.2) 
          buzzer.value(0) 
          utime.sleep(0.2) 
      global button_pressed 
      button_pressed = False 
  led_red.value(1)  #正常情况下红灯边绿灯时黄灯会亮两秒,然后黄灯和红灯灭,绿灯亮
  utime.sleep(5)     #由绿灯边红灯时,绿灯先灭,黄色亮两秒,然后红灯亮
  led_amber.value(1) 
  utime.sleep(2) 
  led_red.value(0) 
  led_amber.value(0) 
  led_green.value(1) 
  utime.sleep(5) 
  led_green.value(0) 
  led_amber.value(1) 
  utime.sleep(5) 
  led_amber.value(0)

Burglar Alarm LED Buzzer 實驗 按照下圖連接好硬件,連接好接入電腦的Micro USB,在Thonny打開示例程序Lesson-14 Burglar Alarm LED Buzzer中的python文件,運行程序可以看到,當人為的在Passive infrared sensor前晃動時,LED燈閃亮的同時蜂鳴器也會報警。 使用注意事項:Passive infrared sensor 的中間引腳為數據輸出引腳,兩邊的引腳分別接入VCC和GND即可。 Raspberry-Pi-Pico-Basic-Kit-Burglar Alarm LED Two Buzzer.png

代碼解析 def pir_handler(pin): #中斷處理函數,蜂鳴器響,led快速閃爍

  print("ALARM! Motion detected!") 
  for i in range(50): 
      led.toggle() 
      buzzer.toggle() 
      utime.sleep_ms(100)

sensor_pir.irq(trigger=machine.Pin.IRQ_RISING, handler=pir_handler)#開啟中斷,當人體傳感器檢測到異常時就會今天中斷處理函數處理 while True: #無異常狀態下會每隔5秒改變一次LDE的狀態

  led.toggle() 
  utime.sleep(5)

Potentiometer 實驗 按照下圖連接好硬件,連接好接入電腦的Micro USB,在Thonny打開示例程序Lesson-16 Potentiometer中的python文件,運行程序,旋轉電位器可以看到Sheel窗口中打印出來的電壓值也在改變。 使用注意事項:Potentiometer的中間引腳為數據輸出口,兩邊的引腳分別接上GND和VCC即可。 Raspberry-Pi-Pico-Basic-Kit-Potentionmeter.png

代碼解析 potentiometer = machine.ADC(26) #將GP26作為模擬信號採集引腳 conversion_factor = 3.3 / (65535) while True:

  voltage = potentiometer.read_u16() * conversion_factor #将采集到的数据进行格式化转换成电压值
  print(voltage) #打印电压信息,电压值会随着滑动变阻器旋转而变化
  utime.sleep(2)

WS2812 實驗 按照下圖連接好硬件,連接好接入電腦的Micro USB,在Thonny打開示例程序Lesson-25 WS2812中的WS2812_RGB_LED.py文件,運行程序可以一次看到藍、紅、綠、白的RGB顏色。 Raspberry-Pi-Pico-Basic-Kit-WS2812.png

代碼解析

  1. 這一段代碼使用到的是狀態機機制,如下代碼是一個裝飾器,在裝飾器中我們可以硬件進行初始化、設定引腳的電平等等。
  2. label("bitloop") 我們可以在代碼中定義一下標記,方便我們通過跳轉的方式跳到他們這裡執行。
  3. jmp(not_x,"do_zero") 當x=0時,我們就調整到標籤“do_zero”。
  4. nop() .set(0) [T2 - 1] 當x=0時,會跳轉到這裡執行。

@asm_pio(sideset_init=PIO.OUT_LOW, out_shiftdir=PIO.SHIFT_LEFT, autopull=True, pull_thresh=24) def ws2812():

  T1 = 2
  T2 = 5
  T3 = 1
  label("bitloop")
  out(x, 1)               .side(0)    [T3 - 1] 
  jmp(not_x, "do_zero")   .side(1)    [T1 - 1] 
  jmp("bitloop")          .side(1)    [T2 - 1] 
  label("do_zero")
  nop()                   .side(0)    [T2 - 1]
  1. Create the StateMachine with the ws2812 program, outputting on Pin(22).

sm = StateMachine(0, ws2812, freq=8000000, sideset_base=Pin(0)) #創建狀態機

  1. Start the StateMachine, it will wait for data on its FIFO.

sm.active(1) #開始狀態機

  1. Display a pattern on the LEDs via an array of LED RGB values.

ar = array.array("I", [0 for _ in range(NUM_LEDS)]) print(ar) print("blue") for j in range(0, 255):

  for i in range(NUM_LEDS): 
      ar[i] = j 
  sm.put(ar,8)  #put()的方法是将数据放入状态机的输出FIFO
  time.sleep_ms(5)

LCD1602 I2C 實驗 按照下圖連接好硬件,連接好接入電腦的Micro USB,在Thonny打開示例程序Lesson-21 LCD1602 I2C中的python文件,先將RGB1602.py文件另存為Raspberry Pi Pico中,運行Choose_Color.py可以看到每5秒切換一種不同的顏色;運行Discoloration.py文件可以看到RGB顏色漸變的效果。 Raspberry-Pi-Pico-Basic-Kit-LCD1602-I2C.jpg

代碼解析 Choose_Color.py

  1. 定義顏色

rgb9 = (0,255,0) #青色’ lcd.setCursor(0, 0) #設置游標位置

  1. print the number of seconds since reset:

lcd.printout("Waveshare") #寫入字符 lcd.setCursor(0, 1) #設置游標位置到第二行第零列 lcd.printout("Hello,World!")#寫入字符 lcd.setRGB(rgb1[0],rgb1[1],rgb1[2]); #設置背光 Discoloration.py

t=0 while True:

  r = int((abs(math.sin(3.14*t/180)))*255);  #RGB随着时间的变化而变化
  g = int((abs(math.sin(3.14*(t+60)/180)))*255);
  b = int((abs(math.sin(3.14*(t+120)/180)))*255);
  t = t + 3;
  lcd.setRGB(r,g,b);#重新设置RGB的值
  1. set the cursor to column 0, line 1
  lcd.setCursor(0, 0) #定位到第一行第零列
  1. print the number of seconds since reset:
  lcd.printout("Waveshare")#写入字符
  lcd.setCursor(0, 1) #定位到第二行第零列
  lcd.printout("Hello,World!")#写入字符
  time.sleep(0.3)