Forum: Mikrocontroller und Digitale Elektronik Raspberry Pi - Arduino über USB Kommunizieren


von Dominik W. (bannone25)


Lesenswert?

Hallo liebe Community,

ich habe folgendes Problem....
Ich habe ein Raspberry Pi und einen Arduino über USB miteinander 
verbunden.
Nun möchte ich Daten an meinen Arduino übermitteln.
z.B. Rasp. -> "LED-on" -> Ardu.
Den Sketch für den Arduino habe ich bereits...
da ich aber mit Linux programmieren noch nicht sehr erfahren bin, und 
ich im Internet nichts wirklich passendes gefunden habe hoffe ich, dass 
ihr mir helfen könnt.

MFG

Dome

von Peter (Gast)


Lesenswert?

Vllt fängst du mal an und sagst wo es klemmt?

Ansonsten ist hier der übliche Stundenlohn 100€ wenn du dir selber schon 
keine Gedanken machen willst.

von PittyJ (Gast)


Lesenswert?

Ich habe so etwas am laufen. Raspi und ein angeschlossener Arduino.
Man könnte das über ein 'virtuelle' TTY machen, also /dev/ttyUSB0.

Ich habe das über die Libusb gelöst, spreche also direkt das USB-Gerät 
über Vensor/Produkt-ID an. Das ist allerdings nichts für Anfänger. Man 
sollte schon C können und mit Bibliotheken umgehen können. Außerdem ein 
Verständnis für die Funktion des USB-Busses besitzen.

ttyUSB ist wohl für Anfänger einfacher. Aber auch da sollte man 
programmieren können. Versuch doch mal, ein String darüber raus zu 
schicken. Der Arduino sollte das empfangen können.

von chris (Gast)


Lesenswert?

Kann man nicht mit Python direkt die serielle Schnittstelle ansprechen?
Damit wuerde man sich die Umstaendlichkeiten von C sparen.

von PittyJ (Gast)


Lesenswert?

>> Damit wuerde man sich die Umstaendlichkeiten von C sparen.
Geschmackssache. Ich finde C wesentlich angenehmer und kann mit Python 
nichts anfangen.

von Karl Käfer (Gast)


Lesenswert?

Hallo PittyJ,

PittyJ schrieb:
>>> Damit wuerde man sich die Umstaendlichkeiten von C sparen.
> Geschmackssache. Ich finde C wesentlich angenehmer und kann mit Python
> nichts anfangen.

Das kann ich nun wirklich nicht nachvollziehen.
1
import serial
2
serialport = serial.Serial('/dev/ttyUSB0', baudrate=9600)
3
while True:
4
    print serialport.readline()

Noch angenehmer geht es doch kaum.

Liebe Grüße,
Karl

von Dominik W. (bannone25)


Lesenswert?

Ich habe etwas gefunden, was meinen anforderungen gerecht wird.
1
<?php
2
include "php_serial.class.php";
3
4
 $serial = new phpSerial();
5
 $serial -> deviceSet("/dev/ttyUSB0"); // usb port ansteuern
6
 $serial -> confBaudRate(9600); // baudrate definieren
7
 $serial -> confParity("none");
8
 $serial -> confCharacterLength(8);
9
 $serial -> confStopBits(1);
10
 $serial -> confFlowControl("none");
11
 $serial -> deviceOpen();
12
13
 sleep(3); // da der PI jedes mal neugestartet wird.
14
15
 $serial -> sendMessage('LEDon;');
16
 $read = $serial -> readPort(); // rückgabe abfragen
17
18
 echo $read; // rückgabe ausgeben
19
20
 $serial -> deviceClose();

aber Ich bekomme immer noch keinen Output....

von Dominik W. (bannone25)


Lesenswert?

Das Mit dem PHP Script hat leider nicht funktioniert...

Kennt ihr eine gute Seite, wo ich mich über die Serieleverbindung mit 
Python mal einlesen kann?

Gruß Dome

von Joachim B. (jar)


Lesenswert?

Dominik Wagner schrieb:
> Kennt ihr eine gute Seite,

vielleicht hier, hat mir sehr geholfen auch in C zu proggen
http://kampis-elektroecke.de/?page_id=1682

von Kaj (Gast)


Lesenswert?


von chris_ (Gast)


Lesenswert?

Raspberry Pi, Python, serial port:

http://elinux.org/Serial_port_programming

von Joachim B. (jar)


Lesenswert?

chris_ schrieb:
> Raspberry Pi, Python, serial port:

aber erst mal muss die Schnitte freigeschaufelt werden zur Benutzung, 
beim PI 1 war die vorbelegt.

http://kampis-elektroecke.de/?page_id=1682

: Bearbeitet durch User
von Noch einer (Gast)


Lesenswert?

Wenn ein /dev/ttyUSB0 erscheint -- zweiter Schritt wäre: einfach mit 
einem Terminalemulator wie cutecom verbinden und schauen, ob überhaupt 
was passiert.

von Dominik W. (bannone25)


Lesenswert?

Ich habe das mit USART probiert, er funktioniert bei mir aber blos, wenn 
nebenher der Serial Monitor der Arduino IDE läuft...
Wieso? wie kann ich das ändern?

von Noch einer (Gast)


Lesenswert?

Uff. Wahrscheinlich setzt der Serial Monitor die passenden 
stty-Parameter.

Gibt ein Programm namens stty. Während der Serial Monitor läuft die 
Parameter lesen. Gibt eine lange Zeile mit Doppelpunkten, wenn ich mich 
richtig erinnere. Später diese Zeile mit stty wieder setzen.

von Joachim B. (jar)


Lesenswert?

Dominik Wagner schrieb:
> Ich habe das mit USART probiert, er funktioniert bei mir aber blos, wenn
> nebenher der Serial Monitor der Arduino IDE läuft...
> Wieso? wie kann ich das ändern?

anderen Arduino wählen mit 2ter Seriell Schnitte (oder Ports und Soft 
seriell) und diese dafür benutzen :-)

: Bearbeitet durch User
von Dominik W. (bannone25)


Lesenswert?

Wie Kann ich die parameter auslesen?

von Joachim B. (jar)


Lesenswert?

Dominik Wagner schrieb:
> Wie Kann ich die parameter auslesen?

vorlesen lassen?

oder verstehe ich gerade nicht deine Frage?

von Noch einer (Gast)


Lesenswert?

Erstmal einfach in der Shell ausprobieren

stty -g -F /dev/tty...

Serial Monitor stoppen

stty -F /dev/tty... copy:paste:der:zeile:mit:den:doppelpunkten

von Kaj (Gast)


Lesenswert?

Dominik Wagner schrieb:
> Ich habe das mit USART probiert, er funktioniert bei mir aber blos, wenn
> nebenher der Serial Monitor der Arduino IDE läuft...
> Wieso? wie kann ich das ändern?
Meinst du USART vom RPi2, also den Pin-Header? Kann sein dass dein Linux 
die Kernel-Meldungen auf den USART raushaut (so z.B. bei Arch Linux).

von PittyJ (Gast)


Lesenswert?

stty, Parameter, Kernel Meldungen darüber ...
Ich weiss schon, warum ich direkt über libusb gehe. Damit gibt es keine 
Probleme dieser Art. Das Programm läuft auf Intel, ARM und sogar einem 
Power-Mac (mit Linux). Recompile reicht. Ist letztendlich einfacher als 
das Prokeln mit der seriellen Schnittstelle.

Probiert es einfach mal.

von Paul F. (zwanni)


Lesenswert?

Ich habe so etwas in der Art auch mal in PHP gemacht. Habe dann auch 
diese class gefunden und keinen Erfolg gehabt. Grundsätzlich kann man 
aber in jeder Sprache auch Terminalanweisungen benutzen. Ob das dann der 
beste stil ist sei dahingestellt, aber so lässt es sich einfach manuell 
testen und in eine Sprache implementieren.
Wenn dir PHP liegt dann hier ein paar codeschnipsel:

Prüfen ob Gerät vorhanden
1
if(file_exists("/dev/ttyUSB0"))

Schnittstelle konfigurieren
1
shell_exec("sudo stty 19200 -F /dev/ttyUSB0");

Befehl senden
1
shell_exec("echo '".$command."' >> /dev/ttyUSB0");

Befehlszeile empfangen
1
$line = shell_exec("head -1 /dev/ttyUSB0");

von Karl Käfer (Gast)


Lesenswert?

Hallo Dominik,

Dominik Wagner schrieb:
> Das Mit dem PHP Script hat leider nicht funktioniert...
>
> Kennt ihr eine gute Seite, wo ich mich über die Serieleverbindung mit
> Python mal einlesen kann?

Bei den Autoren des Python-Moduls PySerial, das ich in dem Beispiel oben 
benutzt habe:

  http://pyserial.sourceforge.net/

Wenn Du Python und PySerial installiert hast, findest Du natürlich auch 
eine hervorragende Referenz in der mitgelieferten Dokumentation, die mit 
"pydoc serial" aufgerufen werden kann. Aber im Grunde genommen brauchst 
Du nicht viel mehr als das, was in meinem Beispiel oben steht: mit 
"import serial" importierst Du das PySerial-Modul, mit dem Befehl 
"serialport = serial.Serial('/dev/ttyUSB0', baudrate=9600)" öffnest Du 
die genannte serielle Schnittstelle mit der angegebenen Baudrate, indem 
Du ein Objekt namens "serialport" vom Typ "Serial" aus dem Modul 
"serial" instanziierst. Der Konstruktor kann noch andere Parameter 
annehmen: [1]; das ist (wie ja meistens in Python) simpel, geradeaus und 
frei von Überraschungen. Was die Funktionen "serialport.read()" und 
"serialport.write()" machen, dürfte ja wohl relativ offensichtlich 
sein... ;-)

Wer mag, kann natürlich auch in Python die libusb verwenden; auch das 
ist keine Geheimwissenschaft: "usb.busses()" gibt die gefundenen 
USB-Busse zurück, "bus.devices" die an einem Bus hängenden Geräte, 
"device.open()" gibt dann ein DeviceHandle zurück, über dessen 
Funktionen dann mit dem Gerät interagiert werden kann. USB selbst ist 
etwas komplizierter als so eine Serielle Schnittstelle, aber wer sich 
damit bereits auskennt, wird mit der Python-Implementierung sicherlich 
keine Probleme haben. Weitere Informationen dazu gibt es hier:

  http://walac.github.io/pyusb/

Liebe Grüße,
Karl


[1]
1
 |  __init__(self, port=None, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, writeTimeout=None, dsrdtr=False, interCharTimeout=None)

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
Noch kein Account? Hier anmelden.