极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10191|回复: 5

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

[复制链接]
发表于 2017-7-3 13:05:08 | 显示全部楼层 |阅读模式

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

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



4.jpg

效果视频


PC端可执行程序(代码和说明见楼下)
Proj_mqtt_client_ch.rar (1.27 MB, 下载次数: 2754)
回复

使用道具 举报

 楼主| 发表于 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
1.jpg

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

2轴云台
2.jpg

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

主控+云台合体
3.jpg

程序发开方面我用的是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标记
5.jpg

程序代码如下

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

  2. #include <ESP8266WiFi.h>
  3. #include <PubSubClient.h>
  4. #include <Servo.h>

  5. Servo servo_x;  //定义舵机
  6. Servo servo_y;

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

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

  12. WiFiClient espClient;
  13. PubSubClient client(espClient);
  14. long lastMsg = 0;
  15. char msg[50];
  16. int value = 0;
  17. int vfirst;

  18. void setup() {
  19.   servo_x.attach(p_x);  //指定用哪个GPIO来控制舵机
  20.   servo_y.attach(p_y);
  21.   delay(1000);
  22.   WiFi.begin(ssid, password);
  23.   delay(1000);
  24.   client.setServer(mqtt_server, 1883);
  25.   client.setCallback(callback);
  26.   delay(1000);
  27.   vfirst=0;
  28. }

  29. void mqtt_connect() {
  30.   if  (!client.connected()) {
  31.     if (client.connect("")) {
  32.       client.subscribe("esp8266_170629_x_ch");
  33.       client.subscribe("esp8266_170629_y_ch");
  34.     }
  35.   }
  36. }

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

  38.   int    iv;
  39.   String sv;

  40.   sv="";
  41.   for (int i = 0; i < length; i++) {
  42.     if (i>1)  //前两个字节会多出来,而不是发送的内容
  43.     {sv=sv+(char)payload[i];}
  44.     //msg[i]=(char)payload[i];
  45.   }
  46.   iv=sv.toInt();
  47.   sv=topic;
  48.   if (iv>=0 && iv<=180) {
  49.     if(sv.indexOf("x")>1)
  50.     {
  51.       servo_x.write(iv);   //设置x舵机的角度
  52.       snprintf (msg, 75, "??sub x #%ld", iv);}
  53.     if(sv.indexOf("y")>1)
  54.     {
  55.       servo_y.write(iv); //设置y舵机的角度
  56.       snprintf (msg, 75, "??sub y #%ld", iv);}
  57.   }
  58.   

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

  61. void loop() {

  62. if (vfirst==0)
  63. {
  64.     vfirst=1;
  65.     servo_x.write(30); //设置x舵机的角度
  66.     servo_y.write(30); //设置y舵机的角度  
  67.      delay(3000);
  68.     servo_x.write(150); //设置x舵机的角度
  69.     servo_y.write(150); //设置y舵机的角度   
  70.      delay(3000);
  71.     servo_x.write(90); //设置x舵机的角度
  72.     servo_y.write(90); //设置y舵机的角度     
  73.   }  

  74.   if (!client.connected()) {
  75.     mqtt_connect();
  76.   }
  77.   client.loop();

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


复制代码


这里简单解析一下:
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端的程序有关,不过无论是什么原因,只要程序处理一下,从第三字节开始读就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-3 13:05:57 | 显示全部楼层
本帖最后由 wing 于 2017-7-3 23:34 编辑

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

PC程序界面,右边两个滑行条分别控制两个舵机
mqtt云台1.jpg

当然代码就多了点,而且程序也大了,对于不熟悉Delphi的人来说就更难理解了。
这里给出完整的程序代码,有兴趣的话可以下载来看看。
mqtt_client_test_云台.rar (167.1 KB, 下载次数: 85)
回复 支持 反对

使用道具 举报

发表于 2017-7-7 10:13:51 | 显示全部楼层
LZ这个方式能不能整个网络控制的小车呢??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-16 01:32:55 | 显示全部楼层
本帖最后由 wing 于 2017-7-16 09:46 编辑

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

oc8266.png

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

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

lipro7.4v.jpg
换成7.4v锂电就可以

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


下面来个视频




&lt;iframe height=498 width=510 src=\'http://player.youku.com/embed/XMjg5NDQ0OTg4MA==\' frameborder=0 \'allowfullscreen\'&gt;&lt;/iframe&gt;
回复 支持 反对

使用道具 举报

发表于 2017-7-16 08:31:43 | 显示全部楼层
9V的电池还是放弃了吧,锂电池才是王道。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-7-16 23:13 , Processed in 0.056846 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表