Über mich

Text? Mein Name ist Heiko, ich bin 33 Jahre alt und lebe im schönen Stralsund. Somit genieße ich mein Dasein als Informatiker in Meeresnähe. :)
Näheres findest du hier.

Neueste Kommentare

Beliebteste Artikel

Blogroll

Kategorien

Tag Cloud

Archiv

19.11.2011

Abacom USB Relaisboard

In der Steueranlage für mein Terrarium habe ich, wie bereits beschrieben, ein USB Relais Board der Ingeneursfirma Abacom verwendet, für welches es leider nur ein Active-X Steuerelement als Windows Treiber zum Download gibt.

Für alle, die dieses Board (zu finden auf ebay oder im Abacom Online Shop) auch unter Linux betreiben möchten, möchte ich hier den Quellcode eines entsprechenden Kerneltreibers zum Download anbieten.

Download

Version 1.0 – Features

  • Ansteuerung von bis zu 256 Boards (*)
  • Setzen der Zustände der Relais über einfache Eingabe eines Bytewerts
  • Auslesen der aktuellen Relaiszustände als Bytewert (**)
  • Standardisierter Zugriff auf das Gerät über Systemcalls so, dass sowohl einfache Konsolenbefehle (wie cat und echo) zur Bedienung genutzt werden können, als auch Filehandles in beliebigen Programmiersprachen

(*) Die Boards werden im /dev-Filesystem unter /dev/usb/relayboard0 bis /dev/usb/relayboard255 registriert, abhängig von der tatsächlichen Reihenfolge des Anschlusses. Die tatsächlich anwendbare Gesamtmenge der Relaisboards ist abhängig von weiteren am Bus betriebenen USB Geräten, da hier ein Limit von maximal 256 Geräten existiert.
(**) Da das Board das Auslesen der Zustände nativ nicht unterstützt, wurde dies als Softwarelösung im Treiber realisiert, um dem Entwickler der Endverbrauchersoftware diese Funktionalität einheitlich zur Verfügung zu stellen. Ein Entladen des Treibers löscht folglich sämtliche gespeicherte Zustände.

Installation

Da ein Kernelmodul speziell für den verwendeten Kernel kompiliert werden muss, macht es keinen Sinn hier vorkompilierte Versionen des Treibers bereitzustellen. Ich werde jedoch eine kurze Übersicht über den Installationsprozess geben, um auch Linuxanfängern die Nutzung des Treibers zu ermöglichen.

Nach dem Download der Sources wird das Archiv zunächst entpackt:

tar -xzvf /pfad/zu/abacom-relay.tgz

Im aktuellen Arbeitsverzeichnis wurde nun ein Ordner mit dem Namen “abacom-relay” erstellt.
Zum kompilieren des Treibers werden nun die Sources des aktuell verwendeten Kernels benötigt. Im Beispiel von Ubuntu installieren wir nun also das Paket “linux-source” für die aktuelle Version oder “linux-source-VERSION“, wenn der genutze Kernel nicht der aktuelle ist.

apt-get install linux-source

oder

apt-get install linux-source-VERSION 

z.B.: linux-source-2.6.38

Unter Ubuntu genügt dies, bei anderen Distributionen könnte es jetzt eventuell nötig sein, dass die Kernelsources zunächst konfiguriert werden, um die USB Unterstützung bzw. das dev-Filesystem zu aktivieren. Sollte dies zum Problem werden, schreibt mir eine E-Mail und ich werde das Prozedere näher erläutern.

Wir wechseln nun in das erstellte “abacom-relay” Verzeichnis

cd abacom-relay

und führen dort das Kommando

make

aus. (Falls dies nicht bekannt ist, was bei Ubuntu nicht der Fall sein sollte, müssen nun noch die Developertools installiert werden, da der Paketname hier ebenfalls von der Distribution abhängig ist -> E-Mail an mich oder google ;) )
Sobald make sein Werk vollendet hat findet sich im “abacom-relay” Verzeichnis eine Datei namens “abacomrelay.ko“. Dies ist der eigentliche Treiber. Mittels

insmod /pfad/zu/abacomrelay.ko

kann dieser nun manuell geladen werden und alles sollte wie gewünscht funktionieren.

Die Datei “75-abacom.rules”

Grundsätzlich wird diese Datei nicht zwangsläufig benötigt. Standardmäßig ist es jedoch nur dem root Nutzer gestattet auf die erzeugte Gerätedatei (/dev/usb/relayboard[0-255]) zuzugreifen. Soll auch ein unpriviligierter Nutzer die Berechtigung haben das Gerät zu bedienen, so muss diese Datei nach “/etc/udev/rules.d/” kopiert werden, da ein setzen der Zugriffsrechte über den Treiber seit Kernel 2.4 obsolet geworden ist.

Handhabung

Über die Gerätedatei kann nun auf das Gerät zugegriffen werden. Für das erste Board ist dies /dev/usb/relayboard0. Hierbei kann die Handhabung über Shellscript über Konsolenbefehle wie “cat” und “echo” realisiert werden.
Sowohl schreibend, als auch lesend wird hier mit Bytewerten gearbeitet, die folgendermaßen interpretiert werden: Das jeweils höchstwertige Bit steht für den Zustand des Relais 8, das niederwertigste für Relais 1. Der Wert 128 steht folglich für “Relais 8 an, alle anderen aus”, 255 für “Alle Relais an”, 0 für “Alle Relais aus” und so weiter. Das (de)aktivieren einzelner Relais kann folglich mit Hilfe der Auslesefunktion des Boardstatus über Bitoperatoren realisiert werden, “Aktueller Status | 128″ (1000 0000) aktiviert beispielsweise das 8. Relais und belässt alle anderen Relais auf ihrem aktuellen Status.
Um über Programmiersprachen, wie beispielsweise C, auf das Gerät zuzugreifen bedient man sich der Fileoperationen write und read der aktuellen Sprache, indem man ein handle auf die device-Datei öffnet.
Zu beachten ist hierbei, dass für die korrekte Terminierung des Kommandozeilentools “cat” ein “Timeout” implementiert wurde, der das Auslesen des Status nur einmal alle 500ms pro geöffneten handle zulässt und bei weiteren Anfragen innerhalb dieses Zeitraums ein “EndOfFile” zurückliefert.

Beispiel:

echo 128 > /dev/usb/relayboard0

Aktiviert Relais 8, deaktiviert alle anderen Relais dieses Boards.

cat /dev/usb/relayboard0

Liefert nun die Ausgabe “128″.

Ausgewertet wird hierbei nur das niederwertigste Byte des gesendeten Wertes, somit ergibt eine Eingabe von “256″ beispielsweise “0″ und damit “Alle Relais aus”. Eine nicht numerische und damit nicht auswertbare Eingabe wird ignoriert, der Zustand der Relais bleibt unverändert.

Für alle, die mit Bitoperationen nichts anfangen können

Bit: 8 7 6 5 4 3 2 1
Bitwert: 128 64 32 16 8 4 2 1
Relais: 8 7 6 5 4 3 2 1

Möchte man nun Relais 8,7 und 1 aktivieren und alle anderen deaktivieren, so sendet man den Wert 128 + 64 + 1 = 193. Vertretene “Bitwerte” stehen also für aktivierte Relais, ist ein Wert nicht in der Summe vertreten, so ist das entsprechende Relais deaktiviert.
Alle möglichen Kombinationen von aktvierten und deaktivierten Relais lassen sich somit über einen Wert zwischen 0 und 255 darstellen, der über die Summe der Bitwerte gebildet wird.

2 Kommentare »

  1. 1
    Mnauel Kuhn schrieb am 31. July 2012 um 21:49


    Hallo und sehr vielen Dank für dieses schöne Kernelmodul.
    Ich habe ein Script zusammengeschrieben mit denen man die einzelnen Relais schön schalten kann.
    https://dreivierteleins.de/relais
    mit sicherheit unsauber, jedoch funktional
    ich bitte den ersten, verkorksten, kommentar zu löschen.
    thx
    manuel

  2. 2
    Hans Jürgen Mayer schrieb am 14. March 2013 um 00:07


    Hallo

    vielen Dank dass du das kernelmodul allgemein zur Verfügung stellst.
    Ich würde gerne aus einem C Programm darauf zugreifen, weiss aber zum Beispiel nicht, was ein handle ist und wie man damit umgeht. Es wäre toll, wenn du ein einfaches Beispiel in C geben könntest, das zeigt, wie man mit dem Treiber kommuniziert. Ich hoffe, dass das nicht zu viel Mühe macht.

    Danke vielmals
    hajo

Kommentar schreiben:

XHTML: Erlaubte Tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Blogverzeichnis - Blog Verzeichnis bloggerei.de    © 2011 – Powered by WordPress – Theme Papyrus 1.0 designed by Leonardo da Finchi