28. 传感器模块

野火linux开发板编写了传感器相对应的驱动以及设备树插件, 驱动对应内核源码路径为: drivers/ebf_module/ (内核源码的获取请参考野火驱动开发或者镜像构建文章)

设备树插件源码对应内核源码路径为: arch/arm/boot/dts/overlays/

下面介绍如何在野火linux开发板上使用这些模块。

28.1. 温度传感器DS18B20模块

28.1.1. 使能设备树插件

DS18B20模块的驱动已经在鲁班猫系统,需要开启下设备树插件, 使能DS18B20设备树插件,在开发板**/boot/uEnv.txt**文件中添加:

/boot/uEnv.txt
1
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-ds18b20.dtbo

将DS18B20模块插到开发板J27上并重启开发板,

DS18B20模块

重启开发板后在 /dev 目录下多个 ds18b20 设备文件,即可编写应用编程获取ds18b20的数据。

28.1.2. 编写应用程序

应用代码如下所示

ebf_6ull_quick_start_code/Source/ds18b20/ds18b20.c
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>

 int main(int argc, char *argv[])
 {
     int fd;
     char buf[20]={0};
     float result;
     int readlen = 0;

     if ((fd=open("/dev/ds18b20",O_RDWR | O_NDELAY | O_NOCTTY)) < 0) {
         printf("Open Device Ds18b20 Failed.\r\n");
         return -1;
     }
     else
     {
         printf("Open Device Ds18b20 Successed.\r\n");
         while(1) {
             readlen = read(fd, buf, sizeof(buf));
             printf("%s", buf);
             usleep(20000);
         }
         close(fd);
     }
     return 0;
 }

28.1.3. 程序编译和运行

在ubuntu上可以使用交叉编译器编译,然后传输可执行文件到开发板执行。

编译

运行程序

运行

28.2. 温湿度传感器_DHT11模块

28.2.1. 使能设备树插件

修改 /boot/uEnv.txt ,使能dht11设备树插件并关闭adc1设备树插件。

/boot/uEnv.txt
1
2
3
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-dht11.dtbo

#dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-adc1.dtbo

将dht11模块插到开发板相对应位置并重新开发板, 重启开发板后在 /dev 目录下多了dht11设备,即可编写应用编程获取dht11的数据。

28.2.2. 编写应用程序

应用代码如下所示

ebf_6ull_quick_start_code/Source/dht11/dht11.c
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
     int fd;
     unsigned char buf[4];
     int length;

     fd = open("/dev/dht11", O_RDONLY);
     if(fd == -1)
     {
             printf("open failed!\n");
             return -1;
     }

     while(1)
     {
             length = read(fd, buf, 6);
             if(length == -1) {
                     printf("read error!\n");
                     return -1;
             }
             /* 打印 */
             printf("Temperature : %d.%d, Humi : %d.%d\n", buf[2],buf[3], buf[0],buf[1]);
             sleep(1);
     }

     /* 关闭DHT11设备节点 */
     close(fd);
     return 0;
}

编译过后运行程序,对dht11模块哈气可看到获取的温湿度均会发生变化。 读取到的数据前两位数为湿度的整数部分和小数部分,后两位数据为温度的整数部分和小数部分。 关于读取到的数据均是在dht11驱动中规定,有兴趣的读者可阅读dht11驱动源码。

28.2.3. 修改dht11相关设备树

野火imx6ull提供了很多的设备树插件源码,若想要添加或修改不同的引脚作为dht11的引脚, 可参考:

其中dht11的设备树插件文件为 imx-fire-dht11-overlay.dts ,源码如下所示

/arch/arm/boot/dts/overlays/ebf/imx-fire-dht11-overlay.dts
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/dts-v1/;
/plugin/;
#include "imx6ul-pinfunc.h"
#include "dt-bindings/gpio/gpio.h"
 / {
        fragment@0 {
            target-path = "/";
            __overlay__ {
        dht11{
            compatible = "dht11";
            gpios = <&gpio1 2 GPIO_ACTIVE_LOW>;
            linux,open-drain;
            pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_onewire>;
            status = "okay";
        };
            };
        };

        fragment@1 {
             target= <&iomuxc>;
             __overlay__{
                 pinctrl_onewire: onewire {
                     fsl,pins = <
                         MX6UL_PAD_GPIO1_IO02__GPIO1_IO02          0x400138B1
                     >;
                 };
            };
        };
 };

若想要修改dht11的引脚只需要修改以上两行代码即可。