先附上两张珍藏的原理图

直接上代码

import network
import time
from machine import Pin, Timer, PWM
import socket

# 无线网连接信息
SSID = "mxblog.mxguanwang.cn"
PASSWORD = "mx88888888"

#
D1 = Pin(5, Pin.OUT, value=1)
D2 = Pin(4, Pin.OUT, value=1)
D3 = Pin(0, Pin.OUT, value=1)
D5 = Pin(14, Pin.OUT, value=1)
D6 = Pin(12, Pin.OUT, value=1)
D7 = Pin(13, Pin.OUT, value=1)

# 板子自带LED灯
LED = Pin(2, Pin.OUT, value=1)

#控制方向的
IN1 = D1
IN2 = D2
IN3 = D3
IN4 = D5

# 控制左右转速的
sp_pwm_L = PWM(D6, 1000)
sp_pwm_R = PWM(D7, 1000)


# 状态信息
speed_L = 0		# 速度(-1023-1023) 负的情况下是反转
speed_R = 0		# 速度(-1023-1023)
speed_L_Cur = 0 # 当前速度
speed_R_Cur = 0 # 当前速度

# 为了解决浅拷贝问题的中间变量
speed_L_1 = 0
speed_R_1 = 0

# 连接无线网
def connectWifi(ssid, passwd):
	print("开始连接无线网")
	wlan = network.WLAN(network.STA_IF)  # create a wlan object
	# wlan.active(False)
	wlan.active(True)  # Activate the network interface
	wlan.disconnect()  # Disconnect the last connected WiFi
	wlan.connect(ssid, passwd)  # connect wifi
	while (wlan.ifconfig()[0] == '0.0.0.0'):
		time.sleep(1)
	print("无线网连接完成")

LED.value(0)
# 顺序:连接wifi -> 连接服务器
wlan = connectWifi(SSID, PASSWORD)
# 默认前进
IN1.value(1)
IN2.value(0)
IN3.value(1)
IN4.value(0)

LED.value(1)

while True:
	sock = socket.socket()
	# 尝试连接服务器
	try:
		sock.connect(('你的IP', 你的端口))
		print("服务器连接成功")
		LED.value(0)
	except OSError as err:
		LED.value(1)
		sock.close()
		print("连接失败,重连中。" + str(err))
		time.sleep(2)
		continue
	while True:
		try:
			sock.send("g")
			recvdata = sock.recv(8)
			if recvdata == None:
				sock.close()
				print("连接已断开1")
				LED.value(1)
				time.sleep(2)
				break
			recvdata = recvdata.decode('utf-8')
			if len(recvdata) == 0:
				sock.close()
				print("连接已断开2")
				LED.value(1)
				time.sleep(2)
				break

			if len(recvdata) != 8:
				sock.close()
				print("连接已断开4")
				LED.value(1)
				time.sleep(2)
				break

			speed_L_1 = int(recvdata[0:4])
			
			if speed_L_1 >= 5000:
				speed_L_1 = 5000 - speed_L_1 
			speed_R_1 = speed_L_1
			
			# 计算左右差值
			x = int(recvdata[4:8])

			if x >= 5000:
				x = 5000 - x
			
			# 0		-	1023	右转
			# -1023	-	0		左转
			# 存在差值则进行计算
			if x != 0:
				x2 = int(x)
				# 小于0 左转是 左轮降低 右轮加速
				# 大于0 右转是 左轮加速 右轮减速
				speed_L_1 += x2
				speed_R_1 -= x2

			# 标准化数据
			if speed_L_1 > 1023:
				speed_L_1 = 1023
			if speed_L_1 < -1023:
				speed_L_1 = -1023
			
			if speed_R_1 > 1023:
				speed_R_1 = 1023
			if speed_R_1 < -1023:
				speed_R_1 = -1023
			
			speed_L = speed_L_1
			speed_R = speed_R_1
			speed_L_1 = 0
			speed_R_1 = 0
			sp_pwm_L.duty(abs(speed_L))
			sp_pwm_R.duty(abs(speed_R))
			print(str(speed_L) + '+' + str(speed_R))
			# 当前速度为0 目标大于0则正转 小于0则反转
			if speed_L > 0:
				IN1.value(1)
				IN2.value(0)
			else:
				IN1.value(0)
				IN2.value(1)
			
			# 当前速度为0 目标大于0则正转 小于0则反转
			if speed_R > 0:
				IN3.value(1)
				IN4.value(0)
			else:
				IN3.value(0)
				IN4.value(1)
		except:
			# 网络断开则开始停止
			speed_L = 0
			speed_R = 0
			sp_pwm_L.duty(abs(speed_L))
			sp_pwm_R.duty(abs(speed_R))
			print("连接已断开3")
			sock.close()
			LED.value(1)
			time.sleep(2)
			break
sock.close()


这里简要说一下代码:

1.SSID,PASSWORD需要你自己配置无线网和密码。

2.里面有中文,你的IP和你的端口,需要为对应的服务器IP和端口,这个后面文章会提到,重点在于看逻辑。

3.逻辑很简单,就是连接上无线网,然后去服务器获取控制信息,分别控制两个轮子。

4.最开始的变量D1 D2 D3等需要根据板子以及驱动板来进行连接,上面代码是针对l298的,如果需要l298n或者其他的驱动板需要进行一定的修改,不同的驱动板控制逻辑不一样。

5.pwm范围是0-1023,为了方便传递,统一定义为0-1023为0-1023 反转时候为0到-1023,传递过程中为5000-6023表示0到-1023,后面服务端以及控制端都会有提到。

OK 不啰嗦了。


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。