一、前言
-
效果展示
-
本文章主要讲述微信小程序与物联网开发板NodeMCU在局域网下进行通信,使用的通信协议为WebSocket协议。
-
在本文中,以微信小程序控制舵机为例,演示通信过程。
-
具体原理:在NodeMCU里创建WebSocket服务,微信小程序通过API
wx.connectSocket(Object object)
连接到机械手的WebSocket服务,之后便可通过APISocketTask.send(Object object)
对机械手发送信息,机械手通过判断微信小程序发送的过来的信息,对舵机执行相应操作。
#二、准备事项
1、硬件准备:
- NodeMCU开发板 1 块
- 机械手支架 1 个
- 舵机 3 个
- 电源模块1个(能够输出5v即可)
- 杜邦线若干
2、软件准备:
2.1、下载安装微信开发者工具
2.2、下载安装Arduino并添加ESP8266开发板库(可观看作者的另一篇教程,链接如下)
2.3、下载第三方库WebSocketsServer.h,链接如下
-
链接:https://pan.baidu.com/s/1FbO9m4wS2MQ-Pat9OBOsyA 提取码:4xs6
-
第三方库下载完成之后将其解压,然后放置在项目文件夹路径下
-
项目文件夹路径查看方式如下
-
打开Arduino IDE → 点击文件 → 首选项
-
将下载的库放置在该路径下的libraries文件夹里
#三、模块介绍
-
NodeMCU是一款基于ESP8266芯片的物联网开发板,价格便宜,开发简单。
-
三自由度的机械手支架,某宝上买的,各关节上面安装的是舵机。
-
舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。舵机有三根线,分别为VCC(红色)、GND(棕色)和信号线(黄色)
-
因为上述舵机需要用5v电源驱动,NodeMCU自身不足以驱动3个舵机,所以需要外接电源,只要能输出5v就行。本款电源模块是输入12v,输出5v,也是某宝上买的。
四、接线
1、分别将3个舵机的红线(VD)接到电源模块的5v接口,棕线(GND)接到电源模块的GND接口。
2、将电源模块的GND与NodeMCU的GND相连。
3、将舵机的黄线接到NodeMCU的PWM(模拟信号)口,本文中选用2、4、5口作为舵机的控制IO口。
五、代码编写
1、NodeMCU
1.1、开发板选择,如图所示
1.2、具体代码
#include <ESP8266WiFi.h>
#include <WebSocketsServer.h>
#include <ESP8266mDNS.h>
#include <Servo.h>
#define H_MIN_DEG 0 // 水平舵机的最小角度
#define H_MAX_DEG 180 // 水平舵机的最大角度
#define V_MIN_DEG 70 // 垂直舵机的最小角度
#define V_MAX_DEG 155 // 垂直舵机的最大角度
#define G_MIN_DEG 60 // 机械爪的最小角度
#define G_MAX_DEG 135 // 机械爪的最大角度
#define H_INIT_DEG 90 // 水平舵机的初始角度
#define V_INIT_DEG 100 // 垂直舵机的初始角度
#define G_INIT_DEG 60 // 机械爪的初始角度
#define WEB_SOCKET_POST 80 // webSocket服务端口
#define MDNS_SERVICE_NAME "gripper" // MDNS服务名称
#define MDNS_SERVICE_TYPE "tcp" // MDNS服务类型
Servo horizontal; // 水平舵机
Servo vertical; // 垂直舵机
Servo gripper; // 机械爪
WebSocketsServer webSocket = WebSocketsServer(WEB_SOCKET_POST); //创建webSocket服务
void setup(void) {
// 初始化舵机
servoInit();
// 初始化串口,设置波特率为9600
Serial.begin(9600);
// 一键配网
smartConfig();
// 设置MDNS域名服务
if (MDNS.begin("esp8266")) {
Serial.println("MDNS服务开始!");
}
// 注册MDNS服务
if(MDNS.addService(MDNS_SERVICE_NAME,MDNS_SERVICE_TYPE,80)) {
Serial.println("MDNS服务注册成功!");
}
webSocket.begin();
// 注册webSocket服务的回调函数
webSocket.onEvent(webSocketEvent);
Serial.println("webSocket服务开始");
}
void loop(void) {
MDNS.update();
webSocket.loop();
}
// 一键配网
void smartConfig()
{
WiFi.begin();
for (int i = 0; i < 3; i++)
{
if (WiFi.status() == WL_CONNECTED)
{
Serial.println("AutoConfig Success");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
delay(1000);
Serial.println(WiFi.localIP());
//WiFi.printDiag(Serial); //打印关键的Wi-Fi诊断信息,信息比较多