MSR Material Sensoren Aktoren Regelkreis Robotik Fischertechnik Mindstorms PIC Arduino seriell parallele Schnittstelle DCF77 Whiteboard Strichcode USB Echtzeit Funktionsmodelle
Pfad: Startseite / Fächer / Informatik / MSR / USB
Autor: mk
12.03.2011 15:48:55
1182
USB

usb4all

Herr Bredendiek hat auf seiner legendären Seite www.sprut.de ein hochinteressantes Projekt zu einem universellen USB-Interface usb4all mit einem PIC-Mikrocontroller veröffentlicht. Erste Nachbauerfolge zeigt das Bild. Erste Experimente erfolgten unter Windows-XP. Jetzt soll die Linux- und Python-Unterstützung angegangen werden.

usb4all0

Canon400D.JPG, Canon5DMark2.JPG

Python-Ansteuerung

Zunächst wird pyusb installiert. Dazu ist die Datei pyusb-1.0.0-a1.zip herunterzuladen und zu entpacken. Anschließend kann man in den Ordner pyusb-1.0.0-a1 verzweigen und wie üblich installieren.

mk@x2:~/Desktop/pyusb-1.0.0-a1$ sudo python3 setup.py install
[sudo] password for mk: 
running install
running build
running build_py
running install_lib
running install_egg_info
Writing /usr/local/lib/python3.1/dist-packages/pyusb-1.0.0_a1.egg-info

Im Handbuch zu usb4all steht auf Seite 74:

Damit alle User Zugriff bekommen, legt man eine Datei "/etc/udev/rules.d/99-sprutbrenner" an und schreibt in die Datei:

SUBSYSTEM=="usb", SYSFS{idProduct}=="ff0b", SYSFS{idVendor}=="04d8", GROUP = "plugdev"

Damit sollte der USB4all-MCD ab dem nächste Einstecken für alle User der plugdev-Gruppe (..) verfügbar sein.

Leider gab es da auf dem vorliegenden Ubuntu 10.10-System ein Problem:

>>> import usb.core
>>> dev = usb.core.find(idVendor=0x04d8, idProduct=0xff0b)
>>> dev.set_configuration()
....
usb.core.USBError: Access denied (insufficient permissions)

Teilerfolg

Zumindest auf dem vorliegenden Ubuntu 10.10-System liegt offensichtlich ein Rechte-Problem vor. Ein probeweises Starten der Shell unter root-Rechten ergab bereits einen tollen Erfolg. Nach dem Schalten des io-Systems auf überall output leuchtete eine LED, die zwischen RA5 und Masse geschaltet war. Die LED ließ sich mit den entsprechenden Befehlen ein- und ausschalten.

mk@x2:~$ sudo python3
[sudo] password for mk: 
Python 3.1.2 (release31-maint, Sep 17 2010, 20:34:23) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import usb.core
>>> dev = usb.core.find(idVendor=0x04d8, idProduct=0xff0b)
>>> dev.set_configuration()
>>> dev.write(1,[0x50,0x01,0x00,0x00,0x00,0x00])
6
>>> dev.write(1,[0x50,0x07,0x20,0x00,0x00,0x00])
6
>>> dev.write(1,[0x50,0x06,0x20,0x00,0x00,0x00])
6

Erfolg

Eine Recherche zu udev unter Ubuntu ergab, dass obige Datei besser "/etc/udev/rules.d/99-sprutbrenner.rules" heißen sollte. Jedenfalls sind jetzt auf dem vorliegenden System keine root-Rechte mehr nötig. Obige Shell-Experimente funktionieren jetzt auch mit Idle.

Nach Anschluss eines LCD-Displays nach Handbuch Seite 15 zaubert

>>> import usb.core
>>> dev = usb.core.find(idVendor=0x04d8, idProduct=0xff0b)
>>> dev.set_configuration()
>>> dev.write(1,[0x55,0x01,0x02,0x16])
4
>>> dev.write(1,[0x55,0x04,0x05,ord('L'),ord('i'),ord('n'),ord('u'),ord('x')])
8

den Schriftzug 'Linux' auf das Display.

Einlesen

Es wurde von der Annahme ausgegangen, dass nach jedem write-Vorgang 16 Bytes gelesen werden müssen. Zum Schreiben wird der Endpoint 0x01 benutzt, zum Lesen der Endpoint 0x81. Man sieht, dass typisch zunächst die geschriebenen Bytes zurückgegeben werden. Versuche mit RA0-RA2 scheinen die Annahmen zu bestätigen. Offene Eingänge werden als 0 gelesen.

>>> import usb.core
>>> dev = usb.core.find(idVendor=0x04d8, idProduct=0xff0b)
>>> dev.set_configuration()
>>> dev.write(1,[0x50,0x01,0x00,0x00,0x00,0x00])
6
>>> dev.read(0x81,16)
array('B', [80, 1, 0, 0, 0, 0, 2, 0, 2, 8, 32, 64, 0, 2, 8, 0])
>>> dev.write(1,[0x50,0x03])
2
>>> dev.read(0x81,16)
array('B', [80, 3, 1, 0, 2, 0, 2, 0, 2, 8, 32, 64, 0, 2, 8, 0])
>>> dev.write(1,[0x50,0x03])
2
>>> dev.read(0x81,16)
array('B', [80, 3, 0, 0, 2, 0, 2, 0, 2, 8, 32, 64, 0, 2, 8, 0])
>>> dev.write(1,[0x50,0x03])
2
>>> dev.read(0x81,16)
array('B', [80, 3, 1, 0, 2, 0, 2, 0, 2, 8, 32, 64, 0, 2, 8, 0])
>>> dev.write(1,[0x50,0x03])
2
>>> dev.read(0x81,16)
array('B', [80, 3, 2, 0, 2, 0, 2, 0, 2, 8, 32, 64, 0, 2, 8, 0])
>>> dev.write(1,[0x50,0x03])
2
>>> dev.read(0x81,16)
array('B', [80, 3, 4, 0, 2, 0, 2, 0, 2, 8, 32, 64, 0, 2, 8, 0])
>>> dev.write(1,[0x50,0x03])
2
>>> dev.read(0x81,16)
array('B', [80, 3, 0, 0, 2, 0, 2, 0, 2, 8, 32, 64, 0, 2, 8, 0])
>>> 

Links