我有一个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,也不会再发生一次。那很好 - 但我很想知道为什么会有所帮助?
答案 0 :(得分:0)
您在单回合功能中呼叫sg()
7,200次。你必须打破你的处理,以避免超时。这就是ESP8266 SDK所需的方式。
阅读文档中的my FAQ以获得更详细的讨论。