HX711压力传感器在Linux内核中已经存在相应的驱动程序,只需要在内核中使能就可以使用。
具体打开如下:
但是和内核中key_board一起打开貌似内核编译会错误,所以我直接在内核中关闭key_board的编译选项:
下一步就是修改设备树结点,参考绑定文档:
在 /home/book/wode/buildroot-100ask_t113-pro/buildroot/output/build/linuxorigin_master/Documentation/devicetree/bindings/iio/adc这个路径下可以找到参考文档:avia-hx711.yaml,内容如下:
结合示例修改设备树:
这里引脚指定和高低点平的指定略有不同,参考其他结点正确指定即可。
重新编译内核,烧写系统,进入开发板,发现设备树下多了两个结点:
但是不能够对这两个文件直接读取数据,因为这里用的是iio框架。
真正的数据传输文件在/sys/devices/platform/weight/iio:device1下的in_voltage0_raw(具体文件可能不同,但是应该就在这个目录下)
这里读取发现其会对压力有反应,但是不是标准的单位。在应用程序进行换算就行。
换算思路就是先测出没有物品放上去的数值a,然后把已知重量为m克的物体放上去得到数值b。
然后用(b-a)/m就可以得到1g是多少个数值,再在应用程序里换算一下就可以了。
具体应用程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#define IIO_DEVICE "/sys/bus/iio/devices/iio:device1"
static int offset = 8500600;
static float scale = 230.8;
static float weight = 0;
float convert_to_weight(int sensor_data) {
float weight;
// 根据校准参数计算重量值
weight = (float)(sensor_data - offset) / scale;
return weight;
}
int main() {
int fd;
char buf[16];
ssize_t num_read;
// 打开iio设备文件
fd = open(IIO_DEVICE "/in_voltage0_raw", O_RDONLY);
if (fd < 0) {
perror("Failed to open iio device");
return 1;
}
// 读取传感器数据
num_read = read(fd, buf, sizeof(buf) - 1);
if (num_read < 0) {
perror("Failed to read sensor data");
close(fd);
return 1;
}
// 关闭设备文件
close(fd);
// 解析传感器数据
buf[num_read] = '\0';
int sensor_data = atoi(buf);
weight = convert_to_weight(sensor_data);
printf("Sensor data: %.1f\n", weight);
return 0;
}
最终结果如图: