Beiträge getagged ‘pollin’

AVR-NET-IO nicht mehr via Ethernet erreichbar?

9 Februar 2010

Hier ein Tipp für diejenigen, die die IP des AVR-NET-IO von Pollin geändert haben (womöglich über die NetServer Software) und die sie dann weder über die alte noch die neue IP erreichen können.

Es kommt manchmal vor, dass die AVR-NET-IO nicht die angegebene sondern eine andere im gleichen Netz verwendet – das war auch bei mir der Fall. Um diese zu finden kann man natürlich alle 255 IPs im Netz manuell durchsuchen (telnet 192.168.0.2 50290, telnet 192.168.0.3 50290 etc.) – aber NMAP ist viel einfacher.

Damit kann man einfach das gesamte lokale Netz scannen und findet dann dank “Pollin Electronic GmbH” die korrekte IP sehr schnell wieder.

Man muss nur auf NMAP.org unter “Microsoft Windows Binaries” die aktuellste stabile Version downloaden, installieren und starten.

Unter “Ziel” oben links gibt man dann einfach das Netz gekürzt ein, z.B. 192.168.0.*und wählt bei “Profil” einfach “Ping scan” aus und klickt dann auf “Scan”. Nach ca. einer Minute sollte das AVR-NET-IO mit seiner IP gefunden sein:

Der Pfeil zeigt auf die Stelle, an der die IP des AVR-NET-IO zu finden ist.

Diese ist dann auf eine andere IP umkonfigurierbar.

Die NetServer-Software stellt keine Verbindung her?

Ganz gleich welche Einstellung im Feld AVR-IP vorgenommen wird, die NetServer-Software verwendet immer nur die bei Start initial angezeigte. Zur Lösung des Problem das Programm beenden und im Ordner, in dem sich die NetServer.exe befindet die Datei config.ini öffnen und in der Zeile “IP-Adress=…” die gefundene IP eintragen und das Programm wieder starten.

Nach einem Klick auf den “Connect”-Button sollte man direkt auf das AVR-NET-IO zugreifen können.

AVR-NET-IO mit PHP ansteuern

9 Februar 2010

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!");
}
?>

Download der Klasse

class AvrNetIo
{
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’);
}
}
?>

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