Vor einigen Tagen habe ich mir das AVR-NET-IO von Pollin bestellt. Eine sehr interessante kleine Schaltung – schon vor einigen Jahren hätte ich gerne auf einfache Weise über Ethernet gemessen und geschaltet – das AVR-NET-IO macht es endlich möglich. Für C-Control von Conrad Electronic, das ich vor allem für den PropController für Halloween verwendet habe, war das nicht so einfach möglich.
Als PHP-Entwickler musste ich natürlich gleich eine Klasse zur Ansteuerung erstellen, so dass man direkt alle Befehle der Standard-Firmware ausführen kann. Später werde ich vermutlich auch andere Firmware wie etwa Ethersex dafür verwenden, aber erst einmal möchte ich einfach anfangen.
Langer Rede, kurzer Sinn – hier ist die Beschreibung der PHP-Klasse
Verfügbare Methoden
Zusätzlich zu den direkten Mappings der Befehle auf PHP-Methoden gibt es auch einige Methoden, die aggregierte Informationen zurückliefern.
Verbindung herstellen und trennen
$avr = new AvrNetIo('192.168.0.90');
$avr->connect();
$avr->disconnect();
Versionsinformationen abfragen
$avr->getVersion();
liefert ein assoziatives Array der Form
array('uc' => "ATMega32", 'ver' => "1.03", 'nic' => "ENC28J60");
Netzwerkeinstellungen
Lesen
$avr->getIp();
$avr->getMask();
$avr->getGw();
Schreiben
$avr->setIp("192.168.0.200")
$avr->setMask("255.255.255.0")
$avr->setGw("192.168.0.1");
Kumulierte Informationen abrufen
$avr->getData();
liefert als Convenience-Funktion ein assoziatives Array der Form
array('ip' => '192.168.0.90', 'gateway' => '192.168.0.1', 'netmask' => '255.255.255.0', 'controller' => 'AtMega32', 'firmware' => '1.03', 'nic' => 'ENC28J60');
Status abfragen
$avr->getStatus($returnType);
liefert den Status wie der Befehl STATUS zurück, in der Standardform exakt so, also z.B. als S00000000.
Manchmal ist es aber sinnvoll, direkt ein Array mit den Werten der einzelnen Ports zu erhalten. Diese kann man sich entwder als Array mit booleschen Werten (true, false) oder als Integer-Array zurückliefern lassen:
// Boolesches Array
$avr->getStatus(AvrNetIo::STATUS_ARRAY_BOOL);
liefert z.B.
array(true, false, false, false, false, false, true, false);
// Integer-Array
$avr->getStatus(AvrNetIo::STATUS_ARRAY_STRING);
liefert z.B.
array(1, 0, 0, 0, 0, 0, 1, 0);
Digitalports abfragen
Das AVR-NET-IO verfügt über 8 digitale Eingänge. Diese können wie folgt abgefragt werden:
$avr->getPort($number);
Analogports abfragen
Die 4 Analog-/Digital-Konverter-Eingänge (ADC) können wie folgt abgefragt werden:
$avr->getAdc($number);
Digitalports setzen
Die 4 digitalen Ausgänge können so geschaltet werden:
$avr->setPort($number, $value);
LCD-Funktionen
Der Befehl INITLCD muss im Prinzip einmalig vor Verwendung des LCDs aufgerufen werden, wird aber von der PHP-Klasse automatisch ausgeführt:
$avr->initLcd(); $avr-> writeLcd($line, $text); $avr->clearLcd();
Beispielcode
<?php
require "AvrNetIo.php";
$avr = new AvrNetIo('192.168.0.90');
if ($avr->connect()) {
    echo "IP: ".$avr->getIp()."<br />\r\n";
    echo "Gateway: ".$avr->getGw()."<br />\r\n";
    echo "Netmask: ".$avr->getMask()."<br />\r\n";
    var_dump($avr->getVersion());
    echo "<br />";
    echo "Port 1:".$avr->getPort(1)."<br />\r\n";
    echo "ADC1 1:".$avr->getAdc(1)."<br />\r\n";
    var_dump($avr->getData());     echo "<br />\r\n";     var_dump($avr->getStatus(AvrNetIo::STATUS_RAW));     echo "\r\n";
for ($i=1; $i<5; $i++) {
   echo "ADC #$i: ".$avr->getAdc($i)."<br />\r\n";
}
$avr->disconnect();
} else {
die("Verbindung nicht möglich!");
}
?>
{
protected $ip;
protected $conn;
protected $timeout = 5;
protected $lcdInitialized;
const STATUS_RAWÂ Â Â Â Â Â Â Â Â = 1;
const STATUS_ARRAY_BOOLÂ Â = 2;
const STATUS_ARRAY_STRING = 3;
public function __construct($ip)
{
$this->ip = $ip;
}
public function connect()
{
$this->conn = fsockopen($this->ip, 50290, $errno, $errstr, $this->timeout);
return (bool)$this->conn;
}
public function disconnect()
{
return fclose($this->conn);
}
protected function read($cmd, $lines)
{
fputs($this->conn, trim($cmd).”\r\n”);
$results = array();
for ($i=0; $i<$lines; $i++) {
$results[] = trim(fgets($this->conn, 65535));
}
return $results;
}
public function getVersion()
{
$info = $this->read(“VERSION”, 3);
$data = array();
foreach ($info as $l) {
list($n, $v) = explode(“:”, $l);
$v = trim($v);
$data[strtolower($n)] = $v;
}
return $data;
}
public function getData()
{
$data     = array();
$boardInfo = $this->getVersion();
$data['ip']Â Â Â Â Â Â Â Â = $this->getIp();
$data['gateway']Â Â Â = $this->getGw();
$data['netmask']Â Â Â = $this->getMask();
$data['controller'] = $boardInfo['uc'];
$data['firmware']Â Â = $boardInfo['ver'];
$data['nic']Â Â Â Â Â Â Â = $boardInfo['nic'];
return $data;
}
public function getStatus($returnType = self::STATUS_RAW)
{
$r   = $this->read(“GETSTATUS”, 1);
$data = $r[0];
if ($returnType == self::STATUS_RAW) {
return $r[0];
} else {
$array = array();
if ($returnType == self::STATUS_ARRAY_BOOL) {
for ($i=1; $i<strlen($data); $i++) {
$char = substr($data, $i, 1);
$array[] = (bool)$char;
}
} else if ($returnType == self::STATUS_ARRAY_STRING) {
for ($i=1; $i<strlen($data); $i++) {
$char = substr($data, $i, 1);
$array[] = (int)$char;
}
}
}
return $array;
}
public function getIp()
{
$r = $this->read(“GETIP”, 1);
return $r[0];
}
public function setIp($value)
{
$r = $this->read(“SETIP “.($value), 1);
return $this->resultToBool($r[0]);
}
public function getMask()
{
$r = $this->read(“GETMASK”, 1);
return $r[0];
}
public function setMask($value)
{
$r = $this->read(“SETMASK “.($value), 1);
return $this->resultToBool($r[0]);
}
public function getGw()
{
$r = $this->read(“GETGW”, 1);
return $r[0];
}
public function setGw($value)
{
$r = $this->read(“SETGW “.($value), 1);
return $this->resultToBool($r[0]);
}
public function getPort($number)
{
$r = $this->read(“GETPORT “.(int)$number, 1);
return (int)$r[0];
}
public function setPort($number, $value)
{
if ($value) {
$value = 1;
} else {
$value = 0;
}
$r = $this->read(“SETPORT “.(int)$number.”.”.(int)$value, 1);
return $this->resultToBool($r[0]);
}
public function getAdc($number)
{
$r = $this->read(“GETADC “.(int)$number, 1);
return (int)$r[0];
}
public function initLcd()
{
if ($this->lcdInitialized) {
return true; // already initialized
}
$r  = $this->read(“INITLCD”, 1);
$res = $this->resultToBool($r[0]);
if ($res) {
$rhis->lcdInitialized = true;
}
return $res;
}
public function writeLcd($line, $text)
{
$this->initLcd();
$r = $this->read(“WRITELCD “.(int)$line.”.”.$text, 1);
return $this->resultToBool($r[0]);
}
public function clearLcd()
{
$this->initLcd();
$r = $this->read(“CLEARLCD”, 1);
return $this->resultToBool($r[0]);
}
protected function resultToBool($result)
{
return ($result == ‘ACK’);
}
}
?>

AvrNetIo PHP Class von Sascha Kimmel steht unter einer Creative Commons Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Deutschland Lizenz.

Ein Lob für die tolle Arbeit…… funktioniert prima.
Vielen Dank
Ich kann auch nur ein Lob für diese Tipps aussprechen. Mir hat sowohl der PHP-Code für den AVR-NET-IO als auch die Fehlerbehebung bei Verlust der IP hervorragend geholfen.
Vielen Dank
Hallo – klingt super
Geht dies auch mit den Boards von http://tuxgraphics.com/ ?
Gruss
Nein, das funktioniert nur mit der Original-Pollin-Firmware.
Vielen Dank,
habe mir den Bausatz ebenfalls gekauft und genau diese Browserbasierte Version gesucht.
Werde gleich mal testen !!!
mfg
thomas
… Das funtz super !
Sag bitte, gibt es noch hier oder in anderen bekannten Foren eventuell ein / zwei Beispiele wie ich die 8 Digi-Outputs mit einem PHP-Script ein – bzw. aus schalten kann ?
Leider bin ich nicht der besste in Sache PHP!
Vielen Dank !
ThomB
Das steht doch in diesem Artikel
$avr->setPort($number, $value);
Also z.B. um Port 3 einzuschalten:
$avr->setPort(3, true);
Also z.B. um Port 3 auszuschalten:
$avr->setPort(3, false);
DANKE für diese schnelle Antwort !!!!
Das ist Super !
thomB
kurze Frage, passt nur bedingt dazu, sorry…
wenn ich jetzt so ein board bei pollin bestelle, wie gross ist die wahrscheinlichkeit dass ich dann eines bekommen wo der chip schon entsrpechend geflashed ist, habe gelesen dass man diese meistens (zumindest war das früher wohl so) erstmal selbst noch flashen muss mit einem aktuellen bios (habe die infrastruktur dazu nicht)
ansonsten, sehr cool! programmiere selbst viel php und werde damit sicherlich gut arbeiten koennen, danke schonmal!
Die Frage kann ich leider nicht beantworten, vielleicht jemand anderes hier? Ich bestelle doch nicht jeden Monat 100 AVR-NET-IO
Meiner hatte jedenfalls kein Problem.
Vielen Dank insbesondere für den Hinweis in “Die NetServer-Software stellt keine Verbindung her?”, der hat mir sehr geholfen.
Offenbar habe aber nur ich folgendes Problem: nach Öffnen der Verbindung kommt auf die erste Anfrage (im Beispiel IP-Adresse abfragen) keine Antwort zurück; nach Timeout werden die folgenden Kommandos dann korrekt beantwortet – woran mag das liegen?
WOW!!!!
Saubere Sache. Funktioniert tadellos und ist zudem auch versändlich….
RESPEKT!!
…funzt echt gut! …toll!
Vielen Dank für diese Schöne Klasse
Fuktioniert 1A.
Kann mir jemand eine Möglichkeit sagen wie ich die VAR-NET-IO vor Fremdzugriff schütze?
Ein Passwort via php/html ein zu binden ist kein Problem.
Aber was wenn jemand die IP der AVR-NET-IO heraus bekommt.
Dann können Unbefugte ja meine Geräte schalten?
@Andi: Ich glaube dafür müsste man die Firmware selbst umprogrammieren!
Danke für die schnelle antwort.
Ich habe einen “AVRISP mk II” Programmieradapter incl. AVR Studio 5.
Damit ist es ohne Probleme möglich eine neue Firmware zu flaschen.
Weiß jemand ob es die Orginal Firmware auch als Quellcode gibt?