我有一个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 回答
您在单转功能中调用了
sg()
7,200次 . 你必须打破你的处理,以避免超时 . 这就是ESP8266 SDK所需的方式 .阅读文档中的my FAQ以获得更详细的讨论 .