【luckfox】添加压力传感器hx711

news2024/11/15 8:06:30

文章目录

  • 前言
  • 一、参考资料
  • 二、电路图
  • 三、驱动
  • 四、makefile——添加驱动
  • 五、dts——使能gpio
    • 5.1 参考
    • 5.2 改动1—— hx117节点
    • 5.3 改动2——引脚节点
    • 5.4 已经被定义的引脚
    • 5.5 gpio源码
  • 六、改动总结——使能hx711
  • 七、验证驱动添加
  • 八、编写测试文件
    • 8.1 测试代码
    • 8.2 配置编译环境变量
  • 九、验证
  • 十、其他——添加文件路径
  • 小结

前言

本章介绍基于luckfox开发板添加压力传感器hx711,并编写测试

一、参考资料

Rockchip_RV1103_Datasheet_V1.1-20220427.pdf
在这里插入图片描述

二、电路图

在这里插入图片描述

只有这两个io口没有复用其他功能,需要关掉PWM0_0/1_0。

三、驱动

luckfox-pico-main\sysdrv\source\kernel\drivers\iio\adc\hx711.c

这里匹配gpio

static int hx711_probe(struct platform_device *pdev)
{
	/*
	 * PD_SCK stands for power down and serial clock input of HX711
	 * in the driver it is an output
	 */
	hx711_data->gpiod_pd_sck = devm_gpiod_get(dev, "sck", GPIOD_OUT_LOW);
	if (IS_ERR(hx711_data->gpiod_pd_sck)) {
		dev_err(dev, "failed to get sck-gpiod: err=%ld\n",
					PTR_ERR(hx711_data->gpiod_pd_sck));
		return PTR_ERR(hx711_data->gpiod_pd_sck);
	}

	/*
	 * DOUT stands for serial data output of HX711
	 * for the driver it is an input
	 */
	hx711_data->gpiod_dout = devm_gpiod_get(dev, "dout", GPIOD_IN);
	if (IS_ERR(hx711_data->gpiod_dout)) {
		dev_err(dev, "failed to get dout-gpiod: err=%ld\n",
					PTR_ERR(hx711_data->gpiod_dout));
		return PTR_ERR(hx711_data->gpiod_dout);
	}

	hx711_data->reg_avdd = devm_regulator_get(dev, "avdd");
	if (IS_ERR(hx711_data->reg_avdd))
		return PTR_ERR(hx711_data->reg_avdd);
}


static struct platform_driver hx711_driver = {
	.probe		= hx711_probe,
	.remove		= hx711_remove,
	.driver		= {
		.name		= "hx711-gpio",
		.of_match_table	= of_hx711_match,
	},
};

四、makefile——添加驱动

# luckfox-pico-main\sysdrv\source\kernel\drivers\Makefile
obj-$(CONFIG_IIO)		+= iio/

# luckfox-pico-main\sysdrv\source\kernel\drivers\iio\Makefile
obj-y += adc/

# luckfox-pico-main\sysdrv\source\kernel\drivers\iio\adc\Makefile
obj-$(CONFIG_HX711) += hx711.o

配置

luckfox-pico\sysdrv\source\kernel\arch\arm\configs\luckfox_rv1106_linux_defconfig

# sensor -- hx711
CONFIG_HX711=y
CONFIG_IIO=y

五、dts——使能gpio

5.1 参考

luckfox-pico\sysdrv\source\kernel\Documentation\devicetree\bindings\iio\adc\avia-hx711.yaml

examples:
  - |
    #include <dt-bindings/gpio/gpio.h>
    weight {
        compatible = "avia,hx711";
        sck-gpios = <&gpio3 10 GPIO_ACTIVE_HIGH>;
        dout-gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>;
        avdd-supply = <&avdd>;
        clock-frequency = <100000>;
    };

注意,这里要改动下,需要匹配驱动中的of获取,移除gpios和supply。

//luckfox-pico-main\sysdrv\source\kernel\drivers\iio\adc\hx711.c
static const struct of_device_id of_hx711_match[] = {
	{ .compatible = "avia,hx711", },
	{},
};

5.2 改动1—— hx117节点

rv1103-luckfox-pico-ipc.dtsi
rv1103g-luckfox-pico.dts
rv1106-evb.dtsi
rv1106.dtsi
rv1103.dtsi

luckfox-pico-main\sysdrv\source\kernel\arch\arm\boot\dts\rv1103g-luckfox-pico.dts

hx711:hx711 {
	status = "okay";
	compatible = "avia,hx711"; 
	sck-gpios = <&gpio1 RK_PA2 GPIO_ACTIVE_HIGH>;
	dout-gpios = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>;
	avdd-supply = <&vcc_3v3>;//vcc3v3_sys
	clock-frequency = <400000>;
};

dtsi中sck-gpios是全的,但是在代码中只有sck,这个是在代码中省去了,注意区分。

这里只是给hx117增加了设备节点,但是rv1103和其他平台不太一样,还需要自己在dts中定义pin的节点

5.3 改动2——引脚节点

这点真就没注意到,导致我纠结了好久,还是没有获取到hx117的数据。
参考:https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-GPIO/

	gpio1pa2:gpio1pa2 {
		compatible = "regulator-fixed";
		pinctrl-names = "default";
		pinctrl-0 = <&gpio1_pa2>;
		regulator-name = "gpio1_pa2";
		regulator-always-on;
	};

	gpio0pa4:gpio0pa4 {
		compatible = "regulator-fixed";
		pinctrl-names = "default";
		pinctrl-0 = <&gpio0_pa4>;
		regulator-name = "gpio0_pa4";
		regulator-always-on;
	};

&pinctrl {
	gpio1-pa2 {
		gpio1_pa2:gpio1-pa2 {
			rockchip,pins =	<1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};

	gpio0-pa4 {
		gpio0_pa4:gpio0-pa4 {
			rockchip,pins =	<0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};
};

5.4 已经被定义的引脚

板子的21-27都被定义了,这是用于fspi

i2c3和spi0被enable了,需要disable后测试hx117
其中spi的cs选的是c0(28+0=16),不是d2(38+2=26),所以只需要关掉i2s3即可。

或者改用gpio1_A2和gpio_A4,这样不会有引脚复用,可以同时支持i2c、spi、adc。

5.5 gpio源码

在这里插入图片描述
在这里插入图片描述
都设为高电平有效GPIO_ACTIVE_HIGH

引脚作为输入还是输出由驱动中devm_gpiod_get定义

/sys/bus/iio/devices/iio:device0/

六、改动总结——使能hx711

diff --git a/sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico.dts b/sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico.dts
index 0f1a686fc..b08b1797d 100644
--- a/sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico.dts
+++ b/sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico.dts
@@ -63,6 +63,23 @@ gpio4pb1:gpio4pb1 {
                regulator-name = "gpio4_pb1";
                regulator-always-on;
        };
+
+       /* add hx711 */
+       gpio1pa2:gpio1pa2 {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&gpio1_pa2>;
+               regulator-name = "gpio1_pa2";
+               regulator-always-on;
+       };
+
+       gpio0pa4:gpio0pa4 {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&gpio0_pa4>;
+               regulator-name = "gpio0_pa4";
+               regulator-always-on;
+       };
 };
 /**********GPIO**********/
 &pinctrl {
@@ -102,6 +119,19 @@ gpio4_pb1:gpio4-pb1 {
                };
        };

+       /* add hx711*/
+       gpio1-pa2 {
+               gpio1_pa2:gpio1-pa2 {
+                       rockchip,pins = <1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+
+       gpio0-pa4 {
+               gpio0_pa4:gpio0-pa4 {
+                       rockchip,pins = <0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;
+               };
+       };
+
 };


@@ -178,19 +208,21 @@ &uart4 {

 /**********PWM**********/

+
 &pwm0 {
-       status = "okay";
+       status = "disabled";
        pinctrl-names = "active";
        pinctrl-0 = <&pwm0m0_pins>;
        // pinctrl-0 = <&pwm0m1_pins>;
 };
 &pwm1 {
-       status = "okay";
+       status = "disabled";
        pinctrl-names = "active";
        pinctrl-0 = <&pwm1m0_pins>;
        // pinctrl-0 = <&pwm1m1_pins>;
 };

 // &pwm2 {
 //     status = "okay";
 //     pinctrl-names = "active";
@@ -251,4 +283,15 @@ &pwm11 {



+/**********iio**********/
+/ {
+       hx711:hx711 {
+               status = "okay";
+               compatible = "avia,hx711";
+               sck-gpios = <&gpio1 RK_PA2 GPIO_ACTIVE_HIGH>;
+               dout-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
+               avdd-supply = <&vcc_3v3>;//vcc3v3_sys
+               clock-frequency = <400000>;
+       };
+};

diff --git a/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig b/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig
index 4c54b6965..28a2caf94 100755
--- a/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig
+++ b/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig
@@ -320,3 +320,7 @@ CONFIG_DEBUG_FS=y
 # CONFIG_SCHED_DEBUG is not set
 # CONFIG_FTRACE is not set
 # CONFIG_RUNTIME_TESTING_MENU is not set
+
+# sensor -- hx711
+CONFIG_HX711=y
+CONFIG_IIO=y

七、验证驱动添加

可以看到驱动正常加载了,注意dmesg中的hx711相关log是我自己在驱动中添加的,默认是没有的,可以直接获取iio属性判断驱动有没有添加成功。

root@Rockchip:/# dmesg | grep hx711
[    0.091066] hx711-gpio hx711: hx711_probe
[    0.091420] hx711-gpio hx711: ret=3300000
[    0.091447] hx711-gpio hx711: ret=330000000
[    0.091456] hx711-gpio hx711: ret=1536
[    0.091464] hx711-gpio hx711: ret=6145
[    0.091471] hx711-gpio hx711: ret=3072
root@Rockchip:/# cd /sys/bus/iio/devices/iio:device0
root@Rockchip:/sys/bus/iio/devices/iio:device0# ls
of_node                      in_voltage0_raw
name                         buffer
uevent                       dev
in_voltage_scale             power
current_timestamp_clock      subsystem
trigger                      in_voltage1_scale_available
in_voltage1_raw              scan_elements
in_voltage0_scale_available
root@Rockchip:/sys/bus/iio/devices/iio:device0# cat name
hx711
root@Rockchip:/sys/bus/iio/devices/iio:device0# cat in_voltage0_raw
7949573
root@Rockchip:/sys/bus/iio/devices/iio:device0#

在这里插入图片描述

八、编写测试文件

应用实例ko
https://wiki.luckfox.com/zh/Luckfox-Pico/Core3566-SDK

执行文件bin
https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-GPIO

8.1 测试代码

hx711_app.c

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
// #include <linux/delay.h>
#include <sys/time.h>
#include <string.h>

#define IIO_DEVICE "/sys/bus/iio/devices/iio:device0"
#define SENSOR_CALI_PATH_OFFSET "/root/hx711_cal_offset"
#define SENSOR_CALI_PATH_SCALE "/root/hx711_cal_scale"

static int cal_offset = 8500000;    // save raw value without test items

static int cal_scale = 475;         // when set phone, 1g is 475
static int cal_weight = 187;  // the weight of phone

// static float weight = 0;
static int weight = 0;
// float convert_to_weight(int sensor_data) {
int convert_to_weight(int sensor_data) {
    int weight;
    // weight = (float)(sensor_data - cal_offset) / cal_scale;

    // printf("\nsensor_raw=%d,cal_offset=%d,cal_scale=%d\n",sensor_data,cal_offset,cal_scale);
    if(cal_scale != 0)
        weight = (sensor_data - cal_offset) / cal_scale;
    else
        weight = 0;

    // printf("Sensor data: %.1f\n", weight);
    // printf("Sensor data: %d\n", weight);

    return weight;
}


int get_hx711_raw(){
    int fd;
    char buf[64];
    ssize_t num_read;

    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);
    // printf("  raw sensor_data=%d\n",sensor_data);

    return sensor_data;
}

// float get_hx711_value(){
int get_hx711_value(){

    int sensor_data = get_hx711_raw();

    weight = convert_to_weight(sensor_data);

    return weight;
}

// save scale&offset to file 
void set_cal_value(){
    int fd;
    char tmp_char[64];

    fd = open(SENSOR_CALI_PATH_OFFSET, O_CREAT|O_RDWR ,0777);
    if (fd < 0) {
        perror("Failed to open cal offset.");
        return;
    }
 
    // printf("-------\ncal_offset=%d\n",cal_offset);
    memset(tmp_char,0,sizeof(tmp_char));
    sprintf(tmp_char,"%d\0",cal_offset);
    // printf("xxx tmp_char=[%s]\n",tmp_char);
    write(fd, tmp_char, sizeof(tmp_char));

    close(fd);

    fd = open(SENSOR_CALI_PATH_SCALE, O_CREAT|O_RDWR ,0777);
    if (fd < 0) {
        perror("Failed to open cal offset.");
        return;
    }

    // printf("cal_scale=%d\n",cal_scale);
    memset(tmp_char,0,sizeof(tmp_char));
    sprintf(tmp_char,"%d\0",cal_scale) ;
    // printf("xxx tmp_char=[%s]\n-------\n",tmp_char);
 
    write(fd, tmp_char, sizeof(tmp_char)-1);
    close(fd);
}

void print_cal_value_and_raw(int sensor_raw_tmp){
    printf("cal&raw:\n");
    printf("   cal_offset=%d sensor_raw=%d\n", cal_offset, sensor_raw_tmp);
    printf("   test_offset\t%d\n   cal_weight\t%d\n   cal_scale\t%d\n",
            sensor_raw_tmp - cal_offset, cal_weight, cal_scale);
    printf("\n");
}

void print_cal_value(){
    printf("hx711 calibration value\n");
    printf("   cal_offset\t%d\n   cal_weight\t%d\n   cal_scale\t%d\n",
            cal_offset, cal_weight, cal_scale);
    printf("\n");
}

void sns_calibration(){
    int cal_test_num = 10;
    int cal_average = 0;
    int cal_test_tmp = 0;
    int cal_scale_raw = 0;

    // test 10 times to get offset average
    for(int i=0; i<cal_test_num; i++){
        cal_test_tmp = get_hx711_raw();
        usleep(10);
        cal_average = (cal_average * i + cal_test_tmp)/(i+1);
    }

    cal_offset=cal_average;

    usleep(20);

    printf("!!! Please put test items on the board whose weight same with cmd3\nWaiting input char to continue ...\n");
    getchar();

    cal_test_tmp = get_hx711_raw();
    cal_scale_raw = cal_test_tmp - cal_offset;
    cal_scale = (cal_scale_raw)/cal_weight;

    print_cal_value_and_raw(cal_test_tmp);

    set_cal_value();
}


void get_cal_value(){
    int tmp_offset;
    int tmp_scale;
    char tmp_file_value[64];
    int fd;

    // printf("get_cal_value\n");

    fd = open(SENSOR_CALI_PATH_OFFSET, O_RDWR,0777);
    if (fd < 0) {
        perror("Failed to open cal offset.");
        return;
    }

    read(fd, tmp_file_value, sizeof(tmp_file_value) - 1);
    // printf("tmp_file_value=%s\n",tmp_file_value);
    tmp_offset = atoi(tmp_file_value);
    // printf("tmp_offset=%d\n",tmp_offset);
 
    close(fd);

    fd = open(SENSOR_CALI_PATH_SCALE, O_RDWR,0777);
    if (fd < 0) {
        perror("Failed to open cal offset.");
        return;
    }
 
    memset(tmp_file_value,0,sizeof(tmp_file_value));
    read(fd, tmp_file_value, sizeof(tmp_file_value) - 1);
    tmp_scale = atoi(tmp_file_value);
    // printf("tmp_offset=%d\n",tmp_scale);
 
    close(fd);

    cal_offset = tmp_offset;
    cal_scale = tmp_scale;


}

int main(int argc, char *argv[]) {

    char cmd1[16];
    char cmd2[16];
    char cmd3[16];
    int ret;
    int val_tmp=0;

    // calibration: put the items whose weight is known. weight sends to cmd3
    // ./hx771_app -c 187
    if(argc == 3){
        strcpy(cmd2,argv[1]);
        strcpy(cmd3,argv[2]);
        printf("cmd2=%s cmd3=%s\n",cmd2,cmd3);
        if(strcmp(cmd2, "-c") == 0){
            printf("get cal cal_weight %s\n",cmd3);
            cal_weight=atoi(cmd3);        // save the weight of cal items
        } else {
            printf("hx711 no cal_weight\n");
            return 0;
        }

        sns_calibration();

		sleep(1);

        // test the calibration result
        val_tmp = get_hx711_value();
        printf("sensor value: %d\n", val_tmp);

		return 0;
    }

    printf("-------------test-------------\n");

    get_cal_value();
    print_cal_value();

    int sensor_data;
    int test_num=5;
    while(test_num--){
        val_tmp = get_hx711_value();
        printf("%02d: %d\n",5 - test_num,val_tmp);
        sleep(1);
    }

    printf("--------------------------\n");

    return 0;
}

8.2 配置编译环境变量

需要在ubuntu环境下运行。

export PATH=/home/luckfox/Luckfox-Pico/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin:$PATH
source ~/.bashrc  
cd ~/luckfox/luckfox-pico/project/app/test_app/hx711
arm-rockchip830-linux-uclibcgnueabihf-gcc hx711_app.c -o hx711_app

在这里插入图片描述

九、验证

由于将虚拟机中生成的可执行文件复制到windows本地,再通过adb传入设备中,这部分流程比较重复,所以编写了一个简单的bat脚本进行刷入,需要输入虚拟机的登录密钥就可以执行了。

scp youkai@192.168.206.130:/home/youkai/luckfox/luckfox-pico/project/app/test_app/hx711/hx711_app .

adb push hx711_app /root/

adb shell "chmod 777 /root/hx711_app"
adb shell "./root/hx711_app -c 187"

直接运行这个bat脚本,然后输入密码就可以实现自动刷执行文件并校准。

刷完执行文件后也可以手动下命令进行测试。

root@Rockchip:/root# ./hx711_app -c 187
root@Rockchip:/root# ./hx711_app

在这里插入图片描述

十、其他——添加文件路径

busybox vi /etc/profile

'# ' --> '$USER@$HOSTNAME:$PWD# '

source /etc/profile

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

小结

本章实现了hx711的数据读取,以及计算出称量物品的重量,后续可以结合算法实现相关功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1143815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式——单例模式详解

目录 设计模式类型单例模式单例模式方式饿汉式静态常量方式静态代码块形式 懒汉式线程不安全&#xff08;不推荐&#xff09;懒汉式优化&#xff08;不推荐&#xff09; 双重检查&#xff08;推荐方式&#xff09;静态内部类&#xff08;推荐方式&#xff09;枚举方式&#xff…

LeetCode 1465. 切割后面积最大的蛋糕【贪心,数组,排序】1444

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

探秘Kafka背后的幕后机关,揭示消息不丢失或重复的原理与实践经验

背景 相信大家在工作中都用过消息队列&#xff0c;特别是 Kafka 使用得更是普遍&#xff0c;业务工程师在使用 Kafka 的时候除了担忧 kafka 服务端宕机外&#xff0c;其实最怕如下这样两件事。 消息丢失。下游系统没收到上游系统发送的消息&#xff0c;造成系统间数据不一致。…

基于springboot实现校园志愿者管理系统项目【项目源码+论文说明】

基于springboot实现校园志愿者管理系统演示 摘要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;校园志愿者管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff…

VMware 16开启虚拟机电脑就蓝屏W11解决方法

问题现象 解决方法 控制面板->程序->启用或关闭windows功能->勾选虚拟机平台->重启

VTKQT 3D交互---[3]降低抬高功能PushAndPull

前言&#xff1a;在医疗的应用中&#xff0c;有时会需要手动去修改模型&#xff0c;比如3-matic软件中的LocalSmoothing和PushAndPull功能。该博文主要记录降低抬高PushAndPull功能。

4 H3C网络设备模拟器

如果大家没有硬件&#xff0c;但是也想做一下组网&#xff0c;可以使用H3C提供的网络模拟器。因为我使用的是mac&#xff0c;所以将软件安装到虚拟机里。安装好之后可以看到如下结构&#xff1a; 交换机工作原理 在使用模拟器前&#xff0c;我们先学习一下交换机的工作原理。 …

深入剖析SQL与NoSQL的优劣势,帮你决定最佳数据存储方案

你是否在为系统的数据库来一波大流量就几乎打满 CPU&#xff0c;日常 CPU 居高不下烦恼?你是否在各种 NoSQL 间纠结不定&#xff0c;到底该选用哪种最好?今天的你就是昨天的我&#xff0c;这也是我写这篇文章的初衷。 作为互联网从业人员&#xff0c;我们要知道关系型数据库…

VMware16,运行虚机后E盘下就会产生一个奇怪的文件夹

问题现象&#xff1a; VMware16&#xff0c;运行虚机后E盘下就会产生一个奇怪的文件夹&#xff0c;是乱码的 问题原因&#xff1a; 虚机安装路径存在中文 解决方法&#xff1a; 删除乱码文件夹 一&#xff1a;是否有中文路径&#xff0c;有的话改为英文路径 二&#xff1…

HED边缘检测

HED边缘检测 HED边缘检测&#xff0c;得到模型后&#xff0c;可以用OPENCV调用&#xff0c;不需要其他依赖&#xff0c;C/PYTHON/ANDROID都可以实现&#xff0c;效果如下&#xff1a;

Ubuntu安装docker,并换镜像源详细教程,建议收藏

文章目录 添加docker官方的GPG密钥将docker仓库添加到apt源安装docker检查docker换源 添加docker官方的GPG密钥 sudo apt-get updatesudo apt-get install ca-certificates curl gnupgsudo install -m 0755 -d /etc/apt/keyringscurl -fsSL https://download.docker.com/linux…

GB/T28181流媒体相关协议详解

GB/T28181流媒体相关协议详解 文章目录 GB/T28181流媒体相关协议详解1 GB/T28181协议中使用的应用层协议介绍2 实时视频点播协议交互流程2.1 设备注册2.2 设备保活2.3 视频播放 总结 本文主要主要针对28181协议中视频流的部分&#xff0c;来阐述视频流通过28181协议如何进行视频…

解密RocketMq的运行机制,带你玩转分布式消息通信

一、 MQ背景&选型 消息队列作为高并发系统的核心组件之一&#xff0c;能够帮助业务系统解耦提升开发效率和系统稳定性。主要具有以下优势&#xff1a; 削峰填谷&#xff08;主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题&#xff09;系统解耦&#xf…

Faster R-CNN(2016.1)

文章目录 摘要引言过去计算proposals的算法我们提出的 相关工作Object ProposalsDeep Networks for Object Detection Faster R-CNNRegion Proposal NetworksAnchorsTranslation-Invariant AnchorsMulti-Scale Anchors as Regression References多尺度预测有两种流行的方法我们…

云计算未来展望:边缘计算、量子计算与AI

文章目录 边缘计算&#xff1a;数据处理的新时代应用领域挑战与机遇 量子计算&#xff1a;超越传统计算的新范式量子比特应用前景挑战与机遇 人工智能&#xff1a;云计算的动力云中的AI应用领域挑战与机遇 结语 &#x1f389;欢迎来到云计算技术应用专栏~云计算未来展望&#x…

Vue学习之样式汇总

Vue学习之样式汇总 一 二者左右排版 案例 说明&#xff1a;头部一左一右排版&#xff0c;内容一左一右两个排版&#xff0c;公告栏文字超过点点点显示 代码实现 说明&#xff1a; &#xff08;1&#xff09;头部实现一左一右排版需要使用一下两个样式 display: flex;justify-…

4、QtCharts 做心电图

文章目录 ui界面核心代码全部代码 ui界面 核心代码 void Dialog::slot_timer() {qreal xOffset0.f;//x的偏移量,推进的距离qreal dIncrease10;//增加量//数据for(int i0;i<10;i){m_xdIncrease;xOffsetdIncrease;m_splineSerise->append(m_x,qrand()%10);//根据实际情况删…

IDEA新建maven项目,使用mybatis操作数据库完整过程

IDEA新建maven项目&#xff0c;使用mybatis操作数据库完整过程 一、IDEA新建maven项目二、配置mybatis三、创建表对应实体类四、创建mapper接口五、使用mybatis操作数据库 前提&#xff1a; 这个教程是在maven项目中使用mybatis进行数据库操作&#xff0c;不是在spring boot项目…

51单片机复位电容计算与分析(附带Proteus电路图)

因为iC x (dU/dt).在上电瞬间&#xff0c;U从0变化到U,所以这一瞬间就是通的&#xff0c;然后这就是一个直流回路&#xff0c;因为电容C直流中是断路的&#xff0c;所以就不通了。 然后来分析一下这个电容的电压到底是能不能达到单片机需要的复位电压。 这是一个线性电容&…

听力检测为什么要在标准化的隔声屏蔽系统中进行?

作者兰明&#xff0c;医学硕士&#xff0c;听力学博士&#xff0c;听觉健康门诊主任 美国国家研究委员会;;行为、认知和感官科学委员会联合出版的听力损失确定社会保障福利的资格一书中关于测试环境的要求如下&#xff1a; 行动建议4-4 测试环境 听力学评估是在受控的声学环境中…