一、前言
在阶段1的项目文档中,介绍了使用Scheme-it绘制的原理图和系统框图,以及项目中所使用到的活动规定厂家的芯片。
想了解阶段1的具体内容可以通过链接跳转:FastBond2阶段1-模拟按键的原理图设计
本文之后的内容将介绍使用kicad绘制的原理图及PCB,成品的功能测试和主要程序的说明。
二、原理图的介绍及PCB介绍
流程图及原理图的绘制都是在Scheme-it网页上完成的,操作很简单。使用了FastBond活动中要求的一家厂商的芯片,TI公司的OPA344运放芯片。下面是分享链接:
https://www.digikey.cn/schemeit/project/detail/8b7338dc5cd44ea8b75a3bc2da9e8f8e
如框图所示,由RP2040-十二指神探拓展板给模拟按键模块提供电源VCC,可提供3.3V或5V的输入电源,模拟按键模块再根据用户按键情况输出不同的电压,模拟按键模块共有六个按键,可输出七种不同的电压,模拟按键模块输出的电压再传输到RP2040-十二指神探拓展板,RP2040-十二指神探拓展板共有三个接口可以接收模拟信号,选其中一个作为接收端就可以了,然后十二指神探根据接收到的电压大小,判断用户按下的哪个按键,LED灯将根据所选模式进行闪烁。
使用Scheme-it设计的原理图导出到KiCad后,有一些地方并不匹配,需要继续更改完善。修改后的原理图如下。
根据原理图绘制的PCB如下:
三、产品功能测试:
板卡焊接完成之后与十二指神探连接实物图:
每当用户按下一个按钮,LED将根据对应按钮的闪烁模式进行闪烁,并且在电脑上显示当前LED灯闪烁模式。十二指神探上只有一个LED灯可用,可设置的LED灯状态模式较少,总共设置了7个LED状态,当没有按钮按下时,LED灯处于熄灭状态;当用户按下SW1,LED灯处于呼吸状态;当用户按下SW2,LED灯处于快速闪烁状态,频率为50KHz;当用户按下SW3,LED灯处于快速闪烁状态,频率为20KHz;当用户按下SW4,LED灯处于快速闪烁状态,频率为8KHz;当用户按下SW5,LED灯处于快速闪烁状态,频率为200Hz;当用户按下SW6,LED灯处于常亮状态。快速闪烁模式,不同的频率对应的LED灯亮度不同,LED灯亮度随着PWM的频率的增大而减小。由于图片展示LED灯闪烁模式效果不佳,所以本文档展示在电脑上显示当前LED灯闪烁模式的结果图,具体LED灯闪烁模式效果将在视频中展示,电源选择的3.3V,也可以选择5V。
四、程序功能说明:
首先是引入MicroPython的内置时间模块(time模块)、机器(machine)模块,配置LED引脚、按键引脚。时间模块提供了与时间相关的函数和方法,例如sleep函数,用于在代码中添加延迟。机器模块提供了与硬件相关的功能,例如控制GPIO引脚、PWM、ADC等硬件控制功能。在使用模块之前,你需要先导入相应的模块,这样才能在代码中使用它们的功能。
import time
import machine
# LED引脚配置
led_pin = machine.Pin(0, machine.Pin.OUT)
led_pwm = machine.PWM(led_pin)
# 按键引脚配置
adc_pin = machine.ADC(26)
然后是设置LED闪烁模式,定义一个名为set_blink_mode的函数,用于设置LED灯的闪烁模式。这个函数接受一个参数mode,用来指定要设置的闪烁模式。根据mode的不同,可以在函数内部编写代码来执行不同的闪烁模式操作。
# 设置闪烁模式
def set_blink_mode(mode):
if mode == 0:
# 熄灭
led_pwm.duty_u16(0)
elif mode == 1:
# 呼吸灯
for duty in range(0, 1024, 32):
led_pwm.duty_u16(duty)
time.sleep_ms(100)
for duty in range(1024, 0, -32):
led_pwm.duty_u16(duty)
time.sleep_ms(100)
elif mode == 2:
# 快速闪烁,频率为50KHz
led_pwm.freq(500000) # set/change the frequency of slice 0
for _ in range(5):
led_pwm.duty_u16(1023)
time.sleep_ms(100)
led_pwm.duty_u16(0)
time.sleep_ms(100)
elif mode == 3:
# 快速闪烁,频率为20KHz
led_pwm.freq(200000) # set/change the frequency of slice 0
for _ in range(5):
led_pwm.duty_u16(1023)
time.sleep_ms(100)
led_pwm.duty_u16(0)
time.sleep_ms(100)
elif mode == 4:
# 快速闪烁,频率为8KHz
led_pwm.freq(8000) # set/change the frequency of slice 0
for _ in range(5):
led_pwm.duty_u16(1023)
time.sleep_ms(100)
led_pwm.duty_u16(0)
time.sleep_ms(100)
elif mode == 5:
# 快速闪烁,频率为200Hz
led_pwm.freq(200) # set/change the frequency of slice 0
for _ in range(5):
led_pwm.duty_u16(1023)
time.sleep_ms(100)
led_pwm.duty_u16(0)
time.sleep_ms(100)
elif mode == 6:
#常亮
led_pwm.duty_u16(1023)
然后下面是一个使用while TRUE的无限循环的示例程序,用于读取模拟信号值并将其转换为电压,然后根据电压选择LED灯的闪烁模式。
while True:
analog_value = adc_pin.read_u16() # 读取模拟信号
voltage = (analog_value / 65535) * 3.3 # 将模拟值转换为电压值(假设使用默认3.3V参考电压)
print("Analog Value: {}".format(analog_value)) # 输出结果
print("Voltage: {:.2f} V".format(voltage))
# 根据电压选择LED灯闪烁模式
if 0<= voltage <=0.5:
mode=0
set_blink_mode(mode) # 按钮按下,设置常亮模式
print("当前LED闪烁模式:熄灭")
elif 3<= voltage <=3.3:
mode=1
set_blink_mode(mode) # 按钮松开,设置呼吸灯模式
print("当前LED闪烁模式:呼吸")
elif 2.5<= voltage <=2.9:
mode=2
set_blink_mode(mode) # 按钮松开,设置呼吸灯模式
print("当前LED闪烁模式:快速闪烁,频率为50KHz")
elif 2<= voltage <=2.5:
mode=3
set_blink_mode(mode) # 按钮松开,设置呼吸灯模式
print("当前LED闪烁模式:快速闪烁,频率为20KHz")
elif 1.5<= voltage <=2:
mode=4
set_blink_mode(mode) # 按钮松开,设置呼吸灯模式
print("当前LED闪烁模式:快速闪烁,频率为8KHz")
elif 1<= voltage <=1.5:
mode=5
set_blink_mode(mode) # 按钮松开,设置呼吸灯模式
print("当前LED闪烁模式:快速闪烁,频率为200Hz")
elif 0.5<= voltage <=1:
mode=6
set_blink_mode(mode) # 按钮松开,设置呼吸灯模式
print("当前LED闪烁模式:常亮")
time.sleep(2) # 间隔2秒钟进行下一次读取
五、活动总结:
感谢硬禾科技举办的这次活动,看着自己画的板子做成成品,并且还可以正常工作,有所应用,内心十分的激动。虽然在这过程中遇到了很多困难,但最终都解决了,并且收获很多。