Hab hier nen Raspi mit standardmäßg neuestem Noobs und möchte mit dem Hardware-PWM Modul exerimentieren. Dazu habe ich das hier https://pythonhosted.org/RPIO/pwm_py.html runtergeladen und installiert. Funzt. Den C Source hab ich zum Testen vorsichtshalber mal nur an einer Textzeile geändert und mit dem zugehörigen Makefile compiliert. Dabei gab's ein paar Unklarheiten, zB. war Python.h nicht in dem Unterverzeichnis in dem das Makefile danach gesucht hatte. Hab das geändert, danach ließ sich _PWM.so erzeugen. Anschließend habe ich diese mit der installierten Datei im Verzeichnis pi@raspberrypi /usr/local/lib/python2.7/dist-packages/RPIO-0.10.0-py2.7-linux-armv6l.eg g/RPIO/PWM einfach ausgetauscht. Beim Aufruf bekomme ich: pi@raspberrypi ~/raspi-stuff $ sudo python pwm_1.py Traceback (most recent call last): File "pwm_1.py", line 7, in <module> from RPIO import PWM File "/usr/local/lib/python2.7/dist-packages/RPIO-0.10.0-py2.7-linux-armv6l.e gg/RPIO/PWM/__init__.py", line 60, in <module> from RPIO.PWM import _PWM ImportError: /usr/local/lib/python2.7/dist-packages/RPIO-0.10.0-py2.7-linux-armv6l.eg g/RPIO/PWM/_PWM.so: undefined symbol: _Py_InitPyPyModule pi@raspberrypi ~/raspi-stuff $ cd /usr/local/lib/python2.7/dist-packages/RPIO-0.10.0-py2.7-linux-armv6l.eg g/RPIO/PWM Hier der Auszug aus dem Makefile: pwm: gcc -Wall -g -O2 -o pwm pwm.c py: mkdir -p build gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/lib/pypy-upstream/include -c pwm.c -o build/pwm.o gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/lib/pypy-upstream/include -c pwm_py.c -o build/pwm_py.o gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro build/pwm.o build/pwm_py.o -o _PWM.so rm -rf build Was ist eine Datei mit der Endung .so? Was hat es mit dem Fehler: undefined symbol: _Py_InitPyPyModule oauf sich bwohl alles doch eigentlich wie vorher sein sollte?
Hi, Transistorfips schrieb: > Was ist eine Datei mit der Endung .so? Das ist ein "shared object", also eine dynamisch ladbare Bibliothek. Unter Windows heißen solche Dinger .dll. > Was hat es mit dem Fehler: undefined symbol: _Py_InitPyPyModule oauf > sich bwohl alles doch eigentlich wie vorher sein sollte? "undefined symbol" heißt, daß der Code auf ein Symbol mit diesem Namen verweist, dieses aber nicht finden kann. Warum liegt Deine Python-Installation unter /usr/local? Warum versuchst Du sowas mit Pypy, statt ein Standard-CPython dafür zu benutzen? Hast Du eine der Installationsanleitungen RPIO ausprobiert, und wenn ja: welche? Liebe Grüße, Karl
>Warum liegt Deine Python-Installation unter /usr/local? Ich bin wie immer unschuldig, alles ist default installiert. PWM hab ich so installiert: $ sudo apt-get install python-setuptools $ sudo easy_install -U RPIO >Warum versuchst Du sowas mit Pypy, statt ein Standard-CPython dafür zu benutzen? CPython, Pypy - Was'n das? Muß ich erst mal nachguggen... Wie gesagt: Ich habe im Moment weder von der Verwaltung unter Linux - noch unter der von Python groß Ahnung -.- Eine weitere SD-Karte mit dem neuesten, 3.3G fetten Raspian Image könnte ich probieren, vielleicht erledigt sich dann das ein oder andere Problem.
Hi Transistorfips, Transistorfips schrieb: >>Warum liegt Deine Python-Installation unter /usr/local? > Ich bin wie immer unschuldig, alles ist default installiert. Oh, mein Fehler: scheint nur das RPIO-egg dorthin installiert worden zu sein. Das ist auch ok, da gehört es hin. Bitte entschuldige. Aber angelegentlich wirft das eine andere Frage auf: warum hast Du eine Zeile des C-Code geändert? Welche? Und was hast Du geändert? > PWM hab ich so installiert: > $ sudo apt-get install python-setuptools > $ sudo easy_install -U RPIO > >>Warum versuchst Du sowas mit Pypy, statt ein Standard-CPython dafür zu >>benutzen? > CPython, Pypy - Was'n das? Muß ich erst mal nachguggen... Für die Skriptsprache Python gibt es Interpreter in unterschiedlichen Sprachen. Die Standardversion ist CPython, in C implementiert. Zudem gibt es Jython in Java und eben PyPy, das anfangs in Python selbst wurde und heute in einem Subset von Python namens RPython entwickelt wird. Diese Implementierungen unterscheiden sich erheblich. Um Python-affine Software zu installieren, also solche, die gegen Python linkt, installierst Du sinnvollerweise das Paket "python-dev" -- das ist das Entwicklerpaket für CPython, und das hat auch die korrekte Python.h. So wie es aussieht, hast Du nicht die Datei "Python.h" aus dem Paket "python-dev" benutzt, sondern einfach die aus /usr/lib/pypy-upstream/include/. Das ist vermutlich nicht die richtige Python.h, wobei ich allerdings ein wenig erstaunt bin, daß das funktioniert hat... > Wie gesagt: Ich habe im Moment weder von der Verwaltung unter Linux - > noch unter der von Python groß Ahnung -.- Beides kann man lernen. ;-) > Eine weitere SD-Karte mit dem neuesten, 3.3G fetten Raspian Image könnte > ich probieren, vielleicht erledigt sich dann das ein oder andere > Problem. Das wäre jedenfalls ein definierter Anfang... würde aber vermutlich je nach Raspi-Modell auch nicht funktionieren. Ich hab' das nämlich gerade auf einem Raspberry Pi 2 installiert und erhalte die Fehlermeldung, daß das Modul nur auf einem Raspberry Pi funktioniert... scheint den neuen Raspi2 wohl noch nicht zu unterstützen. 'Schguggma. Liebe Grüße, Karl
Danke für's mithelfen. >Um Python-affine Software zu installieren, also solche, die gegen Python >linkt, installierst Du sinnvollerweise das Paket "python-dev" -- das ist >das Entwicklerpaket für CPython, und das hat auch die korrekte Python.h. Das probier ich aus. >So wie es aussieht, hast Du nicht die Datei "Python.h" aus dem Paket >"python-dev" benutzt, sondern einfach die aus >/usr/lib/pypy-upstream/include/. Das ist vermutlich nicht die richtige >Python.h, wobei ich allerdings ein wenig erstaunt bin, daß das >funktioniert hat... Ich hab mit find -name Python.h danach gesucht und dann kaltblütig genommen was ich halt hatte. Im Code von pwm_py.c steht
1 | #include "Python.h" |
Keine Ahnung, warum die richtige nicht im Verzeichnis dabei war. Vielleicht sollte ich eine andere Installationsvariante ausprobieren. Auf der Webseite steht: You can also get RPIO from Github repository, which is usually a step ahead of pypi: Vielleicht bedeutet "a step ahead" in diesem Fall ja "in die richtige Richtung"...
>So wie es aussieht, hast Du nicht die Datei "Python.h" aus dem Paket >"python-dev" benutzt Hab eben python-dev auf raspian installiert, ebenso die git Version des Moduls und nochmal compiliert mit dem Makefile. Lief sauber durch. Danke. Nebenbei: Ist das normal, daß
1 | #include "Python.h" |
auch ausserhalb des Verzeichnisses gesucht wird? Kenn ich so nicht.
Hallo, Karl Käfer schrieb: > Das wäre jedenfalls ein definierter Anfang... würde aber vermutlich je > nach Raspi-Modell auch nicht funktionieren. Ich hab' das nämlich gerade > auf einem Raspberry Pi 2 installiert und erhalte die Fehlermeldung, daß > das Modul nur auf einem Raspberry Pi funktioniert... scheint den neuen > Raspi2 wohl noch nicht zu unterstützen. 'Schguggma. Habschgeguggt. Sorry, hat was länger gedauert. Also: in source/c_gpio/cpuinfo.c(38) gibt es eine Funktion get_cpuinfo_revision(), die danach schaut, ob in /proc/cpuinfo ein BCM2708 mit der Revision 000[2-...] vorhanden ist. Auf meinem RasPi2 mit BCM2709 schlägt das latürnich fehl. Das ist jetzt a bisserl blöd. Aber ok, ich hab' noch 'nen Raspi1B und ein paar 1B+. Bei Grabthars Hammer, jetzt ist er dran! Und siehe da, in /proc/cpuinfo:
1 | processor : 0 |
2 | model name : ARMv6-compatible processor rev 7 (v6l) |
3 | Features : swp half thumb fastmult vfp edsp java tls |
4 | CPU implementer : 0x41 |
5 | CPU architecture: 7 |
6 | CPU variant : 0x0 |
7 | CPU part : 0xb76 |
8 | CPU revision : 7 |
9 | |
10 | Hardware : BCM2708 |
11 | Revision : 000e |
Na dann wollen wir mal:
1 | sudo apt-get update |
2 | sudo apt-get dist-upgrade |
3 | sudo reboot |
4 | sudo apt-get install python-dev python-setuptools |
5 | sudo easy_install -U RPIO |
6 | cat <<EOF >>servo.py |
7 | #!/usr/bin/python |
8 | # -*- coding: utf-8 -*- |
9 | |
10 | from RPIO import PWM |
11 | |
12 | if __name__ == '__main__': |
13 | servo = PWM.Servo() |
14 | |
15 | # Set servo on GPIO17 to 1200µs (1.2ms) |
16 | servo.set_servo(17, 1200) |
17 | |
18 | # Set servo on GPIO17 to 2000µs (2.0ms) |
19 | servo.set_servo(17, 2000) |
20 | |
21 | # Clear servo on GPIO17 |
22 | servo.stop_servo(17) |
23 | EOF |
24 | chmod a+x servo.py |
25 | sudo ./servo.py |
Ausgabe von "servo.py":
1 | Using hardware: PWM |
2 | PW increments: 10us |
3 | Initializing channel 0... |
4 | add_channel_pulse: channel=0, gpio=17, start=0, width=120 |
5 | init_gpio 17 |
6 | clear_channel_gpio: channel=0, gpio=17 |
7 | add_channel_pulse: channel=0, gpio=17, start=0, width=200 |
8 | clear_channel_gpio: channel=0, gpio=17 |
9 | shutting down dma channel 0 |
10 | clear_channel: channel=0 |
Siehe da: kaum macht man's richtig, schon funktionierts. ;-) HTH, Karl
Hmm. Isch wees nid ob Python die Sprache meiner Wahl ist... Schon dieses textuelle Einrücken bei Schleifen... da juckt's mich immer. Hab am WE nen LinuxMint KDE-Rechner mit schicker retro CDE (Solaris-like) aufgesetzt um darauf Eclipse mit der gcc arm-bcm2708 toolchain auszuprobieren - die wird justamente grad installiert. Mal guggen wie das läuft.
Hi, Transistorfips schrieb: > Hmm. Isch wees nid ob Python die Sprache meiner Wahl ist... > Schon dieses textuelle Einrücken bei Schleifen... da juckt's mich immer. So hab' ich am Anfang auch gedacht. Mittlerweile weiß ich: das zwingt den Programmierer dazu, sauber strukturierten und lesbaren Code zu schreiben. Insofern ist das gewöhnungsbedürftig, aber letztlich ein prima Feature. > Hab am WE nen LinuxMint KDE-Rechner mit schicker retro CDE > (Solaris-like) aufgesetzt um darauf Eclipse mit der gcc arm-bcm2708 > toolchain auszuprobieren - die wird justamente grad installiert. Das hat dann allerdings einen vollkommen anderen Fokus als Python. HTH, Karl
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.