# OpenFSR **Repository Path**: yunlongdong/open-fsr ## Basic Information - **Project Name**: OpenFSR - **Description**: OpenFSR旨在提供一款低成本的阵列触摸传感器模组方案 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-05-17 - **Last Updated**: 2024-05-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## OpenFSR:低成本阵列触摸传感器模组 OpenFSR旨在提供一款低成本的阵列触摸传感器模组方案,采用FSR 6x6阵列传感器采集压力变化。整体方案分为: * 采集电路(通过模拟开关设计阵列扫描电路,通过分压设计进行数值采集) * 主控芯片(采用Arduino Nano Mini进行阵列扫描以及模拟量读取,通过串口协议进行数据通信) * 上位机(通过python读取串口数据,使用matplotlib进行实时可视化) ### 采集电路 ![](assets/fsr.png) FSR 6x6阵列传感器具有12个引脚,可通过FPC底座进行连接,由于需要实现x/y阵列扫描,采用了两个单刀八掷开关设计扫描电路,同时FSR测量压力的原理为其电阻会随着压力而变化,因此设计一个分压电路以供后续进行模拟量测量,采集电路的原理图如下: ![](assets/sch_capture.png) 为了方便走线,采集电路使用GH1.25 9Pin进行连接(6个负责模拟开关选择,2个为VCC、GND,1个为模拟量采集) ![](assets/pcb_capture.png) 关于FSR采集的原理可以参考: [知乎:力感测电阻(FSR)与Arduino的接口](https://zhuanlan.zhihu.com/p/341246663) ### 主控芯片 主控芯片采用Arduino Nano Mini,资料在: [Arduino Nano Mini](https://product.abrobot.club/ABrobot%E4%BA%A7%E5%93%81%E8%B5%84%E6%96%99%E4%B8%AD%E5%BF%83/Arduino%20nano%20mini%E8%B5%84%E6%96%99) Arduino进行阵列扫描以及串口通信代码如下: ```C int vals[36]={0}; void setup() { // put your setup code here, to run once: Serial.begin(1000000); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(8,OUTPUT); } void loop() { // put your main code here, to run repeatedly: for(int i=0;i<6;i++){ for(int j=0;j<6;j++){ int bit2 = (i >> 2) & 1; int bit1 = (i >> 1) & 1; int bit0 = i & 1; digitalWrite(3, bit0); digitalWrite(4, bit1); digitalWrite(5, bit2); bit2 = (j >> 2) & 1; bit1 = (j >> 1) & 1; bit0 = j & 1; digitalWrite(6, bit0); digitalWrite(7, bit1); digitalWrite(8, bit2); delay(1); int val = analogRead(14); vals[i*6+j] = val; } } if (Serial.available() > 0) { // 检测串口是否有数据可读 char receivedChar = Serial.read(); // Serial.print("receive:"); // Serial.println(receivedChar); if(receivedChar=='A'){ for(int k=0; k<36; k++){ Serial.print(vals[k]); Serial.print(','); } Serial.print('\n'); } } } ``` 为了方便连接,设计了一个底座将Arduino的接口集成到GH1.25 9Pin端子,原理图如下: ![](assets/sch_arduino.png) ![](assets/pcb_arduino.png) ### 上位机代码 ```python import serial import numpy as np from matplotlib import pyplot as plt import time # 设置串口参数 serial_port = 'COM21' # 根据实际情况修改串口名称 baud_rate = 1000000 # 串口波特率,需与设备设置一致 timeout = 1 # 超时时间(秒) plt.ion() try: # 打开串口 ser = serial.Serial(serial_port, baud_rate, timeout=timeout) print(f"串口 {serial_port} 已打开") while True: # 读取一行数据(以换行符为结束标志) try: ser.write('A'.encode('utf-8')) line = ser.readline().decode('utf-8').strip() print('receive:', line) # time.sleep(0.1) comma_count = line.count(',') if comma_count == 36: data = [int(c) for c in line[:-1].split(',')] data = np.array(data).reshape((6, 6)) data = data * 100/1024.0 data = data * 2 data = np.clip(data, 0, 100) # data = data.astype('uint8') # print(data) plt.clf() plt.imshow(data[::-1, :], cmap='hot', vmin=0, vmax=100) plt.colorbar() plt.pause(0.1) plt.ioff() except: pass # # print(comma_count) # if line: # print(f"收到数据:{line}") except serial.SerialException as e: print(f"无法打开串口 {serial_port}: {e}") finally: if ser.is_open: ser.close() print("串口已关闭") ``` ### OpenFSR组装 ![](assets/all.png) ![](assets/test1.png) ![](assets/test2.png) ![](assets/test.gif) ### 材料链接 * 6x6 FSR传感器 [淘宝](https://item.taobao.com/item.htm?abbucket=3&id=773338399288&ns=1&priceTId=2147811b17159340400701730e2e60&spm=a21n57.1.item.4.650b523cqv1kPh): ![](assets/fsr_real.png) * Arduino Nano Mini [淘宝](https://item.taobao.com/item.htm?abbucket=3&id=740699801077&ns=1&priceTId=2147811b17159341478466932e2e60&spm=a21n57.1.item.3.7720523cF03qyf&sku_properties=1627207:28341) ![](assets/nano_mini.png) * GH1.25 9Pin 公对公连接线(反向) ![](assets/gh.png)