硬件和功能介绍
该设计包含一个旋转编码器、三个按键以及点阵LED(10*9)的HMI模块(Charlieplexing),为方便搭配不同的核心板,这个HMI模块需支持对核心板进行信息输入控制及核心板输出信息控制点阵LED的显示。为了尽可能少占用MCU核心板的IO管脚,在支持单片机直接控制的基础上,外加IO拓展器,可以直接使用I2C来控制板上所有外设。
模块设计思路、选型及框图介绍
板子主要元件并不多,主要是一个LED矩阵。为了方便手工焊接,我是用的是0805封装的LED。矩阵使用的是Charlieplexing的技术进行的设计,这样可以使用尽可能少的管脚控制尽可能多的LED。这个依赖于单片机输出引脚的三态特性,也就是说每个引脚都需要可以配置为:
输出:逻辑低
输出:逻辑高
输入:高阻抗

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

模块原理图、PCB简单介绍



这里使用了10个引脚控制了90个LED。
除了直接输入的R0-10以及按键SW1-3, 编码器ABS以外,一般使用更推荐使用板上的I2C来进行通讯。TCA9535的INT引脚用来做中断识别,方便对编码器进行控制。
由于TCA9535最高支持电压是5V,因此VCC端口不要使用超过5V的电源进行供电。
打回来的电路板用烙铁先进行上锡,然后再涂抹助焊剂,摆上元件,上铁板烧,就可以完成焊接。

上面的板子实际上是第二版设计,因为在第一版设计中我遗漏了LED上的限流电阻。特别需要注意的是,任何LED点亮时,实际电路中串联的电阻都是两个,因此电阻的取值要在常规情况下除以2。这里我实际使用的阻值是150R。
调试软件介绍、关键代码片段及说明
模块制作好后,我们可以用任何一种支持I2C通讯的单片机来进行调试。当然使用更高级的树莓派也完全没有问题。这里我用的是一块普通的Arduino nano开发板。
代码比较简单,分为了两个部分,一部分是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 -");
}
模块调通的功能展示图


可以看到在LED扫描的同时,按动按键以及转动编码器,也可以同步看到串口输出。
心得体会
时隔一年再次参加电子森林的活动,活动依旧创意十足,诚意满满!