本帖最后由 蒙德·究史尼 于 2023-3-26 22:46 编辑
上一篇:https://bbs.cmnxt.com/forum.php?mod=viewthread&tid=65475
这一篇讲的是运用EV3的陀螺仪传感器遥控电脑上的海龟画图的方法。
实战:陀螺仪遥控海龟画图在前面的几个实验中,我们已经学会了在Python中让EV3和电脑互相发送消息的方法。接下来,我们就要把刚才学到的知识投入实战。用EV3的陀螺仪传感器遥控电脑上的海龟画图。
原理
陀螺仪传感器EV3的陀螺仪传感器可以检测自身在特定轴向旋转的角度。 ev3dev2函数库调用陀螺仪传感器的相关函数可以在这里查到:
海龟画图海龟画图(turtle)是Python自带的一个很流行的绘制图像的函数库。
遥控EV3运用UDP通信的方法把陀螺仪传感器的值发送给电脑端的程序,电脑端的程序根据此值调整turtle(海龟)的移动方向。
搭建搭建过程非常简单。我只放一张图片。
图中的传感器是陀螺仪传感器,接到EV3的2号口。 经过我测试,陀螺仪传感器必须是EV3原装的。国产的高仿版不能被正确地识别。
电脑端的程序打开电脑端的IDLE,我在电脑上使用的Python版本是3.7.0。输入以下代码: 中文乐高的代码块有25行的限制,放不下。所以我直接放文本。
#电脑端程序,使用python3运行 #显示提示语,让用户先启动EV3端的程序 input('请先启动EV3端的程序,然后按回车键继续运行本程序')
#ev3地址 ev3_address=('192.168.0.112', 9999)
#电脑端本地绑定地址,端口号设定为8888 pc_address=('0.0.0.0', 8888)
#导入socket库和turtle库 import socket import turtle
#创建套接字对象s1 s1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #电脑端绑定端口 s1.bind(pc_address)
#创建窗口 window01=turtle.Screen() #退出程序用的函数 def say_bye(x, y): #向EV3发送退出命令 s1.sendto('exit'.encode('UTF-8'), ev3_address) #关闭套接字 s1.close() #关闭窗口 window01.bye() print('exit') #让窗口被点击后自动执行退出函数“say_bye” window01.onclick(say_bye)
#设置海龟速度为0(最快速度) turtle.speed(0)
#用try...except语句捕获异常 try: while True: #发送“angle”消息,向EV3查询陀螺仪传感器的角度值 s1.sendto('angle'.encode('UTF-8'), ev3_address) #等待接收消息,因为只需要接收消息内容,所以只要recvfrom函数返回值的第一个对象 message=s1.recvfrom(1024)[0] #用UTF-8解码 text=message.decode('utf8') print(text) #计算海龟的朝向 #由于turtle库中默认0朝向是向右的,所以要让它转90度,变成向上的 heading=int(text)+90 #设置海龟的朝向 turtle.setheading(heading) #海龟前进1像素 turtle.forward(1) except: pass
保存,先不着急运行。
EV3端的程序在Thonny里输入以下代码:
保存,先不着急运行。
运行程序把一个EV3陀螺仪传感器连接到EV3的2接口。确保你的电脑和EV3的网络是连接到同一个路由器的。 在程序启动之前,EV3必须水平放置在桌子上,不能有晃动。 先在Thonny里让EV3运行程序,稍等几秒,EV3会输出“准备好接收消息了,等待消息中”,此时EV3已经准备就绪,可以运行电脑端的程序了。 在电脑端的IDLE里,按F5键运行程序,屏幕里会输出“请先启动EV3端的程序,然后按回车键继续运行本程序”。按下回车键,海龟画图就会开始。屏幕上出现海龟画图窗口。(海龟画图窗口可能不会主动弹出来,有时候它只会出现在电脑桌面上的任务栏里,你需要手动把它的窗口切换出来) 用手拿起EV3,让EV3沿着如图所示的方向旋转,就可以控制电脑屏幕上海龟的移动方向。
效果如下图所示。
鼠标左键单击此窗口的空白处,就可以退出电脑端程序。电脑端程序退出之前会给EV3发送“exit”消息,所以EV3端的程序也会退出。
|