打印
[其他ST产品]

基于ESP8266远程控制舵机的实现

[复制链接]
1781|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创#@21小跑堂一、ESP8266 CP2102介绍
NodeMCU板载ESP-12E(4MBFlash) WIFI模组和USB转TTL串口(CP2102/CH340)芯片,方便下载固件和调试, NodeMCU默认为Lua固件,如需使用AT指令,请下载新的AT固件。开发板核心处理器ESP8266在较小尺寸封装中集成了业界领先的TensilicaL106超低功耗32位微型MCU,带有16位精简模式,主频支持80MHz和160MHz,支持RTOS,集成Wi-FiMAC/B/RF/PA/LNA,板载天线。支持标准的IEEE802.11b/g/n协议,完整的TCP/IP协议栈。用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器。
ESP8266是高性能无线SOC,以最低成本提供最大实用性,为WiFi功能嵌入其他系统提供无限可能。
802.11 b/g/n
内置TensilicaL106超低功耗32位微型MCU,主频支持80MHz和160MHz,支持RTOS
160KB SRAM(64KB lRAM+96KB DRAM)
内置10bit高精度ADC
内置TCP/IP协议栈
内置TR开关、balun、LNA、功率放大器和匹配网络内置PLL、稳压器和电源管理组件, 802.11b模式下+20dBm的输出功率
A-MPDU、A-MSDU的聚合和0.4s的保护间隔
WiFi@2.4GHz,支持WPA/WPA2安全模式
支持AT远程升级及云端OTA升级
支持STA/AP/STA+AP工作模式
支持Smart Config功能(包括Android和ios设备)
HSPI、UART、I2C、12S、IRRemote Control、PWM、GPIO深度睡眠保持电流为10uA,关断电流小于5uA
2ms之内唤醒、连接并传递数据包
支持Smart Config/AirKiss-键配网支持SDK二次开发
待机状态消耗功率小于1.0mW (DTIM3)

本次实验使用的是16号管脚,也就是图上的D0管脚、VCC和GND。其中DO设置为输出管脚。
二、相关软件的下载
本次实验需要用到的编程软件是Arduino和微信开发者平台。其中,Arduino主要用于舵机端连接阿里云,微信开发者平台作用是用于手机端,通过微信小程序,实现控制舵机旋转的功能。
2.1 Arduino安装和下载
在官网下载Arduino https://www.arduino.cc/en/software ,网页右边选择与自己电脑匹配的版本。

本次实验用到的版本则是通过以下步骤进行下载。
第一步:打开百度并且输入Arduino
第二步:在搜索结果下点击Arduino中文社区

第三步:在页面右上脚点击软件下载

第四步:点击如图所示下载相应的版本


2.2 配置Ardunio
1.在Arduino中配置开发板管理器网址,打开【Arduino】→【文件】-->首选项,在附加开发板管理器网址中填入 https://arduino.esp8266.com/stable/package_esp8266com_index.json

2.安装esp8266开发板,打开【工具】→【开发板】→【开发板管理器】,搜索“esp8266”,选择版本,安装:

3.在IDE中选择对应开发板,【工具】→【开发板】→【NodeMCU 1.0(ESP-12E Module)】

功能实现、
3.1 获取Ardunio链接阿里云官方代码
第一步:打开Ardunio,点击项目->加载库->管理库在搜索打aliyun,下载

第二步:等待安装完成,点击上图的More info   将官方实例代码复制下来

// 引入 wifi 模块,并实例化,不同的芯片这里的依赖可能不同

#include <ESP8266WiFi.h>static WiFiClient espClient;

// 引入阿里云 IoT SDK

#include <AliyunIoTSDK.h>

// 设置产品和设备的信息,从阿里云设备信息里查看

#define PRODUCT_KEY "xxx"

#define DEVICE_NAME "Device_D"

#define DEVICE_SECRET "xxxxxxxxxxxxxx"

#define REGION_ID "cn-shanghai"

// 设置 wifi 信息

#define WIFI_SSID "xxxxx"

#define WIFI_PASSWD "xxxxx"

void setup()

{

Serial.begin(115200);

     // 初始化 wifi

wifiInit(WIFI_SSID, WIFI_PASSWD);

      // 初始化 iot,需传入 wifi 的 client,和设备产品信息

AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);

      // 绑定一个设备属性回调,当远程修改此属性,会触发 powerCallback

// PowerSwitch 是在设备产品中定义的物联网模型的 id

AliyunIoTSDK::bindData("PowerSwitch", powerCallback);

      // 发送一个数据到云平台,LightLuminance 是在设备产品中定义的物联网模型的 id

AliyunIoTSDK::send("LightLuminance", 100);

}

void loop()

{

AliyunIoTSDK::loop();

}

// 初始化 wifi 连接void wifiInit(const char *ssid, const char *passphrase)

{

WiFi.mode(WIFI_STA);

WiFi.begin(ssid, passphrase);

while (WiFi.status() != WL_CONNECTED)

{

delay(1000);

Serial.println("WiFi not Connect");

}

Serial.println("Connected to AP");

}

// 电源属性修改的回调函数void powerCallback(JsonVariant p)

{

int PowerSwitch = p["PowerSwitch"];

if (PowerSwitch == 1)

{

// 启动设备

}

}


第三步:在相应的地方填写相关信息

上图填写的是在阿里云创建的设备舵机端的三剑客,点击下图位置可查看到

下图是配置wifi相关信息(连接wifi的用户名和密码)

这些填好之后,同时编译成功,同时将代码烧入我们的开发板就可连上阿里云了
要注意以下几个点
✔为编译→为下载

在第一次编译的时候可能会显示缺少某些文件
解决方法很简单,它显示缺少什么文件。项目->加载库->管理库在搜索框搜索相应的文件下载,就可以解决问题了。
3.2 实现阿里云控制舵机旋转
第一步在Ardunio上编写相关函数
在官方提供的代码上没有多少改动,跟舵机有关的代码如下标红的部分,主要通过定义相关管脚,配置管脚模式(输出模式),创建一个函数,输出相应的高低电平时间从而让舵机旋转相应的角度。

// 引入 wifi 模块,并实例化,不同的芯片这里的依赖可能不同

#include <ESP8266WiFi.h>

static WiFiClient espClient;

  // 引入阿里云 IoT SDK

#include <AliyunIoTSDK.h>

  // 设置产品和设备的信息,从阿里云设备信息里查看

#define PRODUCT_KEY ""

#define DEVICE_NAME ""

#define DEVICE_SECRET ""

#define REGION_ID "cn-shanghai"

  // 设置 wifi 信息

#define WIFI_SSID ""

#define WIFI_PASSWD ""

int pwmPin=16;

  void setup()

{

Serial.begin(115200);

pinMode(pwmPin,OUTPUT);

      // 初始化 wifi

wifiInit(WIFI_SSID, WIFI_PASSWD);

      // 初始化 iot,需传入 wifi 的 client,和设备产品信息

AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID);

      // 绑定一个设备属性回调,当远程修改此属性,会触发 powerCallback

// PowerSwitch 是在设备产品中定义的物联网模型的 id

AliyunIoTSDK::bindData("PowerSwitch", powerCallback);

      // 发送一个数据到云平台,LightLuminance 是在设备产品中定义的物联网模型的 id

AliyunIoTSDK::send("LightLuminance", 100);

}

void pwm_motor(int timepwm)

{

int a,i;

for(a=0;a<50;a++)

{

for(i=0;i<5*(50+timepwm/1.4);i++)

{

digitalWrite(pwmPin,HIGH);

}

for(i=0;i<5*2000;i++)

{

//20毫秒

digitalWrite(pwmPin,LOW);

}

}

}

void loop()

{

AliyunIoTSDK::loop();

}

  // 初始化 wifi 连接

void wifiInit(const char *ssid, const char *passphrase)

{

WiFi.mode(WIFI_STA);

WiFi.begin(ssid, passphrase);

while (WiFi.status() != WL_CONNECTED)

{

delay(1000);

Serial.println("WiFi not Connect");

}

Serial.println("Connected to AP");

}

  // 电源属性修改的回调函数

void powerCallback(JsonVariant p)

{

int PowerSwitch = p["PowerSwitch"];

if (PowerSwitch == 1)

{

// 启动设备

}

pwm_motor(PowerSwitch);

}

3.3 实现阿里云控制舵机旋转
当设备连上阿里云之后,设备会显示在线状态

此时可以通过在线调试进行对舵机进行控制(监控运维->在线调试),同时打开Adrunio的串口监视器。如图所示:


在阿里云在线调试,输入想让舵机旋转的角度值,点击设置
此时,Adrunio串口监视器页面会收到一串指令


Message arrived [/sys/h7jyDsK3guc/Vqc0cvYHS82Y5cL54JFI/thing/service/property/set] {"method":"thing.service.property.set","id":"161410917","params":{"PowerSwitch":30},"version":"1.0.0"}
  
这是我们可以吧这一串数据分成以下几部分
第一份指的是阿里云发送数据成功到我们的开发板上中,同时这一部分也是阿里云的物模型通信Topic列表的属性设置模型

Message arrived [/sys/h7jyDsK3guc/Vqc0cvYHS82Y5cL54JFI/thing/service/property/set]

第二部分则是一种发送数据给我们的开发板,从而让开发板驱动舵机旋转的功能

{"method":"thing.service.property.set","id":"161410917","params":{"PowerSwitch":30},"version":"1.0.0"}
我们将这段数据复制,到舵机端就可以实现阿里云控制舵机旋转的功能
点击产品->舵机端->TOPIC列表->发布消息

点击确认就可以实现控制舵机旋转的功能。
要想改变舵机旋转的角度,只要修改标红的地方就可以实现控制舵机旋转不同的角度。
注意:我们不难看出,我们主要通过修改PowerSwitch的值从而实现控制舵机旋转不同的角度,所以在我们进行对产品的功能定义的时候,要把关键字设为PowerSwitch。


使用特权

评论回复
沙发
ST小智|  楼主 | 2022-8-19 23:16 | 只看该作者

使用特权

评论回复
板凳
robincotton| | 2022-8-20 15:03 | 只看该作者
串口通信可以的。   

使用特权

评论回复
地板
bartonalfred| | 2022-8-20 16:19 | 只看该作者
使用的是esp8266哪个型号呢  

使用特权

评论回复
5
typeof| | 2022-8-20 19:28 | 只看该作者
wifi产生pwm吗   

使用特权

评论回复
6
pentruman| | 2022-8-20 20:55 | 只看该作者
是at指令操作的吗  

使用特权

评论回复
7
carpsnow| | 2022-8-22 20:49 | 只看该作者
能讲细致点吗

使用特权

评论回复
8
ST小智|  楼主 | 2022-8-24 15:37 | 只看该作者
AT操作

使用特权

评论回复
9
Pulitzer| | 2022-9-30 07:13 | 只看该作者

对于没有else的场景,使用ifPresent即可

使用特权

评论回复
10
Uriah| | 2022-9-30 14:14 | 只看该作者

会以switch-case的方式出现

使用特权

评论回复
11
Bblythe| | 2022-9-30 17:13 | 只看该作者

不要根据不同的参数类型走不同的代码逻辑

使用特权

评论回复
12
foxsbig| | 2022-10-2 14:08 | 只看该作者
有点强大啊

使用特权

评论回复
13
Pulitzer| | 2022-12-25 07:13 | 只看该作者

对于没有else的场景,使用ifPresent即可

使用特权

评论回复
14
周半梅| | 2022-12-25 08:16 | 只看该作者

每个Strategy交由Spring管理,并在构造后注册

使用特权

评论回复
15
童雨竹| | 2022-12-25 09:09 | 只看该作者

这是个再正常不过的coding习惯

使用特权

评论回复
16
Wordsworth| | 2022-12-25 10:12 | 只看该作者

使用Optional简化if判空

使用特权

评论回复
17
Clyde011| | 2022-12-25 11:15 | 只看该作者

不同的代码逻辑就代表了不同的策略

使用特权

评论回复
18
万图| | 2022-12-25 13:11 | 只看该作者

通过对判断条件取反,代码在逻辑表达上会更加清晰

使用特权

评论回复
19
Uriah| | 2022-12-25 14:14 | 只看该作者

会以switch-case的方式出现

使用特权

评论回复
20
帛灿灿| | 2022-12-25 16:10 | 只看该作者

对于优秀程序员来说,这不是好代码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

8

帖子

0

粉丝