基于北斗和4G_Cat1模组的华为云智慧物流开发02

举报
谢小康 发表于 2021/08/08 21:19:21 2021/08/08
【摘要】 基于北斗和4G_Cat1模组的华为云智慧物流开发02 前言设备树贯穿整个Linux嵌入式开发设备树的使用对后面实战项目驱动外设至关重要在嵌入式Linux 系统中,绝大多数硬件设备都有非常成熟的驱动框架LED子系统、GPIO子 系统、INPUT子系统等都可以直接修改使用●学完本课程后,您将能够:了解如何修改官方设备树相关驱动配置掌握LED子系统的使用添加一个LED节点,并编写测试程序,利用按...

基于北斗和4G_Cat1模组的华为云智慧物流开发02

前言

设备树贯穿整个Linux嵌入式开发
设备树的使用对后面实战项目驱动外设至关重要
在嵌入式Linux 系统中,绝大多数硬件设备都有非常成熟的驱动框架
LED子系统、GPIO子 系统、INPUT子系统等都可以直接修改使用
●学完本课程后,您将能够:

  1. 了解如何修改官方设备树相关驱动配置
  2. 掌握LED子系统的使用
  3. 添加一个LED节点,并编写测试程序,利用按键点亮LED灯
  4. 驱动一个I2C设备——读取传感器的温湿度

设备树文件的修改和编译

编译设备树有两种方式:
一种就是编译内核,顺带就把设备树给编译了,但是会耗费大量的时间
还有一种就是单单只编译设备树文件,这个是手册上的编译步骤
image.png
参考以上步骤只需要更改一下便可以做一个只编译设备树文件的脚本

mkdir -p ../build
#加载SDK环境变量:
source /opt/st/myir/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
#查询版本号并打印出来
$CC --version
#配置内核
make ARCH=arm O="$PWD/../build" myc-ya157c_defconfig
# 只编译设备树
make ARCH=arm dtbs LOADADDR=0xC2000040 O="$PWD/../build"
make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install O="$PWD/../build"
mkdir -p $PWD/../build/install_artifact/boot/
# 只拷贝设备树
cp $PWD/../build/arch/arm/boot/dts/st*.dtb $PWD/../build/install_artifact/boot/

之前没有这个脚本编译设备树文件便很麻烦,这个文件直接放在同一文件夹下面,便可以正常编译设备树文件
image.png

使用按键控制电机的运动

首先读取按键的值
cd /dev/input/by-path/
cat platform-joystick-event
编译KEY_LED的时候一定要加
make ARCH=arm
否则会编译出X86的文件出来
image.png
查询原理图电机的引脚对应到开发板上是F12,所以添加一个设备树节点命名为motor。
image.png
编译设备树文件,拷贝到开发板的/boot/ 下面,重启开发板设备。
查看是否多出了一个可以控制的设备
image.png
然后写一个电机控制程序
image.png
下载至开发板验证,成功,没有问题

驱动I2C设备

E53插接板搭载了一个SHT30温湿度传感器,这是一个IIC设备,与开发板链接是连接到了IIC1上。
查询SHT30的地址,使用I2C-tools工具进行查询,这里需要去官网下载
i2c-tools
解压,进入到i2c-tools的文件夹下面,在Ubuntu系统中进行交叉编译,按照如下步骤进行编译
首先加载米尔电子提供的Gcc交叉编译工具链
source /opt/st/myir/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
然后直接
make
在tools文件夹下面会出现编译出来的文件直接拷贝到开发板即可,执行扫描,确定地址为0x44
image.png
SHT30代码分析

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/select.h>
#include<sys/time.h>
#include<errno.h>
//宏定义

#define SHT30_Address                               0x44         //10001000 器件的地址
#define I2C_RETRIES                                 0x0701
#define I2C_TIMEOUT                                 0x0702
#define I2C_SLAVE                                   0x0703       //IIC从器件的地址设置
#define I2C_BUS_MODE                                0x0780

typedef unsigned char uint8;
int fd = -1;

//函数声明
static uint8 SHT30_Init(void);

//
static uint8 SHT30_Init(void)
{
    fd  = open("/dev/i2c-0", O_RDWR);               // open file and enable read and  write这里的i2c-0代表IIC1 这里不报错的话应该返回1

    if (fd < 0)
    {
        perror("Can't open /dev/SHT30 \n");       // open i2c dev file fail
        exit(1);
    }

    printf("open /dev/i2c-0 success !\n");          // open i2c dev file succes

    if (ioctl(fd, I2C_SLAVE,SHT30_Address) < 0)//设置了IIC的地址、从地址
    { //set i2c address
        printf("fail to set i2c device slave address!\n");
        close(fd);
        return - 1;//失败直接退出程序
    }

    printf("set slave address to 0x%x success!\n", SHT30_Address);

    return (1);
}

// main
int main(int argc, char * argv[])
{
    unsigned char buf[8] = {0};
    SHT30_Init();
    usleep(1000 * 100);
    float temperature=0;
    float humidity=0;
    while (1)
    {
    buf[0] = 0x2C; //发送2C 0D可以启动一个单次的读写,返回6字节的数据
    buf[1] = 0x0D;
    if ( write(fd, buf, 2) != 2 ) {
        perror("faile to write config.\n");
        return -1;
    }
    buf[0] = 0;
    buf[1] = 0;
    if (read(fd, buf, 6) != 6 ) {
        perror("faile to read back configure data.\n");
        return -1;
    }    
    printf("SHT30---->: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x \n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5] );
    temperature = ((float)((buf[0]<<8)+buf[1]))*175/65535-45;
    humidity = ((float)((buf[3]<<8)+buf[4]))*100/65535;
    printf("temperature:%f   humidity:%f\r\n",temperature,humidity);
    usleep(1000 * 200);
    }
    close(fd);
}

image.png
原始数据计算得出我们需要监测的数据温湿度
编译后发送到开发板测试是否能够正常运行。
make ARCH=arm
image.png

LCD屏的调试

image.png
校准显示屏
这里需要制作一个屏幕校准的工具
首先在Ubuntu系统在/home/pc/work/下打开终端,下载源码
git clone https://github.com/libts/tslib.git
加载环境变量 #非常之重要,不然后面会报错
source /opt/st/myir/3.1-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
运行脚本
./autogen.sh
./configure --prefix=/root/tslib --host=arm-linux
make
make install
最后把交叉编译的工具拷贝到开发板里,放在/usr/local/下
image.png

总结:
本节内容主要讲了怎么编译设备树文件,怎么使用按键控制电机,怎么驱动IIC设备SHT30读取温湿度,以及LCD屏的校准。这一节为之后的QT应用搭建智慧物流应用做准备。
附带点感想:收到开发板大概是6月初,机缘巧合之下,参加嵌入式比赛有用到L610cat1模组,看到了华为云的体验官活动,抱着试试看的心理参加了这次活动。我没想到我也能通过审核并拿到了开发板,也是非常的幸运能够参加这次的体验,之前都没有这样的经历。一直到现在8月份,这期间不仅仅结识了很多行业大佬,还有和我一样志同道合的朋友,我从之前的啥也不会,然后一点点的到现在真的收获满满,从Linux小白,到现在也能过说有一段Linux的开发吧。第一次接触过交叉编译,以前只用过stm32f103系列单片机,用过stm32MPI之后才知道其强大不亚于树莓派。
**

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。