码迷,mamicode.com
首页 > 移动开发 > 详细

用ESP8266+android,制作自己的WIFI小车

时间:2017-10-04 15:14:25      阅读:408      评论:0      收藏:0      [点我收藏+]

标签:crc   关系   mis   jpg   按键   实现   程序   而且   可靠   

整体思路ESP8266作为TCP服务器,,手机作为TCP客户端,自己使用Lua直接做到了芯片里面,省了单片机,,节约成本,其实本来就是个单片机(感觉Lua开发8266真的很好,甩AT指令好几条街,,而且很容易上手,),不过呢,等几天我也会做一个51用AT指令的.....强烈建议学习使用Lua开发8266,不要偷懒.....如果谁说难我是不信,,那是因为没有认真去学....下面我会讲的很详细,,,,,让亲们感受一下Lua到底难不难......

因为最近看到朋友遇到各种各样的问题,,我会把遇到的问题统统说一下,,,,,,,

手机界面上放置四个按钮,代表前进,后退,左转,和右转,,,另外呢利用手机的重力感应传感器通过手机的倾斜角度控制小车的速度

前进,后退,左转,右转分别控制ESP8266的一个引脚,,,,速度数据呢是控制ESP8266一个引脚的PWM的占空比

连接

技术分享

 

关于板子的引脚

技术分享

技术分享

 

如果发现轮子转的方向不对自己可以调换一下线哈,,,,,,,,,,

技术分享

 

 现在做ESP8266部分

 第一件事情是刷固件

固件的自己可以去下载

官网下载地址

https://nodemcu-build.com/

如果自己不想自己去下载或者说不愿意去尝试,那么可以下载我自己下载好的,,,,,每一次改变总需要一个开始......希望亲们自己去官网下载

链接:http://pan.baidu.com/s/1jICE1GM 密码:qn69

 

对了还有Lua开发的API文档

 

https://nodemcu.readthedocs.io/en/master/en/modules/gpio/

还有一个简洁版的API资料

链接:http://pan.baidu.com/s/1pL3FHgf 密码:l2nm

 再者呢!有些时候需要写Lua语言自带的API函数

链接:http://pan.baidu.com/s/1pLjycR5 密码:qxk8

还有一个简洁版的

链接:http://pan.baidu.com/s/1o8T1nU6 密码:eglx

其实我也写了Lua的入门教程,,很多人都抱怨难难难,,现在自己用Lua开发却是得心应手,,正是之前所做过的那些努力,,当时也没人教自己,要知道自己花了1个多月才摸索到入门的,只感叹没有遇到引导者.....现在只想让别人不再走这么多的弯路,,,简直是煎熬......现在看来Lua开发8266真心不难....但是总需要经历一下过程........最起码最基本的语法还是要懂得吧.......其实只要知道语法,变量也就够了.....其余的就是调用调用

技术分享

 

 技术分享

技术分享

技术分享

 

 都不用选

 技术分享

技术分享

 

 然后就会出现下面的界面,,等着哈

技术分享

技术分享

技术分享

选中地址下载就行

 

 技术分享

烧写固件的软件(一)

链接: http://pan.baidu.com/s/1cpnbVw 密码:2nha

 烧写固件的软件(二)

链接:http://pan.baidu.com/s/1boBW4N1 密码:88my

 无论哪一个软件,模块的接线都一样

技术分享

技术分享

技术分享

 

 

GPIO0 默认是工作模式(不接线)。如果接了低电平就是下载模式(给模块刷固件!!)所以接低电平。CH_PD接高电平,其余除了TX,RX外可以不接线..

其实在模块上电的时候如果GPIO0是低电平那么模块就工作在等待刷固件模式,,,在模块上电的时候如果GPIO0是高电平那么模块就工作在正常工作模式,由于没有按键什么的,所以可以先接好线再上电

技术分享

 

 

 技术分享

技术分享

 

 先用第一个软件刷固件

技术分享

技术分享

 

 

技术分享

 

 技术分享

选中,,地址是0000

技术分享

然后呢

技术分享

 

 技术分享

 

 技术分享

然后,复位一下

技术分享

 

看一下真实的连接

 

 技术分享

 

 我的手机镜头晚上拍照感觉有一层东西...........

技术分享

技术分享

 

 好了

 技术分享

 

 现在看用第二个软件刷固件

技术分享

技术分享

 

技术分享

 

 选择固件

技术分享

技术分享

给大家各种模块的Flash大小的表

http://wiki.ai-thinker.com/_media/esp8266/esp8266_module_list.png

 技术分享

接上跳线帽,,然后,复位一下

 技术分享

技术分享

好了

 技术分享

对了可能出现

 技术分享

这呢是串口模块和WIFI模块通信不稳定导致的,,,自己用ch340就出现过这种情况,,,,但是用pl2303就没有出现过,,,,对于这种情况,我感觉第一有条件可以换一个串口模块,比如pl2303,或者CP2102等等...再者呢可以选择好的杜邦线,,尽量短......

不过呢,,用pl2303下载好以后,,用ch340也可以了...............

对了也可以尝试

把这里改小一点

技术分享

感觉只要不通信那么多数据,,也能减少出错的机会

 现在用串口助手看一下

软件

 链接:http://pan.baidu.com/s/1qYqh9O4 密码:ddva

技术分享

 

 

 技术分享

 

 如果出现--正在格式化文件系统就等着哈,,

 技术分享

大约不到一分钟

技术分享

技术分享

用Lua开发8622用这个软件

 http://pan.baidu.com/s/1kVN09cr  密码:pfv7

 技术分享

 

 如果点击的时候提示安装,,安装就行,,如果没有提示呢可以,按照下面链接的提示自己安装哈,,,,,或者自己百度

http://jingyan.baidu.com/article/3c343ff70bc6ea0d377963df.html

 

 技术分享

现在新建一个init.lua

技术分享

 

 如果出现

技术分享

然后写上

gpio.write(8,0)
gpio.write(7,0)
gpio.write(6,0)
gpio.write(5,0)
gpio.mode(8,gpio.OUTPUT)--cs--
gpio.mode(7,gpio.OUTPUT)--mosi--
gpio.mode(6,gpio.OUTPUT)--miso--
gpio.mode(5,gpio.OUTPUT)--clk--

pwm.setup(4, 1000, 500)
pwm.start(4)

技术分享

技术分享

 

 技术分享

一上电都是低电平保证不让小车动....

对了想控制GPIO15其实是写的技术分享

 

下面是对应关系

技术分享

技术分享

 

 我是把8266的SPI引脚引出来了,不过呢,只是当普通引脚使用

技术分享

想了解SPI可以看这篇文章

http://www.cnblogs.com/yangfengwu/p/7524297.html

现在看控制速度的PWM引脚

 技术分享

技术分享

感觉初始化的时候,占空比应该为0(一直是低电平),这样的话小车保证不会动

大家看后面注释一定能看明白..........而且还有例子..........

技术分享

 

 如果出现

技术分享

 

 可以先复位一下然后再执行操

对了要是经常出现编译或者下载到模块出问题.........一定是串口模块和WIFI模块通信之间有问题.....尽量使用好的杜邦线,,,尽量短,,,,,再者可以考虑换成pl2303或者CP2102等.......因为自己测试的这两种模块比较可靠

技术分享

 技术分享

 

 因为GPIO2是WIFI模块上面的灯,,由于执行了PWM所以会看到这个这个灯微弱的发光

技术分享

 

 现在再新建一个wifi.lua

技术分享

 

把下面的代码复制粘贴过去

详细可以参考我的这几篇(由于有些朋友说还是不够详细,,,,后期这几篇我会再在里面详细添加内容)

看完这几篇开发8266一定会让您感觉有了新的突破

一   http://www.cnblogs.com/yangfengwu/p/7514336.html      下载自己选择功能的固件,刷固件,写LUA的软件

二    http://www.cnblogs.com/yangfengwu/p/7520260.html     GPIO,串口,注意事项,空闲中断

三    http://www.cnblogs.com/yangfengwu/p/7524297.html      SPI通信介绍,,STM32 SPI 从机

四    http://www.cnblogs.com/yangfengwu/p/7524326.html      TCP服务器,单个连接

五    http://www.cnblogs.com/yangfengwu/p/7531730.html      TCP服务器,多个客户端连接,CRC校验

六    http://www.cnblogs.com/yangfengwu/p/7533302.html       TCP Client 断开自动重连,AD采集

七    http://www.cnblogs.com/yangfengwu/p/7533845.html      UDP支持一路默认,3路动态连接,ssid 与 pwd 的读取

八    http://www.cnblogs.com/yangfengwu/p/7534521.html       ESP8266 文件保存数据(基于Lua脚本语言)

 

wifi.setmode(wifi.STATIONAP)

cfg={}
cfg.ssid="Hellow8266"
cfg.pwd="11223344"
wifi.ap.config(cfg)

apcfg={}
apcfg.ssid="qqqqq"
apcfg.pwd="11223344"
wifi.sta.config(apcfg)
wifi.sta.connect()

TCPSever=net.createServer(net.TCP,28800) 

TcpConnectCnt = 0
TcpSocketTable={}
NowSocket=nil
TCPSever:listen(8080,function(socket) 
  
    if  TcpConnectCnt == 4 then
        if  TcpSocketTable[0] ~= nil then 
            TcpSocketTable[0]:close()
            TcpSocketTable[0] = nil
        end    
    else
        if  TcpSocketTable[TcpConnectCnt+1] ~= nil then 
            TcpSocketTable[TcpConnectCnt+1]:close()
            TcpSocketTable[TcpConnectCnt+1] = nil
        end 
    end
    
    TcpSocketTable[TcpConnectCnt] = socket
    
    print(TcpConnectCnt.."-Connect")
    
    
    TcpConnectCnt = TcpConnectCnt + 1
    if  TcpConnectCnt == 5 then
        TcpConnectCnt = 0
    end
    
    
    socket:on("receive",function(socket,data) 
          NowSocket = socket
          uart.write(0,data) 
          control(data)
    end) 

    socket:on("disconnection",function(sck,c) 
        for i=0,4 do
            if  TcpSocketTable[i] == sck then
                TcpSocketTable[i] = nil
                print(i.."-Disconnect")
            end
        end
    end)
    
end)


function control(data)  
    local RevLen = string.len (data)

    --[[
    local i; local datatable={};
    for  i=1,RevLen do
         datatable[i] = data:byte(i);
    end
    print(CRC16Flage(datatable,6))]]
    
    
    local crc = ow.crc16(string.sub(data,1,RevLen-2))
    local recrc = data:byte(RevLen)
    local recrc = recrc*256
    local recrc = recrc + data:byte(RevLen-1)
    
    if  crc == recrc then
        if  RevLen == 6 then
            if  data:byte(1) == 0xAA and data:byte(2) == 0x55 then
                stopcar = 0;
                if  data:byte(3) == 0x01 then--forward
                    gpio.write(8,1)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,1)--you qian
                    gpio.write(5,0)--you hou
                    --print("forward")
                end
                if  data:byte(3) == 0x02 then--back
                    gpio.write(8,0)--zuo qian
                    gpio.write(7,1)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,1)--you hou
                    --print("back")
                end
                if  data:byte(3) == 0x03 then--right
                    gpio.write(8,1)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,1)--you hou
                    --print("right")
                end
                if  data:byte(3) == 0x04 then--left
                    gpio.write(8,0)--zuo qian
                    gpio.write(7,1)--zuo hou
                    gpio.write(6,1)--you qian
                    gpio.write(5,0)--you hou
                    --print("left")
                end
                if  data:byte(3) == 0x05 then--stop
                    gpio.write(8,0)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,0)--you hou
                    --print("stop")
                end
                pwm.setduty(4, data:byte(4)*10)
            end
        end
    else
        if  NowSocket ~= nil then
                --NowSocket:send("CRC16 Faild")
                NowSocket = nil
        end   
    end       
end  

stopcar = 0;
tmr.alarm(1, 100, 1, function()
    stopcar = stopcar + 1;
    if  stopcar>3 then
        stopcar = 3;
        gpio.write(8,0)--zuo qian
        gpio.write(7,0)--zuo hou
        gpio.write(6,0)--you qian
        gpio.write(5,0)--you hou
    end
end)


--计算CRC
function  CRC16(modbusdata,length)
    local i=0;local j=0;local crc=0;local k=1;local l=1;
    
    for k=1 ,length do
        crc = bit.bxor(crc,modbusdata[k])
        for l=1,8 do
            if  bit.band(crc,1) == 1 then
                crc = bit.rshift(crc,1);
                crc = bit.bxor(crc,0xa001);
            else
                crc = bit.rshift(crc,1);
            end
        end
    end
    return crc;
end

function CRC16Flage(modbusdata,length)
    local Receive_CRC = 0;local calculation = 1;
    Receive_CRC = CRC16(modbusdata,length-2)
    calculation = modbusdata[length];
    calculation = calculation * 256;
    calculation = calculation + modbusdata[length-1];
    if  Receive_CRC == calculation then
        return 1;
    else
        return 0;    
    end
end



uart.on("data",0,function(data) 

    for i=0,4 do
        if  TcpSocketTable[i] ~= nil then
            TcpSocketTable[i]:send(data)
        end
    end
        
end, 0)


printip = 0
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
    printip = 0
end)


wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
   if printip == 0 then
      print("+IP"..T.IP)
   end
   printip = 1
end)

技术分享

 

 技术分享

技术分享

 

 用uart.write(0,data),,和print(data)的区别在于uart就相当于咱们单片机常用的串口发送.....而print相当于printf

而且这个print呢默认是遇到‘\0‘就把这之前的数据发到串口,,所以呢有时候您定义的数据如果有‘0‘,,,,那么这个‘0‘后面的数据就发不过去了........

技术分享

 有些人会问,为什么要这样做呢,,,函数为什么是这样....当然是看的API文档啦

技术分享

 

 技术分享

 

 API函数很多,,其实无论做什么东西您一定要知道自己想做什么东西,,需要什么功能,然后根据这些去找符合自己需求的API,自己心中一定要有数,,无论做什么东西都是这样...一定是自己先全方面的把握好整体,,然后再进行拆分成各个模块,然后再进行组合..............

所以自己做东西前一些天自己进度很慢很慢,我会考虑哪些模块自己并不会,但是一定会用到,我就会先攻克这块,一定是先把自己不懂或者不会的解决掉,因为如果不解决掉,这一块如果牵扯到别的模块就麻烦了....然后感觉可以了呢!就再花些时间整合一下系统,,,再考虑考虑整个系统所涉及的地方,,可能遇到的问题,尽量杀死在摇篮里面....然后呢就把整个系统做一下拆分,,,如何拆分就看自己的了,经验越多越拆分的合理......感觉可以了,,,开始干了,前期的投入就会发现大有成效,后期会节省很多时间........

很多人问我辞职原因:我要的是合作伙伴;我虽然都是自学的,但是我才会对整个系统把握的更好,因为我总是在做整个系统的东西;我从来不会拿公司项目开玩笑,我说在规定时间内能完成就绝对能完成;我要的是做好;解决一个技术难题我认为是自己应该做的,但绝对不会误期,因为如果我觉得会超过时间,我也就不会现在去解决了,我就会留到以后了;

看看程序看一看哪里有不会的就赶紧去查资料哈......QQ号和群都在上面显示着呢

其实呢官方只是提供了这些API函数,,,具体里面实现什么具体功能就看自己的了......

 

 现在看数据处理函数

function control(data)  
    local RevLen = string.len (data)

    --[[
    local i; local datatable={};
    for  i=1,RevLen do
         datatable[i] = data:byte(i);
    end
    print(CRC16Flage(datatable,6))]]
    
    
    local crc = ow.crc16(string.sub(data,1,RevLen-2))
    local recrc = data:byte(RevLen)
    recrc = recrc*256
    recrc = recrc + data:byte(RevLen-1)
    
    if  crc == recrc then
        if  RevLen == 6 then
            if  data:byte(1) == 0xAA and data:byte(2) == 0x55 then
                stopcar = 0;
                if  data:byte(3) == 0x01 then--forward
                    gpio.write(8,1)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,1)--you qian
                    gpio.write(5,0)--you hou
                    --print("forward")
                end
                if  data:byte(3) == 0x02 then--back
                    gpio.write(8,0)--zuo qian
                    gpio.write(7,1)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,1)--you hou
                    --print("back")
                end
                if  data:byte(3) == 0x03 then--right
                    gpio.write(8,1)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,1)--you hou
                    --print("right")
                end
                if  data:byte(3) == 0x04 then--left
                    gpio.write(8,0)--zuo qian
                    gpio.write(7,1)--zuo hou
                    gpio.write(6,1)--you qian
                    gpio.write(5,0)--you hou
                    --print("left")
                end
                if  data:byte(3) == 0x05 then--stop
                    gpio.write(8,0)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,0)--you hou
                    --print("stop")
                end
                pwm.setduty(4, data:byte(4)*10)
            end
        end
    else
        if  NowSocket ~= nil then
                --NowSocket:send("CRC16 Faild")
                NowSocket = nil
        end   
    end       
end 

技术分享

 

 技术分享

我规定的

前进  0xAA,0x55,0x01,((传过来的数0-100,根据手机倾斜角度)速度PWM),CRC16低位,CRC16高位

后退  0xAA,0x55,0x02,((传过来的数0-100,根据手机倾斜角度)速度PWM),CRC16低位,CRC16高位

右转  0xAA,0x55,0x03,((传过来的数0-100,根据手机倾斜角度)速度PWM),CRC16低位,CRC16高位

左转  0xAA,0x55,0x04,((传过来的数0-100根据手机倾斜角度)速度PWM),CRC16低位,CRC16高位

停止  0xAA,0x55,0x05,((0)速度PWM),CRC16低位,CRC16高位

所以现在看一下

技术分享

技术分享

技术分享

下面是自己写的CRC16校验,,对于不是提供了CRC16校验了,为什么还要自己写,...看下面哈

--计算CRC
function  CRC16(modbusdata,length)
    local i=0;local j=0;local crc=0;local k=1;local l=1;
    
    for k=1 ,length do
        crc = bit.bxor(crc,modbusdata[k])
        for l=1,8 do
            if  bit.band(crc,1) == 1 then
                crc = bit.rshift(crc,1);
                crc = bit.bxor(crc,0xa001);
            else
                crc = bit.rshift(crc,1);
            end
        end
    end
    return crc;
end

function CRC16Flage(modbusdata,length)//这个呢为了检测数据方便直接把数据往里面一丢,直接判断返回的如果是1说明crc正确,,否则0错误
    local Receive_CRC = 0;local calculation = 1;
    Receive_CRC = CRC16(modbusdata,length-2)
    calculation = modbusdata[length];
    calculation = calculation * 256;
    calculation = calculation + modbusdata[length-1];
    if  Receive_CRC == calculation then
        return 1;
    else
        return 0;    
    end
end

技术分享

下面还有android的呢!!算法都一样,,,只不过会告诉亲们注意的问题

技术分享

 

 技术分享

 

 技术分享

我重新把wifi,lua贴一下

wifi.setmode(wifi.STATIONAP)

cfg={}
cfg.ssid="Hellow8266"
cfg.pwd="11223344"
wifi.ap.config(cfg)

apcfg={}
apcfg.ssid="qqqqq"
apcfg.pwd="11223344"
wifi.sta.config(apcfg)
wifi.sta.connect()

TCPSever=net.createServer(net.TCP,28800) 

TcpConnectCnt = 0
TcpSocketTable={}
NowSocket=nil
TCPSever:listen(8080,function(socket) 
  
    if  TcpConnectCnt == 4 then
        if  TcpSocketTable[0] ~= nil then 
            TcpSocketTable[0]:close()
            TcpSocketTable[0] = nil
        end    
    else
        if  TcpSocketTable[TcpConnectCnt+1] ~= nil then 
            TcpSocketTable[TcpConnectCnt+1]:close()
            TcpSocketTable[TcpConnectCnt+1] = nil
        end 
    end
    
    TcpSocketTable[TcpConnectCnt] = socket
    
    print(TcpConnectCnt.."-Connect")
    
    
    TcpConnectCnt = TcpConnectCnt + 1
    if  TcpConnectCnt == 5 then
        TcpConnectCnt = 0
    end
    
    
    socket:on("receive",function(socket,data) 
          NowSocket = socket
          uart.write(0,data) 
          control(data)
    end) 

    socket:on("disconnection",function(sck,c) 
        for i=0,4 do
            if  TcpSocketTable[i] == sck then
                TcpSocketTable[i] = nil
                print(i.."-Disconnect")
            end
        end
    end)
    
end)


function control(data)  
    local RevLen = string.len (data)

    --[[
    local i; local datatable={};
    for  i=1,RevLen do
         datatable[i] = data:byte(i);
    end
    print(CRC16Flage(datatable,6))]]
    
    
    local crc = ow.crc16(string.sub(data,1,RevLen-2))
    local recrc = data:byte(RevLen)
    recrc = recrc*256
    recrc = recrc + data:byte(RevLen-1)
    
    if  crc == recrc then
        if  RevLen == 6 then
            if  data:byte(1) == 0xAA and data:byte(2) == 0x55 then
                stopcar = 0;
                if  data:byte(3) == 0x01 then--forward
                    gpio.write(8,1)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,1)--you qian
                    gpio.write(5,0)--you hou
                    --print("forward")
                end
                if  data:byte(3) == 0x02 then--back
                    gpio.write(8,0)--zuo qian
                    gpio.write(7,1)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,1)--you hou
                    --print("back")
                end
                if  data:byte(3) == 0x03 then--right
                    gpio.write(8,1)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,1)--you hou
                    --print("right")
                end
                if  data:byte(3) == 0x04 then--left
                    gpio.write(8,0)--zuo qian
                    gpio.write(7,1)--zuo hou
                    gpio.write(6,1)--you qian
                    gpio.write(5,0)--you hou
                    --print("left")
                end
                if  data:byte(3) == 0x05 then--stop
                    gpio.write(8,0)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,0)--you hou
                    --print("stop")
                end
                pwm.setduty(4, data:byte(4)*10)
            end
        end
    else
        if  NowSocket ~= nil then
                --NowSocket:send("CRC16 Faild")
                NowSocket = nil
        end   
    end       
end  

stopcar = 0;
tmr.alarm(1, 100, 1, function()
    stopcar = stopcar + 1;
    if  stopcar>3 then
        stopcar = 3;
        gpio.write(8,0)--zuo qian
        gpio.write(7,0)--zuo hou
        gpio.write(6,0)--you qian
        gpio.write(5,0)--you hou
    end
end)


--计算CRC
function  CRC16(modbusdata,length)
    local i=0;local j=0;local crc=0;local k=1;local l=1;
    
    for k=1 ,length do
        crc = bit.bxor(crc,modbusdata[k])
        for l=1,8 do
            if  bit.band(crc,1) == 1 then
                crc = bit.rshift(crc,1);
                crc = bit.bxor(crc,0xa001);
            else
                crc = bit.rshift(crc,1);
            end
        end
    end
    return crc;
end

function CRC16Flage(modbusdata,length)
    local Receive_CRC = 0;local calculation = 1;
    Receive_CRC = CRC16(modbusdata,length-2)
    calculation = modbusdata[length];
    calculation = calculation * 256;
    calculation = calculation + modbusdata[length-1];
    if  Receive_CRC == calculation then
        return 1;
    else
        return 0;    
    end
end



uart.on("data",0,function(data) 

    for i=0,4 do
        if  TcpSocketTable[i] ~= nil then
            TcpSocketTable[i]:send(data)
        end
    end
        
end, 0)


printip = 0
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
    printip = 0
end)


wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
   if printip == 0 then
      print("+IP"..T.IP)
   end
   printip = 1
end)

技术分享

 

 如果出现

技术分享

复位一下,然后再

技术分享

技术分享

 

 如果出现

技术分享

其实也是

对了要是经常出现编译或者下载到模块出问题.........一定是串口模块和WIFI模块通信之间有问题.....尽量使用好的杜邦线,,,尽量短,,,,,再者可以考虑换成pl2303或者CP2102等.......因为自己测试的这两种模块比较可靠

 其实也可以复位一下再

技术分享

 

 对了开头就说模块默认上电是执行init.lua,所以呢需要在init.lua中调用wifi.lua

现在的init.lua变为

gpio.write(8,0)
gpio.write(7,0)
gpio.write(6,0)
gpio.write(5,0)
gpio.mode(8,gpio.OUTPUT)--cs--
gpio.mode(7,gpio.OUTPUT)--mosi--
gpio.mode(6,gpio.OUTPUT)--miso--
gpio.mode(5,gpio.OUTPUT)--clk--

pwm.setup(4, 1000, 500)
pwm.start(4)

tmr.alarm(0, 2000, 0, function()
    dofile("wifi.lua")
end)

技术分享

复位一下

技术分享

技术分享

现在打开手机看一下已经有了WiFi的无线了....连接它,,密码是程序中设置的11223344

技术分享

 

 APP软件链接

链接:http://pan.baidu.com/s/1miBo3e4 密码:88lr

 现在您就可以控制自己的小车了..........

不过这样连接会发现有问题......一上电轮子会转一下再停...........

原因是PWM的引脚接的是Wifi模块灯上的引脚,而且呢灯的负极是接到WiFi模块的......所以一上电PWM会是一个高点的电平...........

技术分享

 

 再看第二个原因,,,会发现为什么只有左轮转......右轮为什么不转呢.........

那是由于其实一开始都应该是高电平...但是CS引脚拉低了........造成了左前(低),左后(高),右前(高),右后(高)....所以左轮就倒转了............

技术分享

 

 技术分享

知道了原因,,就好解决问题了.....

第一种方案,,,把PWM(GPIO2)换成左前CS(GPIO15)引脚,,,因为一上电是低电平所以由于没有PWM,,绝对不会转,,改一下程序,,换一下引脚

第二种方案自己再用一个10K的电阻也把左后(MOSI,GPIO13)拉低,,,,,最简单的方案

第三种方案,,自己板子上有一个继电器,,可以先把PWM(GPIO2)接到继电器的输出COM端,然后把继电器的常开触点接到L298N的PWM控制引脚,,在程序里呢先控制控制方向的引脚输出低电平,然后再设置好PWM,然后再控制继电器吸合,,,因为按下复位后,控制继电器的引脚没有那个能力驱动继电器了....就会断开PWM,,,所以轮子也不会转

技术分享

我们采用第一种方案,修改的地方最多的方案,,,要不怕麻烦,这样才会学的更多,理解的更深刻,,这篇博客现在已经用了快2天的时间了,边写边测试,希望自己能够遇到所有的问题

 换一下连接

 技术分享

 好现在的init.lua

--gpio.write(8,0)
gpio.write(4,0)
gpio.write(7,0)
gpio.write(6,0)
gpio.write(5,0)
--gpio.mode(8,gpio.OUTPUT)--cs--
gpio.mode(4,gpio.OUTPUT)--cs--
gpio.mode(7,gpio.OUTPUT)--mosi--
gpio.mode(6,gpio.OUTPUT)--miso--
gpio.mode(5,gpio.OUTPUT)--clk--


pwm.setup(8, 1000, 0)
pwm.start(8)

tmr.alarm(0, 2000, 0, function()
    dofile("wifi.lua")
end)

wifi.lua

 

 

wifi.setmode(wifi.STATIONAP)

cfg={}
cfg.ssid="Hellow8266"
cfg.pwd="11223344"
wifi.ap.config(cfg)

apcfg={}
apcfg.ssid="qqqqq"
apcfg.pwd="11223344"
wifi.sta.config(apcfg)
wifi.sta.connect()

TCPSever=net.createServer(net.TCP,28800) 

TcpConnectCnt = 0
TcpSocketTable={}
NowSocket=nil
TCPSever:listen(8080,function(socket) 
  
    if  TcpConnectCnt == 4 then
        if  TcpSocketTable[0] ~= nil then 
            TcpSocketTable[0]:close()
            TcpSocketTable[0] = nil
        end    
    else
        if  TcpSocketTable[TcpConnectCnt+1] ~= nil then 
            TcpSocketTable[TcpConnectCnt+1]:close()
            TcpSocketTable[TcpConnectCnt+1] = nil
        end 
    end
    
    TcpSocketTable[TcpConnectCnt] = socket
    
    print(TcpConnectCnt.."-Connect")
    
    
    TcpConnectCnt = TcpConnectCnt + 1
    if  TcpConnectCnt == 5 then
        TcpConnectCnt = 0
    end
    
    
    socket:on("receive",function(socket,data) 
          NowSocket = socket
          uart.write(0,data) 
          control(data)
    end) 

    socket:on("disconnection",function(sck,c) 
        for i=0,4 do
            if  TcpSocketTable[i] == sck then
                TcpSocketTable[i] = nil
                print(i.."-Disconnect")
            end
        end
    end)
    
end)


function control(data)  
    local RevLen = string.len (data)

    --[[
    local i; local datatable={};
    for  i=1,RevLen do
         datatable[i] = data:byte(i);
    end
    print(CRC16Flage(datatable,6))]]
    
    
    local crc = ow.crc16(string.sub(data,1,RevLen-2))
    local recrc = data:byte(RevLen)
    recrc = recrc*256
    recrc = recrc + data:byte(RevLen-1)
    
    if  crc == recrc then
        if  RevLen == 6 then
            if  data:byte(1) == 0xAA and data:byte(2) == 0x55 then
                stopcar = 0;
                if  data:byte(3) == 0x01 then--forward
                    gpio.write(4,1)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,1)--you qian
                    gpio.write(5,0)--you hou
                    --print("forward")
                end
                if  data:byte(3) == 0x02 then--back
                    gpio.write(4,0)--zuo qian
                    gpio.write(7,1)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,1)--you hou
                    --print("back")
                end
                if  data:byte(3) == 0x03 then--right
                    gpio.write(4,1)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,1)--you hou
                    --print("right")
                end
                if  data:byte(3) == 0x04 then--left
                    gpio.write(4,0)--zuo qian
                    gpio.write(7,1)--zuo hou
                    gpio.write(6,1)--you qian
                    gpio.write(5,0)--you hou
                    --print("left")
                end
                if  data:byte(3) == 0x05 then--stop
                    gpio.write(4,0)--zuo qian
                    gpio.write(7,0)--zuo hou
                    gpio.write(6,0)--you qian
                    gpio.write(5,0)--you hou
                    --print("stop")
                end
                pwm.setduty(8, data:byte(4)*10)
            end
        end
    else
        if  NowSocket ~= nil then
                --NowSocket:send("CRC16 Faild")
                NowSocket = nil
        end   
    end       
end  

stopcar = 0;
tmr.alarm(1, 100, 1, function()
    stopcar = stopcar + 1;
    if  stopcar>3 then
        stopcar = 3;
        gpio.write(4,0)--zuo qian
        gpio.write(7,0)--zuo hou
        gpio.write(6,0)--you qian
        gpio.write(5,0)--you hou
    end
end)


--计算CRC
function  CRC16(modbusdata,length)
    local i=0;local j=0;local crc=0;local k=1;local l=1;
    
    for k=1 ,length do
        crc = bit.bxor(crc,modbusdata[k])
        for l=1,8 do
            if  bit.band(crc,1) == 1 then
                crc = bit.rshift(crc,1);
                crc = bit.bxor(crc,0xa001);
            else
                crc = bit.rshift(crc,1);
            end
        end
    end
    return crc;
end

function CRC16Flage(modbusdata,length)
    local Receive_CRC = 0;local calculation = 1;
    Receive_CRC = CRC16(modbusdata,length-2)
    calculation = modbusdata[length];
    calculation = calculation * 256;
    calculation = calculation + modbusdata[length-1];
    if  Receive_CRC == calculation then
        return 1;
    else
        return 0;    
    end
end



uart.on("data",0,function(data) 

    for i=0,4 do
        if  TcpSocketTable[i] ~= nil then
            TcpSocketTable[i]:send(data)
        end
    end
        
end, 0)


printip = 0
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
    printip = 0
end)


wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
   if printip == 0 then
      print("+IP"..T.IP)
   end
   printip = 1
end)

先下载wifi.lua哈,,,因为init.lua是调用wifi.lua,,,如果不先下载wifi.lua就会调用报错.....

如果出现

技术分享

可以先把wifi模块里面的init.lua移除掉或者全部文件移除掉...再编译下载wifi.lua

方法是

先编译一个小的文件,,我们的init比较小

技术分享

 

 然后看右边

技术分享

 

 我们把init.lua移除,,,注意哈是事先准备好,然后复位一下模块然后再点击

技术分享

技术分享

 

 然后再复位一下模块看看

技术分享

现在重新下载wifi.lua把

 技术分享

我都是复位,,停1s左右编译,,,,然后复位,,停1s左右下载

 如果还有问题可以考虑把所有文件移除掉

技术分享

复位后再点击哈...因为一开始上电趁模块还没操作影响下载的程序时才可以哈......点击后需要等5~6秒哈......然后再复位一下模块,然后重新下载吧

 好了底层做好了...现在做手机APP,我需要关一下电脑,,,工作时间太长,,有点卡.....这篇文章也写得够多的了,,我单独写一篇文章介绍APP

链接:随后奉上

先奉上实物链接,APP源码链接

https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-15892851284.24.40c1a34cvT6L6W&id=559542734694

 

用ESP8266+android,制作自己的WIFI小车

标签:crc   关系   mis   jpg   按键   实现   程序   而且   可靠   

原文地址:http://www.cnblogs.com/yangfengwu/p/7625608.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!