เริ่มต้นใช้งานบอร์ดไมโครคอนโทรลเลอร์ Raspberry Pi Pico Multicore โดยใช้ C

By Jacob Beningo

Contributed By DigiKey's North American Editors

ระบบฝังตัวที่จะมีหน่วยไมโครคอนโทรลเลอร์ (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 กลายเป็นโซลูชันยอดนิยมสำหรับทั้งผู้ผลิตและนักพัฒนามืออาชีพ

รูปภาพของ Raspberry Pi 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)

รูปภาพของ Raspberry Pi Pico มีให้เลือกสามแบบรูปที่ 2: Raspberry Pi Pico มีให้เลือกสามแบบ (แหล่งที่มาภาพ: Beningo Embedded Group, LLC)

สำหรับแต่ละเวอร์ชัน ฟุตปริ้นทั่วไปของบอร์ดยังคงเหมือนเดิม การเชื่อมต่อที่ขอบสำหรับบอร์ดประกอบด้วยการเชื่อมต่อที่ขอบ 40 พินสำหรับอุปกรณ์ต่อพ่วงและตัวเลือกการเชื่อมต่อที่แสดงในรูปที่ 3 ซึ่งรวมถึงไฟฟ้า กราวด์ ตัวรับและส่งสัญญาณแบบอะซิงโครนัส (UART), อินพุตและเอาต์พุตเอนกประสงค์ (GPIO), การมอดูเลตปรับความกว้างพัลส์ (PWM), ตัวแปลงแอนะล็อกเป็นดิจิตอล (ADC), การเชื่อมต่อระหว่างอุปกรณ์ต่อพ่วงแบบอนุกรม (SPI), อินเตอร์เฟสวงจรรวม (I2C) และการดีบัก

รูปภาพของจุดเชื่อมต่อแบบขอบของ Raspberry Pi Pico (คลิกเพื่อดูภาพขยาย) รูปที่ 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 ที่เกี่ยวข้องเพื่อเร่งการพัฒนาซอฟต์แวร์

DigiKey logo

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.

About this author

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo เป็นที่ปรึกษาด้านซอฟต์แวร์แบบฝังตัว เขาได้ตีพิมพ์บทความมากกว่า 200 บทความเกี่ยวกับเทคนิคการพัฒนาซอฟต์แวร์แบบฝังตัวเป็นวิทยากรและผู้ฝึกสอนด้านเทคนิคที่เป็นที่ต้องการและสำเร็จการศึกษา 3 ปริญญา รวมถึง ปริญญาโทวิศวกรรมศาสตร์จากมหาวิทยาลัยมิชิแกน

About this publisher

DigiKey's North American Editors