Я довольно новичок в LUA и не слишком опытен.
Я использую веб-сервер на узле mcu esp8266, который управляет шаговым двигателем, который вращает карданный подвес.Для этого я нашел шаговый модуль, который работает нормально.Существует команда для поворота двигателя, например, такая: поворот (mno, direction, pan_speed, no_steps). Это отлично работает.Теперь я бы хотел, чтобы двигатель вращался, пока другая команда с веб-сервера не остановит его.Здесь мне нужен совет.Я могу запустить двигатель из веб-сервера, используя цикл, который выполняет команду в модуле.Это также работает, но я не могу остановить двигатель, потому что веб-сервер не получает команду останова, пока цикл вращает двигатель. Я пробовал с таймером, но я все еще не до конца понимал обработку событий в LUA.
Любой совет очень приветствуется
Дерек
Это основная программа.Поскольку я пытаюсь, разные вещи важна только та часть, которая поворачивает кардан влево.Когда программа поворачивает налево, она не может принять вторую команду, чтобы повернуть налево снова, что должно остановить подвес.
Важной является часть веб-сервера, где поворот каркаса поворачивается влево, а затем функция «поворачивается» вшаговый модуль.
motors = require ('stepper')
pan_speed = 1
tilt_speed = pan_speed
pan_steps=50
tilt_steps=pan_steps
steps = 50
mno=1
gol=1
gor=0
stop=1
-- a simple http server
if srv ~= nil then
--srv:close()
end
srv=net.createServer(net.TCP,180)
srv:listen(80,function(conn)
conn:on("receive",function(conn,request)
-- print(node.heap())
buf = ""
local buf = "";
buf = buf.."HTTP/1.1 200 OK\n\n"
local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
if(method == nil)then
_, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
end
local _GET = {}
if (vars ~= nil)then
for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
_GET[k] = v
end
end
if(_GET.direction or _GET.speed) or _GET.distance then
if(_GET.direction) == "left" then
print("pressed left")
dir = -1
if stop==0 then stop=1 elseif stop == 1 then stop=0 end
print("stop = ",stop)
buf = "OK"
mno=1
while stop == 0 do
turn(mno,dir,pan_speed,1)
end
end
if(_GET.direction) == "right" then
if stop==0 then stop=1 elseif stop == 1 then stop=0 end
buf = "OK"
mno=1
while stop == 0 do
print("gimbal dreht rechts")
--turn(mno,1,1,1)
end
end
if(_GET.direction) == "up" then
buf = "OK"
mno=2
--turn(mno,1,tilt_speed,tilt_steps)
end
if(_GET.direction) == "down" then
buf = "OK"
mno=2
--turn(mno,-1,tilt_speed,tilt_steps)
--collectgarbage()
end
if(_GET.speed) then
buf = "OK"
pan_speed = _GET.speed
tilt_speed = pan_speed
collectgarbage()
end
if(_GET.distance) then
buf = "OK"
pan_steps = tonumber(_GET.distance)
tilt_steps = pan_steps
collectgarbage()
end
--write_config()
collectgarbage()
end
conn:send(buf)
-- srv:close()
collectgarbage()
print("stop 3 = ",stop)
end)
print("stop 2 = ",stop)
end)
А вот и шаговый модуль:
stepper = {}
do
local mot = { 1,2,3,4,5,6,7,8}
-- direction = 1
steps = 50
speed = 4
del = 1000 * speed
print("Modul del = ",del)
mno = 1
pan_pos = 0
gpio.mode(12, gpio.INPUT)
gpio.write(12, gpio.HIGH)
print("GPIO-0 = ",gpio.read(12))
r_stop = 0
l_stop = 0
u_stop = 0
d_stop = 0
max_left = 1425
max_right = 0
pan_pos = 0
stop=0
for i = 1, 8,1 do
gpio.mode(mot[i], gpio.OUTPUT) -- define output
end
function say_stop(s)
if s == 1 then stop = 1 end
if s == 0 then stop = 0 end
end
function ask_stop()
return stop
end
function set_stop(l_s,r_s,u_s,d_s)
l_stop = l_s r_stop = r_s u_stop = u_s d_stop = d_s
end
function get_stop(l_stop, r_stop, u_stop, d_stop)
return l_stop, r_stop, u_stop, d_stop
end
function write_config()
cf = file.open("config_data.cfg", "w+")
if cf then
cf.writeline(max_left)
cf.writeline(max_right)
cf.writeline(pan_pos)
cf:close()
end
end
-- write_config()
function load_config()
cf = file.open("config_data.cfg", "r")
if cf then
max_left = tonumber(cf.readline())
max_right = tonumber(cf.readline())
pan_pos = tonumber(cf.readline())
print("Werte geladen")
print("max_left = ",max_left)
print("max_right = ",max_right)
print("pan_pos = ",pan_pos)
cf:close()
end
end
load_config()
function sequence_l(a, b, c, d,mno)--gimbal dreht links
if mno == 1 then
gpio.write(mot[1], a)
gpio.write(mot[2], b)
gpio.write(mot[3], c)
gpio.write(mot[4], d)
tmr.delay(del)
end
if gpio.read(12) == 0 then l_stop = pan_pos end
if mno == 2 and stop == 0 then
gpio.write(mot[5], a)
gpio.write(mot[6], b)
gpio.write(mot[7], c)
gpio.write(mot[8], d)
tmr.delay(del)
end
end
function sequence_r(a, b, c, d,mno)--gimbal dreht rechts
if mno == 1 then
gpio.write(mot[1], a)
gpio.write(mot[2], b)
gpio.write(mot[3], c)
gpio.write(mot[4], d)
tmr.delay(del)
end
if gpio.read(12) == 0 then r_stop = pan_pos end
if mno == 2 then
gpio.write(mot[5], a)
gpio.write(mot[6], b)
gpio.write(mot[7], c)
gpio.write(mot[8], d)
tmr.delay(del)
end
end
function turn(mno,direction,speed,steps)
del = 100 * speed -- bestimmt Geschwindigkeit
if direction == 1 then -- Gimbal turning right
while pan_pos > max_right do --Rotation in one direction
if stop == 1 then break end
pan_pos = pan_pos -1
tmr.alarm(3, del, 0, function() sequence_r(gpio.HIGH, gpio.LOW, gpio.LOW, gpio.LOW,mno) print("timer 3 = ",stop)
end)
tmr.unregister(3)
--sequence_r(gpio.HIGH, gpio.LOW, gpio.LOW, gpio.LOW,mno)
sequence_r(gpio.HIGH, gpio.HIGH, gpio.LOW, gpio.LOW,mno)
sequence_r(gpio.LOW, gpio.HIGH, gpio.LOW, gpio.LOW,mno)
sequence_r(gpio.LOW, gpio.HIGH, gpio.HIGH, gpio.LOW,mno)
sequence_r(gpio.LOW, gpio.LOW, gpio.HIGH, gpio.LOW,mno)
sequence_r(gpio.LOW, gpio.LOW, gpio.HIGH, gpio.HIGH,mno)
sequence_r(gpio.LOW, gpio.LOW, gpio.LOW, gpio.HIGH,mno)
sequence_r(gpio.HIGH, gpio.LOW, gpio.LOW, gpio.HIGH,mno)
end
sequence_r(gpio.HIGH, gpio.LOW, gpio.LOW, gpio.LOW,mno)
elseif direction == -1 then -- Gimbal turning left
while pan_pos <max_left do
print("turning left")
if stop == 1 then break end
pan_pos = pan_pos +1
sequence_l(gpio.LOW, gpio.LOW, gpio.LOW, gpio.HIGH,mno)
sequence_l(gpio.LOW, gpio.LOW, gpio.HIGH, gpio.HIGH,mno)
sequence_l(gpio.LOW, gpio.LOW, gpio.HIGH, gpio.LOW,mno)
sequence_l(gpio.LOW, gpio.HIGH, gpio.HIGH, gpio.LOW,mno)
sequence_l(gpio.LOW, gpio.HIGH, gpio.LOW, gpio.LOW,mno)
sequence_l(gpio.HIGH, gpio.HIGH, gpio.LOW, gpio.LOW,mno)
sequence_l(gpio.HIGH, gpio.LOW, gpio.LOW, gpio.LOW,mno)
sequence_l(gpio.HIGH, gpio.LOW, gpio.LOW, gpio.HIGH,mno)
end
sequence_l(gpio.LOW, gpio.LOW, gpio.LOW, gpio.HIGH,mno)
end
print("-----------------------------------")
print ("pan_pos=",pan_pos)
print("Modul steps = ",steps)
print("r_stop",r_stop)
print("l_stop",l_stop)
print("u_stop",u_stop)
print("d_stop",d_stop)
print("stop",stop)
collectgarbage()
end
end
return stepper