Raspberry Pi 4 Programme über SSH ausführen

Gast #7185209
Lesenswert?

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
Gast #7185240
Lesenswert?

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.
Gast #7185252
Lesenswert?

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.yaml
https://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.
Gast #7185258
Lesenswert?

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?
Gast #7185264
Lesenswert?

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.
Gast #7185266
Lesenswert?

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....
Gast #7185275
Lesenswert?

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.
Gast #7185279
Lesenswert?

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.
#7185280
Lesenswert?

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?
Gast #7185291
Lesenswert?

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.
Gast #7185301
Lesenswert?

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.
Gast #7185310
Lesenswert?

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.
Gast #7185336
Lesenswert?

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?
#7185369
Lesenswert?

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.
Gast #7185392
Lesenswert?

Ε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
Gast #7187069
Lesenswert?

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.
#7187075
Lesenswert?

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?
Gast #7187085
Lesenswert?

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.
#7187212
Lesenswert?

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.
#7187219
Lesenswert?

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.
Gast #7190432
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren