RP2040-Cam-A
来自Waveshare Wiki
说明
| ||||||||||||||||||||
| ||||||||||||||||||||
产品概述
PICO-Cam-A 是一款Waveshare设计的高性能的微控制器开发板,其在较小的板型情况下,板载了1.14inch LCD、Cam摄像头、按键等外设,并且引出了部分GPIO与Debug接口,方便用户开发,并嵌入应用到产品中。
产品特性
- 采用了 Raspberry Pi 研发的 RP2040 微控制器芯片
- 搭载了双核 ARM Cortex M0 + 处理器,运行频率高达 133MHz 灵活时钟
- 内置了 264KB 的 SRAM 和 2MB 的片上 Flash
- 采用 Type-C 接口,紧跟时代潮流,无需纠结正反插
- 板载一个 1.14 英寸的 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 |
引脚分布
尺寸图
示例程序
C例程
代码解析
示例说明
该示例主要是通过摄像头捕获图像,并显示在 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(core1_entry) 启动 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); }
运行程序
资料
配套资料
示例程序
原理图与位号图
官方资料
树莓派官方文档
- 树莓派相关书籍下载
- Raspberry Pi Pico原理图
- Pico引脚分布图
- Pico入门使用手册
- Pico C SDK使用手册
- Pico数据手册
- RP2040数据手册
- RP2040硬件设计参考手册