乐高官方提供的编程工具都是图形化的,这篇文章分享下如何用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()

使用DiscoveryServiceGATTRequester查找连接设备:

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的电机相关推荐

  1. 怎么用python启动谷歌浏览器_如何用python控制浏览器

    selenium从2.0开始集成了webdriver的API,提供了更简单,更简洁的编程接口.selenium webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持进行web ...

  2. 如何用python控制设备实现自动_带你用 Python 实现自动化群控设备

    1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和灰产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接下来的几篇文章,我将带大家聊聊企业 ...

  3. python浏览器怎么设置_如何用python控制浏览器

    selenium从2.0开始集成了webdriver的API,提供了更简单,更简洁的编程接口.selenium webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持进行web ...

  4. 如何用python控制单片机通信_如何实现pc机对单片机的控制

    个人电脑控制单片机,主要通过以下步骤: 1)建立个人电脑和单片机的通信连接 普通的单片机通常有UART.SPI.IIC.USB等通信模块. 和电脑通信最常用的是UART,可以有两种方式和电脑建立连接( ...

  5. 如何用python控制OBS 狀態

    先在OBS安裝 websocket https://github.com/obsproject/obs-websocket/releases/tag/4.9.1 安裝obs-websocket-4.9 ...

  6. 如何用python控制电脑的应用程序打不开_如果电脑中的一个应用程序打不开,点击图标没反应,能否将其强制打开...

    您好!出现:0x???????? 指令引用的0x????????内存.该内存不能为"read"或"written".答案[shijan8原创]★严禁复制★ [1 ...

  7. 如何用python控制电脑的应用程序打不开_电脑打不开应用程序怎么办

    导读:小编根据大家的需要整理了一份关于<电脑打不开应用程序怎么办>的内容,具体内容: 电脑使用久了毛病就多了,相信很多人就遇到电脑打不开应用程序的情况,该怎么解决呢.下面由小编为你整理了的 ...

  8. 如何用python控制电脑的应用程序打不开_电脑问题,应用程序打不开了!!!

    展开全部 像这类故障一般原因比较复e68a843231313335323631343130323136353331333433653361杂,可能是系统和软件之间冲突,也可能是软件和软件之间有冲突,从 ...

  9. 写python脚本管理_如何用python脚本控制TPLINK路由器

    我想知道是否有一种工具可以让我连接到路由器并关闭它,然后从python脚本重新启动它.如何用python脚本控制TPLINK路由器 我知道如果我用python脚本编写:import os然后做os.s ...

最新文章

  1. uestc 1012 饭卡
  2. matlab贝塞尔滤波器设计_DSP之窗函数法设计高通滤波器(MATLAB实现)
  3. html插入图片和文字,HTML第三课文字图片插入
  4. python将16进制字符串转换为整数_Python 16进制与字符串的转换
  5. volatile与多线程
  6. 3年,从工程师到创始人
  7. mysql sql 限制条数据类型_数据库的数据类型和约束条件
  8. Shell date连接mysql执行指令
  9. android硬编码封装mp4,音频编解码(软/硬编码),音频转码
  10. 软件设计师和软件评测师有什么区别?若想从事软件开发方面,哪个更适合?
  11. 复盘:什么是权重衰减?深度学习权重衰减
  12. Web前端常用CDN网站汇总
  13. 计算机辅助翻译和人工翻译的优缺点,计算机辅助翻译的利与弊以及解决方案
  14. UINO优锘:DMV架构管理可视化,让架构图管理快速升级
  15. 来自一个大牛对ACM的总结
  16. 用了这么多年百度搜索, 今天才发现加上双引号搜索结果这么准
  17. 在淘宝上遭遇诈骗卖家
  18. Win10 LTSB/LTSC 录音机、图片查看器、便签
  19. Linux-命令 返回上一级目录
  20. pythonocc 坐标系平移

热门文章

  1. Flink小知识: KeyState的Rescale与 Key Group
  2. echart基本使用
  3. HMM 隐马尔可夫模型
  4. 仿Everthing的搜索软件的测试用例
  5. mui可否使用php网页,使用MUI框架如何加载外部网页或服务器数据
  6. webpack常用的插件集合
  7. 一道CTF综合密码题(培根,DES,栅栏)
  8. 【BZOJ 4010】 [HNOI2015]菜肴制作
  9. jquery报错 $(‘....‘).lazyload is not a function解决方法
  10. OpenGL: 绘制漂亮的围棋子