PICO-Cam-A
来自Waveshare Wiki
说明
| ||||||||||||||||||||
| ||||||||||||||||||||
产品概述
PICO-Cam-A 是一款Waveshare设计的高性能的微控制器开发板,其在较小的板型情况下,板载了1.14inch LCD、Cam摄像头、
按键等外设,并且引出了部分GPIO与Debug接口,方便用户开发,并嵌入应用到产品中。
产品特性
- 采用 Raspberry Pi 设计的 RP2040 微控制器芯片
- 搭载双核 ARM Cortex M0 + 处理器,运行频率高达 133MHz 灵活时钟
- 内置了 264KB 的 SRAM 和 16MB 的片上 Flash
- 采用 Type-C 接口,紧跟时代潮流,无需纠结正反插
- 板载 HM01B0 灰度摄像头
- 板载 1.14 英寸 240×135 像素的 65K 彩色 IPS LCD 显示屏
- USB1.1 主机和设备支持
- 支持低功耗睡眠和休眠模式
- 可通过 USB 识别为大容量存储器进行拖放式下载程序
- 13 个 GPIO 经过 1.27 间距排母引出
- 2 个 SPI,2 个 I2C,2 个 UART,4 个 12 位 ADC,13 个可控 PWM 通道
- 准确的片上时钟和定时器
- 温度传感器
- 片上加速浮点库
- 8 个可编程 I/O (PIO) 状态机,用于自定义外设支持
产品参数
LCD参数 | |||
控制芯片 | ST7789V | 分辨率 | 135(H)RGB x 240(V) |
通信接口 | SPI | 显示尺寸 | 14.864(H)x 24.912(V)mm |
显示面板 | IPS | 像素大小 | 0.1101(H)x 0.1035(V)mm |
引脚分布
尺寸图
Pico快速上手
基础介绍
C/C++系列
对于 C/C++,建议使用 Pico VS Code 进行开发,这是一款 Microsoft Visual Studio Code 扩展,旨在让您在为 Raspberry Pi Pico 系列开发板创建、开发和调试项目时更加轻松。无论您是初学者还是经验丰富的专业人士,此工具都可以帮助您自信而轻松地进行 Pico 开发。下面我们介绍如何安装该扩展并使用。
- 官网教程:https://www.raspberrypi.com/news/pico-vscode-extension/
- 本教程适用于树莓派Pico、Pico2与本公司开发的RP2040、RP2350系列开发板
- 开发环境默认以 Windows 为例,其他环境请参考官网教程进行安装
安装VSCode
-
首先,点击下载 pico-vscode 程序包,解压并打开程序包,双击安装 VSCode
注意:如果已安装 vscode 注意检查版本是否为 v1.87.0 或更高版本
安装扩展
-
点击扩展,选择从 VSIX 安装
-
选择 vsix 后缀的软件包,点击安装
-
随后 vscode 会自动安装 raspberry-pi-pico 及其依赖扩展,可以点击刷新查看安装进度
-
右下角显示完成安装,关闭 vscode
配置扩展
-
打开目录 C:\Users\用户名,将整个 .pico-sdk 拷贝至该目录
-
拷贝完成
-
打开 vscode,对 Raspberry Pi Pico 扩展中各个路径进行配置
配置如下:Cmake Path: ${HOME}/.pico-sdk/cmake/v3.28.6/bin/cmake.exe Git Path: ${HOME}/.pico-sdk/git/cmd/git.exe Ninja Path: ${HOME}/.pico-sdk/ninja/v1.12.1/ninja.exe Python3 Path: ${HOME}/.pico-sdk/python/3.12.1/python.exe
新建工程
-
配置完成,测试新建工程,输入工程名、选择路径后点击 Creat 创建工程
测试官方示例,可以点击工程名旁的 Example 进行选择
-
创建工程成功
-
选择SDK版本
-
选择 Yes 进行高级配置
-
选择交叉编译链,13.2.Rel1 适用 ARM 核,RISCV.13.3 适用 RISCV 核,这里根据您的需求任意选择其中一个即可
-
CMake 版本选择 Default(前面配置的路径)
-
Ninja 版本选择 Default
-
选择开发板
-
点击 Complie 进行编译
-
成功编译出 uf2 格式文件即可
导入工程
- 导入工程的 Cmake 文件不能有中文(包括注释),否则可能导致导入失败
-
导入自己的工程需要在 Cmake 文件中加一行代码,才能正常切换 pico 和 pico2,否则即使选择 pico2,编译得到的固件仍是适用于 pico 的
set(PICO_BOARD pico CACHE STRING "Board type")
更新扩展
开源例程
示例程序
C例程
烧录固件
方式1:按住BOOT键后连接电脑后,松开BOOT键,电脑会出现一个可移动磁盘,将后缀为.uf2的固件库复制进去即可
方式2:连接电脑后,同时按下BOOT键跟RESET键,先松开RESET键再松开BOOT键,电脑会出现一个可移动磁盘,将后缀为.uf2的固件库复制进去即可
代码解析
示例说明
该示例主要是通过摄像头捕获图像,并显示在 1.14inch LCD 上。程序使用了多核心处理,其中 Core 1 负责获取图像数据以及图像处理,Core 0 负责图像显示
Core 1 代码解析
- 推送数据
multicore_fifo_push_blocking() 是 Pico SDK 提供的一个函数,用于将数据推送到多核心系统的 FIFO(First In, First Out)队列中。在这里 Core 1 会将 FLAG_VALUE 推送到 FIFO 中,Core 0 在执行流程中则会阻塞等待来自 Core 1 的数据 FLAG_VALUE
multicore_fifo_push_blocking(FLAG_VALUE);
- 等待数据
Core 1 阻塞等待来自 Core 0 的数据
uint32_t ack = multicore_fifo_pop_blocking();
- LCD初始化
调用 DEV_Module_Init() 初始化 LCD 相关的引脚以及按键,调用 LCD_1IN14_V2_Init() 初始化 LCD
DEV_Module_Init(); LCD_1IN14_V2_Init(HORIZONTAL); LCD_1IN14_V2_Clear(BLACK); UDOUBLE Imagesize = LCD_1IN14_V2_HEIGHT * LCD_1IN14_V2_WIDTH * 2; UWORD *BlackImage; if ((BlackImage = (UWORD *)malloc(Imagesize)) == NULL) { printf("Failed to apply for black memory...\r\n"); exit(0); }
- 显示图像
调用 Paint_DrawImage() 绘制图像,再调用 LCD_1IN14_V2_Display() 在 LCD 上显示图像
Paint_NewImage((UBYTE *)BlackImage, LCD_1IN14_V2.WIDTH, LCD_1IN14_V2.HEIGHT, 0, WHITE); Paint_SetScale(65); Paint_SetRotate(ROTATE_0); Paint_DrawImage(gImage_waveshare, 0, 0, 240, 135); LCD_1IN14_V2_Display(BlackImage); DEV_Delay_ms(500);
- 初始化摄像头
这段代码调用 cam_config_struct() 初始化摄像头配置结构体 config,然后通过调用 cam_init() 对摄像头进行初始化
struct cam_config config; cam_config_struct(&config); cam_init(&config);
- 图像处理
这段代码是一个循环,其中摄像头在每次迭代中捕获一帧图像,然后对图像进行处理,最终将处理后的图像数据存储在 displayBuf 中,并将 imageReady 标志设置为 1,表示图像已准备好显示
while (true) { cam_capture_frame(&config); uint16_t index = 0; for (int y = 134; y > 0; y--) { for (int x = 0; x < 240; x++) { uint16_t c = image_buf[(y)*324+(x)]; uint16_t imageRGB = (((c & 0xF8) << 8) | ((c & 0xFC) << 3) | ((c & 0xF8) >> 3)); displayBuf[index++] = (uint16_t)(imageRGB >> 8) & 0xFF; displayBuf[index++] = (uint16_t)(imageRGB) & 0xFF; } } imageReady = 1; }
Core 0 代码解析
- 启动Core1
multicore_launch_core1 是 Pico SDK 提供的函数,用于在 Raspberry Pi Pico 上启动 Core 1 的执行。这行代码通过调用 multicore_launch_core1() 启动 Core 1 执行指定的函数 core1_entry()
multicore_launch_core1(core1_entry);
- 等待数据
Core 0 阻塞等待来自Core 1的数据,若成功接收数据 FLAG_VALUE 则向 Core 1 发送数据
uint32_t ack = multicore_fifo_pop_blocking(); if (ack != FLAG_VALUE) printf("Error: Core 0 failed to receive acknowledgment from core 1!\n"); else { multicore_fifo_push_blocking(FLAG_VALUE); printf("Success: Core 0 Received acknowledgment from core 1!\n"); }
- 主循环
主循环中不断地检查 imageReady 标志。一旦检测到 imageReady 标志为 1,表示图像已经准备好显示,就调用 LCD_1IN14_V2_Display() 显示图像,并在显示后将 imageReady 标志重置为 0
while (1) { if (imageReady == 1) { LCD_1IN14_V2_Display((uint16_t*)displayBuf); // Reset the imageReady flag after displaying the image imageReady = 0; } DEV_Delay_ms(1); }
运行程序
资料
配套资料
示例程序
原理图
3D图纸
官方资料
树莓派官方文档
- 树莓派相关书籍下载
- Raspberry Pi Pico原理图
- Pico引脚分布图
- Pico入门使用手册
- Pico C SDK使用手册
- Pico数据手册
- RP2040数据手册
- RP2040硬件设计参考手册