Das Arduino LED Interface geht in die vierte Runde und kümmert sich um die Schreibrechte am seriellen Port und schaut nochmal auf den Arduino Code…
Schreibrechte auf /dev/ttyACM0:
Wenn sich die LED nicht über das Interface, also über die Webseite schalten lässt, dann sind eventuell die Zugriffsrechte für die serielle Schnittstelle nicht richtig eingestellt.
Entscheidend sind hier die Schreibrechte die jeweils für Besitzer, Gruppe und Andere eingestellt sind. Der Besitzer und die Gruppe sollten lesen und schreiben können. Für “Andere” sollte es reichen, wenn nur Schreibrechte vergeben werden.
- sudo chmod o=www /dev/ttyACM0
Mit dem Befehl “chmod“ können die Zugriffsrechte eingestellt werden. Die drei Rechte sind dabei die Zugriffsrechte für lesen, schreiben und ausführen. Diese Rechte können für UGO gesetzt werden und damit ist der User, die Gruppe und Others gemeint. Der Bindestrich bedeutet das entsprechende Recht ist nicht gesetzt. Der gewünschte Ordner oder die gewünschte Datei kann einfach ausgewählt werden, indem eine entsprechende Pfadangabe hinter den Befehl gesetzt wird.
Für das Arduino Projekt “LED Interface“ geht es also darum, ein Schreibrecht für “Others“ zu setzen. Der Benutzer muss nicht geändert werden und kann “root“ bleiben.
Programmierung:
char c;
void setup()
{
Serial.begin(9600);
Serial.println("LED-Interface");
pinMode(13, OUTPUT);
}
void loop()
{
if (Serial.available() > 0)
{
c = Serial.read();
Serial.println(c);
}
else
{
delay(100);
}
if (c=='n')
{
Serial.println("on");
digitalWrite(13, HIGH);
}
if (c=='f')
{
Serial.println("off");
digitalWrite(13, LOW);
}
c='\0';
}
Dieser Code wird in der Arduino IDE geschrieben und dann auf das Board hochgeladen. Wenn alles geklappt hat, sollte es möglich sein die LED über das Interface zu schalten.
Entscheidend sollte dabei die Bezeichnung des Ports sein. Im PHP Code sollte also der Port eingetragen sein, der auch in der Arduino IDE eingestellt wurde.
<?php
$port = fopen("/dev/ttyACM0","w");
sleep(2);
?>
Schreibrechte per PHP Extension oder udev-Regeln:
Nach einem Neustart des Systems ist es sehr wahrscheinlich, dass die Zugriffsrechte wieder auf den Benutzer “root” gesetzt werden und die Schreibrechte für “Andere” nicht gesetzt sind. Gibt es eine dauerhafte Lösung für dieses Problem?
Die mögliche Lösung per PHP Extension werde ich mir vermutlich erst später im Rahmen des nächsten PHP Workshops anschauen. Auch die Sache mit den udev-Regeln soll hier nur grob beschrieben werden.
Eigene udev-Regeln erstellt man in einem Editor mit Root-Rechten und legt sie im Verzeichnis /etc/udev/rules.d/ ab. Den Dateinamen sollte man mit einer hohen Zahl oder ohne Zahl beginnen. Wichtig ist, dass die Dateien, die die Regeln enthalten, mit .rules enden, da sie sonst nicht ausgeführt werden. Für unser LED Interface könnten wir also die Datei “interface.rules” erstellen. Nun müssten wir nur noch wissen welche Befehle in diese Datei zu schreiben sind.