เริ่มต้นใช้งานบอร์ดไมโครคอนโทรลเลอร์ Raspberry Pi Pico Multicore โดยใช้ C
Contributed By DigiKey's North American Editors
2023-06-07
ระบบฝังตัวที่จะมีหน่วยไมโครคอนโทรลเลอร์ (MCU) ที่ทรงพลังและต้นทุนต่ำเป็นที่ต้องการอย่างแท้จริง อุปกรณ์เหล่านี้มีบทบาทสำคัญไม่เพียงแค่ในผลิตภัณฑ์เท่านั้น แต่ยังรองรับการทดสอบ การสร้างต้นแบบอย่างรวดเร็ว และความสามารถต่าง ๆ เช่น การเรียนรู้ของเครื่อง (ML) อย่างไรก็ตาม การเริ่มต้นใช้งาน MCU โดยทั่วไปจำเป็นต้องมีความเข้าใจเชิงลึกเกี่ยวกับเทคโนโลยี MCU และภาษาการเขียนโปรแกรมระดับต่ำ ยิ่งไปกว่านั้น บอร์ดพัฒนามักมีราคาระหว่าง 600 ถึง 30,000 บาท ซึ่งอาจแพงเกินไปสำหรับนักพัฒนาหลายคน นอกจากนี้ ก็อาจจะไม่มีบอร์ดสำหรับการพัฒนา และแม้ว่าจะมีอยู่แล้ว นักออกแบบมักจะประสบปัญหาในการทำให้บอร์ดพร้อมใช้งาน
บทความนี้แนะนำ Raspberry Pi Pico (SC0915) ซึ่งเป็นบอร์ดพัฒนาต้นทุนต่ำสำหรับ RP2040 MCU ที่มีความสามารถที่หลากหลายสำหรับนักพัฒนา จากนั้นบทความจะกล่าวถึง Pico และบอร์ดขยายบางส่วน ตรวจสอบชุดพัฒนาซอฟต์แวร์ต่าง ๆ ที่ Raspberry Pi Pico รองรับ และสาธิตวิธีสร้างแอปพลิเคชัน LED กะพริบโดยใช้ C SDK
ความรู้เบื้องต้นเกี่ยวกับ Raspberry Pi Pico
Raspberry Pi Pico เปิดตัวครั้งแรกในปี 2021 ในฐานะแพลตฟอร์มการพัฒนาสำหรับไมโครคอนโทรลเลอร์ RP2040 ซึ่งสามารถใช้ Pico เป็นบอร์ดพัฒนาแบบสแตนด์อโลน หรือสามารถออกแบบเป็นผลิตภัณฑ์ได้โดยตรงเนื่องจากการเชื่อมต่อที่ขอบที่สามารถบัดกรีเข้ากับบอร์ด Carrier ได้ (รูปที่ 1) ด้วยราคาต่ำกว่า 150 บาทและการใช้งานอเนกประสงค์ ทำให้ Pico กลายเป็นโซลูชันยอดนิยมสำหรับทั้งผู้ผลิตและนักพัฒนามืออาชีพ
รูปที่ 1: Raspberry Pi Pico เป็นบอร์ดพัฒนาราคาประหยัดที่มีทุกสิ่งที่จำเป็นในการพัฒนาการใช้งานบนไมโครคอนโทรลเลอร์ RP2040 (แหล่งที่มาภาพ: Raspberry Pi)
RP2040 มีคุณสมบัติโปรเซสเซอร์ Arm® Cortex®-M0+ แบบดูอัลคอร์ สัญญาณนาฬิกาที่ 133 เมกะเฮิรตซ์ (MHz) และมี SRAM สูงสุด 264 กิโลไบต์ (Kbytes) ซึ่ง RP2040 ไม่มีความจำแฟลชออนชิป โดย Raspberry Pi Pico ให้ชิปแฟลชภายนอกขนาด 2 เมกะไบต์ (Mbyte) ที่เชื่อมต่อกับ RP2040 ผ่านอินเทอร์เฟซอุปกรณ์ต่อพ่วงอนุกรมแบบควอด (QSPI) บอร์ดยังมี LED สำหรับผู้ใช้ โดยคริสตัลออสซิลเลเตอร์แบบเฟสล็อคลูป (PLL) ใช้เพื่อสร้างสัญญาณนาฬิกา CPU ความเร็วสูงที่เสถียร และปุ่มกดเพื่อกำหนดค่าว่าโปรเซสเซอร์จะบูทตามปกติหรือใช้ Bootloader
ระบบนิเวศที่ครอบคลุมทั่วถึง
Raspberry Pi Pico มีระบบนิเวศที่ครอบคลุมทั่วถึงซึ่งช่วยให้นักพัฒนาสามารถเลือกระหว่างการใช้ชุดพัฒนาซอฟต์แวร์ MicroPython หรือ C เพื่อเขียนแอปพลิเคชันสำหรับบอร์ด ข้อสังเกตที่น่าสนใจอย่างหนึ่งเกี่ยวกับ Raspberry Pi Pico คือการที่ Raspberry Pi Pico ไม่ได้มีแค่บอร์ดพัฒนาเดียว แต่มีทั้งหมดสามบอร์ด ได้แก่ SC0915 ดั้งเดิมพร้อมการกำหนดค่ามาตรฐาน, SC0917 ที่มีเฮดเดอร์คอนเนคเตอร์และ SC0918 ซึ่งรวมชิป Wi-Fi ต้นทุนต่ำสำหรับการใช้งานที่มีการเชื่อมต่อ (รูปที่ 2)
รูปที่ 2: Raspberry Pi Pico มีให้เลือกสามแบบ (แหล่งที่มาภาพ: Beningo Embedded Group, LLC)
สำหรับแต่ละเวอร์ชัน ฟุตปริ้นทั่วไปของบอร์ดยังคงเหมือนเดิม การเชื่อมต่อที่ขอบสำหรับบอร์ดประกอบด้วยการเชื่อมต่อที่ขอบ 40 พินสำหรับอุปกรณ์ต่อพ่วงและตัวเลือกการเชื่อมต่อที่แสดงในรูปที่ 3 ซึ่งรวมถึงไฟฟ้า กราวด์ ตัวรับและส่งสัญญาณแบบอะซิงโครนัส (UART), อินพุตและเอาต์พุตเอนกประสงค์ (GPIO), การมอดูเลตปรับความกว้างพัลส์ (PWM), ตัวแปลงแอนะล็อกเป็นดิจิตอล (ADC), การเชื่อมต่อระหว่างอุปกรณ์ต่อพ่วงแบบอนุกรม (SPI), อินเตอร์เฟสวงจรรวม (I2C) และการดีบัก
รูปที่ 3: จุดเชื่อมต่อของ Raspberry Pi Pico ให้การเข้าถึงอุปกรณ์ต่อพ่วงที่หลากหลาย (แหล่งที่มาภาพ: Raspberry Pi)
ตัวเลือกเบรกเอาท์บอร์ด
เมื่อต้องการใช้ Raspberry Pi สำหรับการสร้างต้นแบบอย่างรวดเร็ว จะต้องเข้าถึงคอนเนคเตอร์ที่ขอบของบอร์ดได้ง่าย โดยทางเลือกหนึ่งสำหรับการเข้าถึงคือการใช้เฮดเดอร์และโพรโทบอร์ด อย่างไรก็ตาม วิธีแก้ปัญหานี้มักทำให้สายไฟยุ่งเหยิงซึ่งอาจทำให้เกิดข้อผิดพลาดได้ ดังนั้นจึงมีตัวเลือกมากมายโดยใช้เบรกเอาท์บอร์ดที่ขยายการเชื่อมต่อที่ขอบไปยังอินเทอร์เฟซที่พร้อมใช้งานมากขึ้น
ตัวอย่างเช่น บอร์ดโมดูล MM2040EV Pico จาก Bridgetek แบ่งตัวเชื่อมต่อขอบส่วนใหญ่ออกเป็นพินและซ็อกเก็ต นอกจากนี้ยังมี ชิลด์ 103100142 สำหรับ Pico จาก Seeed Studio ที่ทำให้อินเตอร์เฟสต่อพ่วงแต่ละอันเป็นคอนเนคเตอร์ โดยคอนเนคเตอร์แต่ละตัวมีขาที่เข้ากันได้กับบอร์ดขยายเพื่อเพิ่มฟังก์ชันต่างๆ เช่น เซ็นเซอร์แรงเฉื่อย ตัวขับมอเตอร์ และตัวค้นหาระยะ
C หรือ MicroPython?
ระบบสมองกลฝังตัวมักถูกเขียนด้วยภาษา C เนื่องจากมีการรักษาสมดุลของการควบคุมในระดับต่ำกับแนวทางการประยุกต์ใช้ระบบในระดับสูง ปัญหาของ C ในปัจจุบันคือเป็นภาษาโปรแกรมโบราณอายุห้าสิบปีที่ไม่ค่อยมีสอนในมหาวิทยาลัย นอกจากนี้ยังง่ายเกินไปที่จะทำให้เกิดบักโดยไม่ตั้งใจและทำให้เกิดความเสียหาย แม้จะมีปัญหาดังกล่าว แต่ภาษา C ก็เป็นตัวเลือกสำหรับการพัฒนาระบบสมองกลฝังตัวส่วนใหญ่
อีกทางเลือกหนึ่งสำหรับการใช้ C คือ MicroPython ซึ่งมาจากระบบนิเวศ Raspberry Pi Pico ซึ่ง MicroPython เป็นพอร์ต CPython ที่ออกแบบมาเพื่อทำงานบนระบบที่ใช้ MCU แม้ว่าจะใช้โปรเซสเซอร์มากกว่า C อย่างไม่ต้องสงสัย แต่ก็เป็นภาษาสมัยใหม่ที่นักพัฒนาจำนวนมากคุ้นเคย โดย MicroPython สามารถใช้ส่วนระดับต่ำของ MCU และฮาร์ดแวร์ได้ การเข้าถึงฮาร์ดแวร์ผ่านอินเทอร์เฟซโปรแกรมประยุกต์ระดับสูง (API) ที่ง่ายต่อการเรียนรู้ ซึ่งเป็นคุณสมบัติที่สำคัญพร้อมกำหนดเวลาโปรเจคที่กระชั้นชิด
เมื่อเลือกชุดพัฒนาซอฟต์แวร์ (SDK) ที่จะใช้ C หรือนักพัฒนา MicroPython ต้องการมุ่งเน้นไปที่ความต้องการเฉพาะ หากเปรียบเทียบกับ MicroPython แล้ว การใช้ C จะช่วยให้สามารถเข้าถึงรีจิสเตอร์ของ MCU ในระดับต่ำ ใช้พื้นที่หน่วยความจำน้อยกว่า และมีประสิทธิภาพมากกว่า
การตั้งค่า C SDK
การใช้ C SDK เพื่อสร้างแอปพลิเคชัน LED กะพริบนั้นมีหลายตัวเลือก ตัวเลือกแรกคือการศึกษาเอกสาร SDK และทำตามคำแนะนำ ตัวเลือกที่สองคือการใช้ Docker container ที่มีการตั้งค่าล่วงหน้า เพื่อติดตั้งเครื่องมือทั้งหมดที่จำเป็นในการเริ่มต้นโดยอัตโนมัติ ตัวเลือกที่สามคือการติดตั้ง Toolchain และโค้ดตัวอย่าง Raspberry Pi Pico ด้วยตนเอง รวมถึง:
- Git
- Python 3
- Cmake
- gcc-arm-none-eabi \
- libnewlib-arm-none-eabi
การดึงโค้ดตัวอย่าง Raspberry Pi Pico ทำได้โดยการโคลน repo git ของ Raspberry Pi โดยใช้คำสั่งต่อไปนี้:
git clone https://github.com/raspberrypi/pico-sdk /home/sdk/pico-sdk && \
cd /home/sdk/pico-sdk && \
git submodule update --init &&
เมื่อติดตั้งไลบรารีและซอร์สโค้ดเหล่านี้แล้ว ขั้นตอนต่อไปคือการสำรวจและคอมไพล์แอปพลิเคชัน LED กะพริบ
การเขียนแอปพลิเคชันกะพริบครั้งแรก
C SDK มาพร้อมกับตัวอย่างการกะพริบที่นักพัฒนาสามารถใช้สร้างแอปพลิเคชันครั้งแรกของตนได้ โค้ดด้านล่างใช้ LED ออนบอร์ดของ Pico และคำสั่ง PICO_DEFAULT_LED_PIN เพื่อตั้งค่าพิน I/O และกะพริบด้วยการหน่วงเวลา 250 มิลลิวินาที (ms)
คัดลอก
/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "pico/stdlib.h"
int main() {
#ifndef PICO_DEFAULT_LED_PIN
#warning blink example requires a board with a regular LED
#else
const uint LED_PIN = PICO_DEFAULT_LED_PIN;
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
while (true) {
gpio_put(LED_PIN, 1);
sleep_ms(250);
gpio_put(LED_PIN, 0);
sleep_ms(250);
}
#endif
}
โค้ด: Raspberry Pi Pico ใช้คำสั่ง PICO_DEFAULT_LED_PIN เพื่อตั้งค่าพิน I/O และกะพริบด้วยการหน่วงเวลา 250 ms (แหล่งที่มาโค้ด: Raspberry Pi)
จากโค้ดข้างต้น LED_PIN ถูกกำหนดให้เป็นพินเริ่มต้น จากนั้นทำการเรียกไปยัง C gpio API โดย gpio_init ใช้เพื่อเริ่มต้นพิน ในขณะที่ gpio_set_dir ใช้เพื่อตั้งค่า LED_PIN เป็นเอาต์พุต จากนั้นจะมีการสร้างลูปไม่สิ้นสุดที่สวิตช์สถานะของ LED ทุกๆ 250 มิลลิวินาที
การคอมไพล์แอปพลิเคชันนั้นค่อนข้างตรงไปตรงมา ขั้นแรก นักพัฒนาจำเป็นต้องสร้างไดเร็กทอรีสำหรับสร้างในโฟลเดอร์ Raspberry Pi Pico โดยใช้คำสั่งต่อไปนี้:
mkdir build
cd build
ถัดไป ต้องเตรียม cmake สำหรับการสร้างโดยดำเนินการคำสั่งต่อไปนี้:
cmake
ตอนนี้นักพัฒนาสามารถเปลี่ยนเป็นไดเรกทอรีกะพริบและเรียกใช้คำสั่ง make:
cd blink
make
ผลลัพธ์จากกระบวนการสร้างจะเป็นไฟล์ blinky.uf2 สามารถโหลดโปรแกรมที่คอมไพล์แล้วบน Raspberry Pi Pico ได้โดยการกด BOOTSEL pin ค้างไว้แล้วเปิดบอร์ด จากนั้น RP2 จะปรากฏเป็นอุปกรณ์เก็บข้อมูลขนาดใหญ่ นักพัฒนาซอฟต์แวร์จำเป็นต้องลากไฟล์ blinky.uf2 ไปยังไดรฟ์ จากนั้น bootloader จะติดตั้งแอปพลิเคชัน เมื่อเสร็จแล้ว ไฟ LED ควรเริ่มกะพริบ
สรุป
Raspberry Pi Pico เป็นโซลูชันที่น่าสนใจสำหรับนักพัฒนาระบบฝังตัวที่ต้องการความยืดหยุ่นในวงจรการพัฒนา มีตัวเลือกมากมาย รวมถึงโซลูชันแบบสแตนด์อโลนหรือบอร์ดที่มีการเชื่อมต่อแบบไร้สาย นอกจากนี้ ระบบนิเวศยังรองรับ C และ C++ รวมถึง MicroPython ซึ่งนักพัฒนาสามารถเลือกภาษาที่ดีที่สุดสำหรับการใช้งานของพวกเขา จากนั้นใช้ประโยชน์จาก SDK ที่เกี่ยวข้องเพื่อเร่งการพัฒนาซอฟต์แวร์

Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.