===== Lanzacohetes "Dream Link WH1080 Weather Station / USB Missile Launcher" en GNU/Linux =====
**Modelo de Lanzacohetes USB**: Dream Link WH1080 Weather Station / USB Missile Launcher ([[http://usb.brando.com/prod_img/zoom/ULIFE005600_01_L.JPG |imagen]]).
$ lsusb
...
Bus 002 Device 003: ID 1941:8021 Dream Link WH1080 Weather Station / USB Missile Launcher
...
**Dependencias**: Pyusb / TK
==== Instalación de Pyusb / TK en Arch GNU/Linux====
yaourt pyusb
#Opción 1: 1 aur/python-pyusb 1.0.0b1-1 (8)
pacman -S tk
==== Script en Python para manejar el lanzacohetes USB ====
#!/usr/bin/python
import sys, Tkinter
sys.modules['tkinter'] = Tkinter # put the module where python looks first for modules
import tkinter # now works!
import sys
import usb.core
import time
import tkinter as tk
class LauncherDriver():
def __init__(self):
self.dev = usb.core.find(idVendor=0x1941, idProduct=0x8021)
if self.dev is None:
raise ValueError('Missile launcher not found.')
#if sys.platform == 'linux2' and self.dev.is_kernel_driver_active(0) is True:
self.dev.detach_kernel_driver(0)
self.dev.set_configuration()
"""self.handle = self.dev.open()
try:
self.handle.claimInterface(0)
except:
if e.message.find("could not claim interface") >= 0:
self.handle.detachKernelDriver(0)
self.handle.claimInterface(0)
self.handle.setAltInterface(0)
"""
def turretDown(self):
try:
self.dev.ctrl_transfer(0x21, 0x09, 0x200, 0, [0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
except:
pass
def turretRight(self):
try:
self.dev.ctrl_transfer(0x21, 0x09, 0x200, 0, [0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
except:
pass
def turretLeft(self):
try:
self.dev.ctrl_transfer(0x21, 0x09, 0x200, 0, [0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
except:
pass
def turretUp(self):
try:
self.dev.ctrl_transfer(0x21, 0x09, 0x200, 0, [0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
except:
pass
def turretStop(self):
try:
self.dev.ctrl_transfer(0x21, 0x09, 0x200, 0, [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
except:
pass
def turretFire(self):
try:
self.dev.ctrl_transfer(0x21, 0x09, 0x200, 0, [0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
except:
pass
class Launcher():
def __init__(self, root):
self.launcher = LauncherDriver()
frame = tk.Frame(root)
frame.master.title("Missle Control")
frame.master.geometry("100x100")
frame.master.bind("", self.up)
frame.master.bind("", self.stop)
frame.master.bind("", self.down)
frame.master.bind("", self.stop)
frame.master.bind("", self.left)
frame.master.bind("", self.stop)
frame.master.bind("", self.right)
frame.master.bind("", self.stop)
frame.master.bind("", self.shoot)
frame.master.bind("", self.stop)
frame.master.bind("", self.exit)
frame.pack()
self.frame = frame
def left(self, event):
self.frame.focus_set()
self.launcher.turretLeft()
def right(self, event):
self.frame.focus_set()
self.launcher.turretRight()
def up(self, event):
self.frame.focus_set()
self.launcher.turretUp()
def down(self, event):
self.frame.focus_set()
self.launcher.turretDown()
def shoot(self, event):
self.frame.focus_set()
self.launcher.turretFire()
def stop(self, event):
self.frame.focus_set()
self.launcher.turretStop()
def exit(self, event):
print("Exitting...")
self.launcher.turretStop()
sys.exit(0)
root = tk.Tk()
launcher = Launcher(root)
root.mainloop()
El script original sin modificar se puede descargar de [[https://github.com/dwetterau/USBMissile/|aquí]], pero puede que se visualice el siguiente error al ejecutarlo.
Traceback (most recent call last):
File "USBMissile-master/control.py", line 5, in
import tkinter as tk
ImportError: No module named tkinter
Problema típico al volver a ejecutar el script.
Traceback (most recent call last):
File "control.py", line 108, in
launcher = Launcher(root)
File "control.py", line 60, in __init__
self.launcher = LauncherDriver()
File "control.py", line 16, in __init__
self.dev.detach_kernel_driver(0)
File "/usr/lib/python2.7/site-packages/usb/core.py", line 1005, in detach_kernel_driver
interface)
File "/usr/lib/python2.7/site-packages/usb/backend/libusb1.py", line 838, in detach_kernel_driver
_check(self.lib.libusb_detach_kernel_driver(dev_handle.handle, intf))
File "/usr/lib/python2.7/site-packages/usb/backend/libusb1.py", line 552, in _check
raise USBError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBError: [Errno 2] Entity not found
**Solución**: Reconectar el lanzamisiles USB.