2025 Make Blocks阶段2 - 用TCA9535设计的Charlieplexing LED点阵及输入模块
该项目使用了TCA9535,实现了Charlieplexing LED点阵及输入模块的设计,它的主要功能为:支持对核心板进行信息输入控制及核心板输出信息控制点阵LED的显示。。
标签
开发板
接口
Make Blocks
TCA9535
StreakingJerry
更新2025-08-13
179
KiCad文件
全屏

硬件和功能介绍

该设计包含一个旋转编码器、三个按键以及点阵LED(10*9)的HMI模块(Charlieplexing),为方便搭配不同的核心板,这个HMI模块需支持对核心板进行信息输入控制及核心板输出信息控制点阵LED的显示。为了尽可能少占用MCU核心板的IO管脚,在支持单片机直接控制的基础上,外加IO拓展器,可以直接使用I2C来控制板上所有外设。

模块设计思路、选型及框图介绍

板子主要元件并不多,主要是一个LED矩阵。为了方便手工焊接,我是用的是0805封装的LED。矩阵使用的是Charlieplexing的技术进行的设计,这样可以使用尽可能少的管脚控制尽可能多的LED。这个依赖于单片机输出引脚的三态特性,也就是说每个引脚都需要可以配置为:

输出:逻辑低

输出:逻辑高

输入:高阻抗

02_00

那么自然在选择IO拓展器的时候,就不能使用常见的TCA9555,因为TCA9555的输入模式自带了弱上拉。这个项目中我们使用另一款产品TCA9535.


image.png

模块原理图、PCB简单介绍

image.png

image.png

这里使用了10个引脚控制了90个LED。

除了直接输入的R0-10以及按键SW1-3, 编码器ABS以外,一般使用更推荐使用板上的I2C来进行通讯。TCA9535的INT引脚用来做中断识别,方便对编码器进行控制。

由于TCA9535最高支持电压是5V,因此VCC端口不要使用超过5V的电源进行供电。


打回来的电路板用烙铁先进行上锡,然后再涂抹助焊剂,摆上元件,上铁板烧,就可以完成焊接。e3b911f054740f33d3760496a71eef4.jpg

4396a656bd1df6392b455d24bc455c3.jpg

上面的板子实际上是第二版设计,因为在第一版设计中我遗漏了LED上的限流电阻。特别需要注意的是,任何LED点亮时,实际电路中串联的电阻都是两个,因此电阻的取值要在常规情况下除以2。这里我实际使用的阻值是150R。

调试软件介绍、关键代码片段及说明

模块制作好后,我们可以用任何一种支持I2C通讯的单片机来进行调试。当然使用更高级的树莓派也完全没有问题。这里我用的是一块普通的Arduino nano开发板。

Arduino Nano Development Board


代码比较简单,分为了两个部分,一部分是LED的驱动,我用两个嵌套循环实现了按顺序遍历矩阵中的所有LED:

  for (byte i = 1; i < LED_PIN_COUNT; i++) {
    for (byte j = 0; j < i; j++) {
      TCA.pinMode1(LED_PINS[i], OUTPUT);
      TCA.pinMode1(LED_PINS[j], OUTPUT);
      TCA.write1(LED_PINS[i], LOW);
      TCA.write1(LED_PINS[j], HIGH);
      delay(SCAN_DELAY);
      TCA.write1(LED_PINS[i], HIGH);
      TCA.write1(LED_PINS[j], LOW);
      delay(SCAN_DELAY);
      TCA.pinMode1(LED_PINS[i], INPUT);
      TCA.pinMode1(LED_PINS[j], INPUT);
    }
  }

从代码中也可以看到,我是通过将pinmode重新设置为INPUT的方式来关闭LED,因此引脚支持三态是十分重要的,如果自带上拉电阻,很可能导致部分LED无法关闭。


第二部分是输入部分。按键输入比较简单,直接在loop中轮询按键状态即可;但编码器部分就比较麻烦,比较科学的方法是使用中断来进行读取。TCA9535有一个中断引脚,但是由于TCA9535上任何一个输入模式引脚发生变化都会触发中断输出,这就导致上面的LED循环会频繁触发中断,并没有办法让中断引脚只监控编码器输入引脚。因此编码器的AB相我是通过电路板右边的引脚直接接入单片机的。

  if (!TCA.read1(SW_PINS[0])) {
    Serial.println("Encoder Press");
  } else if (!TCA.read1(SW_PINS[1])) {
    Serial.println("BTN 1 Press");
  } else if (!TCA.read1(SW_PINS[2])) {
    Serial.println("BTN 2 Press");
  } else if (!TCA.read1(SW_PINS[3])) {
    Serial.println("BTN 3 Press");
  } else if (encoder_flag == 1) {
    encoder_flag = 0;
    Serial.println("Encoder +");
  } else if (encoder_flag == 2) {
    encoder_flag = 0;
    Serial.println("Encoder -");
  }

模块调通的功能展示图

image.png

image.png

可以看到在LED扫描的同时,按动按键以及转动编码器,也可以同步看到串口输出。

心得体会

时隔一年再次参加电子森林的活动,活动依旧创意十足,诚意满满!

附件下载
ProPrj_Make_block_2025_2025-06-24.zip
code.ino
团队介绍
个人
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号