用ESP8266+android,制作自己的WIFI小車(ESP8266篇)


由於官方的定時器做了改變,請自行改一下定時器函數

 

 

 

 

整體思路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

 

 

 

最新版本只有64位的

 

 

 

 

現在新建一個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,自己心中一定要有數,,無論做什么東西都是這樣...一定是自己先全方面的把握好整體,,然后再進行拆分成各個模塊,然后再進行組合..............

所以自己做東西前一些天自己進度很慢很慢,我會考慮哪些模塊自己並不會,但是一定會用到,我就會先攻克這塊,一定是先把自己不懂或者不會的解決掉,因為如果不解決掉,這一塊如果牽扯到別的模塊就麻煩了....然后感覺可以了呢!就再花些時間整合一下系統,,,再考慮考慮整個系統所涉及的地方,,可能遇到的問題,盡量殺死在搖籃里面....然后呢就把整個系統做一下拆分,,,如何拆分就看自己的了,經驗越多越拆分的合理......感覺可以了,,,開始干了,前期的投入就會發現大有成效,后期會節省很多時間........

很多人問我辭職原因:在我手里做的東西首先要讓自己認可,解決當前的問題並不是我為了炫耀什么,這是我自己做東西的底線,我一直相信辦法總比困難多,我要的是合作伙伴;我雖然都是自學的,但是我才會對整個系統把握的更好,因為我總是在做整個系統的東西;我從來不會拿公司項目開玩笑,我說在規定時間內能完成就絕對能完成;我要的是做好;解決一個技術難題我認為是自己應該做的,但絕對不會誤期,因為如果我覺得會超過時間,我也就不會現在去解決了,我就會留到以后了;

解決的問題 :

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

看看程序看一看哪里有不會的就趕緊去查資料哈......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

鏈接:http://www.cnblogs.com/yangfengwu/p/7633980.html

先奉上實物鏈接,APP源碼鏈接

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM