如何用Python控制LEGO Wedo 2.0的电机
乐高官方提供的编程工具都是图形化的,这篇文章分享下如何用Python来连接控制LEGO Wedo 2.0中提供的蓝牙主控设备和电机。
学习资源
网上有两篇很有用的文章:
- Controlling a WeDo 2.0 motor
- WeDo 2.0 – reverse engineering
使用pygattlib可以通过Python和蓝牙低功耗设备通讯。这个库只支持Linux。
命令行工具和开发环境
通过测试发现,Windows的Linux子系统和VMWare虚拟机是不支持的。我最终选了树莓派做开发环境。
使用系统自带的命令行工具可以直接测试蓝牙连接。
扫描设备获取地址:
sudo hcitool -i hci0 lescan
LE Scan ...
98:07:2D:DD:98:56 (unknown)
98:07:2D:DD:98:56 LPF2 Smart Hub
连接设备:
gatttool -I
[ ][LE]> connect <ble address>
使用Python创建界面控制程序
安装依赖库以及gattlib
:
sudo apt-get update
sudo apt-get install libbluetooth-dev bluez bluez-hcidump libboost-python-dev libboost-thread-dev libglib2.0-dev
sudo pip install gattlib
用Tkinter
创建界面:
import Tkinter as tk
from gattlib import DiscoveryService
from gattlib import GATTRequester
from time import sleepdef run():global button_runbutton_run.after(DELAY, motor_run)def stop():global button_stopbutton_stop.after(DELAY, motor_stop)def connect():global button_disconnectbutton_disconnect.after(DELAY, smart_hub_connect)def disconnect():global button_disconnectbutton_disconnect.after(DELAY, smart_hub_disconnect)def up():global button_upbutton_up.after(DELAY, motor_up)def down():global button_downbutton_down.after(DELAY, motor_down)root = tk.Tk()
root.title("Lego Wedo 2.0 Motor Control")label = tk.Label(root, fg="dark green", text='N/A')
label.pack()button_connect = tk.Button(root, text='Connect Smart Hub', width=BUTTON_WIDTH, command=connect)
button_connect.pack()button_disconnect = tk.Button(root, text='Disconnect Smart Hub', width=BUTTON_WIDTH, command=disconnect, state='disabled')
button_disconnect.pack()button_run = tk.Button(root, text='Run motor', width=BUTTON_WIDTH, command=run, state='disabled')
button_run.pack()button_up = tk.Button(root, text='Speed up', width=BUTTON_WIDTH, command=up, state='disabled')
button_up.pack()button_down = tk.Button(root, text='Speed down', width=BUTTON_WIDTH, command=down, state='disabled')
button_down.pack()button_stop = tk.Button(root, text='Stop motor', width=BUTTON_WIDTH, command=stop, state='disabled')
button_stop.pack()root.mainloop()
使用DiscoveryService
和GATTRequester
查找连接设备:
def smart_hub_connect():service = DiscoveryService("hci0")devices = service.discover(2)for address, name in devices.items():if name != '' and 'Smart Hub' in name:label['text'] = addressglobal button_run, button_stop, button_disconnect, reqbutton_connect['state'] = 'disabled'button_run['state'] = 'normal'button_stop['state'] = 'normal'button_disconnect['state'] = 'normal'button_up['state'] = 'normal'button_down['state'] = 'normal'req = GATTRequester(address, True, "hci0")break
运行电机:
def motor_run():global reqif req != None:req.write_by_handle(0x3d, str(bytearray([0x01, 0x01, 0x01, 0x64]))
)
第一个字节代表端口号。主控设备上有两个端口,选择对应的端口号。
通过gatttool
也可以查看端口变化:
[98:07:2D:DD:98:56][LE]> char-read-hnd 0015
Characteristic value/descriptor: 01 01 00 01 01 00 00 00 01 00 00 00
[98:07:2D:DD:98:56][LE]> char-read-hnd 0015
Characteristic value/descriptor: 02 01 01 01 01 00 00 00 01 00 00 00
最后一个字节代表速度。可以通过代码动态调节:
MAX_SPEED = 100
MIN_SPEED = 1
SPEED_CHANGE = 4current_speed = 100
req = Nonedef motor_up():global req, current_speedif req != None:if current_speed == MAX_SPEED:returncurrent_speed += SPEED_CHANGEreq.write_by_handle(HANDLE, str(bytearray([0x01, 0x01, 0x01, current_speed])))sleep(WEDO_DELAY)def motor_down():global req, current_speedif req != None:if current_speed == MIN_SPEED:returncurrent_speed -= SPEED_CHANGEreq.write_by_handle(HANDLE, str(bytearray([0x01, 0x01, 0x01, current_speed])))sleep(WEDO_DELAY)
运行程序的时候,如果没有root权限,会出现错误。
运行界面程序需要用gksudo
而不是sudo
。
在Windows中可以通过SmarTTY
来显示远程的GUI。
源码
https://github.com/yushulx/lego-wedo-motor-control
如何用Python控制LEGO Wedo 2.0的电机相关推荐
- 怎么用python启动谷歌浏览器_如何用python控制浏览器
selenium从2.0开始集成了webdriver的API,提供了更简单,更简洁的编程接口.selenium webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持进行web ...
- 如何用python控制设备实现自动_带你用 Python 实现自动化群控设备
1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和灰产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接下来的几篇文章,我将带大家聊聊企业 ...
- python浏览器怎么设置_如何用python控制浏览器
selenium从2.0开始集成了webdriver的API,提供了更简单,更简洁的编程接口.selenium webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持进行web ...
- 如何用python控制单片机通信_如何实现pc机对单片机的控制
个人电脑控制单片机,主要通过以下步骤: 1)建立个人电脑和单片机的通信连接 普通的单片机通常有UART.SPI.IIC.USB等通信模块. 和电脑通信最常用的是UART,可以有两种方式和电脑建立连接( ...
- 如何用python控制OBS 狀態
先在OBS安裝 websocket https://github.com/obsproject/obs-websocket/releases/tag/4.9.1 安裝obs-websocket-4.9 ...
- 如何用python控制电脑的应用程序打不开_如果电脑中的一个应用程序打不开,点击图标没反应,能否将其强制打开...
您好!出现:0x???????? 指令引用的0x????????内存.该内存不能为"read"或"written".答案[shijan8原创]★严禁复制★ [1 ...
- 如何用python控制电脑的应用程序打不开_电脑打不开应用程序怎么办
导读:小编根据大家的需要整理了一份关于<电脑打不开应用程序怎么办>的内容,具体内容: 电脑使用久了毛病就多了,相信很多人就遇到电脑打不开应用程序的情况,该怎么解决呢.下面由小编为你整理了的 ...
- 如何用python控制电脑的应用程序打不开_电脑问题,应用程序打不开了!!!
展开全部 像这类故障一般原因比较复e68a843231313335323631343130323136353331333433653361杂,可能是系统和软件之间冲突,也可能是软件和软件之间有冲突,从 ...
- 写python脚本管理_如何用python脚本控制TPLINK路由器
我想知道是否有一种工具可以让我连接到路由器并关闭它,然后从python脚本重新启动它.如何用python脚本控制TPLINK路由器 我知道如果我用python脚本编写:import os然后做os.s ...
最新文章
- uestc 1012 饭卡
- matlab贝塞尔滤波器设计_DSP之窗函数法设计高通滤波器(MATLAB实现)
- html插入图片和文字,HTML第三课文字图片插入
- python将16进制字符串转换为整数_Python 16进制与字符串的转换
- volatile与多线程
- 3年,从工程师到创始人
- mysql sql 限制条数据类型_数据库的数据类型和约束条件
- Shell date连接mysql执行指令
- android硬编码封装mp4,音频编解码(软/硬编码),音频转码
- 软件设计师和软件评测师有什么区别?若想从事软件开发方面,哪个更适合?
- 复盘:什么是权重衰减?深度学习权重衰减
- Web前端常用CDN网站汇总
- 计算机辅助翻译和人工翻译的优缺点,计算机辅助翻译的利与弊以及解决方案
- UINO优锘:DMV架构管理可视化,让架构图管理快速升级
- 来自一个大牛对ACM的总结
- 用了这么多年百度搜索, 今天才发现加上双引号搜索结果这么准
- 在淘宝上遭遇诈骗卖家
- Win10 LTSB/LTSC 录音机、图片查看器、便签
- Linux-命令 返回上一级目录
- pythonocc 坐标系平移
热门文章
- Flink小知识: KeyState的Rescale与 Key Group
- echart基本使用
- HMM 隐马尔可夫模型
- 仿Everthing的搜索软件的测试用例
- mui可否使用php网页,使用MUI框架如何加载外部网页或服务器数据
- webpack常用的插件集合
- 一道CTF综合密码题(培根,DES,栅栏)
- 【BZOJ 4010】 [HNOI2015]菜肴制作
- jquery报错 $(‘....‘).lazyload is not a function解决方法
- OpenGL: 绘制漂亮的围棋子