บอร์ด Raspberry Pi Pico ที่เพิ่งเปิดไปไม่นาน และต้องขอบคุณบริษัท Cytron ที่ส่งตัวอย่างมาให้ ฉันจึงมีเวลาเล่นกับบอร์ดโดยใช้โปรแกรมภาษา MicroPython และ C
ฉันเริ่มต้นจากการไปที่เอกสาร และสิ่งที่ฉันต้องการคือหลอด LED บางหลอดกะพริบ และฉันก็จะเริ่มบันทึกด้วยคู่มือการเริ่มต้นใช้งาน Raspberry Pi Pico โดยใช้คอมพิวเตอร์ที่ทำงานอยู่ในระบบปฏิบัติการ Ubuntu 20.04 ซึ่งจะคล้ายกันสำหรับ Windows และ Mac OS
การเตรียมฮาร์ดแวร์
ในทางทฤษฎีแล้ว เราสามารถเริ่มต้นด้วยบอร์ดเพียงอย่างเดียว แต่ฉันจะลองใช้หัวแร้งบัดกรี (Pinecil soldering ironl ) ด้วยตัวจ่ายไฟ MINIX NEO P2 USB-C
หัวแร้งบัดกรีใช้งานได้ดีประมาณหนึ่งนาที แล้วฉันก็เริ่มมีปัญหากับการบัดกรี … มองไปที่หน้าจอเป็น Zzzz และอุณหภูมิลดลง ซึ่งอาจเป็นเพราะไม่ได้ขยับการบัดกรี จึงไม่สามารถตรวจจับกิจกรรมใด ๆได้ และเข้าสู่โหมดสลีป(Sleep)ได้ ฉันจึงเปลี่ยนความไวในการเคลื่อนไหวหรือการหมดเวลาพักเครื่อง สามารถแก้ไขปัญหานี้ได้ง่ายและฉันสามารถทำให้เสร็จได้
แต่น่าเสียดายที่จะไม่ใช้ส่วนหัว (header)เหล่านั้น ดังนั้นฉันจึงใส่ Raspberry Pi Pico ลงในเบรดบอร์ด (bread board) และเพิ่ม LED พร้อมกับวงจรประกอบ
5 โวลต์ เชื่อมต่อกับ VBUS (พิน 40 ขา), GND ถึงพิน 38 ขา และฉันตัดสินใจใช้ GPIO ที่ใกล้เคียงที่สุดกับ LED คือ GP15 (พิน 20 ขา) หมายเลข GPIO บน Raspberry Pi Pico จะแสดงอยู่ที่ด้านล่างของบอร์ดเท่านั้น โดยดูจากแผนภาพพินเอาต์
การตั้งค่าฮาร์ดแวร์เสร็จสมบูรณ์แล้วและสิ่งที่ต้องมีก็คือสาย Micro USB เป็น USB-A เพื่อเชื่อมต่อบอร์ดกับแล็ปท็อป (Laptop)
MicroPython บน Raspberry Pi Pico
เราจึงคัดลอกเฟิร์มแวร์ MicroPython ไปยังบอร์ดก่อน โดยดาวน์โหลดเฟิร์มแวร์ล่าสุดได้จากคู่มือการเริ่มต้นใช้งาน (pico_micropython_20210121.uf2 ) จากนั้นกดปุ่ม BOOTSEL บนบอร์ด ในขณะที่เชื่อมต่อกับคอมพิวเตอร์ด้วยพอร์ต USB และปล่อยปุ่มหลังจากการเชื่อมต่อ แต่ไม่มีอะไรเกิดขึ้น นั่นเป็นเพราะฉันใช้สาย USB ของไฟหน้าจักรยานซึ่งขาดสายข้อมูล…ดังนั้นจึงเลือกสายไมโคร USB เป็น USB-Type-A ที่เหมาะสมและ Raspberry Pi Pico ได้รับการยอมรับอย่างถูกต้องบนแล็ปท็อป
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[422070.155550] usb 1-2: new full-speed USB device number 16 using xhci_hcd [422070.330829] usb 1-2: New USB device found, idVendor=2e8a, idProduct=0003, bcdDevice= 1.00 [422070.330836] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [422070.330839] usb 1-2: Product: RP2 Boot [422070.330842] usb 1-2: Manufacturer: Raspberry Pi [422070.330845] usb 1-2: SerialNumber: E0C912D24340 [422070.415044] usb-storage 1-2:1.0: USB Mass Storage device detected [422070.415349] scsi host2: usb-storage 1-2:1.0 [422070.415538] usbcore: registered new interface driver usb-storage [422070.418743] usbcore: registered new interface driver uas [422071.551633] usb 1-2: reset full-speed USB device number 16 using xhci_hcd [422071.727779] scsi 2:0:0:0: Direct-Access RPI RP2 1 PQ: 0 ANSI: 2 [422071.728263] sd 2:0:0:0: Attached scsi generic sg2 type 0 [422071.728572] sd 2:0:0:0: [sdc] 262144 512-byte logical blocks: (134 MB/128 MiB) [422071.729857] sd 2:0:0:0: [sdc] Write Protect is off [422071.729860] sd 2:0:0:0: [sdc] Mode Sense: 03 00 00 00 [422071.731895] sd 2:0:0:0: [sdc] No Caching mode page found [422071.731900] sd 2:0:0:0: [sdc] Assuming drive cache: write through [422071.767149] sdc: sdc1 [422071.771908] sd 2:0:0:0: [sdc] Attached SCSI removable disk |
.. และติดตั้งเป็นอุปกรณ์จัดเก็บข้อมูลขนาดใหญ่ RPI-RP2
หลังจากคัดลอกไฟล์ pico_micropython_20210121.uf2 ไปยังไดรฟ์แล้ว ไฟล์จะยกเลิกการต่อเชื่อมโดยอัตโนมัติ และบอร์ด Pico จะรีบูตเป็นอุปกรณ์แบบอนุกรม:
1 2 3 4 5 6 7 |
[422425.812363] usb 1-2: new full-speed USB device number 19 using xhci_hcd [422425.990450] usb 1-2: New USB device found, idVendor=2e8a, idProduct=0005, bcdDevice= 1.00 [422425.990459] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [422425.990463] usb 1-2: Product: Board in FS mode [422425.990466] usb 1-2: Manufacturer: MicroPython [422425.990470] usb 1-2: SerialNumber: 000000000000 [422426.016529] cdc_acm 1-2:1.0: ttyACM0: USB ACM device |
ณ จุดนี้คู่มือเริ่มต้นใช้งานบนเว็บไซต์ Raspberry Pi จะไม่มีประโยชน์และเราต้องเปลี่ยนเอกสาร Python SDK (PDF)
เอกสารประกอบใช้มินิคอม (minicom) สำหรับคอนโซลที่เป็นอนุกรม แต่ตอนนี้ฉันชอบ Bootterm มากกว่าเพราะมันใช้ง่ายกว่า แต่ไม่ว่าจะเป็นแบบใด หากคุณตั้งโปรแกรมบอร์ดใน Linux ต้องตรวจสอบให้แน่ใจว่ามีการเพิ่มผู้ใช้ปัจจุบันของคุณในกลุ่ม dialout หรือคุณจะต้องเรียกใช้โปรแกรมทั้งหมดในฐานะรูท (root):
1 |
sudo usermod -a -G dialout $(whoami) |
Bootterm ตรวจพบพอร์ต ttyACM0 อย่างถูกต้องดังนั้นฉันจึงเรียกใช้“ bt” เพื่อเข้าถึงอินเทอร์เฟซ MicroPython REPL และพิมพ์คำสั่ง MicroPython
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ bt -l port | age (sec) | device | driver | description ------+------------+------------+------------------+---------------------- * 0 | 29 | ttyACM0 | cdc_acm | Board CDC $ bt No port specified, using ttyACM0 (last registered). Use -l to list ports. Trying port ttyACM0... Connected to ttyACM0 at 115200 bps. Escape character is 'Ctrl-]'. Use escape followed by '?' for help. >>> print("Hello, Pico!") Hello, Pico! >>> from machine import Pin >>> led = Pin(25, Pin.OUT) >>> led.value(1) >>> led2 = Pin(15, Pin.OUT) >>> led2.value(1) >>> |
ฉันสามารถเปิดหลอดLED ออนบอร์ด (GP25) ได้ แต่เมื่อฉันทำเช่นเดียวกันกับ หลอดLED บนเบรดบอร์ด (GP15) มันไม่ทำงาน ฉันตรวจสอบวงจรของฉันอีกครั้งและใช้มัลติมิเตอร์เพื่อตรวจสอบระดับแรงดันไฟฟ้าและพบว่า GP25 ยังคงถูกดึงต่ำ จากการค้นหาเว็บพบว่า GP15 ถูกปิดใช้งานใน CircuitPython เนื่องจากจะรบกวนจากอินเทอร์เฟซ USB
นี่เป็นสาเหตุหนึ่งที่ไม่ควรใช้ GP15 โดยใช้อุปกรณ์ต่อพ่วง USB
อืม…ฉันคิดว่ามันเหมือนกันสำหรับ MicroPython ดังนั้นฉันจึงเปลี่ยนไปใช้พินข้างเคียง (GP14, พิน 19 ขา)
1 2 |
>>> led2 = Pin(14, Pin.OUT) >>> led2.value(1) |
และแน่นอนว่ามันได้ผล! หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ MicroPyton API ให้กด Ctrl + B แล้วพิมพ์ help ():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
>>> raw REPL; CTRL-B to exit > MicroPython v1.13-290-g556ae7914 on 2021-01-21; Raspberry Pi Pico with RP2040 Type "help()" for more information. >>> help() Welcome to MicroPython! For online help please visit https://micropython.org/help/. For access to the hardware use the 'machine' module. RP2 specific commands are in the 'rp2' module. Quick overview of some objects: machine.Pin(pin) -- get a pin, eg machine.Pin(0) machine.Pin(pin, m, [p]) -- get a pin and configure it for IO mode m, pull mode p methods: init(..), value([v]), high(), low(), irq(handler) machine.ADC(pin) -- make an analog object from a pin methods: read_u16() machine.PWM(pin) -- make a PWM object from a pin methods: deinit(), freq([f]), duty_u16([d]), duty_ns([d]) machine.I2C(id) -- create an I2C object (id=0,1) methods: readfrom(addr, buf, stop=True), writeto(addr, buf, stop=True) readfrom_mem(addr, memaddr, arg), writeto_mem(addr, memaddr, arg) machine.SPI(id, baudrate=1000000) -- create an SPI object (id=0,1) methods: read(nbytes, write=0x00), write(buf), write_readinto(wr_buf, rd_buf) machine.Timer(freq, callback) -- create a software timer object eg: machine.Timer(freq=1, callback=lambda t:print(t)) Pins are numbered 0-29, and 26-29 have ADC capabilities Pin IO modes are: Pin.IN, Pin.OUT, Pin.ALT Pin pull modes are: Pin.PULL_UP, Pin.PULL_DOWN Useful control commands: CTRL-C -- interrupt a running program CTRL-D -- on a blank line, do a soft reset of the board CTRL-E -- on a blank line, enter paste mode For further help on a specific object, type help(obj) For a list of available modules, type help('modules') |
เราสามารถออกจาก bootterm ด้วย“ Ctrl +]” ตามด้วย“ q” แต่ถ้าเราต้องการบันทึกโปรแกรม Python บนบอร์ดและเรียกใช้โดยอัตโนมัติล่ะ? ฉันอาจจะพลาดสิ่งนั้นในเอกสาร Python SDK ดังนั้นฉันจึงต้องข้ามไปยังคู่มือที่สาม คือการใช้ Thonny เพื่อค้นหาวิธีที่ดีที่สุด
Ubuntu 20.04 มี Thonny 3.2.7 ในพื้นที่เก็บข้อมูลซึ่งเราสามารถติดตั้งด้วย sudo apt install thonny ได้ แต่ไม่รองรับ Raspberry Pi Pico ดังนั้นฉันจึงติดตั้งโปรแกรมเวอร์ชันล่าสุด (v3.3.3) ด้วย pip3 แทน:
1 |
pip3 install thonny |
จากนั้นไปที่ Run-> Select interpreter …เพื่อเลือก“ MicroPython (Raspberry Pi Pico)“
จากอินเทอร์เฟซผู้ใช้ ฉันสามารถพิมพ์รหัสเพื่อปิดหลอด LED ออนบอร์ดได้:
เพื่อที่จะให้หลอดLED กะพริบออนบอร์ด และหลอด LED บนเบรดบอร์ดด้วยเวลาหนึ่งวินาที ฉันคัดลอกและแก้ไขโค้ดบางส่วนจากเอกสาร Python SDKได้:
1 2 3 4 5 6 7 8 9 10 11 12 |
from machine import Pin, Timer led = Pin(25, Pin.OUT) led2 = Pin(14, Pin.OUT) led.value(0) led2.value(1) tim = Timer() def tick(timer): global led, led2 led.toggle() led2.toggle() tim.init(freq=1, mode=Timer.PERIODIC, callback=tick) |
ฉันบันทึกไฟล์เป็น blink.py บนพีซีของฉันและมันก็ทำงานได้ดี แต่ถ้าคุณต้องการเรียกใช้โค้ดโดยไม่ใช้พีซี คุณสามารถบันทึกลงใน Raspberry Pi Pico ได้ คลิกที่ไฟล์ -> บันทึกสำเนาจากนั้นคลิกที่ปุ่ม“ Raspberry Pi Pico”
และบันทึกโปรแกรมเป็น main.py ตอนนี้คุณสามารถเรียกใช้โปรแกรมโดยอัตโนมัติ โดยเชื่อมต่อบอร์ดของคุณกับแหล่งจ่ายไฟ USB ใดก็ได้
ภาษาC/C++ บน Raspberry Pi Pico
ลองใช้ “ภาษาC/C++ SDK” ซึ่งโดยพื้นฐานแล้วเป็นภาษา C ทั้งหมด ยกเว้นเครื่องมือบางอย่างที่เขียนด้วย C++ เราสามารถย้อนกลับไปที่เอกสารการเริ่มต้นใช้งาน ซึ่งจะคัดลอก blink.uf2 เป็น Raspberry Pi Pico ขณะอยู่ในโหมดบูตและจะกะพริบ LED บนบอร์ด ใช้งานได้และง่ายมากเนื่องจากไบนารีถูกสร้างไว้ล่วงหน้า แต่สิ่งที่เราต้องการทำจริงๆคือ การแก้ไขซอร์สโค้ดและสร้างไบนารีของเราเอง เพื่อกะพริบทั้ง LED ภายในและภายนอก
ดังนั้นเราจะต้องติดตั้งภาษา C/C++ SDK การอ้างอิงและตัวอย่างดังต่อไปนี้:
1 2 3 4 5 6 |
sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential git clone https://github.com/raspberrypi/pico-sdk cd pico-sdk git submodule update --init cd .. git clone -b master https://github.com/raspberrypi/pico-examples.git |
เราสามารถดูตัวอย่างการกะพริบได้ในตัวอย่าง pico / blink / blink.c:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/** * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */ #include "pico/stdlib.h" int main() { const uint LED_PIN = 25; 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); } } |
ดี, ก่อนที่เราจะแก้ไขเราควรพยายามสร้างโดยส่งออกเส้นทาง SDK ก่อนและกำหนดค่าการสร้าง:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ cd pico-examples/blink $ export PICO_SDK_PATH=../../pico-sdk $ cmake .. Using PICO_SDK_PATH from environment ('../../pico-sdk') Pico SDK is located at /home/jaufranc/edev/sandbox/pico-sdk Defaulting PICO_PLATFORM to rp2040 since not specified. Defaulting PICO platform compiler to pico_arm_gcc since not specified. -- Defaulting build type to 'Release' since not specified. PICO compiler is pico_arm_gcc PICO_GCC_TRIPLE defaulted to arm-none-eabi -- The C compiler identification is GNU 9.2.1 -- The CXX compiler identification is GNU 9.2.1 -- The ASM compiler identification is GNU -- Found assembler: /usr/bin/arm-none-eabi-gcc Defaulting PICO target board to pico since not specified. Using board configuration from /home/jaufranc/edev/sandbox/pico-sdk/src/boards/include/boards/pico.h -- Found Python3: /usr/bin/python3.8 (found version "3.8.5") found components: Interpreter TinyUSB available at /home/jaufranc/edev/sandbox/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040; adding USB support. -- Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE) ELF2UF2 will need to be built PIOASM will need to be built -- Configuring done -- Generating done -- Build files have been written to: /home/jaufranc/edev/sandbox/pico-examples/blink |
ตอนนี้เราสามารถเข้าสู่ไดเร็กทอรี blink (อันใหม่สร้างโดย cmake) และเรียกใช้ make:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ cd blink $ make -j8 Scanning dependencies of target ELF2UF2Build Scanning dependencies of target bs2_default [ 0%] Creating directories for 'ELF2UF2Build' [ 0%] No download step for 'ELF2UF2Build' [ 0%] No patch step for 'ELF2UF2Build' [ 0%] No update step for 'ELF2UF2Build' [ 0%] Building ASM object pico_sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/boot2_w25q080.S.obj [ 0%] Performing configure step for 'ELF2UF2Build' [ 0%] Linking ASM executable bs2_default.elf [ 0%] Built target bs2_default ... [ 50%] Building CXX object blink/CMakeFiles/blink.dir/home/jaufranc/edev/sandbox/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj [ 50%] Building C object blink/CMakeFiles/blink.dir/home/jaufranc/edev/sandbox/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj [100%] Building C object blink/CMakeFiles/blink.dir/home/jaufranc/edev/sandbox/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj [100%] Building C object blink/CMakeFiles/blink.dir/home/jaufranc/edev/sandbox/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj [100%] Linking CXX executable blink.elf [100%] Built target blink |
ตอนนี้เรามีไฟล์มากมาย:
1 2 3 4 5 6 7 8 9 10 11 12 |
jaufranc@cnx-laptop-4:~/edev/sandbox/pico-examples/blink/blink$ ls -l total 636 -rwxrwxr-x 1 jaufranc jaufranc 12696 Jan 24 11:42 blink.bin -rw-rw-r-- 1 jaufranc jaufranc 197019 Jan 24 11:42 blink.dis -rwxrwxr-x 1 jaufranc jaufranc 204232 Jan 24 11:42 blink.elf -rw-rw-r-- 1 jaufranc jaufranc 172574 Jan 24 11:42 blink.elf.map -rw-rw-r-- 1 jaufranc jaufranc 35778 Jan 24 11:42 blink.hex -rw-rw-r-- 1 jaufranc jaufranc 25600 Jan 24 11:42 blink.uf2 drwxrwxr-x 4 jaufranc jaufranc 4096 Jan 24 11:41 CMakeFiles -rw-rw-r-- 1 jaufranc jaufranc 1004 Jan 24 11:39 cmake_install.cmake drwxrwxr-x 4 jaufranc jaufranc 4096 Jan 24 11:39 elf2uf2 -rw-rw-r-- 1 jaufranc jaufranc 89141 Jan 24 11:39 Makefile |
สิ่งที่สำคัญที่สุดคือ blink.uf2 ที่เราสามารถคัดลอกไปยัง Raspberry Pi Pico เพื่อเรียกใช้โปรแกรมและ blink.elf ที่สามารถใช้โดยดีบักเกอร์ (OpenOCD + GDB) แต่นั่นอยู่นอกขอบเขตของคู่มือเริ่มต้นใช้งานนี้
ตอนนี้เรารู้วิธีรวบรวมโปรแกรม ภาษาC สำหรับบอร์ด Pico แล้วเรามาปรับเปลี่ยนตัวอย่าง blink.c เพื่อเปิดและปิด หลอดLED ออนบอร์ดและ หลอดLED ภายนอกที่เชื่อมต่อกับพิน 14 ขา
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include "pico/stdlib.h" int main() { const uint LED_PIN = 25; /* onboard LED */ const uint LED2_PIN = 14; /* external LED */ gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); gpio_init(LED2_PIN); gpio_set_dir(LED2_PIN, GPIO_OUT); while (true) { gpio_put(LED_PIN, 1); gpio_put(LED2_PIN, 0); sleep_ms(1000); gpio_put(LED_PIN, 0); gpio_put(LED2_PIN, 1); sleep_ms(1000); } } |
และสร้างโปรแกรมอีกครั้ง:
1 2 |
cd blink make |
จากนั้นเข้าสู่โหมดบูตและคัดลอก blink.uf2 ไปที่บอร์ดและประสบความสำเร็จ!
เราสามารถบรรลุผลลัพธ์เดียวกันได้ด้วยโปรแกรมภาษา C หรือ Python เราจะดูอินเทอร์เฟซ PIO (Programmable IO) ของ RP2040 เป็นสิ่งที่ทำให้ Raspberry Pi RP2040 แตกต่างจากไมโครคอนโทรลเลอร์อื่น ๆ มากที่สุด
ฉันต้องขอขอบคุณบริษัท Cytron ที่ส่ง บอร์ดPico ของ Raspberry Pi มาให้ตรวจสอบ หากคุณอาศัยอยู่ในอาเซียนคุณสามารถซื้อบอร์ดได้ในราคา $ 4.98 หรือหากคุณมีเวลาพอสมควรจะเสนอบอร์ดผู้ให้บริการ $ 5 สำหรับ Raspberry Pi Pico ในราคาเดียวกันกับบอร์ดที่บัดกรีแล้ว ซึ่งคาดว่าจะจัดส่งในเดือนกุมภาพันธ์ อันดับ 10 และวางจำหน่ายทั่วโลกไม่ใช่เฉพาะในอาเซียน
แปลจากบทความภาษาอังกฤษ Getting Started with Raspberry Pi Pico using MicroPython and C
บรรณาธิการข่าวและบทความภาษาไทย CNX Software ได้มีความสนใจในด้านเทคโนโลยี โดยเฉพาะ Smart Home และ IoT