首页 文章

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

提问于
浏览
0

我有一个ESP-12F模块,我使用当前的NodeMCU dev-branch固件闪存 . 该模块由> 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
>

Update: I found a solution that works, but I can't explain why. Maybe someone can shed some light on this?

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

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

这不会以任何明显的方式影响电机的速度,但现在我可以轻松地将数字调高到我想要的数量;)我可以使用 turn('right',200000) 并且重新启动完全消失,它甚至没有再发生一次,即使我将延迟设置为仅1μs . 's great - but I'd喜欢知道为什么有帮助?

1 回答

  • 0

    您在单转功能中调用了 sg() 7,200次 . 你必须打破你的处理,以避免超时 . 这就是ESP8266 SDK所需的方式 .

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

相关问题