PICO-Cam-A教程

资料

配套资料

示例程序

原理图与位号图

官方资料

树莓派官方文档

树莓派开源例程

开发软件


说明

产品概述

PICO-Cam-A 是一款Waveshare设计的高性能的微控制器开发板,其在较小的板型情况下,板载了1.14inch LCD、Cam摄像头、
按键等外设,并且引出了部分GPIO与Debug接口,方便用户开发,并嵌入应用到产品中。

产品特性

  • 采用 Raspberry Pi 设计的 RP2040 微控制器芯片
  • 搭载双核 ARM Cortex M0 + 处理器,运行频率高达 133MHz 灵活时钟
  • 内置了 264KB 的 SRAM 和 2MB 的片上 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

引脚分布


尺寸图


示例程序

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() 启动 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);
}

运行程序

  • 烧录固件,上电启动后 PICO-Cam-A 显示开机界面,然后实时显示摄像头捕获到的画面