本帖最后由 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_head mqtt.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[50];
- 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[i];}
- //msg[i]=(char)payload[i];
- }
- 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端的程序有关,不过无论是什么原因,只要程序处理一下,从第三字节开始读就可以了。 |