Mục lục
Raspberry Pi Pico là bo vi điều khiển rẻ nhất trong hệ sinh thái Raspberry Pi, nhưng nó không phải một chiếc máy tính thu nhỏ. Không hệ điều hành, không màn hình, không SSH. Cắm điện là chương trình trong bộ nhớ chạy ngay, chỉ vài mili giây, và đó là lý do dòng bo này thành lựa chọn mặc định cho các dự án cần điều khiển phần cứng thật: đọc cảm biến, bật relay, quay động cơ bước, đếm xung encoder.
Bài này đi từ con số 0 đến một mạch LED hoàn chỉnh: nhận diện bo, hiểu sơ đồ chân, nạp MicroPython bằng Thonny, chạy chương trình đầu tiên, điều khiển LED onboard rồi dựng mạch ba LED trên breadboard. Phần cuối là bảng xử lý sự cố cho những lỗi người mới gặp nhiều nhất và cách chọn giữa các phiên bản Raspberry Pi Pico đang bán.
Raspberry Pi Pico là gì
Raspberry Pi Pico dùng chip RP2040, vi điều khiển đầu tiên do chính Raspberry Pi thiết kế. Thông số cần nhớ: hai nhân Arm Cortex-M0+ chạy tới 133 MHz, 264 KB SRAM, 2 MB flash QSPI gắn trên bo, 26 chân GPIO trong đó ba chân có ADC 12 bit (500 nghìn mẫu/giây), 2 UART, 2 SPI, 2 I2C, 16 kênh PWM, USB 1.1 và 8 máy trạng thái PIO. Bo đo 21 x 51 mm, mép có lỗ bán nguyệt để hàn trực tiếp lên board mạch in khác.
Khác biệt lớn nhất so với Raspberry Pi 4 hay Pi 5: máy tính nhúng chạy hệ điều hành, khởi động mất vài chục giây, tắt điện đột ngột là hỏng thẻ nhớ. Raspberry Pi Pico chạy trực tiếp chương trình, không có gì để hỏng khi mất điện, và đánh thức được từ chế độ ngủ bằng một ngắt ngoài. Với dự án chạy pin nhiều tháng, khoảng cách về điện năng tiêu thụ là hàng trăm lần.
Chuẩn bị
Mức tối thiểu chỉ gồm hai thứ: một bo Raspberry Pi Pico và một cáp Micro-USB có truyền dữ liệu. Nếu làm phần LED của bài thì thêm breadboard, ba LED 5 mm, ba điện trở 330 ohm và một ít dây jumper. Thiếu cáp đúng chuẩn thì lấy cáp nguồn USB-A sang Micro USB 1 m, còn breadboard thì dùng đế test 400 lỗ là vừa đủ cho cả bo lẫn ba LED.
Nên chọn bản Pico H vì header 40 chân đã hàn sẵn. Bản Pico trơn rẻ hơn vài chục nghìn nhưng phải tự hàn, và mối hàn đầu tiên của người mới thường không đủ chắc để cắm vào breadboard. Bản Pico W có Wi-Fi nhưng người mới chưa dùng tới trong vài tuần đầu.
Một lưu ý hay gây mất thời gian: rất nhiều cáp Micro-USB ngoài thị trường chỉ có hai dây nguồn, không có dây dữ liệu. Cắm vào thì bo lên đèn nhưng máy tính không thấy thiết bị nào. Nếu làm đúng mọi bước mà vẫn không thấy ổ RPI-RP2, thử ngay một cáp khác trước khi nghi ngờ bo.
Sơ đồ chân Raspberry Pi Pico
Hai bên bo Raspberry Pi Pico là 40 chân, đánh số từ 1 đến 40 ngược chiều kim đồng hồ, bắt đầu từ chân trên cùng bên trái khi nhìn từ mặt có chip. Trong 40 chân đó chỉ có 26 chân là GPIO thật (GPIO0 đến GPIO25), phần còn lại là nguồn và đất. Ba nhóm màu cần phân biệt trên sơ đồ chân Raspberry Pi Pico chính thức:
- Xanh lá: chân GPIO, dùng làm đầu vào hoặc đầu ra tùy cấu hình trong code
- Đỏ: chân nguồn, dùng nhiều nhất là 3V3(OUT) – đầu ra 3,3 V từ mạch buck-boost trên bo, cấp cho cảm biến và module ngoài
- Đen: GND. Có tới tám chân GND rải khắp bo, nối tất cả về cùng một điểm đất
Ba chân hay dùng: VBUS là 5 V lấy trực tiếp từ cổng USB, VSYS là đầu vào nguồn chính chịu được 1,8 đến 5,5 V nên rất tiện khi chạy pin, 3V3_EN dùng để tắt nguồn 3,3 V bằng tín hiệu ngoài. Riêng GPIO25 không đưa ra mép bo mà nối thẳng vào LED nhỏ trên mạch, nên chương trình phần cứng đầu tiên của hầu hết tài liệu Raspberry Pi Pico đều là bật LED onboard.
Cài Thonny và nạp MicroPython
Raspberry Pi Pico lập trình được bằng C/C++ với SDK chính thức, bằng Arduino, bằng CircuitPython, nhưng MicroPython phổ biến nhất vì cú pháp giống Python 3 và mọi ví dụ trên mạng đều dùng nó. MicroPython là bản Python 3 rút gọn, bỏ phần lớn thư viện chuẩn để nhét vừa vài trăm KB flash của vi điều khiển. Công cụ soạn thảo là Thonny, một IDE nhẹ, và quan trọng nhất: nó có sẵn chức năng nạp firmware cho bo, không cần dùng dòng lệnh.
Cài Thonny
Vào thonny.org, tải bản dành cho hệ điều hành đang dùng. Với Windows 10/11 64 bit thì chọn bản 64 bit, trang web sẽ tự gợi ý. Cứ để mặc định trong lúc cài, mất chưa tới một phút. Trên Linux cần thêm quyền nhóm dialout để mở được cổng USB. Cài xong, gõ Thonny ở Start Menu là mở được chương trình.
Đưa bo vào chế độ nạp firmware
Cắm cáp Micro-USB vào bo trước, đầu còn lại chưa cắm vào máy tính. Tìm nút BOOTSEL hình bầu dục màu trắng trên mặt bo, giữ nút đó, đồng thời cắm đầu USB còn lại vào máy tính, giữ thêm khoảng một giây rồi thả ra.
Lúc này bo không chạy chương trình nào cả. Nó khởi động vào bootloader UF2 có sẵn trong ROM của RP2040 và hiện ra với máy tính như một ổ USB tên RPI-RP2. Đây là cơ chế nạp firmware của dòng RP2040: không cần đầu nạp, không cần phần mềm riêng, chỉ cần copy một tệp .uf2 vào ổ đó, bootloader tự ghi vào flash và khởi động lại.
Nạp MicroPython bằng Thonny
Trong Thonny, nhìn góc dưới bên phải cửa sổ, sẽ thấy dòng chữ dạng MicroPython (Raspberry Pi Pico) kèm tên cổng COM. Bấm vào đó, chọn Install MicroPython. Hộp thoại yêu cầu ba thông tin: ổ đích (RPI-RP2), dòng chip (RP2) và biến thể bo. Chọn Raspberry Pi Pico / Pico H, để phiên bản firmware mới nhất, bấm Install.
Con số phiên bản trong ảnh chỉ đúng ở thời điểm bài gốc được viết; MicroPython hiện đã lên các bản 1.2x và danh sách biến thể trong Thonny mới có thêm Pico 2, Pico 2 W. Nếu không thấy đúng bo đang dùng, cách chắc chắn hơn là tải tệp .uf2 từ trang chủ MicroPython rồi kéo thả vào ổ RPI-RP2 trong File Explorer, kết quả giống hệt nhau.
Nạp xong, bo tự khởi động lại. Vào Run, chọn Configure interpreter, đặt dòng đầu là MicroPython (Raspberry Pi Pico) và chọn đúng cổng COM. Nếu danh sách cổng có nhiều mục, ghi lại các cổng đang có, rút bo ra, mở lại hộp thoại – cổng nào biến mất chính là cổng của Raspberry Pi Pico.
Khi mọi thứ đúng, cột trái của Thonny hiện cây tệp của Raspberry Pi Pico, khung Shell bên dưới hiện thông tin firmware. Từ đây bo hoạt động như một ổ đĩa nhỏ: tệp boot.py chạy mỗi lần cấp nguồn, tệp main.py chạy ngay sau đó. Muốn bo tự chạy chương trình khi rút khỏi máy tính, lưu code vào main.py trên bo.
Chương trình đầu tiên
Bài kiểm tra nhỏ nhất để chắc chắn toàn bộ đường truyền hoạt động: in một chuỗi ký tự ra Shell. Gõ hoặc dán dòng sau vào khung soạn thảo phía trên, rồi bấm nút Run màu xanh:
print("This is my Pico talking")
Kết quả hiện ở khung Shell bên dưới, đúng nguyên văn chuỗi vừa nhập. Hai điểm cần nhớ ngay từ dòng code đầu tiên: chuỗi ký tự luôn nằm trong cặp nháy kép và bên trong cặp ngoặc đơn, và Python phân biệt hoa thường – print viết thường, không phải Print.
Hàm print là công cụ gỡ lỗi rẻ nhất khi làm việc với Raspberry Pi Pico. Không có màn hình, không có log hệ thống, nên muốn biết chương trình dừng ở đâu hay biến đang giữ giá trị gì thì in nó ra Shell. Người mới thường bỏ qua bước này rồi mất hàng giờ đoán mò.
Điều khiển LED onboard
GPIO có hai chế độ: đầu vào và đầu ra. Đầu vào dùng khi có thứ gì đó gửi tín hiệu vào bo – nút bấm, cảm biến, xung encoder. Đầu ra dùng khi bo điều khiển thứ khác – LED, buzzer, relay. LED onboard là ví dụ gọn nhất của đầu ra trên Raspberry Pi Pico: một chân GPIO, một mức điện áp, không có linh kiện ngoài.
Cần import lớp Pin từ module machine để dùng được GPIO trên Raspberry Pi Pico. Import trong MicroPython giống Python: kéo code từ module khác vào, chỉ khác là các module ở đây gắn chặt với phần cứng. Với bo Pico và Pico H, LED nối với GPIO25:
from machine import Pin onboardLED = Pin(25, Pin.OUT) onboardLED.value(1)
Ba dòng, ba việc: lấy lớp Pin, khai báo GPIO25 là đầu ra và đặt tên cho nó là onboardLED, rồi gán giá trị 1 – tức mức cao, LED sáng. Đổi số 1 thành 0 rồi chạy lại, LED tắt. Trên Raspberry Pi Pico, 1 luôn là bật và 0 luôn là tắt.
Với Pico W, đoạn code trên không sáng đèn. Trên Raspberry Pi Pico W, LED không nối vào GPIO25 mà nối vào một chân của chip không dây CYW43439, và MicroPython đặt tên cho chân đó là LED. Cách viết đúng:
from machine import Pin
onboardLED = Pin('LED', Pin.OUT)
onboardLED.value(1)
Đây là lỗi rất hay gặp: chép code từ bài hướng dẫn Raspberry Pi Pico bản thường rồi chạy trên Pico W, thấy không có phản ứng gì và tưởng bo hỏng. Chỉ cần đổi số 25 thành chuỗi 'LED', kể cả cặp nháy đơn. Cách viết Pin('LED', ...) cũng chạy được trên Pico 2 W vì firmware xử lý tên chân đặc biệt này.
Mạch 3 LED trên breadboard
Trước khi cắm dây, rút cáp USB ra. Nguyên tắc khi làm mạch với Raspberry Pi Pico: mọi thay đổi phần cứng đều thực hiện khi bo đã mất điện, vì chập chân nguồn xuống đất trong lúc bo đang chạy có thể làm hỏng chân GPIO hoặc cả chip.
Breadboard hoạt động thế nào
Breadboard có hai ray ngang chạy dọc hai bên, ký hiệu màu đỏ và xanh. Toàn bộ lỗ trên một ray đỏ nối với nhau, tương tự với ray xanh, nhưng ray bên trái và bên phải hoàn toàn tách rời. Người ta dùng ray đỏ cho nguồn và ray xanh cho GND.
Phần giữa là các rãnh dọc, mỗi rãnh gồm năm lỗ nối liền, và rãnh giữa chia breadboard làm hai nửa không thông nhau. Hiểu đúng hai quy tắc này là đủ để không phải hỏi tại sao mạch không chạy: linh kiện cắm cùng một rãnh dọc thì nối với nhau, khác rãnh hoặc khác nửa thì không. Ấn Raspberry Pi Pico xuống hết cỡ sao cho không còn nhìn thấy phần kim loại của chân header, và bo phải bắc qua rãnh giữa, mỗi bên header nằm trên một nửa breadboard.
Đấu LED và điện trở
Đặt ba LED xuống nửa dưới của breadboard, cách nhau một lỗ, chân dài quay sang phải. Chân dài là anode (cực dương), chân ngắn là cathode (cực âm), nhìn kỹ sẽ thấy một cạnh phẳng ở phía chân ngắn. LED phân cực, cắm ngược thì không sáng, và đây là lỗi số một của người mới.
Mỗi LED cần một điện trở nối tiếp để giới hạn dòng. Tính nhanh: chân GPIO của Raspberry Pi Pico phát 3,3 V, LED đỏ sụt áp khoảng 2,0 V, còn lại 1,3 V rơi trên điện trở. Với 330 ohm, dòng qua LED là 1,3 chia 330, tức khoảng 4 mA – đủ sáng rõ trong nhà và an toàn cho chân GPIO. Bỏ điện trở, dòng chỉ bị giới hạn bởi nội trở của chân chip, LED có thể cháy và chân GPIO hỏng vĩnh viễn. Đặt điện trở từ chân trái của mỗi LED xuống ray xanh phía dưới; ray này sẽ nối về GND nên toàn bộ cathode chung một điểm đất.
Dùng một dây jumper nối ray xanh về chân GND của bo, chân vật lý số 38 là lựa chọn thuận tay vì nằm cùng phía. Ba dây còn lại nối chân phải của từng LED lên ba chân GPIO: LED xanh lá vào GPIO18 (chân 24), LED vàng vào GPIO19 (chân 25), LED đỏ vào GPIO20 (chân 26). Màu dây không ảnh hưởng gì đến hoạt động, nhưng nên giữ thói quen đen cho GND và đỏ cho nguồn để sau này đọc lại mạch không bị nhầm.
Code điều khiển ba LED
Đoạn code dưới đây bật cả ba LED, đợi 5 giây rồi tắt. Nó cần thêm module time, module tạo độ trễ trong chương trình – thứ gần như dự án Raspberry Pi Pico nào cũng dùng, từ nhấp nháy LED đến chờ cảm biến ổn định sau khi cấp nguồn.
from machine import Pin import time led1 = Pin(18, Pin.OUT) led2 = Pin(19, Pin.OUT) led3 = Pin(20, Pin.OUT) led1.value(1) led2.value(1) led3.value(1) time.sleep(5) led1.value(0) led2.value(0) led3.value(0)
Chạy xong, đổi thứ tự các dòng value() thành hiệu ứng chạy lần lượt trên ba LED, hoặc thay time.sleep(5) bằng time.sleep(0.2) trong một vòng lặp while True để có đèn nháy. Code mẫu chỉ là điểm xuất phát, giá trị nằm ở việc sửa nó và quan sát phần cứng phản ứng.
Làm mờ LED bằng PWM
Bật và tắt là mức thấp nhất của điều khiển. Muốn LED sáng yếu, sáng mạnh hay mờ dần, cần điều chế độ rộng xung (PWM): chân GPIO của Raspberry Pi Pico bật tắt rất nhanh, tỷ lệ thời gian bật quyết định độ sáng trung bình. RP2040 có 16 kênh PWM độc lập, mỗi kênh chia sẻ giữa hai chân GPIO. Ví dụ mở rộng, cho LED ở GPIO18 mờ dần:
from machine import Pin, PWM
import time
led = PWM(Pin(18))
led.freq(1000)
while True:
for duty in range(0, 65536, 2048):
led.duty_u16(duty)
time.sleep_ms(20)
duty_u16 nhận giá trị từ 0 đến 65535, trong đó 0 là tắt hoàn toàn và 65535 là sáng hết mức. Tần số 1000 Hz đủ cao để mắt không thấy nhấp nháy. Với động cơ DC thì cần tần số thấp hơn, khoảng 50 đến 100 Hz, và phải qua mạch cầu H vì chân GPIO không đủ dòng.
Xử lý sự cố
Bảng dưới tổng hợp các lỗi gặp nhiều nhất khi mới làm quen với Raspberry Pi Pico, xếp theo thứ tự từ lúc cắm cáp đến lúc mạch chạy.
| Hiện tượng | Nguyên nhân | Cách xử lý |
|---|---|---|
| Máy tính không thấy ổ RPI-RP2 | Cáp chỉ có hai dây nguồn, hoặc thả nút BOOTSEL trước khi cắm cáp | Đổi sang cáp có truyền dữ liệu; giữ nút BOOTSEL rồi mới cắm cáp, giữ thêm một giây sau khi cắm |
| Thonny báo không tìm thấy cổng, danh sách cổng trống | Chưa nạp firmware MicroPython, hoặc chọn sai cổng trong Configure interpreter | Nạp lại MicroPython, rút cắm lại cáp, mở Configure interpreter và chọn đúng cổng COM |
| Nạp firmware lỗi SSL, không kết nối được tới server | Mạng chặn HTTPS, proxy nội bộ, chứng chỉ hết hạn | Tải tệp .uf2 từ trang MicroPython rồi kéo thả vào ổ RPI-RP2, cách này không cần mạng trong Thonny |
| Nút Run không phản hồi gì | Chưa chọn đúng interpreter nên Thonny chạy code trên máy tính | Run > Configure interpreter, đặt MicroPython (Raspberry Pi Pico), chọn lại cổng |
| Code chạy nhưng không thấy gì trong Shell | Cửa sổ Shell bị thu gọn, hoặc tệp chưa được lưu | View > Shell để mở lại; lưu tệp trước khi bấm Run |
| LED onboard không sáng dù code đúng | Đang dùng Pico W nhưng khai báo Pin(25) |
Đổi thành Pin('LED', Pin.OUT) vì LED trên bản W nối qua chip không dây |
| LED ngoài không sáng, bo vẫn chạy bình thường | Cắm ngược chiều LED, sai chân GPIO, hoặc quên nối ray xanh về GND | Chân dài là anode, nối về GPIO qua điện trở; kiểm tra dây GND bằng đồng hồ vạn năng ở chế độ thông mạch |
| LED sáng rất yếu hoặc bo nóng, tự reset | Thiếu điện trở hạn dòng, hoặc chập ray nguồn với ray GND | Thêm điện trở 330 ohm cho mỗi LED, rút cáp và kiểm tra lại dây trước khi cấp nguồn |
| Rút cáp ra cắm lại, bo chạy chương trình cũ | Tệp main.py trên bo tự chạy mỗi lần cấp nguồn |
Xóa hoặc đổi tên main.py trong cây tệp của bo ở cột trái Thonny |
Ứng dụng thực tế
Ba LED là bài tập, nhưng kiến trúc đằng sau nó mở ra gần như toàn bộ phần nhúng trên Raspberry Pi Pico. Cùng một cách khai báo chân, thay LED bằng relay là có mạch điều khiển thiết bị 220 V (nhớ dùng optocoupler cách ly, đừng nối relay trực tiếp vào GPIO). Thay bằng MOSFET là điều khiển dải LED 12 V hoặc bơm nước. Thay bằng cảm biến DHT22 trên một chân GPIO là trạm đo nhiệt độ, độ ẩm ghi log ra thẻ nhớ.
Phần thú vị nhất của RP2040 là PIO: tám máy trạng thái lập trình được, chạy độc lập với hai nhân chính, cho phép tạo ra giao thức nối tiếp mà phần cứng không có sẵn. Điều khiển dải WS2812 với thời gian chính xác tới hàng chục nanosecond, đọc xung encoder tần số cao, giả lập cổng VGA, hoặc giao tiếp với chip cũ chỉ có một dây dữ liệu đều nằm trong khả năng của nó. Với vi điều khiển thông thường, mỗi việc như vậy phải viết bằng ngắt và đánh đổi độ chính xác thời gian; với PIO, nó chỉ là một chương trình nhỏ nạp vào máy trạng thái.
Ba chân ADC 12 bit đọc được biến trở, cảm biến ánh sáng, cảm biến dòng. Hai bus I2C và hai bus SPI cho phép gắn màn hình, RTC, cảm biến chất lượng không khí, module thẻ nhớ cùng lúc trên một bo duy nhất.
Pico, Pico W hay Pico 2
Thời điểm bài gốc được viết, dòng Raspberry Pi Pico chỉ có ba bản. Hiện tại có bốn lựa chọn phổ biến, khác nhau ở chip và khả năng kết nối:
| Bo | Chip | Xung nhịp | SRAM | Flash | Không dây | Cách bật LED |
|---|---|---|---|---|---|---|
| Pico / Pico H | RP2040 | 133 MHz | 264 KB | 2 MB | Không | Pin(25) |
| Pico W | RP2040 + CYW43439 | 133 MHz | 264 KB | 2 MB | Wi-Fi, Bluetooth | Pin('LED') |
| Pico 2 | RP2350A | 150 MHz | 520 KB | 4 MB | Không | Pin(25) |
| Pico 2 W | RP2350A + CYW43439 | 150 MHz | 520 KB | 4 MB | Wi-Fi, Bluetooth | Pin('LED') |
RP2350 trên Raspberry Pi Pico 2 dùng nhân Cortex-M33, gấp đôi SRAM và flash, thêm khả năng chạy nhân RISC-V. Toàn bộ code MicroPython trong bài này chạy nguyên xi trên Pico 2 mà không phải sửa dòng nào, vì lớp machine giữ nguyên API. Người mới nên chọn Pico H nếu chỉ học cơ bản, chọn Pico W khi đã có ý tưởng dự án cần gửi dữ liệu lên mạng, và chọn Pico 2 khi cần xử lý ảnh, âm thanh hoặc chạy nhiều tác vụ song song.
Ba điểm cần nắm sau khi đọc xong: Raspberry Pi Pico là vi điều khiển chứ không phải máy tính, nên chương trình chạy ngay khi cấp nguồn và không sợ mất điện đột ngột. Nạp code gồm hai lớp riêng biệt – firmware MicroPython nạp một lần qua chế độ BOOTSEL, sau đó code Python nạp qua Thonny mỗi lần sửa. Và mọi thứ từ LED onboard đến mạch ba LED đều xoay quanh một thao tác duy nhất: khai báo chân GPIO là đầu ra rồi gán mức 1 hoặc 0, phần còn lại chỉ là ghép nhiều lần thao tác đó lại với nhau.
Phần cứng không đoán được ý người viết code. Nếu mạch Raspberry Pi Pico không chạy, gần như luôn là sai chân, ngược chiều linh kiện, hoặc thiếu một dây GND, và ba nguyên nhân đó giải thích phần lớn thời gian gỡ lỗi của người mới. Cắm đúng, đo lại bằng đồng hồ vạn năng, rồi hãy sửa code.
Nguồn: The Pi Hut
