深度优先

这个家伙好懒,除了文章什么都没留下

0%

1. MQTT 介绍

  • 它是一种 机器之间通讯 machine-to-machine (M2M)、物联网 Internet of Things (IoT)常用的一种轻量级消息传输协议
  • 适用于网络带宽较低的场合
  • 包含发布、订阅模式,通过一个代理服务器(broker),任何一个客户端(client)都可以订阅或者发布某个主题的消息,然后订阅了该主题的客户端则会收到该消息

    1.1 消息主题

  • 发布消息或者订阅消息都要选定一个消息主题,消息主题可以任意定制,类似文件系统,用 “/” 进行分隔,例如主题为 /a/b/c/d 的消息
  • 客户端可以使用完全字符匹配消息,也可以使用通配符进行消息匹配
  • 通配符 + :替换任意单个层级。比如订阅 /a/b/c/d、/a/+/c/d 、+/+/+/+ 主题的消息即可收到主题为 /a/b/c/d 的消息,而 b/+/c/d 、 +/+/+ 不会匹配
  • 通配符 # :匹配任意层级,只能用于末尾, #、a/# 可以匹配上面的主题消息
  • 长度为 0 的主题层级也是允许的。比如发布主题为 a//topic 的消息,客户端可以用 a/+/topic 进行匹配。/a/topic 的主题用 +/a/topic、#、/# 可以匹配。

    1.2 服务质量(Quality of Service,QoS)

MQTT 定义了三种客户端与代理服务器之间消息到达的难度

  • 0:broker/client 之间消息传一次,并不确认传到没有,消息可能丢失
  • 1:broker/client 之间消息至少一次,带确认消息的传输,可能重复收到
  • 2:broker/client 之间消息仅有一次,利用四次握手进行确认,网络延迟可能会增加 当客户端订阅的消息质量与代理服务器发布主题的质量不同时,客户端会选择难度最小的 QoS 接收消息
  • 发布等级为 2 ,客户端订阅等级为 0, 那么客户端接收到的 QoS = 0
  • 发布等级为 0 ,订阅等级为 2,那么客户端接收到的 QoS = 0

    1.3 消息保留

  • 即当 broker 正在发送消息给 client 时,消息会保存,如果此时有新的 client 订阅了该主题的消息,那么它也会收到消息。这种做法的好处就是当消息主题经常变换的时候,如果有新的 client 订阅该消息,那么它不用等待太长的时间就可以收到消息

    1.4 会话清除

  • client 可以设置 clean session 标志位,当 clean session = false 时,client 失去连接时, broker 会一直保留消息直到 client 重新连接。而 clean session = true 时,broker 会清除所有的消息当这个 client 失去连接。

    1.5 消息意愿

  • 当 client 连接上 broker 时,client 会提示 broker 它有一个意愿消息,这个意愿消息将会在 client 失去连接时,broker 发送出去。消息意愿和普通消息一样都包含主题和内容。 以上来自知乎:https://zhuanlan.zhihu.com/p/41156335

1.6 下载EMQTT

1
wget http://emqtt.com/static/brokers/emqttd-centos7-v2.3.1.zip
1
yum install unzip -y
1
unzip emqttd-centos7-v2.3.1.zip

1.7 运行MQTT软件

进入 emqttd 主文件 :

1
cd emqttd

开始安装 emqttd 主文件 ,注意有小数点 :

1
./bin/emqttd console

如果出现以下画面,恭喜,安装成功!

CTRL+ C 关闭控制台。守护进程模式启动:

1
./bin/emqttd start

启动错误日志将输出在 log/ 目录。EMQ 消息服务器进程状态查询:

1
./bin/emqttd_ctl status

-正常运行状态,查询命令返回:

1.8 服务器需开放的端口

1.9 登陆MQTT后台

在浏览器输入该公网IP后面+端口号 :18083,进入后台。默认账号 admin ,密码 public

转自:https://blog.csdn.net/xh870189248/article/details/78867173

HC-SR04

一款利用超声波测距离的传感器,多应用于 机器人避开障碍物,距离测量。
其模块,用Trig触发测距
会发出8 个 40khz的方波,自动检测是否有信号返回
有信号返回,通过echo输出高电平,高电平持续的时间就是距离的2倍
测量距离 = (高电平时间*声速)/ 2

主要技术参数

1:使用电压:DC—5V
2:静态电流:小于2mA
3:电平输出:高5V
4:电平输出:底0V
5:感应角度:不大于15度
6:探测距离:2cm-450cm
7: 高精度 可达0.2cm

Bom表

Arduino Uno *1
HC-SR04超声波传感器 *1
面包板 *1
跳线 若干
尺子 *1
障碍物 *1

引脚说明

VCC – 供5V电源
TRIG – 触发控制信号输入
ECHO – 回响信号输出等四个接口端
GND – 为地线

接线方式

程序实现

代码:

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
36
37
38
#define Trig 2 //引脚Tring 连接 IO D2
#define Echo 3 //引脚Echo 连接 IO D3

float cm; //距离变量
float temp; //

void setup() {
Serial.begin(9600);
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
}

void loop() {
//给Trig发送一个低高低的短时间脉冲,触发测距
digitalWrite(Trig, LOW); //给Trig发送一个低电平
delayMicroseconds(2); //等待 2微妙
digitalWrite(Trig,HIGH); //给Trig发送一个高电平
delayMicroseconds(10); //等待 10微妙
digitalWrite(Trig, LOW); //给Trig发送一个低电平

temp = float(pulseIn(Echo, HIGH)); //存储回波等待时间,
//pulseIn函数会等待引脚变为HIGH,开始计算时间,再等待变为LOW并停止计时
//返回脉冲的长度

//声速是:340m/1s 换算成 34000cm / 1000000μs => 34 / 1000
//因为发送到接收,实际是相同距离走了2回,所以要除以2
//距离(厘米) = (回波时间 * (34 / 1000)) / 2
//简化后的计算公式为 (回波时间 * 17)/ 1000

cm = (temp * 17 )/1000; //把回波时间换算成cm

Serial.print("Echo =");
Serial.print(temp);//串口输出等待时间的原始数据
Serial.print(" | | Distance = ");
Serial.print(cm);//串口输出距离换算成cm的结果
Serial.println("cm");
delay(100);
}

实例效果

按下串口监视器,可以看到测量出来的距离是9.8cm-10.1cm 误差大概在0.2cm左右

转自:https://blog.csdn.net/ling3ye/article/details/51407328

在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。
舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。

1.舵机与控制原理

2.servo类介绍
servo类下有以下成员函数
attach()//连接舵机
write()//角度控制
writeMicroseconds()//
read()//读上一次舵机转动角度
attached()//
detach()//断开舵机连接

普通舵机有3根线:GND(黑)、VCC(红)、Signal(黄),一般情况下,我们建议为舵机单独供电,此处实验为了图方便,用arduino为舵机供电。

3.实例1
需要的器材:
arduino控制器、舵机、**杜邦线若干**
首先将舵机如下图连接:

下载以下例程(程序可以在IDE>File>Examples>Servo>Sweep中找到,我只是做个中文介绍)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <Servo.h> 
Servo myservo;  //创建一个舵机控制对象
                          // 使用Servo类最多可以控制8个舵机
int pos = 0;    // 该变量用与存储舵机角度位置
/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ */
void setup()
{
  myservo.attach(9);  // 该舵机由arduino第九脚控制
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线 ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
void loop()
{
  for(pos = 0; pos < 180; pos += 1)  // 从0度到180度运动
  {                                                     // 每次步进一度
    myservo.write(pos);        // 指定舵机转向的角度
    delay(15);                       // 等待15ms让舵机到达指定位置
  }
  for(pos = 180; pos>=1; pos-=1)   //从180度到0度运动  
  {                                
    myservo.write(pos);         // 指定舵机转向的角度
    delay(15);                        // 等待15ms让舵机到达指定位置
  }
}

4.实例2
需要的器材:
arduino控制器、舵机、电位器、杜邦线若干

首先将舵机如下图连接:

下载以下例程(程序可以在IDE>File>Examples>Servo>Knob中找到)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <Servo.h> 

Servo myservo;  
//创建一个舵机控制对象  

int potpin = 0;  //该变量用于存储用电位器读出的模拟值
int val;   
// 该变量用与存储舵机角度位置  

void setup()
{
  myservo.attach(9);  
// 该舵机由arduino第九脚控制  
}

void loop()
{
  val = analogRead(potpin);            //读取电位器控制的模拟值 (范围在0-1023)
  val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  
// 指定舵机转向的角度  
  delay(15);                           
// 等待15ms让舵机到达指定位置   
}

5.其他驱动方法:

传送门:
arduino驱动舵机,不调用库函数:http://www.arduino.cn/thread-45-1-1.html

转自:https://www.arduino.cn/thread-1038-1-1.html