沧海笑 发表于 2017-6-25 23:57:46

一步一步使用uPyCraft学习MicroPython之eps8266小车socket控制

【一步一步使用uPyCraft学习MicroPython之eps8266小车socket控制】【本期故事】本期不是原创故事,是昨晚在看到一个http://www.instructables.com/member/botdemy/的小车控制的作品。本帖就是把这个教程实现出来,同时和大家分享一下注意事项。
还是发一个视频:通过平板浏览器访问8266上的socket server,然后把小车的控制参数传下去,8266这边用mp解析,然后驱动gpio口,通过电机驱动板来实现对小车的控制。http://player.youku.com/player.php/sid/XMjg0OTM1NzA4OA==/v.swf

【硬件清单】
品名数量备注
D1 mini pro 1Esp8266-12F的core
D1 mini 电池扩展板1带800mah电池一块
小车底盘1电机、L293D电机驱动板
杜邦线6

【软件准备】

品名 版本备注
uPyCraftV0.20DF出品MicroPython IDE
socket
micropython
Tcp server 示例代码
dfrobot
MicroPython-IoT-Rover-Based-on-WeMos-D1-ESP-8266EX代码
botdemy
【接线】#Wemos Dpin to GPIO我的小车驱动板是L293D#https://www.wemos.cc/product/d1.html#D1->GPIO5----DIRA #D2->GIOO4----PWMAimport socket#D3->GPIO0----DIRB#skip D4 - built-in LED)#D5->GPI014 --PWMB
【esp8266代码】```
import socket
import machine
import time
import network

SSID="your SSID"
PASSWORD=your psw"
port=80
wlan=None
listenSocket=None

def connectWifi(ssid,passwd): #建立wifi连接
global wlan
wlan=network.WLAN(network.STA_IF)
wlan.active(True)
wlan.disconnect()
wlan.connect(ssid,passwd)
while(wlan.ifconfig()=='0.0.0.0'):
    time.sleep(1)
return True

#HTML to send to browsers
html = """<!DOCTYPE html>
<html>
<head>
<title>Botdemy MicroPython IoT Car</title>
<style>
body {background-color: white}
h1 {color:red}

button {
      color: red;
      height: 200px;
      width: 200px;
      background:white;
      border: 3px solid #4CAF50; /* Green */
      border-radius: 50%;
      font-size: 250%;
      position: center;
}
</style>
</head>
<body>
<center><h1>Botdemy IoT Car Control</h1>
<form>
<div><button name="CMD" value="forward" type="submit">Forward</button></div>
<div><button name="CMD" value="left" type="submit">Left</button>
<button name="CMD" value="stop" type="submit">Stop</button>
<button name="CMD" value="right" type="submit">Right</button></div>
<div><button name="CMD" value="back" type="submit">Back</button></div>
</form>
</center>
</body>
</html>
"""


#Wemos Dpin to GPIO
#https://www.wemos.cc/product/d1.html
#根据我的小车电机驱动板进行的接线安排,玩家可以根据自己的小车驱动板进行调整,gpio io对照接线表
#D1->GPIO5----DIRA
#D2->GIOO4----PWMA
#D3->GPIO0----DIRB
#skip D4 - built-in LED)
#D5->GPI014 --PWMB
Lmotor1 = machine.Pin(5, machine.Pin.OUT)
Lmotor2 = machine.Pin(4, machine.Pin.OUT)

Rmotor1 = machine.Pin(0, machine.Pin.OUT)
Rmotor2 = machine.Pin(14, machine.Pin.OUT)


def forward():
Lmotor1.high()
Lmotor2.high()
Rmotor1.high()
Rmotor2.high()

def back():
Lmotor1.low()
Lmotor2.high()
Rmotor1.low()
Rmotor2.high()

def left():
Lmotor1.high()
Lmotor2.low()
Rmotor1.high()
Rmotor2.high()
time.sleep_ms(100)
stop()

def right():
Lmotor1.high()
Lmotor2.high()
Rmotor1.high()
Rmotor2.low()
time.sleep_ms(100)
stop()

def stop():
Lmotor1.low()
Lmotor2.low()
Rmotor1.low()
Rmotor2.low()

#Setup Socket Web
connectWifi(SSID,PASSWORD)
ip=wlan.ifconfig()

listenSocket = socket.socket() #建立一个实例
listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listenSocket.bind((ip,port))#绑定建立网路连接的ip地址和端口
listenSocket.listen(5) #开始侦听

print ('tcp waiting...')


while True:
    print("accepting.....")
    conn, addr = listenSocket.accept()
    print("Got a connection from %s" % str(addr))
    request = conn.recv(1024)
    print("Content = %s" % str(request))
    request = str(request)

    CMD_forward = request.find('/?CMD=forward') #如果在请求的包中,发现有/?CMD=forward,下同
    CMD_back = request.find('/?CMD=back')
    CMD_left = request.find('/?CMD=left')
    CMD_right = request.find('/?CMD=right')
    CMD_stop = request.find('/?CMD=stop')

    print("Data: " + str(CMD_forward))
    print("Data: " + str(CMD_back))
    print("Data: " + str(CMD_left))
    print("Data: " + str(CMD_right))
    print("Data: " + str(CMD_stop))

    if CMD_forward == 6: #如果此命令有效,下同
      print('+forward')
      forward() #调用前进函数,下同
    if CMD_back == 6:
      print('+back')
      back()
    if CMD_left == 6:
      print('+left')
      left()
    if CMD_right == 6:
      print('+right')
      right()
    if CMD_stop == 6:
      print('+stop')
      stop()
    response = html #将html的网页定义装载在回应字段
    conn.send(response) #send到浏览器上,就形成了控制界面
    conn.close()
```

【测试】用浏览器登录192.168.0.165:80就将看到一个小车控制界面。这是按动按钮,小车就会随着控制而动作。其中左右转是100ms,前后没有时间限制。
【小结】   使用esp8266作为socket web server,手机、平板、PC通过浏览器访问,驱动gpio端口,控制电机,从而驱动小车运动。micropython的玩法越来越多啦!本教程修改自http://www.instructables.com/的作品。结合了官方tcp server代码,将网络连接部分在main.py中表达。今天在调试时发现,一旦建立wifi连接,这个conn就可能保存在flash某个位置。除非擦除flash,否则可能会自行连接。这一点还有待后续研究。   今天要鸣谢致敬的就是这篇文章的作者。    下面是他的头像和部分作品,可爱吧,小车居多,可见钻研之深。

luna 发表于 2017-7-4 09:59:07

好棒啊!!小车还是有很多可玩的地方

川山甲的壳 发表于 2017-8-11 16:51:18

esp8266驱动和esp32一样吗?我安装的驱动在esp32能用,插上esp8266的板子后,就找不到串口了。

沧海笑 发表于 2017-8-13 16:11:02

川山甲的壳 发表于 2017-8-11 16:51
esp8266驱动和esp32一样吗?我安装的驱动在esp32能用,插上esp8266的板子后,就找不到串口了。 ...

你说的驱动是板载usb-ttl驱动吗?肯定不一样啊,各有各的驱动,这个要看具体板子的情况了,详见供货商的技术资料。

esp32cam 发表于 2024-10-13 10:57:26

急想求教:uPy_lib 中的文件是怎么来的(我试用各种电脑系统装都是空的?)。uPyCraft 怎么下载模块(如 websocket),并 import 成功? 其实,我是在 thonny 中遇到这个问题,实在找不到有人提及。但 thonny 环境复杂(已有大量lib库,import 出错人们总误以为是路径不对), 怕说不清,所以用相对精简的uPyCraft来求教。 我熟悉地知道,自己编的库.py 一般放到设备的 /common 下、下载的常用库(如 microdot-main)一般放到设备的 /lib 下,调试 .py 程序就在设备的根即可。 Python pip install 的模块都非常大(不能整个都放入设备),import(还没在设备直接出错)的只是需要的其中部分,怎么选(如只需要 websocket-client)?
页: [1]
查看完整版本: 一步一步使用uPyCraft学习MicroPython之eps8266小车socket控制