Forum: Mikrocontroller und Digitale Elektronik Arduino UNO & Linux, PHP Datenübertragung per USB


von Guido S. (flintstone)


Angehängte Dateien:

Lesenswert?

Liebe Gemeinde,

heute versuche ich Daten von einem Arduino UNO zu einem Linuxserver mit 
PHP zu übertragen.

Stand:
- Auf dem Arduino läuft ein Programm, dass auf Anforderung Daten per 
UART sendet.
- Der Arduino ist per USB an einen kleinen Server angeschlossen, auf dem 
Linux Debian läuft. Es handelt sich um ein DockStar.
- Die Datenübertragung läuft mit einem Terminalprogramm. Zum Test habe 
ich 'minicom' auf dem Linux installiert. Wenn ich ein "A" sende, kommt 
die Antwort vom Arduino. Wie in dem Bild zu sehen ist, empfange ich die 
Rohdaten eines DS1820.

Versuch:
1
<?php
2
    echo ("Test 2<br />");
3
4
    $string = "A";
5
    $pointer = fopen("/dev/ttyACM1","w");
6
    fwrite($pointer, $string);
7
    fclose($pointer);
8
9
    $pointer = fopen("/dev/ttyACM1","r");
10
    echo fread($pointer);
11
    fclose($pointer);
12
?>
Leider bekomme ich nicht das gewünschte Ergebnis.

Problem:
- Wie kann ich diese Datenübertragung in PHP realisieren?
- Wie stelle ich in PHP die Parameter (Baudrate, Protokoll usw.) ein?

Gruß
Guido

von Unlucky2012 (Gast)


Lesenswert?

Was ergibt denn ein einfaches
1
cat /dev/ttyACM1
 auf der Konsole der Debian-Kiste? PHP greift zunächst ganz stupide über 
das Dateisystem zu. Wenn das Device also nicht richtig eingestellt ist, 
dann wird das nicht funktionieren. Eventuell hilfreich dürft "stty" 
sein.

von Guido S. (flintstone)


Lesenswert?

Unlucky2012 schrieb:
> /dev/ttyACM1

Brachte leider kein Ergebnis. Also keine Antwort vom Arduino.
Ich vermute, dass es an DTR liegt, die den Arduino zurücksetzt.

Somit entsteht die Frage, wie man die Hardwaresteuerung ausschaltet. Mit 
'minicom' ging es ja auch.

von Jakob L. (jakob)


Lesenswert?

Ich sehe da zwei mögliche Fehler:
1. Es wird erst geschrieben und dann erst das Device zum Lesen geöffnet. 
Wenn die Antwort zu schnell kommt, dann können die Daten unter Umständen 
verloren gehen, weil noch niemand die Daten liest.

2. Normalerweise muss man bei einer seriellen Schnittstelle gewisse 
Einstellungen (Baudrate, Parität, ...) setzen, bevor man die 
Schnittstelle verwendet. Das kann man z.B. über das 
Kommandozeilenprogramm stty machen. Alternativ kann man das Handling der 
seriellen Schnittstelle auch mit socat machen und über proc_open() in 
php auf stdin/stdout von socat und damit die seriellen Daten zugreifen.

von Εrnst B. (ernst)


Lesenswert?

Guido Scheidat schrieb:
> Der Arduino ist per USB

Wie? Per CDC-ACM über V-USB? Per FT232 o.Ä.? Sorry, kenn Arduino nicht 
im Detail.

Aber:
jedes
fopen("/dev/ttyACM1","w");
auf dem Device wird dazu führen, dass die Verbindung neu geöffnet wird, 
ggfs bereits gebufferte Zeichen verworfen werden usw.

d.H.: aus dem PHP-Kontext ist das keine gute Sache.

Besser: Server-Dienst(chen), dass die Serielle Verbindung dauernd offen 
hält, und dem PHP zeitweise Zugriff (über Socket, Pipe, TCP, ...) 
erlaubt.

Dieser Daemon lässt sich ggfs schon mit Bash und Bordmitteln 
implementieren, das oben angesprochene socat ist schonmal ein guter 
Einstiegspunkt.

von Krapao (Gast)


Lesenswert?


von Guido S. (flintstone)


Lesenswert?

Danke an Alle!

Inzwischen habe ich eine Lösung gefunden. In diese sind eure Vorschläge 
eingeflossen, für die ich mich herzlich bedanke.
Meine Lösung:
Ein C Programm, dass man auch als Daemon laufen lassen kann. Das 
Programm sendet in chronologischen Abständen ein Byte. Damit wird der 
Arduino veranlasst, die Temperatur auszugeben. Das Programm empfängt 
diese und speichert die Temperatur in einer MySQL-Datenbank. Somit ist 
es möglich, diese per PHP zu verarbeiten und in HTML auszugeben.

Gruß
Guido

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.