设计思路
- 由于相同i2c地址的器件无法接入同一个bus,所以引入tca9548a分址器操作。通过对tca9548a的8各通道进行扫描,可以单独操作某一个通道的i2c器件。
- 每次开启一个通道。当开启通道时候,tca9548a相当于透明,i2c操作直接对器件进行。
- 由于此项目进行了一段时间,很多故事和摸索,作者认为有必要对种种学得进行归纳总计
- 由于作者能力有限但是喜欢倒持,截至今日(12Jun2021), 本设计还在持续的摸索前进
1. 设计目的
- 解决一个I2C bus上面挂多个相同地址的I2C期间
- 解决期间高耗电问题
2. 初期想法
- 设计一个硬件转接板,上带有6个I2C通道,用网口进行链接
- 转接板需要和树莓派进行对接
- 树莓派上用python通过smbus库进行i2c操作
- 分址器选用tca9548a - 同时使用此器件的扩展功能,理论上可以扩展8个转接板)
- 用AMS1117-1.8v, -3v, -5v进行输入5v转不同电压操作)
- 两路分开通电保持足够的电流(1路直接给树莓派,1路给i2c器件)
- 外壳设计用3d打印
3. 工具
- DesignSpark PCB 进行pcb设计
- DesignSpark Mechanical进行外壳设计
- Notepad++ 进行软件开发
4. 心路历程
硬件设计
- 转接板V2
- 左上角为tca9548a扩展口,其他6个网口为连接i2c器件
- 靠近右上角为micro usb 5p的电源接口给传感器充电
- 40pin连接器为对接树莓派接口
- 连接板V3
- 增加输入电压口因为micro usb 5p能力不足
- 增加选址器扩展的上拉和下拉电阻
- 对tca9548a复位叫上拉到vdd - tca9548a的电压用树莓派的3.3v
- 转接板V4
- 小路小修改;引出tca9548a的通道3,作为平时debug等操作用途
- 转接板V5 (线路优化)
- 转接板V6
- 线路不变,只将40pin的连接器从正面移到背面,好进行结构设计
6. 转接板v7
- 移除tca9548a扩展功能(由于可能需求不大)
- 减小PCB尺寸
- 将2路5v电源输入,变成1路电源12v电源输入【左上角】,变压成2路电源
- 用AMS1117-5v转12v到5v专门对树莓派供电
- 用SY6103转12v到1.8v/3.3v/5v三路电压,通过短路帽进行电压选择
- 用12v2A电源进行输入
- 由于6个通道的传感器操作的电流(单通道设计150mA)和树莓派工作的电流(<350mA),为了正常工作,添置12v6A的电源
测试后: 可能ASM1117-5V无法带动树莓派(<350mA),怀疑此LDO买了假货。SY6103通过引线可以单独带动树莓派,但是可能发热太大,害怕如果连接6通道的i2c期间后,无法带起来。所以购买: - XRE10/24S05dcdc: 12v输入,5v输出,12W
- XRE12/24S3V3:12v输入,3.3v输出,12W
- 转接板v8
- SY6103:5v输出单独给树莓派供电
- 修改pcb,加入大个子的dc-dc模块
- 正在进行时
- 转接板v8–》v11
- 每个通道单独供电
- 每个通道通过双路开关进行5v和3.3v的电压选择
结构设计
- 此结构是通过板子V6进行的初版外壳设计,软件DesignSpark现学现用,需要改进地方:
- 外壳开口3D打印以后,比较大,需要根据实际修正
- PCB尺寸有点大,需要减少–》V7产生
- 外壳内径宽(或者长)有点大,需要减少
- 增加外壳组装的卡扣设计
- 外壳需要进行倒角
- 增加卡扣
软件设计
- 开启tca9548a的各通道扫描
- 开启树莓派I2C bus
- 芯片的地址固定0x70
class RPI_runSensors():
def __init__(self):
self.bus = SMBus(1)
self.address_TCA9548 = 0x70
- 引用smbus2库的函数对i2c进行操作功能
def write_data(self, address, value):
msg = i2c_msg.write(address, value)
self.bus.i2c_rdwr(msg)
def read_numbers_bytes(self, address,num):
msg = i2c_msg.read(address, num)
self.bus.i2c_rdwr(msg)
data = list(msg)
return data
- 扫描函数
- 将tca9548a接入树莓派的GPIO18 (也就是树莓派的12脚)用于复位。
- 函数进行下个通道扫描的时候,都对芯片进行复位一次,不然会有错误提示
def OpenChannel_TCA9548(self, channel):
# print("set low")
GPIO.output(18, GPIO.LOW)
time.sleep(0.1)
# print("set high")
GPIO.output(18, GPIO.HIGH)
# print("cleanup")
# GPIO.cleanup()
# time.sleep(1.0)
if (channel == 0):
action = 0x01
elif (channel == 1):
action = 0x02
elif (channel == 2):
action = 0x04
elif (channel == 3):
action = 0x08
elif (channel == 4):
action = 0x10
elif (channel == 5):
action = 0x20
elif (channel == 6):
action = 0x40
elif (channel == 7):
action = 0x80
else:
action = 0x00
self.write_data(self.address_TCA9548, [action]) #[] is essential
- 模块化设计软件 – 方便以后接入更多的I2C器件,减少主文件的长度
零件 | 个数 | 链接 | 备注 |
---|---|---|---|
DC-005-5A-2.5 | 1 | https://item.taobao.com/item.htm?spm=a1z09.2.0.0.19212e8dIiqleY&id=566638444906&_u=v33ambv08b3 | 5.5*2.5 |
SHDR40W82P254_2X20_5130X500X16 | 1 | https://detail.tmall.com/item.htm?id=556128222391&spm=a1z09.2.0.0.606d2e8d6J8E9n&_u=v33ambv097c | 双排40针 |
TCA9548APWR | 1 | PWR封装 | |
Molex Female Cat3 RJ45 Modular Jack, Right Angle, Surface Mount Mount, 43743 | 7 | https://item.taobao.com/item.htm?spm=a1z09.2.0.0.606d2e8d6J8E9n&id=534692293080&_u=v33ambv1c07 | SMT |
ams1117-3.3v | 7 | SOT-229 | |
ams1117-5.0v | 7 | SOT-229 | |
SS12D00G5 | 7 | 柄高5MM | |
10K电阻 | 20 | 0603 | |
TAJB226M016RNJ | 14 | https://item.taobao.com/item.htm?spm=a1z09.2.0.0.67002e8dDiq6DP&id=520379721933&_u=v33ambv8e2d | 钽电容,22uf |
22uf | 2 | 电解电容 |
## 6. 持续改进
序号 | 地点 | 内容 | 评论 | 进展 |
---|---|---|---|---|
1 | PCB 第5通道5v | 线路开路 | ||
2 | 所有RJ45位置 | 需要移到PCB最边缘 | 需要相应修改外壳设计 | |
3 | DCDC开孔 | 需要增大 | 方便更换 | |
4 | 点解电容 | 需要放置到背面 | 目前放正面但是焊接在背面,此修改需要和2结合 | |
5 | 外壳 | 上盖增加高度,下盖减少高度 | 方便制作卡扣(学习Lilygo设计) | |
6 | ||||
7 | ||||
8 | ||||
10 |
## 7. 实物照片