乐高官方提供的编程工具都是图形化的,这篇文章分享下如何用Python来连接控制LEGO Wedo 2.0中提供的蓝牙主控设备和电机。

学习资源

网上有两篇很有用的文章:

使用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

使用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 sleep

def run():

global button_run

button_run.after(DELAY, motor_run)

def stop():

global button_stop

button_stop.after(DELAY, motor_stop)

def connect():

global button_disconnect

button_disconnect.after(DELAY, smart_hub_connect)

def disconnect():

global button_disconnect

button_disconnect.after(DELAY, smart_hub_disconnect)

def up():

global button_up

button_up.after(DELAY, motor_up)

def down():

global button_down

button_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'] = address

global button_run, button_stop, button_disconnect, req

button_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 req

if 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 = 4

current_speed = 100

req = None

def motor_up():

global req, current_speed

if req != None:

if current_speed == MAX_SPEED:

return

current_speed += SPEED_CHANGE

req.write_by_handle(HANDLE, str(bytearray([0x01, 0x01, 0x01, current_speed])))

sleep(WEDO_DELAY)

def motor_down():

global req, current_speed

if req != None:

if current_speed == MIN_SPEED:

return

current_speed -= SPEED_CHANGE

req.write_by_handle(HANDLE, str(bytearray([0x01, 0x01, 0x01, current_speed])))

sleep(WEDO_DELAY)

运行程序的时候,如果没有root权限,会出现错误。

运行界面程序需要用gksudo而不是sudo。

在Windows中可以通过SmarTTY来显示远程的GUI。

源码

python控制电机_如何用Python控制LEGO Wedo 2.0的电机相关推荐

  1. 如何用Python控制LEGO Wedo 2.0的电机

    乐高官方提供的编程工具都是图形化的,这篇文章分享下如何用Python来连接控制LEGO Wedo 2.0中提供的蓝牙主控设备和电机. 学习资源 网上有两篇很有用的文章: Controlling a W ...

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

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

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

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

  4. python怎么读_如何用Python读写文件

    前面我们已经介绍了很多Python相关的基础知识,大家是不是对Python已经有了进一步认识了呢?作为人工智能时代的热门编程语言,开始接触并学习Python的孩子越来越多,家长们都不想让自己的孩子落于 ...

  5. python旅游推荐系统_如何用Python搭建一个简单的推荐系统?

    推荐系统的相关知识我们已在前文中提到,在这篇文章中,我们会介绍如何用Python来搭建一个简单的推荐系统. 本文使用的数据集是MovieLens数据集,该数据集由明尼苏达大学的Grouplens研究小 ...

  6. 用python开启相机_如何用Python打开realsenseD435相机并获取相机参数

    如何用Python打开realsenseD435相机 import pyrealsense2 as rs import numpy as np import cv2 if __name__ == &q ...

  7. python读取二进制文件_如何用python读取二进制文件?

    我发现用Python读取二进制文件特别困难.你能帮我一把吗?我需要读取这个文件,在Fortran 90中,该文件很容易被int*4 n_particles, n_groups real*4 group ...

  8. python md5加密_如何用python“优雅”的调用有道翻译?

    前言 其实在以前就盯上有道翻译了的,但是由于时间问题一直没有研究(我的骚操作还在后面,记得关注),本文主要讲解如何用python调用有道翻译,讲解这个爬虫与有道翻译的js"斗争"的 ...

  9. python求平均值_如何用python求平均值

    学习了Python相关数据类型,函数的知识后,利用字符串的分割实现了输入任意多个数据,并计算其平均值的小程序.思路是接收输入的字符串,以空格为分隔符,将分割的数据存入列表(lst1)中,将lst1中的 ...

  10. python小助手_如何用python写个人专属群聊提醒小助手?

    前言 大家还记得教会父母玩微信是什么时候吗?父母学会后,我们的生活就发生了「质」的变化,父母也许会吐槽你的微信头像不好,要你换一个头像. 最近 pk哥 又被母后大人吐槽了,原因是亲戚微信群里某个亲戚生 ...

最新文章

  1. 如何写出一个confirm组件
  2. SD-WAN加速推动企业分支上云—Vecloud
  3. React Native封装Toast与加载Loading组件
  4. vue 新版本 webpack 代理 跨域设置
  5. Hbase rowkey设计原则,热点问题
  6. 短网址生成+域名检测+短网址还原等四合一前端源码
  7. awk的常用内置函数的使用【转】
  8. fwrite函数Matlab,fread和fwrite函数,C语言fread和fwrite函数详解
  9. jQuery学习(四)— jQuery的ready事件和原生JS的load事件的区别
  10. 素因子分解算法python语言_python中求取最小公倍数的两种方法
  11. Beaver‘s triple(乘法三元组)-秘密共享的乘法计算
  12. 基于Andriod的简易记事本APP设计与实现
  13. 算法入门之lowB三人组---冒泡排序、选择排序、插入排序 【python版-详解】
  14. 【数理逻辑开篇】朴实的逻辑学与数学危机
  15. [ecshop 资料] ecshop 手机 自动识别 ua 自动跳转到手机版本 miqinew ecmoban
  16. boot版本是什么 cent os_CentOS下载及版本选择-CentOS LiveCD、LiveDVD和BinDVD区别
  17. Java面向对象-01-类和对象
  18. 《*** 法治思想学习纲要》学习辅导
  19. 大学自学html有前途吗,大学中最“牛逼”,最有前途的3个专业,考上就是金饭碗...
  20. 7 种常用的数据挖掘技术分享

热门文章

  1. 耐福-NTP8849音频功放芯片有哪些功能?
  2. linux磁盘刻录ISO工具,技术|Ubuntu下的三个好用的CD/DVD刻录工具
  3. 百度网盘客户端终于解除限速啦
  4. 魔兽地图编辑器插件YDWE的使用与基本设置5 触发编辑器5 物品合成(2种方式)
  5. 【C#】AutoCAD二次开发笔记
  6. 磁带库Scalar i6000界面基本操作步骤
  7. python交通流预测算法_使用KNN方法进行的短时交通流预测和结果分析
  8. 情人节程序员用HTML网页表白【表白对话】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  9. 软件测试,AutoRunner错误:license invalid,error code=-8
  10. 你需要知道的物联网开放平台