Raspberry Pi Pico with RP2040: Review (without Board)

<rawat.s>
6 min readJan 21, 2021

--

.

วันที่ 21 มกราคม พ.ศ. 2564 ได้มีการเปิดตัวบอร์ดไมโครคอนโทรลเลอร์ “Raspberry Pi (RPi) Picoโดย Raspberry Pi (Trading) Ltd. ซึ่งถือว่าเป็นก้าวแรกในทิศทางการพัฒนาฮาร์ดแวร์ที่ไม่ใช่คอมพิวเตอร์บอร์ดเดี่ยวหรือ Single-Board Computer (SBC) โดยทีมพัฒนา Raspberry Pi และได้มีการตั้งราคาไว้ที่ $4 จึงเป็นบอร์ดประเภท Low-Cost

ผู้เขียนได้ใช้แหล่งข้อมูลต่อไปนี้ เพื่อศึกษาเกี่ยวกับบอร์ดนี้ในเบื้องต้น

Board Specifications

  • RP2040 microcontroller chip designed by Raspberry Pi (UK)
  • Dual-core Arm Cortex M0+ processor, clock running up to 133 MHz
  • 264KB of SRAM, and 2MB of on-board Flash memory
  • USB 1.1 with device and host support
  • Low-power sleep and dormant modes
  • Drag-and-drop programming using mass storage over USB
  • 26 × multi-function GPIO pins (Pico IO voltage is fixed at 3.3V!!!)
  • 2 × SPI, 2 × I2C, 2 × UART, 3 × 12-bit ADC, 16 × controllable PWM channels
  • on-chip temperature sensor
  • Accelerated floating-point libraries on-chip
  • 8 × Programmable I/O (PIO) state machines for custom peripheral support

Ref.: https://www.raspberrypi.org/documentation/pico/getting-started/

Raspberry Pi Pico Boards (Top & Bottom Views)

Source: https://datasheets.raspberrypi.org/pico/pico_datasheet.pdf

Raspberry Pi Pico (Pinout)

รหัส “RP2040” มีความหมายอย่างไร

  • RP = Raspberry Pi
  • 2 = Dual Core
  • 0 = Arm Cortex M0+
  • 4 = floor(log2(264 KB/16 KB)) — 264KB SRAM
  • 0 = floor(log2(0 / 16KB)) — no on-chip Flash memory

ลองมาดูหรือวิเคราะห์กันดูว่า ทางผู้พัฒนาฮาร์ดแวร์ของ Raspberry Pi Pico ได้เลือกใช้แนวทางใดบ้างในการพัฒนา

  • ตัวประมวลผลแบบสองแกน
  • ไม่มี on-chip Flash แต่ใช้ Serial Flash ภายนอก
  • ตัวประมวลผลที่รองรับการใช้งาน Native USB
  • มาพร้อมกับ UF2 Bootloader ใน ROM
  • ใช้ SWD สำหรับ Flashing / Debugging
  • รับอินพุตแรงดันไฟเลี้ยงสำหรับบอร์ดจาก VUSB / VSYS
  • มีวงจรประเภท Software-Programmable I/O
  • ใช้ ภาษา C/C++ และ MicroPython ในเบื้องต้นสำหรับเขียนโปรแกรม

ตัวประมวลผลแบบสองแกน

.

RPi Pico ได้เลือกใช้ชิป RP2040 ของ Raspberry Pi เอง เป็นไมโครคอนโทรลเลอร์ที่ทำงานตามสถาปัตยกรรมแบบ 32-bit Arm Cortex-M0+ (ARMv6-M architecture) แบบ dual-core ซึ่งเน้นการประหยัดพลังงาน หรือ low-power ความเร็วปรกติ 48 MHz แต่ก็สามารถปรับโดยซอฟต์แวร์ให้ รันได้สูงถึง 133 MHz ถ้าเน้นการทำงานแบบ High Performance

RP2040 เป็นชิปตัวแรกที่ทาง Raspberry Pi ได้ออกแบบเอง ดังนั้นจึงควบคุมทิศทางการพัฒนาออกแบบและการผลิตชิป แล้วนำมาสร้างบอร์ดเอง แต่ก็เห็นว่า มีความร่วมมือกับบริษัท เช่น Arduino / Sparkfun / Adafruit เพื่อนำชิป RP2040 ไปสร้างบอร์ดของแต่ละบริษัทเอง เพื่อให้เกิดความหลากหลายและ ecosystem

อ้างอิงจากการให้สัมภาษณ์ของ James Adams ตำแหน่ง Chief Operating Officer, Raspberry Pi Trading เขากล่าวว่า การพัฒนา RP2040 เริ่มต้นมาตั้งแต่ปลายปีค.ศ. 2016 และได้รับชิป “Test Silicon” มาทดสอบในปีค.ศ. 2018 หลังจากนั้นก็มี silicon revision อีกหลายครั้ง และได้ให้ TSMC เป็นผู้ผลิตชิป และใช้เทคโนโลยีการผลิตชิปที่ระดับ 40nm

Block Diagram of RP2040 MCU
On-chip bus architecture

แต่ Arm Cortex-M0+ ไม่มี Hardware Floating-Point Unit (hardfp) ดังนั้นการคำนวณ โดยใช้ชนิดข้อมูลแบบ float / double จึงต้องใช้ซอฟต์แวร์ช่วย (softfp) โดยเลือกใช้ไลบรารี Qfplib ในภาษา Assembly ลองดูตัวอย่างโค้ดได้จาก BootROM ของ RP2040 เช่น

RP2040 มีตัวประมวลผล Arm Cortex-M0+ เหมือนกัน 2 ชุด คือ core0 และ core1 และใช้หน่วยความจำและทรัพยากรต่าง ๆ ร่วมกัน สามารถเข้าถึง On-chip Peripherals ต่าง ๆ ผ่านทาง IOPort ไปยัง SIO (Single-Cycle I/O) สำหรับ GPIOs

ทั้งสองซีพียูก็สามารถสื่อสารกันได้ผ่านทาง FIFOs (ทำงานแบบ Mailboxes) แยกกันในสองทิศทาง และใช้อินเทอร์รัพท์สื่อสารกันได้ (SIO_IRQ_PROC0, SIO_IRQ_PROC1)

นอกจากนั้นยังมี Hardware Spinlocks 32 bits (flags) เพื่อเอาไว้ป้องกันการเข้าถึง Critical Sections เมื่อมีการทำงานแบบ Concurrency ในซีพียูเดียวกันหรือต่างซีพียูกันก็ได้

ในแง่ของการเขียนโปรแกรมภาษา C/C++ เพื่อใช้งานซีพียูแบบสองแกน ก็มี Pico SDK ไว้ให้ใช้งาน พร้อมตัวอย่างสาธิต เช่น

  • multicore_launch_core0(…), multicore_launch_core1(…) เป็นคำสั่งเพื่อเรียกฟังก์ชันให้ทำงานโดยใช้เจาะจงใช้ core0 หรือ core1
  • multicore_fifo_push_blocking(…) / multicore_fifo_pop_blocking() เป็นคำสั่งที่นำข้อมูลขนาด 32 บิต ไปใส่หรืออ่านข้อมูลจาก FIFO ที่ใช้สื่อสารกันระหว่าง core0 และ core1
  • multicore_fifo_clear_irq() เป็นคำสั่งเคลียร์ FIFO interrupt flag

.

Dual-Core Processor Subsystem
Single-Cycle I/O Block

ไม่มี on-chip Flash แต่ใช้ Serial Flash ภายนอก

.

โดยปรกติแล้วไมโครคอนโทรลเลอร์ มักมีหน่วยความจำ Flash อยู่ภายในชิปเดียวกัน แต่ RP2040 ไม่มี On-chip Flash แต่เลือกใช้วิธีเก็บโปรแกรมคำสั่งภายนอกเอาไว้ใน Serial Flash (รองรับได้ถึง 16 MB) และบอร์ด RPi Pico มี 2MB external Quad-SPI Flash (W25Q16) และมี on-chip Cache สำหรับ Program Memory

ตัวประมวลผลที่รองรับการใช้งาน Native USB

.

ภายใน RP2040 มีวงจร USB 1.1 controller & PHY ดังนั้นจึงใช้งาน USB แบบ native เช่น สามารถโปรแกรมให้รองรับการทำงานแบบ USB CDC จึงไม่จำเป็นต้องใช้ USB-to-Serial Chip (เช่น CP210x, CH34x) และรองรับ USB MSC (Mass Storage) เป็นต้น

แนวทางนี้ก็เหมือนกรณีที่บริษัท Adafruit (USA) พัฒนา CircuitPython ให้ใช้เฉพาะกับบอร์ดที่มี USB native เท่านั้น

ในการใช้งาน USB ของ RP2040 จะใช้ 12MHz Crystal ภายนอก และใช้ความถี่ 48MHz (ได้จากวงจร internal PLL คูณความถี่)

มาพร้อมกับ UF2 Bootloader ใน ROM

.

ชิป RP2040 ได้ติดตั้งเฟิร์มแวร์สำหรับ Bootloader เรียกว่า Pico BootROM ในหน่วยความจำภายในแบบ ROM เอาไว้แล้ว (อ่านได้อย่างเดียว เขียนทับหรือลบไม่ได้) เมื่อกดปุ่ม BOOTSEL บนบอร์ดค้างไว้ แล้วจ่ายไฟ หรือรีเซตบอร์ด ถัดจากนั้นจะเข้าสู่เข้าสู่โหมดการโปรแกรมเฟิร์มแวร์สำหรับ User Application โดยมองเห็นเป็นไดรฟ์ USB Flash Storage (Virtual Drive)

ถ้าเรามีไฟล์ประเภท .UF2 สำหรับ RP2040 เราก็สามารถลากไฟล์ไปวางลงในไดรฟ์ดังกล่าว

การติดตั้งเฟิร์มแวร์ในลักษณะนี้ทำได้ง่าย หลายคนคงอาจเคยลองใช้กับบอร์ด Micro:bit ที่รองรับ DAP Link หรือบอร์ดไมโครคอนโทรลเลอร์ที่ติดตั้ง UF2 Bootloader เช่น nRF58240 หรือ SAMD21/D51 เป็นต้น

ใช้ SWD สำหรับ Flashing / Debugging

.

เนื่องจากใช้ตัวประมวลผลตามสถาปัตยกรรมของ Arm Cortex-M Series ดังนั้นถ้าต้องการดีบัก (DEBUG) หรืออัปโหลดโปรแกรมไปยัง QSPI Flash ก็สามารถใช้ SWD (Serial Wire Debug) ได้ง่าย โดยใช้ขาเพียง 3 ขา คือ SWDIO, GND, SWCLK และใช้โปรแกรมอย่างเช่น OpenOCD ในการดีบักการทำงานของไมโครคอนโทรลเลอร์ได้

ตัวเลือกอินพุตแรงดันไฟเลี้ยงสำหรับบอร์ด

.

บอร์ด Pico สามารถใช้แรงดันไฟเลี้ยงจาก MicroUSB (5V VSUB) หรือขา VSYS (รับแรงดันไฟฟ้าในช่วงกว้างตัังแต่ 1.8V ถึง 5.5V) เพื่อใช้กับวงจร RT6150 buck-boost SMPS (Switched Mode Power Supply / Buck-Boost Switching Regulator) และแปลงระดับและควบคุมแรงดันคงที่บนบอร์ด ให้ได้ 3.3V สำหรับ RP2040 และ GPIO

วงจร SMPS มีขา 3V3_EN ซึ่งต่อแบบ Pull-up (100k Ohm) เอาไว้กับขา VSYS แต่ถ้าต้องการปิดการจ่ายแรงดันไฟฟ้า 3.3V (OUT) ให้ต่อขาดังกล่าวลง GND (Low)

ตัวชิป RP2040 ใช้แรงดันไฟเลี้ยงสำหรับวงจรซีพียูภายใน (Core Voltage) อยู่ที่ระดับ 1.1V และมีวงจรภายในที่แปลง 3.3V ลดลงให้เป็น 1.1V

แต่บอร์ด Pico ไม่มีวงจรสำหรับ LiPo charger

มีวงจรประเภท Programmable I/O อยู่ภายใน

.

RP2040 มีวงจรภายในที่เรียกว่า PIO จำนวน 2 ชุด (PIO0 & PIO1) รับหน้าที่แทน CPU สำหรับ Real-Time Fast I/O เช่น การสร้างสัญญาณควบคุมให้ RGB LED WS2812B ที่ต้องมี ฺBit Timing แม่นยำ และสร้างสัญญาณพัลส์ความถี่สูง หรือใช้สำหรับอินเทอร์เฟส Audio I2S, S/PDIF, PWM เป็นต้น

PIO0 หรือ PIO1 มีวงจร Programmable State Machines อย่างละ 4 ชุด (SM0..SM3) รวมทั้งหมด 8 ชุด ทำงานโดยใช้คำสั่งจาก 32-Slot Instruction Memory (สูงสุด 32 คำสั่ง) นอกจากนั้น ยังมีวงจรหารความถี่ ดังนั้นจึงโปรแกรมเลือกความถี่ในการทำงานสำหรับ PIO ได้

ถ้าใช้งานสำหรับการเลื่อนบิตเข้าหรือออก กีมีรีจิสเตอร์ประเภท Shift Register 2 ชุด (Input & Output Shift Registers ใน 2 ทิศทางพร้อมกันได้) เช่น ใช้กับอินเทอร์เฟสแบบ Synchronous Serial I/O เป็นต้น

Programmable input/output block (PIO)

การเขียนโปรแกรมสำหรับ PIO0 หรือ PIO1 จะใช้ภาษา Assembly โดยเฉพาะ มีชุดคำสั่งขนาดเล็ก คำสั่งมีความยาว 16 บิต (16-bit instructions) และมีเพียง 9 คำสั่ง: JMP, WAIT, IN, OUT, PUSH, PULL, MOV, IRQ, SET และแต่ละคำสั่งใช้เวลา 1 ไซเคิล (Single-Cycle Instruction Execution)

โค้ด Assembly จะต้องคอมไพล์ด้วย PIO assembler (pioasm) ซึ่งเป็นส่วนหนึ่งของ Pico SDK

มีบอร์ดที่ใช้ RP2040 แต่มาจากบริษัทอื่นด้วย

.

นอกจากบอร์ด RPi Pico ที่ใช้ RP2040 ก็ยังมีบอร์ดจากผู้พัฒนาอื่นที่ใช้ชิป RP2040 เช่นกัน ยกตัวอย่าง

ใช้ ภาษา C/C++ และ MicroPython ในเบื้องต้นสำหรับเขียนโปรแกรม

.

ภาษา C/C++ เป็นตัวเลือกแรกสำหรับเขียนโปรแกรมไมโครคอนโทรลเลอร์ มี Pico C/C++ SDK (datasheet) มาให้ (header files, libraries, examples) สามารถใช้ Visual Studio เป็น IDE ได้ หรือจากสร้างโปรเจกต์และคอมไพล์โดยใช้ CMake ก็ได้ (ลองดู pico-project-generator) คอมไพล์เลอร์ที่ใช้คือ gcc-arm-none-eabi (v9.2.1)

ถ้าลองดูตัวอย่าง Pico C/C++ Examples & Playground จะเห็นว่า มีตัวอย่างสาธิตการทำงานและช่วยให้เราเริ่มต้นเขียนโค้ดได้ง่ายขึ้น

ตัวอย่างโค้ดจากไฟล์ blink.c

#include "pico/stdlib.h" // standard library for Picoint main() {
const uint LED_PIN = 25; // GP25 pin for onboard LED
gpio_init(LED_PIN); // initialize GPIO pin for LED
gpio_set_dir(LED_PIN, GPIO_OUT); // set GPIO direction
while (true) {
gpio_put(LED_PIN, 1); // write 1 to LED pin
sleep_ms(250);
gpio_put(LED_PIN, 0); // write 0 to LED pin
sleep_ms(250);
}
}

ตัวอย่างโค้ด เช่น ไฟล์ hello_serial.c หรือ hello_usb.c มีโค้ดเหมือนกันสำหรับการใช้ stdio และฟังก์ชัน printf() แต่ต่างกันในการตั้งค่าเลือกใช้ Hardware Serial หรือ USB ในไฟล์ CMakeLists.txt โดยใช้คำสั่ง pico_enable_stdio_uart(…) หรือ pico_enable_stdio_usb(…)

#include <stdio.h>
#include "pico/stdlib.h"
int main() {
stdio_init_all();
while (true) {
printf("Hello, world!\n");
sleep_ms(1000);
}
return 0;
}

.

ตัวอย่างขั้นตอนการติดตั้งซอฟต์แวร์หรือโปรแกรมต่าง ๆ โดยใช้บอร์ด RPi 4B หรือ 400 Computer เป็นแพลตฟอร์มในการเขียนโค้ดสำหรับ RP2040 ก็ดูได้จาก https://github.com/raspberrypi/pico-setup/

นอกจากภาษา C/C++ แล้ว เพื่อใช้ง่ายสำหรับผู้เริ่มต้น จึงได้มีการพัฒนา MicroPython Firmware สำหรับ RP2040 ไว้พร้อมใช้งานแล้ว (เช่น เวอร์ชัน v1.13) นำทีมโดย Damien George (George Robotics Ltd., UK) ผู้สร้าง MicroPython สำหรับบอร์ด STM32-based PyBoard และ BBC Micro:bit ในยุคแรกของไมโครไพธอน

หนังสือ “Get Started with MicroPython on Raspberry Pi Pico (ebook)” ซึ่งแนะนำการใช้ MicroPython สำหรับ RP2040 ก็สามารถดาวน์โหลดได้ฟรีจาก
https://hackspace.raspberrypi.org/books/micropython-pico/pdf (~20MB)

.

การติดตั้งไฟล์ MicroPython ก็ทำได้ง่าย ดาวน์โหลดไฟล์ .uf2 แล้วนำไปใช้กับบอร์ด Pico ได้เลย และถ้าใครเคยใช้ MicroPython สำหรับ STM32 หรือ ESP32 มาบ้างแล้ว ก็แทบจะไม่แตกต่างแต่อย่างใด ยกเว้นการใช้โมดูล rp2 และคำสั่ง asm_pio สำหรับใช้ State Machines / PIO ที่มีเฉพาะสำหรับ RP2040

โครงการของ Raspberry Pi เกิดขึ้นในวงการนักพัฒนาและสนับสนุนการศึกษาใน UK ดังนั้นการใช้ฮาร์ดแวร์และซอฟต์แวร์จากบริษัทหรือนักพัฒนาใน UK ก็คงไม่ใช่เรื่องแปลกแต่อย่างไร

บริษัท Adafruit ซึ่งได้นำ MicroPython มาพัฒนาต่อและแยกออกมา จนกลายเป็น CircuitPython ในขณะที่เขียนบทความนี้ ก็เห็นว่า ทางบริษัทได้เริ่มต้นนำ Source Code มาสร้างไฟล์ .bin เพื่อให้ผู้ที่สนใจได้ทดลองใช้ CircuitPython กับบอร์ด RPi Pico

RPi Pico Schematic

ผู้อ่านที่สนใจศึกษารูปแบบการเขียน MicroPython สำหรับบอร์ด Raspberry Pi Pico พร้อมตัวอย่างโค้ด ลองศึกษาได้จาก Gitbook นี้ครับ

กล่าวสรุป

.

บอร์ด Raspberry Pi Pico ที่ใช้ชิป RP2040 ก็เป็นอีกตัวเลือกสำหรับบอร์ดไมโครคอนโทรลเลอร์ที่มีราคาถูกสำหรับนักพัฒนา มีซัพพอร์ตที่ดีจาก Raspberry Pi Trading / Foundation คาดว่าจะมีการใช้งานแพร่หลายและมี Community ของผู้ใช้และนักพัฒนาที่จะขยายใหญ่ขึ้นเมื่อบอร์ด Pico ถูกจำหน่ายออกไปในวงกว้าง คงต้องรอดูกันต่อไป

--

--

<rawat.s>
<rawat.s>

Written by <rawat.s>

I'm Thai and working in Bangkok/Thailand.

No responses yet