LEGO Rocket Launcher - Part 3 - Microcontroller
The Rocket Launcher is controlled by an ESP8266-12 microcontroller.
I bought a NodeMCU Amica v2 board. It costs less than 10 euros from european internet sellers or 2/3 euros from asiatic sellers (if you can wait a month for shipping).
I flashed the ESP8266 using NodeMCU firmware version 1.5.4.1-final.
Then I uploaded the needed lua scripts, init.lua and lrr.lua:
I bought a NodeMCU Amica v2 board. It costs less than 10 euros from european internet sellers or 2/3 euros from asiatic sellers (if you can wait a month for shipping).
The ESP8266's GPIO pins (D0, D1, D2, D3, D5, D6) are connected to motor driver board inputs (C1, C2, C3).
The motor board is able provide +5V to ESP8266, as shown in the figure; don't forget GND pin.
Then I uploaded the needed lua scripts, init.lua and lrr.lua:
- init.lua configures wifi and then calls lrr.lua
- lrr.lua: runs a web server listening for motor commands
wifi.setmode(wifi.STATIONAP)
wifi.sta.config("YOURssid","YOURpassword")
print(wifi.sta.getip())
cfg={}
cfg.ssid="ESP8266"
wifi.ap.config(cfg)
dhcp_config ={}
dhcp_config.start = "192.168.4.100"
wifi.ap.dhcp.config(dhcp_config)
wifi.ap.dhcp.start()
dofile("lrr.lua")
|
The script sets ESP8266 in AP+STATION mode:
- AP mode: ESP8266 works as access point (SSID = ESP8266) and DHCP server; DHCP scope starts at 192.168.4.100; ESP IP is 192.168.4.1
- STATION mode: ESP connects to home wifi network as DHCP client; you have to find on your modem router the ESP IP
C1a = 0
C1b = 1
C2a = 2
C2b = 3
C3a = 5
C3b = 6
gpio.mode(C1a, gpio.OUTPUT)
gpio.mode(C1b, gpio.OUTPUT)
gpio.mode(C2a, gpio.OUTPUT)
gpio.mode(C2b, gpio.OUTPUT)
gpio.mode(C3a, gpio.OUTPUT)
gpio.mode(C3b, gpio.OUTPUT)
gpio.write(C1a, gpio.HIGH)
gpio.write(C1b, gpio.HIGH)
gpio.write(C2a, gpio.HIGH)
gpio.write(C2b, gpio.HIGH)
gpio.write(C3a, gpio.HIGH)
gpio.write(C3b, gpio.HIGH)
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on("receive", function(client,request)
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
buf = buf.."<h1> ESP8266 Web Server</h1>";
buf = buf.."<p>GPIO01 <a href=\"?pin=ONL\"><button>UP</button></a></p>";
buf = buf.."<p>GPIO10 <a href=\"?pin=ONR\"><button>DN</button></a></p>";
buf = buf.."<p>GPIO23 <a href=\"?pin=ONU\"><button>LT</button></a></p>";
buf = buf.."<p>GPIO32 <a href=\"?pin=OND\"><button>RT</button></a></p>";
buf = buf.."<p>GPIO56 <a href=\"?pin=ONF\"><button>FR</button></a></p>";
local _on,_off = "",""
if(_GET.pin == "ONL")then
gpio.write(C1a, gpio.LOW)
gpio.write(C1b, gpio.HIGH)
tmr.delay(500000)
gpio.write(C1a, gpio.HIGH)
gpio.write(C1b, gpio.HIGH)
elseif(_GET.pin == "ONR")then
gpio.write(C1a, gpio.HIGH)
gpio.write(C1b, gpio.LOW)
tmr.delay(500000)
gpio.write(C1a, gpio.HIGH)
gpio.write(C1b, gpio.HIGH)
elseif(_GET.pin == "OND")then
gpio.write(C2a, gpio.LOW)
gpio.write(C2b, gpio.HIGH)
tmr.delay(500000)
gpio.write(C2a, gpio.HIGH)
gpio.write(C2b, gpio.HIGH)
elseif(_GET.pin == "ONU")then
gpio.write(C2a, gpio.HIGH)
gpio.write(C2b, gpio.LOW)
tmr.delay(500000)
gpio.write(C2a, gpio.HIGH)
gpio.write(C2b, gpio.HIGH)
elseif(_GET.pin == "ONF")then
gpio.write(C3a, gpio.LOW)
gpio.write(C3b, gpio.HIGH)
tmr.delay(500000)
gpio.write(C3a, gpio.HIGH)
gpio.write(C3b, gpio.HIGH)
end
client:send(buf);
client:close();
collectgarbage();
end)
end)
|
The script :
- defines GPIO pin (DO, D1, D2, D3, D5, D6) as outputs and set motors off (level HIGH)
- starts a web server listening for commands (UP, DOWN, LEFT, RIGHT, FIRE) from browser or android app.
Commenti
Posta un commento