下班最常做的事就是研究新的玩具,最近Raspberry Pi pico 很熱門花費近兩個星期的時間,小小的研究心得,目前常用的板子有:
樹莓派RP2040 Waveshare Zero研發履歷
概述
RP2040-Zero迷你開發板,板載Type-C母口 採用 Raspberry Pi 研發的 RP2040作為核心,並在極小板型下引出全部未佔用引腳採用半孔工序,可以焊接接在你自訂的板子上
特性
採用了 Raspberry Pi 官方設計的 RP2040 微控制器晶片
搭載了雙核 ARM Cortex M0 + 處理器,運行頻率高達 133MHz 靈活時鐘
內置了 264KB 的 SRAM 和 2MB 的板載 Flash
採用Type-C介面,緊跟時代潮流,無需糾結正反插
郵票孔設計,可直接焊接集成到用戶自主設計的底板上
USB1.1 主機和設備支援
支援低功耗睡眠和休眠模式
可通過 USB 識別為大量存放區進行拖放式下載程式
RP2040 的 29 個 GPIO 引腳引出(20 個可通過排針引出,其餘僅可焊接引出)
多種硬體外設
2 個 SPI
2 個 I2C
2 個 UART
4 個 12 位 ADC
16 個可控 PWM 通道
精確的片上時鐘和計時器
溫度感測器
片上加速浮點庫
8 個可程式設計 I/O (PIO) 狀態機,用於自訂外設支持
腳位較多的RP2040
原廠的RP2040
加入RP2040的板子資訊到Arduino IDE程序
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
發展板資訊將這一行複製
開啟Arduino IDE
檔案🡪喜好設定…
按下箭頭所指按鈕
將剛剛複製的板子鏈接貼上,如紅色方框處
按下
再按下關閉視窗
這樣就會開始下載RP2040板子資料如此就可以使用
第一次上傳程式
按住Pico板上的BOOTSET按鍵,將pico通過Micro USB線接到電腦的USB介面,待電腦識別出一個可移動硬碟(RPI-RP2)後,鬆開按鍵。
我發現這樣插拔USB cable也很麻煩,我的新發現是當要下載程式時先按住boot按鍵再按住reset鍵🡪放開reset鍵🡪再放開boot鍵,這樣也可以進入UF2 mode這樣就不用一直插拔USB cable
這個時候打開Arduino IDE 選擇 工具🡪連接埠🡪UF2 Board
這樣就可以將程式下載到RP2040 Zero
下載完程式如果需要使用到Serial port 此時再如上步驟工具🡪連接埠🡪 COM X
這是就可以收到serial 傳來的資料了。
這一點比STM32F 的開發板還強
這個開發板上的LED為WS2812B 三色LED不是一般的LED僅控制IO port的HI LO就可以讓LED亮或滅,我是使用Neopixel 函數庫控制,由於RP2040記憶體夠大,可以放心的用盡情的爽爽用不用擔心記憶體不足問題,如果使用Arduino UNO的板子我不建議使用這個函數庫。
關於使用內部的溫度
內部的溫度Sensor 內定為ADC4 但是analogRead()不能直接使用analogRead(4),必須使用analogReadTemp()他會傳出攝氏度的數值,但是溫度極為不穩定。
網路也有熱心的啊豆仔特別寫了一個函數庫,但是讀取的結果如同analogReadTemp()方法如下:
#include <CPU.h> // Include the library to use the CPU temperature sensor
CPU cpu; // Create an instance of the CPU temperature sensor
tem = " " + String(cpu.getTemperature()) + "度" + "C"; //" °C";
u8g2.print(tem);
u8g2.sendBuffer(); // transfer internal memory to the display
這個沒有比較理想
顯示OLED和DS3231和WS2812 LED的函數庫如下:
使用 2.33.15 版本的 U8g2 库,在列出的文件夹中:D:\onedrive\文件\Arduino\libraries\U8g2
使用 1.0 版本的 Wire 库,在列出的文件夹中:C:\Users\leecw\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\3.6.3\libraries\Wire
使用 1.1.2 版本的 DS3231 库,在列出的文件夹中:D:\onedrive\文件\Arduino\libraries\DS3231
使用 1.12.0 版本的 Adafruit NeoPixel 库,在列出的文件夹中:D:\onedrive\文件\Arduino\libraries\Adafruit_NeoPixel
使用 1.0.0 版本的 Raspberry Pi Pico CPU Temperature 库,在列出的文件夹中:D:\onedrive\文件\Arduino\libraries\Raspberry_Pi_Pico_CPU_Temperature
使用 1.0 版本的 SPI 库,在列出的文件夹中:C:\Users\leecw\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\3.6.3\libraries\SPI
關於很傷腦筋的IO port 常用到的Uart,I2C,SPI 到底是對應那隻腳在pico.h有指定
我的開發板購買的是Waveshare RP2040 Zero 將I2C的SD4焊接在第5pin SCL焊接在第6pin這個使用也沒有什麼問題,但是當我要使用SPI時卻發生IO port 衝突導致OLED和DS3231都失效,修改pico.h 的定義也無效使用Wire.srtSDA()和Wire.setSCL()指定腳位都無效。
花了一天的時間研究底層,還是無法從錯綜複雜的定義找出端倪。
確定修改pico.h的定義是無效的
C:\Users\leecw\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\3.6.3\pico-sdk\src\boards\include\boards
檔案的位置
AI的答案還是屬於胡說八道compiler都失敗!!
C:\Users\leecw\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\3.6.3\pico-sdk\src\rp2_common\hardware_i2c\include\hardware
2024/01/31 今天早上我從修改pico.h的接腳定義失效之後我嘗試將板子的型號故意改成Arduino NANO RP2040將I2C的SDA改到12pin SCL 改到13pin 再compiler 竟然可以正常Work了,真是太神奇了
Arduino 內定的I2C和SPI通信接腳如表一
表一
Arduino nano RP2040 connect 接腳圖
Arduino Nano RP2040 connecot
如果想要錯開SPI 與I2C衝突板子請選擇Arduino Nano RP2040 connecot
目前邱盈繼的鋰電池充電IC測試治具就是使用這個設定,如果要compiler也要選擇Arduino Nano RP2040 connecot
SPI 是否真的有效還要測試
2024/01/31 SPI功能測試OK有信號輸出
所以使用Waveshare RP2040 Zero 開發板在Arduino IDE的設定要選擇Arduino nano RP2040 connect.
ADC 測試
2024/01/31 我寫程式測試是OK的可以從USRT輸出信號
RP2040的解析度是0~4095 2^12
多核心運作測試
RP2040有雙核心在Arduino IDE如何使用雙核心,很簡單就是使用兩組setup(),setup1(),loop(),Loop1()
就可以搞定,2024/02/01 完成測試
如何知道開發板的IO PORT設定
以網路的RP2040各家開發板為例:在李進衛的電腦路徑
C:\Users\leecw\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\3.7.2\variants
進入這個路徑之後會看到一頭拉庫的板子廠商如下圖
進入目錄之後我們會看到pins_arduino.h
在這個檔案中我們就會看到各種界面例如:SPI/UART/I2C/ADC的接腳定義如下圖:
各種開發板的pins_arduino.h
Arduino nano RP2040 connect 的pins_arduino.h路徑:
C:\Users\leecw\AppData\Local\Arduino15\packages\arduino\hardware\mbed_nano\4.0.10\variants\NANO_RP2040_CONNECT
SPI 接腳定義
I2C 接腳定義
這裡要注意的是Arduino 原廠的定義是使用他們自己的接腳定義例如18u就是接腳的D18 對應到RP2040的GPIO12,19u 就是接腳的D19對應到RP2040的GPIO13,同理SPI的對應亦是如此10u,11u,12u,13u 為D10,D11,D12,D13對應到GPIO的GPIO4,5,6,7
為什麼數字後面要加一個u或者ul?
在Arduino的pins_arduino.h檔案中,數字後面加上u或ul是為了明確指定數字的類型。u代表無符號整數(unsigned int),而ul代表無符號長整數(unsigned long)。這樣做可以避免在不同平台或編譯器之間可能出現的類型不匹配問題。
例如,#define PIN_SPI_MISO (22u)中的22u告訴編譯器這個常數是一個無符號整數。這樣做有助於確保當您的程式碼在不同的微控制器上運行時,數字的大小和範圍是正確的。這對於跨平台開發特別重要,因為不同的微控制器可能會以不同的方式處理整數和長整數。
沒有留言:
張貼留言