USV->I2C->Tiny45->USB->Python->gentoo

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
oxyl
User
Beiträge: 4
Registriert: Sonntag 30. Dezember 2007, 20:12

Sonntag 30. Dezember 2007, 20:21

hab ne alte USV-Backupbatterie die quasi noch von Vorkriegszeiten stammt aber funktionstüchtig ist mit einem selbstgebauten Interface erweitert.

ein pcf8591p mit 8bit-Wandlern (4in und 1out) gibt die werte via I2C an ein tiny45 weiter und der wiederum via USB an meinen Rechner.

via i2cget bzw. i2cset (im Paket zu lm_sensors enthalten) kann ich alle werte
auslesen bzw. den einen Ausgang setzten.

meine Problem nun ist die Einbindung bzw, das ansprechen des i2c-Bus aus einem Python-Script heraus.

kann mir da jemand weiter helfen?

danke schon mal!


ps: die Antwort bitte so einfach wie irgend möglich halten, kann zwar zusammenhänge recht gut erkennen und Analogien aufbauen, bin aber erst seit ein paar tage mit Python auf Tuchfühlung

mein system ist ein gentoo-linux mit nem 2.6.22-r10 kernel (oder höher) und python 2.4.4 (da unter gentoo die 2.5er noch unstable)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 30. Dezember 2007, 20:59

oxyl hat geschrieben:an ein tiny45 weiter und der wiederum via USB an meinen Rechner
Hallo oxyl!

Willkommen im Python-Forum!

Wie bindest du den ATtiny45 an USB? Kann es sein, dass du am Computer sogar einen (vom USB-Controller) simulierten COM-Port hast? Das wäre das Einfachste. Denn mit pySerial kannst du Daten direkt über COM-Verbindungen schicken.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 30. Dezember 2007, 21:19

Hallo oxyl!

Ahhhhhhhh! Man sollte einen Beitrag öfter lesen. ;-) Du hast also schon eine **funktionierende** Verbindung zum Computer.

i2cget http://linux.die.net/man/8/i2cget ist also ein Kommandozeilenprogramm.

Das Einfachste ist, wenn du die Programm i2get und i2cset über subprocess aufrufst und die Rückgabe auswertest.

In etwa so:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import subprocess


def main():
    args = ["i2cget", "-y", "i2cbus", "chip-address", "data-address", "mode"]
    proc = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    retval = proc.stdout.read()
    errors = proc.stderr.read()
    print retval
    print "Errors:", errors


if __name__ == "__main__":
    main()
Die Parameter ``"i2cbus", "chip-address", "data-address", "mode"`` musst du natürlich durch deine Vorgaben ersetzen.

Die Daten kann man dann aus der Rückgabe herausparsen. Allerdings weiß ich jetzt nicht was dieser Aufruf zurück liefert. Deshalb kann ich dazu noch nichts schreiben.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 30. Dezember 2007, 21:27

Außerdem gibt es scheinbar ein Python-Binding für lm_sensors, wird wohl python-smbus heißen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 30. Dezember 2007, 21:33

Leonidas hat geschrieben:Außerdem gibt es scheinbar ein Python-Binding für lm_sensors, wird wohl python-smbus heißen.
Hallo Leonidas!

Ja! "py-smbus" http://www.lm-sensors.org/browser/i2c-t ... k/py-smbus

Aber ich konnte noch keine Anleitung dafür finden. Außerdem finde ich die subprocess-Lösung einfacher zu verwenden. ;-)

EDIT1:

@oxyl:
Hast du mehr Infos über die Hardware für mich? Und wie du den ATtiny45 programmiert hast, dass dieser die Signale direkt zu den I2C-ICs weiterreicht. Und wie dieser ATtiny45 an den USB gekoppelt ist. Nur weil es mich persönlich interessiert. Zur Lösung deines Problems tragen diese Informationen nicht mehr bei. :-)

EDIT2:
Ich habe ein MINI-Beispiel für die Verwendung von py-smbus gefunden: http://archives.andrew.net.au/lm-sensors/msg28792.html

EDIT2:
Aus dem Quellcode kann man recht viel heraus lesen: http://www.lm-sensors.org/browser/i2c-t ... usmodule.c

Das sind die Befehle die du wahrscheinlich damit verwenden kannst:
- open
- close
- write_quick
- read_byte
- write_byte
- read_byte_data
- write_byte_data
- read_word_data
- write_word_data
- process_call
- read_block_data
- write_block_data
- block_process_call
- read_i2c_block_data
- write_i2c_block_data

Die Beschreibungen findest du im C-Quellcode.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lunar

Sonntag 30. Dezember 2007, 23:44

oxyl hat geschrieben:mein system ist ein gentoo-linux mit nem 2.6.22-r10 kernel (oder höher) und python 2.4.4 (da unter gentoo die 2.5er noch unstable)
Das ist eine der Entscheidungen der Gentoo Devs, die ich absolut nicht nachvollziehen kann! Es gibt afaik kein Paket mehr im Tree, welches absolut inkompatibel zu 2.5 ist. numeric und trac, die in der Vergangenheit Probleme hatten, sind mittlerweile korrigiert, den sie sind hier beide für 2.5 installiert. Genshi ist laut bugtracker auch wieder korrigiert. Außerdem sagt der Upstream "The current production version is Python 2.5.1. You should start here if you want to learn Python or if you want the most stable version."

Ich halte es persönlich für dumm und eher schädlich, Python 2.5 so lange unstable zu lassen. Mein System läuft seit einem halben Jahr mit Python 2.5 und ich hatte nie ernsthafte Probleme.

Generell kann man bei Gentoo den unstable Zweig sowieso aktivieren. Abgesehen von kleineren Bugs, die man durch Hard masking der betroffenen Pakete beheben kann, hatte ich damit bisher auch keine Probleme.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 31. Dezember 2007, 00:03

lunar hat geschrieben:Ich halte es persönlich für dumm und eher schädlich, Python 2.5 so lange unstable zu lassen. Mein System läuft seit einem halben Jahr mit Python 2.5 und ich hatte nie ernsthafte Probleme.
Ich halte es auch für ziemlich dumm. In Debian ist es auch oft der Fall, dass die Default-Version von Python recht alt ist, was ich mir aber durch die Notwendigkeit alle Pakete gegen die neue Python-Version zu kompilieren erklären lasse. Bei Gentoo hingegen sehe ich keine Probleme damit.

Gentoo stable ist auch in der Tat eine eher seltsame Sache, denn beispielsweise IPython ist Upstream in Version 0.8.2, welche auch in Gentoo unstable ist. Gentoo stable hat hingegen 0.6.15! Ich schiebe es auf die nicht vorhandene Stabilizing-Infrastruktur, so etwas wie "B r i t n e y" würde auch in Gentoo hilfreich sein.

Edit: phpBB ersetzt mir den Namen des automatischen Migrators nach Testing durch "fuddel", also habe ich mal eine Technik der Spamer adaptiert, da ich zu faul war das abzustellen.
Zuletzt geändert von Leonidas am Montag 31. Dezember 2007, 00:14, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Montag 31. Dezember 2007, 00:10

Leonidas hat geschrieben:
lunar hat geschrieben:Ich halte es persönlich für dumm und eher schädlich, Python 2.5 so lange unstable zu lassen. Mein System läuft seit einem halben Jahr mit Python 2.5 und ich hatte nie ernsthafte Probleme.
Ich schiebe es auf die nicht vorhandene Stabilizing-Infrastruktur, so etwas wie "fuddel" würde auch in Gentoo hilfreich sein.
ack. Wenn, wie im Moment, das Stabilizing komplett über Bugs im Bugzilla Bugtracker erledigt wird, dann ist klar, dass die Sache nicht funktionieren kann. Bugzilla an sich ist schon schrecklich genug ;)

Leider hat das zur Folge, dass sich der Sinn von unstable immer mehr ins Gegenteil verkehrt. Die meisten Gentoo-User, die ich kenne, haben ein komplettes unstable-System. Insofern gibt es bei Gentoo eigentlich nur noch zwei Arten von Paketen: hard masked und der Rest. Hard masked Pakete sind wirklich kaputt, der Rest läuft. Zwischen stable und unstable unterscheiden die meisten User eigentlich schon gar nicht mehr.
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Montag 31. Dezember 2007, 11:18

Jep. Jetzt muß ich mir nur noch ne Lösung basteln, die die ganzen Pakete automatisch ins package.keywords schreibt.

Abtrennen und ins Offtopic :lol:
lunar

Montag 31. Dezember 2007, 12:33

Jan-Peer hat geschrieben:Jep. Jetzt muß ich mir nur noch ne Lösung basteln, die die ganzen Pakete automatisch ins package.keywords schreibt.
ACCEPT_KEYWORDS="~x86" in der make.conf ;)
oxyl
User
Beiträge: 4
Registriert: Sonntag 30. Dezember 2007, 20:12

Dienstag 1. Januar 2008, 03:06

erstmal danke für die schenllen antworten.

@ gerold

die verbinding vom i2c-bus auf den usb hab ich mittels eines projekt's von Till harbaum (http://www.harbaum.org/till/i2c_tiny_usb/index.shtml) realisiert.

die dort vorgestellte schaltung sammt code für den tiny45 hab ich zu erst mit diversen i2c-client-chips getestet und mich schluss endlich für den pcf 8591p entschieden. ich werde dieses projekt, mit allen quellen und dem gesammten code, der schlussendlich zum einsatz kommt, in meinem hauseigenem wiki veröffentlichen. (link folgt)

zugleich ein sry dafür, dass ich die vorgeschalgenen Lösungen noch nicht testen konnte, werde dies schnellstmöglich nach holen und meine erfahrungen teilen.

@ "den rest der gentoo-ustable-diskusion"

bin zwar in der lage mein system selbst zu erstellen und zu verwalten, jedoch nicht unbedingt mit den bugs, die bei der verwendung mit unstable-paketen aufgetreten können sinnvoll zu recht zu kommen. aus diesem grunde bleib ich grundsätzlich bei den stable paketen und nutze die unstable-pakte nur, wenn dies für meine vorhaben zwingend notwendig ist. bis dato bin ich mit dieser politik rech gut gefahren, beneide aber jeden, der auf diese vorgehensweise nicht angewiesen ist. bin halt 'n elektroniker, der sich in die abgründe der script und programiersprachen vor wagt.

in diesem sinne: frohes neues und auf bald!
oxyl
User
Beiträge: 4
Registriert: Sonntag 30. Dezember 2007, 20:12

Donnerstag 3. Januar 2008, 05:12

hi! ich dachte das ich mit den geposteten Lösungswegen zu recht kommen würde, musste mich jedoch eines besseren belehren lassen.

sollte mein fehler bei einer, für jederman klar zu erkenneden kleinigkeit liegen, werde ich jede art verbaler abstafung akzeptieren. *g*

hier das script das ich direkt in der bash ausführe:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-


command = raw_input('command: ')
opt = raw_input('options: ')
i2cbus = raw_input('bus-address: ')
chip_address = raw_input('chip_address: ')
data_address = raw_input('data_address: ')
mode = raw_input('r/w-mode: ')

import subprocess, os, sys, tempfile


def main():
    args = ["command", "opt", "i2cbus", "chip_address", "data_address", "mode"]
    proc = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    retval = proc.stdout.read()
    errors = proc.stderr.read()
    print retval
    print "Errors:", errors


if __name__ == "__main__":
    main()
darauf folgt dann folgend die eingabe der variablen und die Fehlerausgabe in der Konsole

Code: Alles auswählen

alexes src # ./i2cscann
command: i2cget
optionen: -y
bus-address: 7
chip_address: 0x48
data_address: 0x00
r/w-mode: b
Traceback (most recent call last):
  File "./i2cscann", line 25, in ?
    main()
  File "./i2cscann", line 17, in main
    proc = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
  File "/usr/lib/python2.4/subprocess.py", line 543, in __init__
    errread, errwrite)
  File "/usr/lib/python2.4/subprocess.py", line 975, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

im ideal-fall sollte eine abfrage des folgendermaßen von statten gehen:

Code: Alles auswählen

alexes src # i2cget -y 7 0x48 0x00 b
0xf1
in diesem Fall gibt der Wert "0xf1" den bruchteil von 256 im hexadezimalsystem wieder, das der angelegten spannung an dem eingang des i2c-chips enspricht

i2cget = abfragebefehlt
-y = option das nicht nachgefragt werden soll ob wirklich ausgelsen werden soll
7 = die i2c-busadresse
0x48 = die chip-adresse
0x00 = daten-register-adresse
b = bit, das aussagt das daten gelsen werden sollen#

wie gesagt, bin 'n python anfänger, danke für eure gedult!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 3. Januar 2008, 08:22

Hallo oxyl!

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import subprocess


def main():
    command = raw_input('command: ')
    opt = raw_input('options: ')
    i2cbus = raw_input('bus-address: ')
    chip_address = raw_input('chip_address: ')
    data_address = raw_input('data_address: ')
    mode = raw_input('r/w-mode: ')
    
    args = [command, opt, i2cbus, chip_address, data_address, mode]
    proc = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    retval = proc.stdout.read()
    errors = proc.stderr.read()
    print retval
    print "Errors:", errors


if __name__ == "__main__":
    main()
Probier mal ob es so funktioniert. :-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 3. Januar 2008, 11:31

gerold hat geschrieben:

Code: Alles auswählen

proc = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
<nitpick>

Code: Alles auswählen

proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
</nitpick>

SCNR.

Kann es sein, dass durch irgendeinen seltsamen Zufall die Eingeben von ``raw_input()`` aus irgendeinem seltsamen Grund mit ``\n`` enden?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Donnerstag 3. Januar 2008, 11:42

lunar hat geschrieben:
Jan-Peer hat geschrieben:Jep. Jetzt muß ich mir nur noch ne Lösung basteln, die die ganzen Pakete automatisch ins package.keywords schreibt.
ACCEPT_KEYWORDS="~x86" in der make.conf ;)
Das ist in etwa so populär wie der Gebrauch von 'eval' ... Aber effektiv ... hm. Irgendwie war ich immer der Meinung, ein besserer Mensch zu sein, weil ich es alles manuell eintrage :lol:

@Oxyl:

Irgendwie habe ich nicht den Eindruck, daß ich mit dem unstable-Zweig mit mehr Bugs zu kämpfen habe. Meiner Ansicht nach ist unstable durchaus stable. Und manche - exotischere - Pakete neigen ohnehin dazu, niemals 'stable' zu werden, einfach weil es nicht genügend Leute interessiert. Wovon man auf Arbeitssystemen wirklich die Finger lassen sollte, ist alles, was hardmasked ist. Aber da war die Versuchung bei dir wahrscheinlich ohnehin nicht so groß ... :wink:
Zuletzt geändert von Jan-Peer am Donnerstag 3. Januar 2008, 11:48, insgesamt 1-mal geändert.
Antworten