HSG |
|
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.
Canon400D.JPG, Canon5DMark2.JPG
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)
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
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.
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]) >>>