esp8266.py
from select import poll
from pyb import UART
class ESP8266():
def __init__(self, server_port=None):
self.uart = UART(3, 115200)
self.poller = poll()
self.poller.register(self.uart, 1)
self.uart.write('AT\r\n')
self.uart_read()
self.uart.write('AT+CWMODE=%s\r\n' % (2 if server_port else 1))
self.uart_read()
self.uart.write('AT+CIPMUX=1\r\n')
self.uart_read()
if server_port:
self.uart.write('AT+CIPSERVER=1,%s\r\n' % server_port)
self.uart_read()
def uart_read(self, ok_raise=True):
msg = ''
attempts = 5
while attempts >= 0:
ev = self.poller.poll(1000)
if len(ev)>0 and self.uart.any():
msg += self.uart.readall().decode('utf-8')
if 'OK' in msg: break
attempts -= 1
if attempts < 0 and ok_raise: raise Exception('no OK received!')
return msg
def send_data(self, cid, data):
try:
self.uart.write('AT+CIPSEND=%s,%s\r\n' % (cid, len(data)))
self.uart.write('%s\r\n' % data)
return self.uart_read()
except Exception as e:
raise Exception('send_exception: %s' % e)
def get_rs(self, ip, port, data): # as CLIENT
self.uart.write('AT+CIPSTART=?\r\n')
self.uart_read()
self.uart.write('AT+CIPSTART=4,"TCP","%s",%s\r\n' % (ip, port))
self.uart_read()
return self.send_data(4, data)
def get_rq(self, data_def): # as SERVER
rq = self.uart_read(ok_raise=False)
if '+IPD,' in rq:
cid = rq[rq.find('+IPD,') + len('+IPD,')]
self.send_data(cid, data_def(rq))
self.uart.write('AT+CIPCLOSE=%s\r\n' % cid)
self.uart_read()
def __del__(self):
poller.unregister(self.uart)
uart.deinit()
esp8266.py (main)
from re import search
from esp8266 import ESP8266
html = """
<html>
<head>
<link rel="icon" href="#" />
<meta name="viewport" content="initial-scale=1" />
</head>
<input id="y" type="range" min="-5" max="5" step="1" value="%s"
style="margin:50px 50px 0 0; transform:rotate(270deg);"
onchange="update()" />
<input id="x" type="range" min="-5" max="5" step="1" value="%s"
style="margin-left:150px;"
onchange="update()" />
<script>
function update() {
window.location.href = '?' + document.getElementById('y').value +
'&' + document.getElementById('x').value;
}
</script>
</html>
"""
last_x = last_y = 0
def response(rq):
global last_x, last_y
x = search(r'\&-?\d+', rq)
y = search(r'\?-?\d+', rq)
last_x = x.group(0)[1:] if x else last_x
last_y = y.group(0)[1:] if y else last_y
return html % (last_y, last_x)
server = ESP8266(server_port=1336)
try:
server.get_rq(response)
except Exception as e:
print(e)
del server
I promised I will try it, and it took me a lot of time, but finally I removed the PyBoard from my other robot, and put it on Tote. Here's the code I came up with (note that I might have it wrong which leg is which on your robot, you may need to rearrange them): https://bitbucket.org/thesheep/pyb_tote/src