16828浏览
查看: 16828|回复: 4

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

[复制链接]
一步一步使用uPyCraft学习MicroPython之eps8266小车socket控制】
【本期故事】
本期不是原创故事,是昨晚在看到一个http://www.instructables.com/member/botdemy/的小车控制的作品。本帖就是把这个教程实现出来,同时和大家分享一下注意事项。

还是发一个视频:
通过平板浏览器访问8266上的socket server,然后把小车的控制参数传下去,8266这边用mp解析,然后驱动gpio口,通过电机驱动板来实现对小车的控制。


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

【软件准备】

品名
版本
备注
uPyCraft
V0.20
DF出品MicroPython IDE
socket

micropython
Tcp server 示例代码

dfrobot
MicroPython-IoT-Rover-Based-on-WeMos-D1-ESP-8266EX代码

一步一步使用uPyCraft学习MicroPython之eps8266小车socket控制图2
【接线】
#Wemos Dpin to GPIO
我的小车驱动板是L293D
#D1->GPIO5----DIRA
#D2->GIOO4----PWMA[mw_shl_code=python,true]import socket
#D3->GPIO0----DIRB
#skip D4 - built-in LED)
#D5->GPI014 --PWMB
一步一步使用uPyCraft学习MicroPython之eps8266小车socket控制图4
【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.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()[0]

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()

一步一步使用uPyCraft学习MicroPython之eps8266小车socket控制图1
【测试】
用浏览器登录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,否则可能会自行连接。这一点还有待后续研究。
   今天要鸣谢致敬的就是这篇文章的作者。
    下面是他的头像和部分作品,可爱吧,小车居多,可见钻研之深。

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

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)?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail