Dùng hai camera trên Raspberry Pi 5 là một trong những nâng cấp đáng giá nhất của thế hệ này: máy có hai cổng MIPI 4 lane độc lập (CAM/DISP 0 và CAM/DISP 1). Trên Raspberry Pi 4, bạn chỉ có một cổng CSI dành cho camera và một cổng DSI dành cho màn hình, nên muốn dùng hai camera thì phải tìm đến các giải pháp mux hoặc camera USB. Với Pi 5, mỗi cổng có 4 lane riêng đi thẳng xuống chip cầu nam RP1, nghĩa là hai camera không chia sẻ băng thông và có thể chạy đồng thời ở độ phân giải gốc của cảm biến.
Với hai camera trên Raspberry Pi 5, bạn có thể mở ra những ứng dụng mà trước đây rất khó làm trên một board nhúng giá rẻ: thị giác lập thể (stereo vision) để tính khoảng cách, robot tự hành quan sát hai hướng, hệ thống giám sát một camera góc rộng và một camera tele, hay đơn giản là vừa chụp ảnh vừa quay video. Bài viết này hướng dẫn đầy đủ từ việc cắm cáp, kiểm tra cảm biến, đến cấu hình cho cả camera chính hãng lẫn camera không chính hãng.
Mục lục
- Chuẩn bị phần cứng và phần mềm
- Bước 1: Cắm cáp camera đúng chiều
- Bước 2: Kiểm tra hai camera trên Raspberry Pi 5 đã được nhận
- Bước 3: Chạy đồng thời hai camera chính hãng
- Bước 4: Dùng camera không chính hãng – sửa config.txt
- Bước 5: Kiểm tra lại và chạy đồng thời
- Xử lý sự cố thường gặp
- Ứng dụng thực tế của hai camera trên Raspberry Pi 5
Chuẩn bị phần cứng và phần mềm
Để dựng thử hai camera trên Raspberry Pi 5, bạn cần chuẩn bị những thứ sau.
- Raspberry Pi 5 (bản 4GB, 8GB hay 16GB đều được – hai camera không tiêu tốn nhiều RAM).
- Hai module camera. Trong bài này dùng Camera Module 3 (cảm biến IMX708, 12MP, lấy nét tự động) và Camera Module v2 (IMX219, 8MP) cho phần chính hãng; ZeroCam OV5647 5MP và một module IMX219 cho phần không chính hãng.
- Cáp FPC 22 chân, bước 0,5mm nếu camera của bạn dùng cáp 15 chân kiểu Pi 4. Camera thiết kế cho Raspberry Pi Zero đã dùng sẵn chuẩn 22 chân nên cắm thẳng được vào Pi 5.
- Nguồn 5V/5A (27W, chuẩn USB-C PD) nếu bạn gắn thêm SSD, HAT hoặc quạt. Hai camera tiêu thụ không đáng kể, nhưng nguồn yếu là nguyên nhân rất phổ biến gây lỗi ngẫu nhiên trên Pi 5.
- Thẻ nhớ đã cài Raspberry Pi OS bản đầy đủ, cập nhật mới nhất (Bookworm trở lên). Bản Lite cũng chạy được, nhưng bạn sẽ không có giao diện xem trước trực tiếp.
Bước 1: Cắm cáp camera đúng chiều
Việc cắm cáp cho hai camera trên Raspberry Pi 5 về cơ bản giống các thế hệ trước, nhưng connector nhỏ hơn nhiều nên cần thao tác nhẹ tay. Trước khi làm bất cứ điều gì, hãy tắt máy và rút cáp nguồn – cắm rút cáp FPC khi đang có điện có thể làm hỏng cảm biến hoặc cổng MIPI.
- Dùng móng tay hoặc que nhựa mềm kéo nhẹ thanh khoá nhựa của connector lên trên. Thanh này rất mỏng, chỉ cần bật lên khoảng 1mm là đủ.
- Đưa cáp vào hết cỡ, sao cho mép cáp chạm hết chiều sâu của khe. Cáp phải vuông góc, không bị lệch một bên.
- Kiểm tra chiều tiếp điểm: các răng tiếp điểm vàng phải hướng về phía cổng Ethernet và hàng chân PoE (tức là quay xuống mặt board trong tư thế Pi nằm ngửa). Đây là chiều dễ sai nhất và cũng là nguyên nhân hàng đầu khiến hệ thống không nhận camera.
- Nhấn thanh khoá xuống cho đến khi nghe hoặc cảm nhận được tiếng tách nhẹ. Rút thử nhẹ cáp để chắc chắn đã giữ.
Mẹo: nếu lỡ bật thanh khoá nhựa ra khỏi connector, phần lớn trường hợp bạn có thể gắn lại được – chỉ cần đặt đúng rãnh và ấn nhẹ cho đến khi khớp. Chỉ khi thanh này đã gãy mới cần thay connector.
Bước 2: Kiểm tra hai camera trên Raspberry Pi 5 đã được nhận
Với camera chính hãng, Raspberry Pi OS nhận diện tự động, không cần sửa bất kỳ file cấu hình nào. Sau khi cắm cả hai module và khởi động máy, mở Terminal và chạy:
libcamera-hello --list-cameras
Kết quả sẽ liệt kê từng camera kèm chỉ số cổng, tên cảm biến, độ phân giải tối đa và danh sách chế độ ghi hình. Ví dụ khi gắn Camera Module v2 ở cổng 0 và Camera Module 3 ở cổng 1:
Available cameras
-----------------
0 : imx219 [3280x2464 10-bit] (/base/axi/pcie@120000/rp1/i2c@88000/imx219@10)
Modes: 'SBGGR10_CSI2P' : 640x480 [30.00 fps]
1640x1232 [30.00 fps]
1920x1080 [30.00 fps]
3280x2464 [30.00 fps]
1 : imx708 [4608x2592 10-bit] (/base/axi/pcie@120000/rp1/i2c@80000/imx708@1a)
Modes: 'SBGGR10_CSI2P' : 1536x864 [30.00 fps]
2304x1296 [30.00 fps]
4608x2592 [30.00 fps]
(Danh sách mode đã được lược bớt cho dễ đọc; trên máy thật sẽ dài hơn.)
Ba thông tin đáng chú ý trong kết quả trên:
- Số 0 và 1 là chỉ số camera mà các lệnh sau này sẽ dùng. Thứ tự này theo cổng vật lý, nhưng nếu bạn cắm ngược thì chỉ cần đổi số trong lệnh là xong.
- imx219 và imx708 là tên cảm biến, không phải tên thương mại. IMX219 tương ứng Camera Module v2 (8MP), IMX708 tương ứng Camera Module 3 (12MP).
- Đường dẫn
/base/axi/pcie@120000/rp1/...cho thấy camera nối vào chip RP1 – chip xử lý I/O mới của Pi 5. Đây là thông tin hữu ích khi tra log, hoàn toàn bình thường và không phải lỗi.
Nếu hai camera trên Raspberry Pi 5 chỉ hiện một cổng, hoặc không cổng nào hiện, hãy tắt máy, rút nguồn và cắm lại cáp. Kiểm tra lại chiều tiếp điểm trước khi nghi ngờ phần mềm – phần lớn lỗi nằm ở bước này.
Bước 3: Chạy đồng thời hai camera chính hãng
Để chạy đồng thời hai camera trên Raspberry Pi 5, mỗi tiến trình chỉ được giữ một camera tại một thời điểm, nên cách đơn giản nhất là mở hai cửa sổ Terminal và chạy mỗi camera ở một cửa sổ. Trong cửa sổ thứ nhất:
libcamera-hello --camera 0 -t 0
Cửa sổ xem trước sẽ hiện hình ảnh trực tiếp từ camera ở cổng 0. Tham số -t 0 đặt thời gian chạy bằng 0, nghĩa là chạy liên tục cho đến khi bạn nhấn Ctrl+C. Nếu bỏ tham số này, chương trình sẽ tự thoát sau 5 giây.
Mở cửa sổ Terminal thứ hai và chạy lệnh tương tự, chỉ đổi số camera:
libcamera-hello --camera 1 -t 0
Lúc này bạn sẽ có hai cửa sổ cạnh nhau, mỗi cửa sổ là một luồng hình ảnh độc lập. Trong thử nghiệm dưới đây, camera 1 là Camera Module 3 có lấy nét tự động, cho hình rõ hơn hẳn ở cùng khoảng cách:
Khi cần chụp ảnh hoặc quay video thay vì xem trước, nguyên tắc giữ nguyên: dùng libcamera-still hoặc libcamera-vid với --camera 0 và --camera 1. Trên các bản Raspberry Pi OS mới, bộ công cụ đã được đổi tên thành rpicam-apps, nên nếu máy bạn không có lệnh libcamera-* thì dùng rpicam-hello, rpicam-still, rpicam-vid với cú pháp hoàn toàn tương đương.
Điều khiển hai camera trong cùng một ứng dụng Python
Khi triển khai thực tế, bạn sẽ không muốn mở hai cửa sổ Terminal. Thư viện Picamera2 cho phép tạo hai đối tượng camera trong cùng một tiến trình:
from picamera2 import Picamera2
import time
cam0 = Picamera2(0)
cam1 = Picamera2(1)
cam0.configure(cam0.create_still_configuration())
cam1.configure(cam1.create_still_configuration())
cam0.start()
cam1.start()
time.sleep(2) # để AE/AWB ổn định
cam0.capture_file("cam0.jpg")
cam1.capture_file("cam1.jpg")
cam0.stop()
cam1.stop()
Đoạn time.sleep(2) không phải để “chờ cho chắc” mà để thuật toán phơi sáng tự động và cân bằng trắng có thời gian hội tụ – bỏ bước này, bức ảnh đầu tiên thường bị tối hoặc ám màu. Với ứng dụng cần đồng bộ thời điểm chụp giữa hai camera, hãy dùng chế độ capture metadata và ghép timestamp, vì hai cảm biến không chia sẻ xung clock chung.
Bước 4: Dùng camera không chính hãng – sửa config.txt
Với hai camera trên Raspberry Pi 5 không chính hãng, cơ chế camera_auto_detect hoạt động bằng cách dò các cảm biến đã biết trên bus I2C rồi nạp overlay tương ứng. Module lạ hoặc module dùng cảm biến không nằm trong danh sách sẽ không được nhận. Khi đó phải tắt tự động dò và khai báo overlay thủ công.
Mở file cấu hình bằng lệnh:
sudo nano /boot/firmware/config.txt
Trên Raspberry Pi OS Bookworm trở lên, file nằm ở /boot/firmware/config.txt. Với các bản cũ hơn (Bullseye trở về trước), đường dẫn là /boot/config.txt – nếu lệnh trên báo không tìm thấy file, thử đường dẫn cũ này.
Tìm dòng camera_auto_detect=1 và thêm dấu # vào đầu dòng để vô hiệu hoá:
#camera_auto_detect=1
Ngay bên dưới, khai báo overlay cho từng camera, kèm tham số cam0 hoặc cam1 để chỉ định cổng vật lý:
dtoverlay=ov5647,cam0 dtoverlay=imx219,cam1
Lưu ý quan trọng: một khi đã tắt camera_auto_detect, bạn phải khai báo overlay cho tất cả camera đang gắn, kể cả camera chính hãng. Nếu chỉ khai báo một cái, camera còn lại sẽ biến mất khỏi danh sách – đây là lỗi rất hay gặp và thường bị hiểu nhầm là hỏng phần cứng.
Lưu file bằng Ctrl+X, nhấn Y rồi Enter, sau đó khởi động lại:
sudo reboot
dtoverlay thủ công.Bước 5: Kiểm tra lại và chạy đồng thời
Sau khi khởi động lại, chạy lại lệnh kiểm tra:
libcamera-hello --list-cameras
Kết quả đúng sẽ hiển thị OV5647 ở cổng 0 và IMX219 ở cổng 1:
Available cameras
-----------------
0 : ov5647 [2592x1944 10-bit GBRG] (/base/axi/pcie@120000/rp1/i2c@88000/ov5647@36)
Modes: 'SGBRG10_CSI2P' : 640x480 [30.00 fps]
1296x972 [30.00 fps]
1920x1080 [30.00 fps]
2592x1944 [30.00 fps]
1 : imx219 [3280x2464 10-bit] (/base/axi/pcie@120000/rp1/i2c@80000/imx219@10)
Modes: 'SBGGR10_CSI2P' : 640x480 [30.00 fps]
1640x1232 [30.00 fps]
1920x1080 [30.00 fps]
3280x2464 [30.00 fps]
Cách chạy đồng thời hai camera trên Raspberry Pi 5 giống hệt phần trên: hai cửa sổ Terminal, một lệnh libcamera-hello --camera 0 -t 0 và một lệnh libcamera-hello --camera 1 -t 0.
Ngoài OV5647 và IMX219, Raspberry Pi hỗ trợ nhiều cảm biến khác như IMX296, OV9281, IMX477, IMX519… Danh sách overlay đầy đủ và tham số hợp lệ của từng loại có trong tài liệu chính thức tại raspberrypi.com/documentation, mục Camera → Software → dtoverlay. Nên tra đúng tên overlay trước khi thêm dòng cấu hình, vì một ký tự sai cũng khiến camera không lên.
Xử lý sự cố thường gặp
Khi hai camera trên Raspberry Pi 5 không hoạt động như mong đợi, hãy đối chiếu hiện tượng với bảng dưới đây trước khi thay phần cứng.
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Chỉ thấy một camera | Cáp lỏng hoặc cắm sai chiều ở một cổng | Tắt nguồn, cắm lại, kiểm tra tiếp điểm vàng hướng về Ethernet/PoE |
| Không thấy camera nào | Cáp hỏng, sai loại cáp (15 chân không qua adapter), hoặc connector chưa khoá | Thử cáp khác, kiểm tra thanh khoá đã nhấn xuống |
| Camera không chính hãng không được nhận | Chưa khai báo dtoverlay hoặc sai tên cảm biến |
Comment camera_auto_detect=1, thêm overlay đúng cho từng cổng, reboot |
| Sau khi sửa config.txt chỉ còn một camera | Chỉ khai báo overlay cho một cổng | Khai báo đủ overlay cho mọi camera đang gắn, kể cả camera chính hãng |
Failed to acquire camera: Device or resource busy |
Camera đang bị tiến trình khác giữ | Đóng cửa sổ xem trước còn lại, kiểm tra bằng ps aux | grep libcamera |
| Hình mờ, ám màu hoặc đen | Còn lớp film bảo vệ trên ống kính, hoặc cáp tiếp xúc kém | Bóc film bảo vệ, vệ sinh nhẹ ống kính, cắm lại cáp |
Ứng dụng thực tế của hai camera trên Raspberry Pi 5
- Thị giác lập thể: hai camera trên Raspberry Pi 5 đặt cách nhau một khoảng cách cơ sở (baseline) cố định cho phép tính bản đồ độ sâu bằng thuật toán stereo matching (OpenCV
StereoBMhoặcStereoSGBM). Pi 5 đủ nhanh để xử lý độ phân giải thấp theo thời gian thực. - Robot và xe tự hành: một camera nhìn gần để né vật cản, một camera nhìn xa để nhận diện làn đường hoặc vật thể.
- Giám sát hai hướng: một camera góc rộng quét toàn cảnh, một camera tele hoặc hồng ngoại tập trung vào điểm quan trọng.
- Chụp và quay song song: camera 0 chụp ảnh độ phân giải cao theo lịch, camera 1 quay video liên tục.
Ba điểm cần nhớ khi làm việc với hai camera trên Raspberry Pi 5: thứ nhất, cáp 22 chân phải cắm đúng chiều với tiếp điểm vàng hướng về phía cổng Ethernet; thứ hai, camera chính hãng chạy được ngay không cần cấu hình, còn camera không chính hãng bắt buộc phải tắt camera_auto_detect và khai báo dtoverlay cho từng cổng; thứ ba, mỗi tiến trình chỉ giữ được một camera, nên muốn chạy đồng thời thì hoặc mở hai tiến trình riêng, hoặc dùng Picamera2 với hai đối tượng camera trong cùng ứng dụng.
Với hai camera trên Raspberry Pi 5, phần cứng đã sẵn sàng, phần mềm chỉ mất vài dòng cấu hình – phần còn lại là bài toán thị giác máy tính của bạn.
Nguồn: The Pi Hut

