基于PIC18F47Q10的色彩控制

发布时间 2023-09-11 13:21:21作者: AmorFati404

基于PIC18F47Q10的色彩控制

开发环境

  • MPLABX IDE 6.05
  • XC8 2.36
  • windows10 | macOS 13 | Deepin v23 alpha下均编译通过

题目及目的

题目一

PIC18F47Q10为主控,通过Color click 和 4*4 RGB Click实现色彩控制的功能。

简单来说,通过Color Click采集外界光的RGB三色值,通过I2C协议将三色值输出给主控芯片,在4*4 RGB Click上显示外界光的颜色(已完成)


题目二

如果上述完成顺利,计划采用Wifi ESP Click、Color Click、microSD Click三块拓展板,内嵌HTML页面存储到microSD卡,通过Wifi ESP Click接入局域网,可远程控制4*4 RGB Click显示光的颜色(未完成,仅完成前端页面和wifi esp click的调试)

image-20230826221546842

image-20230828230728412

通过CH340接线测试,功能正常

image-20230828224843130PIC18F47Q10串口写入 AT后,返回OK,成功调试,但存在卡死的情况。除了卡死,还会出现返回乱序的情况,比如CONNECT返回为NNOCCET,估计需要做CRC校验,能力有限,做到这里就结束了

d97a78b555de2b302237790e707757b

内容与要求

工作原理

Curiosity Nano Base for Click board

适用于 Click 板的 Curiosity Nano 底座可轻松将 Mikro Elektronika mikroBUSTM Click 板和 Xplained Pro 扩展连接到 Curiosity Nano 评估套件。
默认情况下,该套件通过已安装的 Curiosity Nano 套件上的 USB 供电。 该套件还可以由锂离子/锂聚合物电池或外部电源供电。
Click 板的 Curiosity Nano 底座附带排针和插针插座,用于连接 Curiosity Nano 评估套件。

image-20230806093505191

4*4 RGB Click

4x4 RGB click 带有16个WS2812的LED元件,排列成 4 x 4 矩阵。 这些 LED 元件由红、绿、蓝三色组成,形成 RGB LED 单元。 该集成控制部分允许对每个 RGB 段进行单独的8位控制,形成 24 位调色板,允许显示 16,777,216 种不同的颜色。

Mikroe Display 4X4 RGB click

通过单线与主机 MCU 通信。 数据传输协议采用不归零(NRZ)通信模式,因此数据信号的时序至关重要。 逻辑 1 由具有特定高电平和低电平时序的信号组成。 逻辑 0 还包含具有特定高电平和低电平时序的信号。 逻辑0和1的区别在于高电平和低电平信号状态的时序,如下图所示:

Display4X4 RGB click sequence chart

HIGH level timing for logic 0 T0H 0.5us ±150ns
LOW level timing for logic 0 T0L 0.8us ±150ns
HIGH level timing for logic 1 T1H 0.7us ±150ns
LOW level timing for logic 1 T1L 0.6us ±150ns
LOW level timing for RESET TRST > 50us

这意味着向 WS2812 设备发送1 时,主机 MCU 必须保持在高电平 0.7us,然后再保持低电平 0.6us。 一旦前 24 位以这种方式完成,RST 脉冲将锁存数据。

可以通过板载SW1开关选择通讯线路。 它提供 mikroBUS™ RST 和 CS 线路之间的选择,标记为 IN1 和 IN2。 通信电压电平可以通过板载 SMD 跳线设置,标记为 IO LEVEL,可以在 3.3V 和 5V 之间选择,从而可以连接 3.3V 和 5V MCU。

LED 元件的电源由 Microchip 的LDO 稳压器 MCP1826 提供,可提供高达 1A 的电流。 虽然逻辑电压可以在 3.3V 和 5V 电源轨之间选择,但 LED 电源来自 5V mikroBUS™ 电源。 它被 LDO 降低至 3.5V,并分配给 WS2812 元件的 LED 电源输入。

mikroBUS™ 的 PWM 引脚在此 Click board™ 上标记为 OUT,允许级联多个 4x4 RGB click 设备。 有关数据通信的更详细说明可以在 WS2812 数据表中找到。

Notes Pin Mikrobus logo.png Pin Notes
NC 1 AN PWM 16 OUT Output pin
Data input 1 IN1 2 RST INT 15 NC
Data input 2 IN2 3 CS RX 14 NC
NC 4 SCK TX 13 NC
NC 5 MISO SCL 12 NC
NC 6 MOSI SDA 11 NC
Power supply 3.3V 7 3.3V 5V 10 5V Power supply
Ground GND 8 GND GND 9 GND Ground

Color Click

Color click 有两个用于感知颜色的有源组件:它配备了 ams-TAOS 的 TCS3471 集成彩色光数字转换器,以及欧司朗光电半导体的 LRTB GFTG(高亮度 RGB LED)。 TCS3471 颜色传感器具有 4x4 光电二极管阵列,可检测每种光成分:红、绿和蓝(R、G、B)。 此外,它还可以感知清晰的光成分。 传感器 IC 具有可编程增益控制,应用 1、4、16 和 60 的增益比。允许使用 A/D 转换器 (ADC) 的最佳范围。

Mikroe Sensors Color click

该传感器的每个通道都有一个积分 16 位 ADC 部分,用于执行信号积分,这会影响灵敏度和采集时间。 转换完成后,结果以 16 位格式存储在输出寄存器中。 数据传输采用双缓冲,可防止转换过程中出现读取错误。 该传感器没有任何红外滤光片,因此如果感测环境光,则必须将其放置在红外阻挡玻璃下方。 然而,它非常适合 RGB 照明应用,因为 LED 发出相当窄的光谱带的光,并且没有红外分量。 在这种情况下,传感器可以实现高达 1,000,000:1 的动态范围。

中断引脚为开漏类型,路由至 mikroBUS™ INT 引脚。 它用于在达到特定条件时向 MCU 发出警报:有两个 16 位寄存器,其中包含颜色强度读数的上限和下限。 此外,只有当积累了足够的超出范围的事件时,持久性过滤器才允许触发中断。 触发中断之前发生超出范围的次数可通过相应的寄存器进行配置。

TCS3471 传感器由状态机驱动。 它通过 ENABLE 寄存器中的状态位控制传感器的操作。 该寄存器包含控制 ADC 操作、上电操作、使能中断引擎、使能等待定时器等的位。 TCS3471 数据表中提供了完整的寄存器列表和深入说明。

Osram RGB LED 通过主机控制器的 GPIO 引脚直接控制。 三个晶体管的基极连接至 mikroBUS™ 的 AN、CS 和 PWM 引脚。 基极上的逻辑高电平将对晶体管施加偏置,从而允许电流流过 RGB LED 段。 通过LED的电流受到串联电阻的限制,因此不会损坏LED和晶体管。 该LED提供有限量的受控光,可用于在弱光情况下照亮被测物体。 可以将 PWM 信号传送到这些引脚,而不是高或低逻辑电平,这将允许对 LRTB GFTG 的 R、G 和 B 段进行亮度控制。

Notes Pin Mikrobus logo.png Pin Notes
Red LED RD 1 AN PWM 16 BL Blue LED
NC 2 RST INT 15 INT Interrupt
Green LED GR 3 CS RX 14 NC
NC 4 SCK TX 13 NC
NC 5 MISO SCL 12 SCL I2C Clock
NC 6 MOSI SDA 11 SDA I2C Data
Power supply 3.3V 7 3.3V 5V 10 5V Power supply
Ground GND 8 GND GND 9 GND Ground

Wifi ESP Click

WiFi ESP click 搭载集成 ESP8266EX 的 ESP-WROOM-02 模块。 Click 设计为在 3.3V 电源下运行。 它通过 UART 接口和 mikroBUS™ 线上的以下引脚与目标微控制器进行通信:RST、CS。

Notes Pin Mikrobus logo.png Pin Notes
NC 1 AN PWM 16 NC
HW Reset RST 2 RST INT 15 NC
Chip enable (active high) EN 3 CS TX 14 TX UART0_TXD / Transmit end in UART download (program) mode
NC 4 SCK RX 13 RX UART0_RXD / Receive end in UART download (program) mode
NC 5 MISO SCL 12 NC
NC 6 MOSI SDA 11 NC
Power supply +3.3V 7 3.3V 5V 10 NC
Ground GND 8 GND GND 9 GND Ground

microSD Click

具有一个 microSD 卡插槽,用于将 microSD 卡用作便携式设备的大容量存储介质。 microSD click 设计为在 3.3V 电源下运行。 标准 SPI 接口确保高数据速率下的简单通信。 用它来读取或存储音乐、文本文件、视频等数据。

Notes Pin Mikrobus logo.png Pin Notes
NC 1 AN PWM 16 NC
NC 2 RST INT 15 NC
SPI chip select CS 3 CS TX 14 NC
SPI clock SCK 4 SCK RX 13 NC
Serial data output SDO 5 MISO SCL 12 NC
Serial data input SDI 6 MOSI SDA 11 NC
Power supply +3.3V 7 3.3V 5V 10 NC
Ground GND 8 GND GND 9 GND Ground

硬件接线图

相关Click

  • 4*4 RGB Click
主控 拓展板 I/O
RA7 RST1 O
  • Color Click
主控 拓展板 I/O
RB2 SDA O
RB1 SCL O
RB5 INT3 I
RA2 AN3 O
RD7 CS3 O
RA5 PWM3 O
  • Wifi ESP Click
主控 拓展板 click I/O
RC2 TX1 RX O
RC3 RX1 TX I
RD7 CS3 O
RD5 RST3 O
  • microSD Click
    | 主控 | 拓展板 | click | I/O |
    | ---- | ------ | ---- |-----|
    | RD6 | CS2 | |O|
    | RC4 | MOSI | SDO |O|
    | RC5 | MISO | SDI |O|
    | RC6 | SCK | SCK |I O|

思路

先看两张图

image-20230806113832178

image-20230806113848110

分为两个部分

  • RGB Click和Color Click

    只涉及到这两块板,RGB Click例程中,放在了插槽1,Color Click采用I2c协议,按照图中标识就放在了插槽3

  • RGB Click、microSD Click和Wifi ESP Click

    microSD Click采用SPI协议,放在插槽2

    Wifi ESP Click采用串口,RGB Click没啥特殊需求,那么rgb还是放在插槽1,wifi放在插槽3

问题及解决方案

  1. RGB Click例程无法烧录

    在windows10系统下,安装Maplab X IDE v6.10,可以正常编译程序,但无法烧录,后安装6.05版本解决问题,可以正常烧录

  2. MCC不会用

    按照这个文件,初步学习MCC

  3. I2C读取

    最开始先使用mcc生成的i2c例程,读取TCS3471失败,后采用手动实现i2c的方式还是读取失败。认真阅读TCS3471 Datasheet后,发现没有写入command register,后正常读取数据

    image-20230807151556314

    image-20230806094548792

    image-20230806094607495

  4. 关于WIFI ESP Click的驱动

    Mikroe提供了P18F45K22驱动Wifi Esp Click例程,移植完成后,串口发送数据后成功触发外部中断,但没有接收到数据,未能解决

  5. 关于调试步骤

    • 基本操作

      image-20230806121019663

      image-20230806121122183

    • 开发中没有用到断点调试,全程都是通过串口重定向到printf打印调试信息,下图为MCC配置页面

      image-20230806121540424

      image-20230806121600633

测试视频及源码

  • 测试视频为test.mp4

  • 源码(这里只列部分驱动函数原型,全部源码查看这个仓库

    //TCS3471相关函数
    //检测设备是否存在
    bool TCS3471_Detect();
    //TCS3471开始工作
    bool TCS3471_Enable();
    //关闭TCS3471
    void TCS3471_disable();
    //设置采样时间
    void TCS3471_SetIntegrationTime(float integrationTime);
    //设置等待时间
    void TCS3471_SetWaitTime(float waitTime);
    //模拟增益
    void TCS3471_SetGain(tcs3471Gain_t gain);
    //启用中断
    void TCS3471_EnableInterrupt();
    //禁用中断
    void TCS3471_DisableInterrupt();
    //清除中断标识位
    void TCS3471_ClearInterrupt();
    //clear高于设置值产生中断
    void TCS3471_InterruptHighThreshold(uint16_t highThreshold);
    //和上面类似
    void TCS3471_InterruptLowThreshold(uint16_t lowThreshold);
    //clear中必须高于高阈值的次数,或低于生成中断的低阈值
    void TCS3471_InterruptPersistence(uint8_t persistence);
    //获取设备ID
    uint8_t TCS3471_GetChipID();
    //检查rgbc值
    bool TCS3471_RgbcValid();
    //读取clear
    uint16_t TCS3471_ReadCData();
    //读取r
    uint16_t TCS3471_ReadRData();
    //读取g
    uint16_t TCS3471_ReadGData();
    //读取b
    uint16_t TCS3471_ReadBData();
    
    //控制RGB
    //ANUM第几个LEd,AColor16进制颜色代码
    void RGBLed_SetDiode(uint8_t ANum, uint32_t AColor, uint32_t * AdiodeArray)
    

操作说明

PIC18F47Q0按照拓展板尾插方向插好 RGB Click-插槽1 Color Click-插槽3

image-20230806102816756

上电,板载LED闪烁过后,放置需要的识别的颜色,最好用LED发光源,RGB Click会显示对应的颜色

这里以红色作为例子

image-20230806102846762

测试方法

⚠️注意:由于拍摄环境、手机CMOS不同、不同显示设备存在色差等因素,以下列出的RGB三色值,仅代表在测试设备上的数值,不具有普遍性

?拍摄设备:荣耀 x40

?️取色软件:微信截图提供16进制颜色代码

开发的时候用标准四阶魔方的红、绿、蓝三个面测试,样张如下

image-20230806104725833

image-20230806110047139image-20230806104734663

image-20230806132147490

可以看到传感器数据和样张数据存在误差,可以通过增加采样时间来增加RGB色值的精确度,范围为2.4ms到614.4ms,通过TCS3471_SetIntegrationTime实现


后来在学校测试,发现蓝色通道数值特别低,明显不正常,目前没有确定问题原因

image-20230828230311422

工程管理

  1. 代码版本控制

    在开发过程中,随软件功能的变动,对不同软件版本进行管理和控制的需求也随之增加,目前主流版本控制工具有git、svn,我们可以通过git推送到代码托管平台:GIthub、Gitlab、Gitee等

  2. 项目周期管理

    为了保证开发进度,最开始要做好时间点的管理,定好不同时间段的工作,根据开发进度动态调整进度

心得体会

  1. 学会阅读英文文献
  2. 学会从开发商官网找资料
  3. 要乐于学习新东西
  4. MCC真好用
  5. 和同学交流会有很大收获,感谢丛明钧同学在开发思路上提供的帮助