Hallo,
ich habe ein Problem bezüglich meines Raspberry Pi's. Ich habe gestern
eine kleine elektronische Schaltung aufgebaut, welche aus einem
Potentiometer und einer LED-Leiste besteht. Dazu ein Programm, welches
die aktuelle Potentiometer-Einstellung im Terminal ausgibt und
zusätzlich die LED-Leiste je nach Poti-Stellung ansteuert. Also bei
Stellung ganz links leuchtet keine LED und bei ganz rechts leuchten alle
10 LEDs der Leiste.
Soweit so gut. Führe ich das Programm über den Raspberry Pi selbst per
Maus und Tastatur aus funktioniert alles problemlos.
Versuche ich allerdings das Programm per Putty über SSH auszuführen, so
wird mir lediglich das Putty Terminal am Rechner angezeigt, auf dem
Putty installiert ist. Dabei funktioniert auch die Erkennung der
Potentiometer Eingabe, jedoch leuchten meine LED's am Pi nicht.... Woran
könnte das liegen und wie lässt sich dieses Phänomen beheben?
Vielen Dank im Vorraus!
Markus
Markus schrieb:> Woran> könnte das liegen und wie lässt sich dieses Phänomen beheben?
Wer bist du wenn du dich direkt am Pi anmeldest? (user)
Wer bist du wenn du dich über SSH am Pi anmeldest? (user)
Beides Mal der gleiche user mit den gleichen Rechten?
Markus schrieb:> Versuche ich allerdings das Programm per Putty über SSH auszuführen, so> wird mir lediglich das Putty Terminal am Rechner angezeigt, auf dem> Putty installiert ist.
Zeige mal einen Screenshot, auch von den relevanten Einstellungen. Mit
ist nämlich gar nicht klar, was du mit "das Programm per Putty über SSH
auszuführen" meinst.
Du weißt, dass es für die beiden IC von dir einen Kerneltreiber gibt,
oder?
https://github.com/torvalds/linux/blob/929d931f2b40d7c24587818cf6c1f7a6473c363f/Documentation/devicetree/bindings/hwmon/ti%2Cads7828.yamlhttps://www.kernel.org/doc/html/v5.12/hwmon/pcf8591.html
Mit z.B. einem Overlay kannst du den Device Tree um die entsprechenden
Einträge ergänzen und kannst die IC dann direkt nutzen - du bekommst
direkt die Spannung in Volt sofern du die passende Referenz
konfigurierst.
https://github.com/raspberrypi/firmware/tree/master/boot/overlays
Eine Umrechnung wie du sie implementiert hast ist dadurch vollkommen
unnötig. Genauso die Pins deines Port Expanders, diese wären direkt
nutzbar.
Generell finde ich diese Bibliothek auf einem Raspberry Pi etwas
gruselig, auf einem Arudino okay, aber so arbeitet man eigentlich nicht
wirklich auf einem Linux System, dort will man ja eigentlich gar nicht
mit I2C Devices direkt sprechen als normaler Anwender.
Der Vorteil der Nutzung der Kerneltreiber: Du könntest nun einfach ohne
großartig testen zu müssen mit simplen echo Befehlen die LED testen,
genauso mittels cat den Wert des ADC auslesen. Als Anwendung würde dir
nun ein simples Bash Script reichen, das könnte sogar ein Einzeiler
sein.
Markus schrieb:> Ja immer der selbe. Benutzer: pi. Rechte müssten dann auch gleich> sein, oder?
Ja, das sollten sie.
OK, also wenn du direkt auf dem Pi arbeitest, dort auf dem Desktop eine
Shell geöffnet hast und dein Programm startest, dann funktioniert es.
Wenn du dich von einem anderen Rechner mittels SSH auf deinem Pi
anmeldest bekommst du ja auch eine Shell. Und in dieser Shell startest
du dein Programm und dann klappt zwar das Lesen (ADC) aber nicht das
Schreiben(LED)?
Irgendwelche Fehler geloggt?
Eventuell als root mal ›dmesg‹ versuchen.
Hast du in deiner - ich vermute mal bash - also ›~/.bashrc‹ irgend
etwas drin stehen was nur für non-login shells ausgeführt wird?
Onkel Ted schrieb:> Die Meldung ist doch eindeutig, dein Port Expander wird nicht> gefunden:>> if(adc->detectI2C(0x48)){ // Detect the pcf8591.
Stellt sich die Frage warum wird der lokal gefunden und remote nicht.
Beide Male als ›root‹ gestartet.
Onkel Ted schrieb:> Die Meldung ist doch eindeutig, dein Port Expander wird nicht gefunden:>> if(adc->detectI2C(0x48)){ // Detect the pcf8591.
Das war Blödsinn, vergiss das.
wiringPiSetup() <<< sicherer dir da einmal den Rückgabewert und gib
diesen aus, genauso bei den digital write.
Doch der wird gefunden. Ich verwende nur einen der beiden ADC. Und der
ist auch vorhanden. Den anderen habe ich garnicht in der Schaltung
verbaut. Die Abfrage könnte man natürlich weglassen, ja....
Gerald K. schrieb:> Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.
Warum bitte schön sollte ein solch einfaches Programm im Hintergrund
anders laufen als eines im Vordergrund?
Hab ich versucht, hat nichts bewirkt. @Gerald K.
Bin grad ein wenig verwirrt wegen dem Rückgabewert und dem ›~/.bashrc‹
Befehl. Wie bekomme ich nochmal genau den Wert? und der Befehl hat nicht
funktioniert. Wurde nicht erkannt.
Markus schrieb:> Bin grad ein wenig verwirrt … ›~/.bashrc‹ Befehl.> … und der Befehl hat nicht funktioniert. Wurde nicht erkannt.
Hätte mich auch sehr gewundert. Das ist kein Befehl sondern eine
Konfigurationsdatei.
Aber da du dein Programm sowieso mit root Rechten laufen lässt, dürfte
der Inhalt wohl so ziemlich egal sein.
Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.
Norbert schrieb:> Gerald K. schrieb:>>> Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.>> Warum bitte schön sollte ein solch einfaches Programm im Hintergrund> anders laufen als eines im Vordergrund?
Warum sollte ein Programm am Desktop gestartet funktionieren und über
SSH nicht funktionieren?
wiringPi verwendet bzw. unterstützt i2c. Könnte es zwischen ADCDevice()
und anschließendem wiringPiSetup() einen Konfikt geben?
Gerald K. schrieb:> Warum sollte ein Programm am Desktop gestartet funktionieren und über> SSH nicht funktionieren?
Tja Gerald, das ist aber eine weitere Frage und keine Antwort auf die
von mir gestellte.
In dem Zusammenhang kommt mir aber gerade ein Gedanke.
Bitte mal als root ein:
›killall PotiMitLEDfertig‹
ausführen. Nicht das bereits zahlreiche im Hintergrund gestartete
Prozesse um die Zugriffsrechte kämpfen.
Gerald K. schrieb:> PittyJ schrieb:>> Ich nehme statt Putty gleich ssh. Warum der Umweg über Putty?>> Putty ist das Terminalprogramm mit dem SSH ausgefühert wird.
Verstehe ich nicht.
Um mich auf meinen Pi einzuloggen mache ich in der Bash:
ssh root@kirsche
Wobei root der User und kirsche der Rechnername ist. Warum sollte ich
noch Putty dafür nehmen? Müßte ja erst einmal installiert werden.
PittyJ schrieb:> Warum sollte ich noch Putty dafür nehmen? Müßte ja erst einmal> installiert werden.
Der To arbeitet vermutlich unter Windows. Gibt es putty unter Linux?
Mh. Dann jetzt mal die verzweifelten Versuche:
- Logge dich mal per grafischer Oberfläche ein und teste dann dein
Skript über SSH. Vielleicht macht irgendeine autostart Magie irgendwas.
- Alternativ mittels "printenv" die Umgebungsvariablen in der grafischen
Session mit denen in der SSH Session vergleichen. Vielleicht ist
irgendwas anders. Also es wird bestimmt anders sein, aber vielleicht ist
da was vergraben. Die grafische Session und die SSH session sind nämlich
in den seltensten Fällen 100% identisch. Ich glaube aber nicht, dass das
Problem hier liegt.
- Braucht dein Programm aus irgendwelchen Gründen doch ein Display
(GUI?) Werden irgendwelche Komponenten geladen, die das eventuell
bräuchten? mal versuchen die SSH Session mit X11 forwarding zu starten.
Ich würde das jetzt zwar auch nicht erwarten, aber man weiß nie... Im
Normalfall käme sonst irgendeine Meldung wie "Cannot open display :0"
oder so ähnlich.
- Anstatt mit sudo <mein_prog> mal mit "sudo su" direkt als root
einloggen und dann das Programm ausführen. (Das ist nämlich nicht
äquivalent)
Gerald K. schrieb:> Der To arbeitet vermutlich unter Windows. Gibt es putty unter Linux?
Theoretisch ja. Aber wer das unter Linux nutzt, hat die Kontrolle über
seinen Rechner verloren.
Markus schrieb:> Das wäre mein Aufruf über Putty
Sehr gut. Die Screensh0ts verwirren mich aber. Im linken hast du
offenbar noch nicht die Enter Taste gedrückt, um die Befehlszeile
abzuschließen.
Markus schrieb:> Versuche ich allerdings das Programm per Putty über SSH auszuführen, so> wird mir lediglich das Putty Terminal am Rechner angezeigt, auf dem> Putty installiert ist.
Ich sehe im rechten Screenshot viel mehr als "lediglich das Putty
Terminal", nämlich die Ausgaben von deinem Programm. Also läuft dein
Programm.
Kannst du nochmal für außen stehende verständlich Beschreiben, was dein
Problem ist?
Onkel Ted schrieb:> Mit z.B. einem Overlay kannst du den Device Tree um die entsprechenden> Einträge ergänzen und kannst die IC dann direkt nutzen
+1
Statt mit Overlay zu Booten geht im laufenden Betrieb:
# echo pcf8591 0x48 > /sys/bus/i2c/devices/i2c-0/new_device
Methode 4 von
https://www.kernel.org/doc/html/latest/i2c/instantiating-devices.html
Grade bei GPIO-Expandern ist das schick: es sind einfach neue GPIOs
verfügbar, und für die Userspace-Applikation ist es egal, ob die direkt
an der CPU hängen oder eben indirekt. API bleibt die gleiche.
Εrnst B. schrieb:> Statt mit Overlay zu Booten geht im laufenden Betrieb:
Stimmt, das ist zum Basteln viel sinnvoller, gerade wenn es das Overlay
wie in diesem Fall noch nicht fertig gibt.
Ich würde einmal an Stelle des TS schauen was die GPIO so genau aktuell
treiben und wer die aktuell für sich beansprucht:
cat /sys/kernel/debug/gpio
Ein T. schrieb:> Gerald K. schrieb:>>> Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.>> Warum sollte er den Job in den Hintergrund schicken?
Man könnte dann mit "gpio readall" PIN Konfiguration (Mode) die Ports
kontrollieren.
Wie greifst Du denn auf die LED-Leiste zu, über Python/gpio oder über
/sys/class/gpio...
Kannst Du, wenn Du per ssh eingeloggt bist, die LEDs über deinen Zugriff
direkt ansteuern
Ich vermute stark, dass das ein Rechteproblem ist, Du hast vermutlich am
Raspi direkt andere Rechte als über ssh. Gibt doch mal am Raspi direkt
und auch per ssh ein 'groups', das zeigt Dir an, in welchen Gruppen Du
bist.
Gerald K. schrieb:> Ein T. schrieb:>> Gerald K. schrieb:>>>>> Ich würde es einmal mit "sudo ./PotiMitLEDfertig &" versuchen.>>>> Warum sollte er den Job in den Hintergrund schicken?>> Man könnte dann mit "gpio readall" PIN Konfiguration (Mode) die Ports> kontrollieren.
Ja, auch das könnte man womöglich tun. Aber bitte beantworte doch
zunächst meine Frage: Warum sollte er den Job in den Hintergrund
schicken?
rechteverwerter schrieb:> Wie greifst Du denn auf die LED-Leiste zu, über Python/gpio oder über> /sys/class/gpio...
Lesen bildet, Pfosten.
> Kannst Du, wenn Du per ssh eingeloggt bist, die LEDs über deinen Zugriff> direkt ansteuern
Lesen bildet, wieder Pfosten.
> Ich vermute stark, dass das ein Rechteproblem ist, Du hast vermutlich am> Raspi direkt andere Rechte als über ssh. Gibt doch mal am Raspi direkt> und auch per ssh ein 'groups', das zeigt Dir an, in welchen Gruppen Du> bist.
Denk bitte mal nach bevor du einfach los blubberst, 3-fach Pfosten.
Ein T. schrieb:> Ja, auch das könnte man womöglich tun. Aber bitte beantworte doch> zunächst meine Frage: Warum sollte er den Job in den Hintergrund> schicken?
Am Desktop gestartet läuft das Programm ebenfalls im Hintergrund. Man
kann während das Programm im Hintergrund läuft weiter Programme starten.
Gerald K. schrieb:> Ein T. schrieb:>> Ja, auch das könnte man womöglich tun. Aber bitte beantworte doch>> zunächst meine Frage: Warum sollte er den Job in den Hintergrund>> schicken?>> Am Desktop gestartet läuft das Programm ebenfalls im Hintergrund.
Das kommt darauf an, wie es aufgerufen wird. Auf jedem mir bekannten
Linux kann man eine Terminalanwendung mit einer Shell aufrufen und dort
Programme starten -- im Vordergrund, im Hintergrund, mit oder ohne
sudo(8) und oder nohup(1)...
> Man kann während das Programm im Hintergrund läuft weiter Programme starten.
Danke für die Erinnerung, aber die Jobkontrolle unixoider Shells kannte
ich schon. Mir ist nur nicht klar, inwieweit das einen Einfluß auf die
Funktion des Programms unseres TO haben sollte.
Dieter schrieb:> Probiere es mal mit:ssh -X -C pi@192.168.x.x> x: Dort Deine IP des Raspi eintragen.
Bei den doch recht schmalen Datenmengen in einem LAN würde ich vermuten,
daß die Kompression lediglich die Latenz minimal erhöht, und was das
X-Forwarding soll, wenn auf der Gegenseite kein X-Server läuft, verstehe
ich leider auch nicht.
Ein T. schrieb:> und was das X-Forwarding soll,
Eine Variante mit kleinen Unterschieden, mit dem kleinen Unterschied,
dass es funktioniert auf die Sprünge helfen könnte. So wie es aussieht,
verwendet der TO auf dem Desktop vom Raspian einen Terminalemulator.
Also Leute.
Es ist mir beinahe schon peinlich dies hier zu schreiben, aber ich habe
tatsächlich gerade den Fehler gefunden. Ich wollte gerade versuchen X11
forwarding zu testen, als ich plötzlich ausversehen beim Programmstart
das "sudo" vergessen habe. Und, oh Wunder, auf einmal hat alles
funktioniert.
Also beim Befehl 'sudo ./PotiMitLEDfertig'
--> LED's leuchten NICHT, nur Terminal-Anzeige fürs Poti läuft.
Aber beim Befehl './PotiMitLEDfertig'
--> LED's leichten einwandfrei und Programm funktioniert.
Ich habe keinen blassen Schimmer, wieso der Befehl "sudo" bei meiner SSH
Sitzung zu diesem Verhalten führt. Bei einer direkten Sitzung am Pi
funktioniert das nämlich schon. Naja, jedenfalls war's das Problem.
Vielleicht versteht das ja jemand und kanns mir erklären^^
Viele Grüße und Danke für die vielen Antworten,
Markus
Stefan ⛄ F. schrieb:> Das ist aber komisch (nicht peinlich), ich dachte der super-user> darf> alles. Da würde ich alleine schon aus Neugier weiter nachforschen.
Was sagte Hamlet doch gleich in Bezug auf Dänemark? ;-)
Aber Zustimmung, ging mir genauso als ich's gelesen habe.
Tim T. schrieb:> Was sagen id (als normaler user) und sudo id, jeweils über ssh und dann> nochmal auf konsole?
Hier beide Bilder. Einmal per SSH und einmal direkt im Terminal vom Pi.