wing 发表于 2017-7-3 13:05:08

伪极客玩家乱入IoT之二——通过mqtt协议远程控制ESP8266云台


欢迎来到本系列的第二篇,这次为大家带来一个实例:通过mqtt实现在internet上控制一个2轴云台。
硬件方面使用OCROBOT的Alpha版ESP8266控制两个180度舵机,廉价的黑胶云台支架。
机械部分硬件成本非常低下,不过可玩性还是很高的。
至于控制方面由PC程序做终端,在本系列的第一篇的程序功能上已经足够控制这套云台,不过为了更便捷的操作今次还改了下程序:增加了两条滑动条,界面皮肤也更加炫彩诱人。

和上次一样,直接提供已经完全编译的可执行程序,代码会全部提供,楼下也有制作说明。
不过很遗憾PC端的程序开发依然难懂,为了界面效果,增加了皮肤控件,对于不熟悉的人来说代码量更大,更难理解了。
然而这些改动其实不是必须的,用第一篇程序也能控制,只是没那么方便而已。
不过话又说回来,我一直坚持提供可执行程序,原因就是程序既然已经做好了,就不一定要理解做的过程。
另外8266部分也提供代码和说明,希望大家喜欢。





效果视频
http://player.youku.com/player.php/sid/XMjg2MDAyOTExNg==/v.swf

PC端可执行程序(代码和说明见楼下)


Alpha版ESP8266代码文件(WIFI的SSD和密码部分请自行修改,楼下有更多说明)

wing 发表于 2017-7-3 13:05:42

本帖最后由 wing 于 2017-7-4 12:08 编辑

首先来说说云台的主控部分,采用OCROBOT的Alpha版ESP8266。这并不是OC的第一款8266产品,早在2015年OC就推出过一款基于at指令控制的ESP8266通讯模块(虽然我有这个模块,不过一直没用过)。
时隔两年,新款的模块引出了大部分针脚,Alpha板的Size小巧动人,可以很方便地和OC其他Alpha和Gama系列的模块堆叠组合。
而且还有一个特点就是板子上没有LED,这点我觉得很好,如果需要完全可以自行外接LED,最恨那些胡乱在板子上加灯有事没事乱闪一通。
如果是以实验为目的它是一个不错的选择,但是也有明显的不足之处:
1.价格偏高,这个价位基本上可以买到ESP32。虽然以玩家自居的我对价格并不敏感,但是这么明显得问题如果我不说的来的话,相信大家都会以为我是马甲。
2.只配备了2M的Flash,实际容量我没测试过,不过IDE上只有2M的选项,相信就是只有2M。当然不是每个应用都需要用到4M,但是参数上的确落后于市场主流的4M配置。
3.唯一的ADC端口居然没有引出来。就我自己而言上面两点其实不算什么,但是这点真是比较难接受。


OCROBOT Alpha ESP8266


云台的机械部分,两个180度9G塑料舵机,支架是最廉价的黑胶架,最大的优点是便宜。

2轴云台


2个舵机由4节AA电池供电,gpio12和gpio14分别控制水平的舵机和垂直的舵机,GUN和电池负极相连。

主控+云台合体


程序发开方面我用的是OCROBOT-IDE-0.1.1,目前来说这个只是次新版,现在最新是0.1.2
如果不清楚怎么搭建ESP8266开发环境的话请参阅强强的权威教程贴http://www.geek-workshop.com/thread-27443-1-1.html
完成的基本的ESP8266开发环境配置之后还要导入一个库才能顺利运用mqtt服务,想深入了解的小伙伴可以看看这里https://github.com/knolleary/pubsubclient
IDE上的安装方式如下:
1.菜单栏选择 项目 -> 加载库 -> 管理库
2.然后在“库管理器”查找 “PubSubClient” ,接下来就是下载和安装...漫长的等待

安装好后对应的库的条目上会有installed标记


程序代码如下

//OC 8266 mqtt +cradle_headmqtt.ocrobot.com 1883 订阅 esp8266_170629_x_ch esp8266_170629_y_ch ->0~180发布 out_esp8266_170629_ch

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Servo.h>

Servo servo_x;//定义舵机
Servo servo_y;

const int p_x = 12;   //x角度 gpio12
const int p_y = 14;   //y角度 gpio14

const char* ssid = "填上你的WIFI";
const char* password = "填上你的WIFI密码";
const char* mqtt_server = "mqtt.ocrobot.com";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg;
int value = 0;
int vfirst;

void setup() {
servo_x.attach(p_x);//指定用哪个GPIO来控制舵机
servo_y.attach(p_y);
delay(1000);
WiFi.begin(ssid, password);
delay(1000);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
delay(1000);
vfirst=0;
}

void mqtt_connect() {
if(!client.connected()) {
    if (client.connect("")) {
      client.subscribe("esp8266_170629_x_ch");
      client.subscribe("esp8266_170629_y_ch");
    }
}
}

void callback(char* topic, byte* payload, unsigned int length) {

int    iv;
String sv;

sv="";
for (int i = 0; i < length; i++) {
    if (i>1)//前两个字节会多出来,而不是发送的内容
    {sv=sv+(char)payload;}
    //msg=(char)payload;
}
iv=sv.toInt();
sv=topic;
if (iv>=0 && iv<=180) {
    if(sv.indexOf("x")>1)
    {
      servo_x.write(iv);   //设置x舵机的角度
      snprintf (msg, 75, "??sub x #%ld", iv);}
    if(sv.indexOf("y")>1)
    {
      servo_y.write(iv); //设置y舵机的角度
      snprintf (msg, 75, "??sub y #%ld", iv);}
}


client.publish("out_esp8266_170629_ch", msg);   
}

void loop() {

if (vfirst==0)
{
    vfirst=1;
    servo_x.write(30); //设置x舵机的角度
    servo_y.write(30); //设置y舵机的角度
   delay(3000);
    servo_x.write(150); //设置x舵机的角度
    servo_y.write(150); //设置y舵机的角度   
   delay(3000);
    servo_x.write(90); //设置x舵机的角度
    servo_y.write(90); //设置y舵机的角度   
}

if (!client.connected()) {
    mqtt_connect();
}
client.loop();

if (vfirst<2)
{
vfirst=2;
client.publish("out_esp8266_170629_ch", "??mqtt_ch_ready");//前两个字节PC端会收不到,所以这放两个没用的在开头
}

}




这里简单解析一下:
1.ssid和password请自行修改。
2.程序开始的时候会转动几下舵机,就像热身运动一样,然后2个舵机都停在90度位置。
3.接下来连接mqtt服务,和第一篇一样还是使用mqtt.ocrobot.com提供的免费服务,如果连接成功就发布一条信息out_esp8266_170629_ch:mqtt_ch_ready
这里其实存在一个问题:在PC端订阅“out_esp8266_170629_ch”的话是收不到前两个字节的
4.在连接成功之后订阅“esp8266_170629_x_ch”和“esp8266_170629_y_ch”,分别用于控制两个舵机,这里和发布时一样头两个字节也是有问题的
当然这个现象可能和PC端的程序有关,不过无论是什么原因,只要程序处理一下,从第三字节开始读就可以了。

wing 发表于 2017-7-3 13:05:57

本帖最后由 wing 于 2017-7-3 23:34 编辑

最后是PC端的程序,顶楼已经提过了,大家如果不怕操作麻烦大可以用第一篇的程序,本次程序的改动只是针对云台操作做了便捷处理和增强了视觉效果。
对,主要是为了好看一点,为此加入了一套皮肤控件AlphaControls,至少名字上和OC的Alpha系列很般配。鉴于这套控件的授权方式我就不提供链接了,想了解的可以google一下

PC程序界面,右边两个滑行条分别控制两个舵机


当然代码就多了点,而且程序也大了,对于不熟悉Delphi的人来说就更难理解了。
这里给出完整的程序代码,有兴趣的话可以下载来看看。


至于代码就不贴出来了,
还是那句话:程序既然已经做好了,就不一定要理解做的过程,直接用就可以了。

Freezing 发表于 2017-7-7 10:13:51

LZ这个方式能不能整个网络控制的小车呢??

wing 发表于 2017-7-16 01:32:55

本帖最后由 wing 于 2017-7-16 09:46 编辑

近日针对上面的项目做了个外接电源的测试,在毅神的耐心指导下终于成功了。其中发现一些要注意的地方,特此记录下来备忘。
OC的模块左上有个拨动开关,如图所示。
打上去是烧录模式:可以下载程序,程序下载完毕后会自动重启执行,但是外接电源的时候是不会执行程序的;
打下来是运行模式:外接电源可以运行已经写入的程序,但是无法写入新的程式。



外接电源的针脚是5v 和gnd,然而电源也是有一定要求的,同样是用LM1085降压(遗憾的是没有10uf电容...),9v充电电池不行的,7.4v的锂电可以。
为了验证高品质电源所带来效果加成我放大招用PC电源的5v做了测试,结果...也没什么特别


本次实验中这种9v无法启动板子


换成7.4v锂电就可以


PC电源直接供5v就更不在话下啦


下面来个视频

http://player.youku.com/player.php/sid/XMjg5NDQ0OTg4MA==/v.swf


<iframe height=498 width=510 src='http://player.youku.com/embed/XMjg5NDQ0OTg4MA==' frameborder=0 'allowfullscreen'></iframe>

弘毅 发表于 2017-7-16 08:31:43

:lol9V的电池还是放弃了吧,锂电池才是王道。
页: [1]
查看完整版本: 伪极客玩家乱入IoT之二——通过mqtt协议远程控制ESP8266云台