使用循环GPIO写入时,带有NodeMCU固件的ESP8266 ESP-12F重新启动

时间:2016-11-21 21:47:37

标签: lua esp8266 nodemcu

我有一个ESP-12F模块,我使用当前的NodeMCU开发分支固件闪存。该模块由> 2A电源供电。我使用4个GPIO来控制一个小步进电机(this is the combo)的驱动程序。

我在ESPlorer中写了一个小的Lua脚本(partially based on the arduino version described here)来控制电机,程序运行正常,电机也相应转动,但是当我调用函数turn时,它会重新启动模块太多的步骤。限制大约是180步,有时略高一点,有时略低于这个数字。

我是编程这种模块的新手,我也只是学习Lua,有人可以想象这里会发生什么以及如何避免重启?顺便说一句:我也尝试向驱动板提供外部5伏电压,但它没有改变任何东西。

这是我的剧本:

gpio.mode(5, gpio.OUTPUT)
gpio.mode(6, gpio.OUTPUT)
gpio.mode(7, gpio.OUTPUT)
gpio.mode(0, gpio.OUTPUT)

sg = function (n,v) gpio.write(n, (v == 0 and gpio.LOW or gpio.HIGH)) end

stepRight = function ()
    sg(5,0);sg(6,0);sg(7,0);sg(0,1);
    sg(5,0);sg(6,0);sg(7,1);sg(0,1);
    sg(5,0);sg(6,0);sg(7,1);sg(0,0);
    sg(5,0);sg(6,1);sg(7,1);sg(0,0);
    sg(5,0);sg(6,1);sg(7,0);sg(0,0);
    sg(5,1);sg(6,1);sg(7,0);sg(0,0);
    sg(5,1);sg(6,0);sg(7,0);sg(0,0);
    sg(5,1);sg(6,0);sg(7,0);sg(0,1);
    sg(5,0);sg(6,0);sg(7,0);sg(0,0);
end

turn = function (dir, steps)
  if dir == 'right' then
    for i=0,steps,1 do
      stepRight()
    end
  end
end

以下是有关模块和固件的一些详细信息:

NodeMCU custom build by frightanic.com
    branch: dev
    commit: c54bc05ba61fe55f0dccc1a1506791ba41f1d31b
    SSL: true
    modules: adc,cjson,crypto,dht,file,gpio,hmc5883l,http,i2c,l3g4200d,mqtt,net,node,ow,pwm,spi,tmr,tsl2561,uart,wifi
 build  built on: 2016-11-21 19:02
 powered by Lua 5.1.4 on SDK 1.5.4.1(39cb9a32)

当我使用过高的值调用turn函数时,这就是它的样子:

turn('right',200)

 ets Jan  8 2013,rst cause:2, boot mode:(3,7)

load 0x40100000, len 26144, room 16 
tail 0
chksum 0x95
load 0x3ffe8000, len 2288, room 8 
tail 8
chksum 0xa8
load 0x3ffe88f0, len 8, room 0 
tail 8
chksum 0x66
csum 0x66
����o�r��n|�llll`��r�l�l��

NodeMCU custom build by frightanic.com
    branch: dev
    commit: c54bc05ba61fe55f0dccc1a1506791ba41f1d31b
    SSL: true
    modules: adc,cjson,crypto,dht,file,gpio,hmc5883l,http,i2c,l3g4200d,mqtt,net,node,ow,pwm,spi,tmr,tsl2561,uart,wifi
 build  built on: 2016-11-21 19:02
 powered by Lua 5.1.4 on SDK 1.5.4.1(39cb9a32)
lua: cannot open init.lua
> 

更新:我找到了一个有效的解决方案,但我无法解释原因。也许有人可以对此有所了解?

我认为我必须通过找出重启的时间和方式来解决问题,所以我在for循环中添加了一点定时器延迟:

for i=0,steps,1 do
  stepRight()
  tmr.delay(10)
end

这不会以任何明显的方式影响电机的速度,但现在我可以轻松地将数字调高到我想要的高度;)我可以使用turn('right',200000)并且重新启动完全消失了,它确实即使我将延迟设置为仅1μs,也不会再发生一次。那很好 - 但我很想知道为什么会有所帮助?

1 个答案:

答案 0 :(得分:0)

您在单回合功能中呼叫sg() 7,200次。你必须打破你的处理,以避免超时。这就是ESP8266 SDK所需的方式。

阅读文档中的my FAQ以获得更详细的讨论。