跳转至

智能电子设备开发

464 个字 124 行代码 预计阅读时间 3 分钟

课程资源

10% 平时 +10% 读书报告 +10% 思政报告 +30% 设计作业 +40% 实物制作

大作业——柔性材料传感器

原理

利用压敏电阻片受到压力会产生形变导致电阻发生变化,因此其两端的电压值会发生变化,利用 Arduino ADC 口测量其电压值。通过两个 MUX 可以控制阵列不同地方的导通,因此可以依次读取阵列所有点的压力值。

硬件部分

材料 数量
MUX 多通道复用器 2
HC-05 模块 2
Arduino 1
USB-TTL 1
LM358 功放 2
面包板 1

制作一个 2x2 阵列的传感器进行数据读取

  • 将压敏导电片进行裁剪,将其剪成 1cm*1cm 的小方块;
  • 拿出铜箔胶带,裁剪成宽度为 0.5cm 左右的宽度;
  • 利用提供的塑封带,将铜箔胶带贴在塑封袋的两边,使得与压敏导电片接触并将电流引出来;
  • 制作成一个简单的 2X2 的阵列,以便后面实验进行。

连接如下图所示

image-20241023154513488

软件配置

蓝牙模块配置

关于从机与主机与蓝牙的连接方式

从机

HC-05 USB-TTL
VCC 5V
GND GND
TXD RXD
RXD TXD

主机(与 Arduino 练级)

HC-05 Arduino
STATE 不连
RXD pni11
TXD pin10
GND GND
VCC 5V
EN 不连

关于主从机蓝牙连接的配置

# 从机配置
AT              # 测试指令响应OK
AT+ORGL         # 恢复默认设置响应OK
AT+ROLE=0       # 将模块设置成从机模式响应OK
AT+ADDR?        # 获取模块蓝牙地址
AT+PSWD=1122    # 设置配对码为1122

# 主机配置
AT              # 测试指令响应OK
AT+ORGL         # 恢复默认设置响应OK
AT+ROLE=1       # 将模块设置成主机模式响应OK
AT+PSWD=1122    # 设置配对码为1122
AT+CMODE=0      # 设置为指定蓝牙地址连接模式
AT+BIND=xx      # 绑定蓝牙地址,xx为上面从机获得的地址
测试代码
Arduino 代码

通过 Arduino 的串口监视器可以发送信息,电脑端可以收到

#include <SoftwareSerial.h> 
// Pin10接HC05的TXD
// Pin1接HC05的RXD
SoftwareSerial BT(10, 11); 
char val;
 
void setup() {
  Serial.begin(38400); 
  Serial.println("bluetooth is ready!");
  BT.begin(38400);
}
 
void loop() {
  if (Serial.available()) {
    val = Serial.read();
    BT.print(val);
  }
 
  if (BT.available()) {
    val = BT.read();
    Serial.print(val);
  }
}
PC 端代码
import serial

# 配置串口的参数
port = 'COMX'  # 替换为你的实际串口
baudrate = 38400  # 波特率,根据实际设备的配置
timeout = 1  # 设置超时时间,单位为秒

# 初始化串口
try:
    ser = serial.Serial(port, baudrate, timeout=timeout)
    print(f"已连接到 {port}")
except serial.SerialException as e:
    print(f"无法打开串口: {e}")
    exit()

# 持续读取串口数据并打印
try:
    while True:
        if ser.in_waiting > 0:  # 检查是否有数据可读取
            data = ser.readline()#.decode('utf-8').strip()  # 读取一行并去掉末尾的换行符
            print(f"接收到的数据: {data}")
except KeyboardInterrupt:
    print("程序终止")

# 关闭串口
finally:
    ser.close()
    print("串口已关闭")

这样就可以验证通讯是否能够进行,接下来就可以进行 MUX 控制开关实现电压的读取了

MUX

读取示例代码

int s0 = 8;
int s1 = 9;
int s2 = 10;
int s3 = 11;

//Mux in “SIG” pin
int SIG_pin = 0;

void setup(){
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);

digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);

Serial.begin(9600);
}

void loop(){
    //Loop through and read all 16 values
    //Reports back Value at channel 6 is: 346
    for(int i = 0; i < 16; i ++){ 
        Serial.print("Value at channel ");
        Serial.print(i); Serial.print("is : ");
        Serial.println(readMux(i));
        delay(1000);
    }
}
int readMux(int channel){ 
    int controlPin[] = {s0, s1, s2, s3};
	int muxChannel[16][4]={ {0,0,0,0}, //channel 0
        {1,0,0,0}, //channel 1
        {0,1,0,0}, //channel 2
        {1,1,0,0}, //channel 3
        {0,0,1,0}, //channel 4
        {1,0,1,0}, //channel 5
        {0,1,1,0}, //channel 6
        {1,1,1,0}, //channel 7
        {0,0,0,1}, //channel 8
        {1,0,0,1}, //channel 9
        {0,1,0,1}, //channel 10
        {1,1,0,1}, //channel 11
        {0,0,1,1}, //channel 12
        {1,0,1,1}, //channel 13
        {0,1,1,1}, //channel 14
        {1,1,1,1} //channel 15
    }; //loop through the 4 sig
    for(int i = 0; i < 4; i ++){ 
        //read the value at the SIG pin
        digitalWrite(controlPin[i], muxChannel[channel][i]); 
    } 
    int val = analogRead(SIG_pin);
   //return the value
	return val; 
}

实际代码

Arduino


PC