24970浏览
查看: 24970|回复: 21

[项目] 智能垃圾桶第二期: wifi模块实现tcp数据透传

[复制链接]
本帖最后由 饶厂长 于 2017-6-19 01:13 编辑

本文多图, 流量党当心了。
加载慢的话请耐心等候一下下。

前言: 饶厂长五月初申请试用了curie nano这块板子, 扬言要制作一个
智能移动垃圾桶。 大约两周前发布了第一篇制作教程: 底盘篇
https://mc.dfrobot.com.cn/thread-25255-1-2.html
在底盘之后, 就需要将控制底盘的Arduino mega 与进行视觉处理的pc进程连接起来。 我选用的解决方案是wifi 模块, esp8266, 利用房间中的路由器,
让wifi模块接入局域网, 并和pc端的tcp server连接起来, 由pc端向wifi模块发送
数据包。
注: 以下我所说到的wifi模块, 都是指以esp8266为核心设计的功能模块。


大部分朋友在使用wifi模块的时候可能更多的是使用模块配套的AT指令, 像这样:
智能垃圾桶第二期: wifi模块实现tcp数据透传图1



没错, 使用arduino 在 初始化过程中向模块发送AT指令确实没问题, 但是存在以下几个隐患:
1. 中途tcp连接断开, 如何检测并重新连接?
2. 中途网络断开, 怎么能够知道?
3. 各种不方便, 我只需要同样的功能, 每次却需要重新配置, 还不如蓝牙配置一次就可以用。


基于这些种种问题, 我决定不使用AT指令, 直接给wifi模块烧写我所需要的功能, 然后直接将
wifi模块与arduino连接即可。

今天我将分享一下第二期教程,


本期教程将解决以下几个问题:
1. 几类wifi模块简单介绍。
2. 如何以arduino IDE来搭建wifi模块的开发环境?
3. 如何将程序烧写进wifi模块中?
4. 如何将wifi模块与arduino连接起来?
5. 如何编写pc端的程序实现pc端进程与wifi模块的数据透传?


------------------------------------------正文分割线--------------------------------------

一、 几类模块介绍
智能垃圾桶第二期: wifi模块实现tcp数据透传图2

图一、 从左到右为 nodemcu模块, wifibee模块, esp8266普通模块, ttl电平转usb模块。


wifi模块(esp8266)的种类是非常之多了, 根据flash、cpu等等分为
各种类型, 但是使用方法类似。 从我使用的角度来看, 姑且分为3类:
1. 带ttl转usb芯片和usb接口的模块。
2. 不带转换芯片但引出引脚的模块。
3. 啥也不带的模块。
从方便角度来说, 第三个我就不去用了, 毕竟不想再折腾硬件上花费过多
时间。
对于第一种, 无需自备ttl转usb的转接模块, 和arduino一样插到usb口上即可,
对于第二种, 需要自备转接模块,才能正常使用。


下面介绍一下目前手头这几个模块:
第一个nodemcu模块, 搭载了esp8266以及
稳压芯片, 串口与ch340芯片相连, 将ttl信号转换为usb串口信号。 此外, 该模块将
8266wifi芯片的各个引脚全部引出, 本意就在于让wifi模块当作能与传感器或执行机构交互
的网络节点, 使用也非常方便, arduino ide开发环境搭建完毕后直接烧录就可以。


第二个是dfrobot 的wifi bee 模块, 插在了FTDI转换模块上, 此外也有rx tx引脚直接引出。 这个模块我没有成功的使用, 因为FTDI的驱动我折腾了两天, 完全装不上,直接放弃了。
但是直接引出的几个引脚直接和usb转串口模块连接使用是没问题的。 另外 wifi bee有个好处
就是用开关档位选择下载模式或者运行模式。


第三个是淘宝上买的一个模块, 板子上只有esp8266 和稳压芯片, 引出了除vcc gnd rx tx之外的d0引脚。
这个引脚在烧写程序的时候需要接低电平才能进入下载模式, 而wifi bee的开关就是为这个
设计的。 除此之外, 用arduino ide进行开发的时候, 改模块必须先烧写nodemcu的固件, 再进行下载,
否则会出现下载同步失败的问题。 wifi bee 在下载程序时也是一样的流程。


以上说的一些东西没动手前各位看官是无法明白的, 所以进入下一个部分,
我们来动手操作一下吧。


二、 Arduino IDE for ESP8266开发环境搭建
Arduino IDE for ESP8266是由 Richard SloanIvan Grokhotkov 开发的,所有开发资料
都放在github上,感兴趣的朋友可以上去看一下。
之前看到各个论坛, df社区里面有些大神已经分享了如何安装,  但对于有些模块不太适用。
按照本文以下的操作流程操作的话, 只要是esp8266的模块, 使用起来应该没有任何问题。
当然, 并不是说所有的wifi都ok, 这个我目前只是测试了四种模块, 其他的还需要各位朋友
去尝试一下。 但至少目前我测试的几种模块都没问题。

第一步: 打开Arduino IDE, 点击“文件”, 选择“首选项”


智能垃圾桶第二期: wifi模块实现tcp数据透传图5

第二步: 在“附加开发板管理器网址”添加:http://arduino.esp8266.com/staging/package_esp8266com_index.json
智能垃圾桶第二期: wifi模块实现tcp数据透传图6

第三步:在”网络“中设置人工代理。 主机名称和端口号请查询你正确科学上网的工具的主机和端口, 这个不细讲。
智能垃圾桶第二期: wifi模块实现tcp数据透传图7

第四步:在Arduino IDE主界面点击“工具"——“开发板”——“开发板管理器”
智能垃圾桶第二期: wifi模块实现tcp数据透传图8

第五步: 如果你成功的科学的正确的上网了并正确配置主机和端口了, 那么你会看到这个

智能垃圾桶第二期: wifi模块实现tcp数据透传图9

智能垃圾桶第二期: wifi模块实现tcp数据透传图10


点击安装, 安装完成后开发环境就搭建成功了。这时再在主界面点击“工具”——“开发板”
就能够看到我们安装的开发板了:
智能垃圾桶第二期: wifi模块实现tcp数据透传图11




三、 利用Arduino IDE for esp8266 为wifi模块烧写程序
如果你认为到这一步就能把固件烧进去就大错特错了。 当然, 有一些朋友使用的模块可能
各不相同, 有的到此就可以直接烧写了,比如图一的第一个模块。 但是有的模块可能到这
里无法烧写。 像wifi bee这个模块和图一中第三个模块, 到了这一步仍然是无法烧写的,
因此我们就以第三个模块为例,讲解一下如何烧写。 整个过程和用到的工具都是完全一样,
就不说两遍了。


第一步: 下载esp8266固件烧写工具, 最好使用nodemcu-flasher, 自带nodemcu 0.9 的固件,
要下载的朋友可以下载本文的附件。


第二步:  打开这个文件夹——点击“Win64”(看你是什么系统)——点击“Release ”
——打开“ESP8266Flasher.exe”

智能垃圾桶第二期: wifi模块实现tcp数据透传图14
这个界面就是主界面, 如果没有特别的设置, 无需点击
其他页面。
智能垃圾桶第二期: wifi模块实现tcp数据透传图12
这个就是选择模块类型的界面, 可选的有闪存大小,
闪存速度, 波特率, spi模式几项。
智能垃圾桶第二期: wifi模块实现tcp数据透传图13
点击config可以看到, 待上传的是nodemcu的固件。

第三步: 将模块与usb转串口模块连接起来


智能垃圾桶第二期: wifi模块实现tcp数据透传图3智能垃圾桶第二期: wifi模块实现tcp数据透传图4




wifi模块                        usb模块
vcc                                5v
GND                            GND
TX                                RX
RX                                TX
IO_0                             GND


第四步: 将usb模块插入计算机, 驱动安装无误后, 选择好com口, 开始“flash”
智能垃圾桶第二期: wifi模块实现tcp数据透传图15

当rx 和 tx指示灯交替闪烁时, 才算同步成功, 能够正常烧写。 成功之后, 打开Arduino IDE for esp8266。


第五步:打开Arduino IDE, 开发板选择NodeMcu 0.9, 然后选择一个TCP连接的实例:
智能垃圾桶第二期: wifi模块实现tcp数据透传图16

按照我的需求稍事修改后, 我改成了:
[mw_shl_code=cpp,true]/*
    This sketch sends data via HTTP GET requests to data.sparkfun.com service.

    You need to get streamId and privateKey at data.sparkfun.com and paste them
    below. Or just customize this script to talk to other HTTP servers.

*/

#include <ESP8266WiFi.h>

const char* ssid     = "你的wifi名称";
const char* password = "你的wifi密码;

const char* host = "pc的ip地址";
const char* streamId   = "....................";
const char* privateKey = "....................";

void setup() {
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

int value = 0;

void loop() {
  //delay(5000);
  String line;
  char buf;
  ++value;

  Serial.print("connecting to ");
  Serial.println(host);

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 8090;
  while (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

  // We now create a URI for the request
  String url = "/input/";
  url += streamId;
  url += "?private_key=";
  url += privateKey;
  url += "&value=";
  url += value;

  Serial.print("Requesting URL: ");
  Serial.println(url);

  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  delay(10);


  // Read all the lines of the reply from server and print them to Serial
  while (client.connected()) {
    while (client.available()) {
      buf = client.read();
      if (buf == '\r') {
        line += buf;
        break;
      } else {
        line += buf;
      }
    }
    if((line != "")&&(line!="\\r")&&(line.length()>=6)){
      line.trim();
     Serial.println("pos:"+line);
    }
    line = "";
  }

  //Serial.println();
  //Serial.println("closing connection");
}
[/mw_shl_code]

这段代码的功能是连接我特定ip特定端口的tcp server, 并且将收到的数据整理
再通过串口发送出来。如果断开或连接失败就不停重连。  
搞定, 然后点击上传:

上传的样子和普通的板子不太一样。
智能垃圾桶第二期: wifi模块实现tcp数据透传图17
上传成功后打开串口监视器:

智能垃圾桶第二期: wifi模块实现tcp数据透传图18
连得上wifi却连不上你的心, 努力变成你喜欢的样子, 最后却忘却了自己。。。。。


请忽略我的中二, 打开网络调试助手, 没有的话在附件下载, 打开后按照程序中的ip地址和端口号, 选择tcp server, 打开链接, 我们会看到wifi模块发来的一条讯息,
这表示我们的wifi模块和pc的网络调试助手之间可以透传了。
智能垃圾桶第二期: wifi模块实现tcp数据透传图19

智能垃圾桶第二期: wifi模块实现tcp数据透传图20



四、 如何将wifi模块和Arduino mega之间连接。
接线方面, 由于arduino mega有四个硬件串口, 不用白不用, 直接用掉, 链接在RX3,在中断里处理。
程序如下:
[mw_shl_code=cpp,true]void serialEvent3(){
   while(Serial3.available()){
      info_buf = Serial3.read();
      info = info+info_buf;
      //Serial.print(info_buf);
    }
   
    if(info.endsWith("\r\n")){
      Serial.println(info);
      info = "";
    }
  }[/mw_shl_code]


解码的程序还没有进行, 在下一期会完成。


五、如何编写pc端的程序实现pc端进程与wifi模块的数据透传?
这个问题我无法展开来讲了, 因为我也仅仅是会使用库而已, 不是非常专业。
我就简单分享一下我在VS2010里面用C++写的一个tcp连接的程序和通讯效果吧。
[mw_shl_code=cpp,true]#include <WinSock2.h>  
#include <stdio.h>  
#include <stdlib.h>  
  
#pragma comment(lib, "ws2_32.lib")  
  
void main()  
{  
    WSADATA wsaData;  
    int port = 8090;  
  
    char buf[] = "Server: hello, I am a server.....\r";   
  
    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)  
    {  
        printf("Failed to load Winsock");  
        return;  
    }  
  
    //创建用于监听的套接字  
    SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);  
  
    SOCKADDR_IN addrSrv;  
    addrSrv.sin_family = AF_INET;  
    addrSrv.sin_port = htons(port); //1024以上的端口号  
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
  
    int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv, sizeof(SOCKADDR_IN));  
    if(retVal == SOCKET_ERROR){  
        printf("Failed bind:%d\n", WSAGetLastError());  
        return;  
    }  
  
    if(listen(sockSrv,10) ==SOCKET_ERROR){  
        printf("Listen failed:%d", WSAGetLastError());  
        return;  
    }  
  
    SOCKADDR_IN addrClient;  
    int len = sizeof(SOCKADDR);  
  
  
        //等待客户请求到来   
        SOCKET sockConn = accept(sockSrv, (SOCKADDR *) &addrClient, &len);  
        if(sockConn == SOCKET_ERROR){  
            printf("Accept failed:%d", WSAGetLastError());  
           // break;  
        }  
  
        printf("Accept client IP:[%s]\n", inet_ntoa(addrClient.sin_addr));  
  
        //发送数据  
                while(1){
                        int iSend = send(sockConn, buf, sizeof(buf) , 0);  
                        if(iSend == SOCKET_ERROR){  
                                printf("send failed");  
                                //break;  
                        }  
                        _sleep(100);
               
                }
        char recvBuf[100];  
        memset(recvBuf, 0, sizeof(recvBuf));  
//      //接收数据  
        recv(sockConn, recvBuf, sizeof(recvBuf), 0);  
        printf("%s\n", recvBuf);  
  

    closesocket(sockSrv);  
    WSACleanup();  
    system("pause");  
}  [/mw_shl_code]

智能垃圾桶第二期: wifi模块实现tcp数据透传图21
------------------------------------------结尾分割线--------------------------------------

ok, 智能垃圾桶项目的第二期分享已经结束了。 饶厂长知道自己做的很慢。。。 过了这么久都
没有动, 工作太忙。。。


下期我分享kinect环境安装与底盘位置反馈。
预计, 三周后把。。。。

nodemcu-flasher-master.zip

6.26 MB, 下载次数: 306

NetAssist.rar

377.78 KB, 下载次数: 314

本帖被以下淘专辑推荐:

luna  初级技神

发表于 2017-6-20 16:37:35

终于更新了!!!好棒啊!虽然工作很忙,但是内容依然很优质!
回复

使用道具 举报

lkl0305  中级技师

发表于 2017-6-20 21:00:22

很不错的教程
回复

使用道具 举报

饶厂长  初级技匠
 楼主|

发表于 2017-6-21 01:47:34


力求清晰明了, 可操作性高
回复

使用道具 举报

饶厂长  初级技匠
 楼主|

发表于 2017-6-21 01:48:16

luna 发表于 2017-6-20 16:37
终于更新了!!!好棒啊!虽然工作很忙,但是内容依然很优质!

真的好忙啊。。。。 不过做东西还是很开心的
回复

使用道具 举报

luna  初级技神

发表于 2017-6-21 16:11:42

饶厂长 发表于 2017-6-21 01:48
真的好忙啊。。。。 不过做东西还是很开心的

做东西确实很放松~~还有减压功效
回复

使用道具 举报

LRW  学徒

发表于 2017-7-9 20:34:16

厉害了,厉害了我的哥  期待厂长更新
回复

使用道具 举报

饶厂长  初级技匠
 楼主|

发表于 2017-7-10 18:46:18

LRW 发表于 2017-7-9 20:34
厉害了,厉害了我的哥  期待厂长更新

厂长变IP了呢,哈哈
回复

使用道具 举报

238715  见习技师

发表于 2017-7-30 20:20:37

厂长  这个什么时候完全开源   特别想做一个去参加比赛
回复

使用道具 举报

饶厂长  初级技匠
 楼主|

发表于 2017-8-8 11:39:05

238715 发表于 2017-7-30 20:20
厂长  这个什么时候完全开源   特别想做一个去参加比赛

还没做完呢。 最近在搞大机器人, 这个项目就搁置两个月
回复

使用道具 举报

Борис  学徒

发表于 2017-8-21 13:17:17

骚呢。。。666
回复

使用道具 举报

238715  见习技师

发表于 2017-8-28 17:01:45

饶厂长 发表于 2017-8-8 11:39
还没做完呢。 最近在搞大机器人, 这个项目就搁置两个月

好吧  谢谢厂长
回复

使用道具 举报

25142112292017  见习技师

发表于 2018-1-22 18:12:30

厂长什么时候把,kinect环境安装 更新一下,我正在应用于pc开发,万分感谢
回复

使用道具 举报

饶厂长  初级技匠
 楼主|

发表于 2018-1-23 10:26:55

25142112292017 发表于 2018-1-22 18:12
厂长什么时候把,kinect环境安装 更新一下,我正在应用于pc开发,万分感谢

CSDN里面有很多, 你可以去看一下。
回复

使用道具 举报

foreversky  见习技师

发表于 2018-3-15 18:41:12

跪求厂长更贴:))
回复

使用道具 举报

新手小白来蹭热度  学徒

发表于 2018-8-7 00:46:10

啊,,,关于Kinect弄视觉的怎么没有更新。。跪求更新。:'(
回复

使用道具 举报

HeySearra  学徒

发表于 2018-9-1 17:05:25

太感谢了!正好需要这个模块
回复

使用道具 举报

hjtao2018  见习技师

发表于 2018-9-10 21:05:38

好好学习下。
回复

使用道具 举报

饶先生  学徒

发表于 2019-3-14 12:54:10

呵呵,遇到同行业的家人了,空了加个qq吧 81779007
回复

使用道具 举报

an1122  学徒

发表于 2019-5-18 15:17:42

在等第三期
回复

使用道具 举报

Karzes  学徒

发表于 2019-7-10 01:08:59

厂长还有第三期嘛啊哈哈哈
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail