Linux Scripte starten mit IOW40 Inputs

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

RudiOnTheAir
Posts: 11
Joined: Fri Sep 24, 2010 9:30 am

Linux Scripte starten mit IOW40 Inputs

Post by RudiOnTheAir »

Moin

Bin seit ein paar Tagen Besitzer eines IO Warrior 40. Ich würde das Gerät gerne als Steuerung einer Softwareautomation unter Linux nutzen.

Konkret sind das ca. 20 Tasten, die jeweils ein zugeordnetes Script aufrufen sollen, in dem dann die entsprechende Funktionen aktiviert werden.

Das ganze unter Ubuntu LTS 10.04.

Ich bin jetzt soweit gekommen, das der Treiber wohl korrekt geladen wird. Das Testprogramm lässt zumindest die LEDs blinken und reagiert auf den Tastendruck.

Nun weiss ich aber nicht weiter. ? Ich hatte jetzt gehofft, das ich Linux-like eine Textdatei passend editiere und fertig. Aber so einfach ist das wohl nicht. Der Java_install meldete gleich nach dem Start, das "nichts zu tun wäre". Komisch. Ist das mit dem Java denn für die Funktion überhaupt erforderlich.? Oder soll das nur die Konfiguration erleichtern.??

Hat evtl. jemand hier im Forum sowas im Prinzip schonmal realisiert, und kann mir einen Schubs in die richtige Richtung geben.?

Bin für jeden Hinweiss dankbar...

--
Rüdiger
towaibw
Posts: 198
Joined: Sat Dec 27, 2003 10:55 pm
Location: Berlin / Germany
Contact:

Re: Linux Scripte starten mit IOW40 Inputs

Post by towaibw »

Hallo Rüdiger,

nativ programmierts Du die Programme für die IO-Warrior unter Linux in C. Java kommt da erst einmal nicht vor. Ein JNI Interface ist in der Lib aber vorhanden, so das Du die IO-Warriors auch mit Javaprogrammen steuern kannst. Möchtest Du Java benutzen und Dir Arbeit sparen, könntest Du Dir IOWJ (Achtung Reklame!) ansehen. Da habe ich mal einen Vorschlag gemacht, wie man mit einem Kontakt ein Programm starten kann:

http://www.wagner-ibw.de/iowbatch.html

Der Vorschlag ist zwar mit Windows realisiert worden, aber prinzipiell funktioniert IOWJ auch unter Linux (habe ich lange nicht mehr ausprobiert, das letzte mal unter Suse 10).

Gruß Thomas
RudiOnTheAir
Posts: 11
Joined: Fri Sep 24, 2010 9:30 am

Re: Linux Scripte starten mit IOW40 Inputs

Post by RudiOnTheAir »

Moin

Programmieren mit C...

Leider hab ich bis auf Scripte unter Linux überhaupt keine Kenntnisse in Sachen Programmieren.

Der Baustein soll dann an einer Radioautomation die Audiooutput steuern. Deswegen die Frage nach dem erforderlichen JAVA während des Betriebs. Die/die Rechner sollen allein aus Gründen der Sicherheit und Performance keine zusätzlichen Anwendungen laufen haben.

Oder wird der Baustein nur einmal programmiert, und dann läuft das so.??
towaibw
Posts: 198
Joined: Sat Dec 27, 2003 10:55 pm
Location: Berlin / Germany
Contact:

Re: Linux Scripte starten mit IOW40 Inputs

Post by towaibw »

Scripte steuern in der Regel etwas. Du möchtes das aber in Abhängigkeit von den IO-Warrior Pins und ohne Programmierung (außerhalb des Scriptes). Du bräuchtes also ein fertiges Programm, welches Dir über stdout mitteilt, welche Pins gedrückt oder losgelassen wurden. In Deinem Script müßtest Du in einer Schleifen dann zeilenweise diesen Output einlesen und in Abhängikeit vom Inhalt Deine Programme starten, stoppen, ... Habe ich das so richtig verstanden?. Wäre natürlich eine sinnvolle Erweiterung für IOWJ und somit für mich interessant.

Vorschlag: Das "Programm" liefert, wenn sich an den Pins etwas ändert (Standardverhalten der IOWs) eine Zeile der Art "L H H L ... L L L H" (Bit 31 zuerst, Bit 0 zuletzt). Mit awk könntest Du dann die Werte der einzelnen Bits auslesen und Deine Schlüsse daraus im Script ziehen. Was hälts Du davon? (Das wäre auch in C schell gmacht, ist aber nicht meine Baustelle ;-).

Gruß Thomas
Ich zitiere mich mal selber und ziehe den Vorschlag zurück, denn er funktioniert so nicht. Das Programm dürfte man nur einmal aufrufen und danach in einer Schleife zeilenweise den Output parsen. Oder geht das doch (kenne mich mit Scripten nicht mehr so gut aus)?

Oder Programm aufrufen und Ausgabe (stdout) in das Script als stdin pipen und da "foreach line in stdin" (sinngemäß ;-) ???????
towaibw
Posts: 198
Joined: Sat Dec 27, 2003 10:55 pm
Location: Berlin / Germany
Contact:

Re: Linux Scripte starten mit IOW40 Inputs

Post by towaibw »

So, erster Aufschlag fertig. Im Gegensatz zum Vorschlag aber mit LSB zuerst (awk Feldindex ist dann die Bitnummer +1). Funktioniert, wenn nur ein IOW angeschlossen ist. Welcher Typ (24, 40 , 56) ist egal.

Output von einem IOW40 Starterkit (Taster gedrückt, losgelassen, gedrükt, ...):

Code: Select all

L H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H  
H H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H  
L H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H  
H H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H  
L H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H  
H H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H 
Programm:

Code: Select all

/*
 * This File is part of the iowj-project   
 * $Id: IowRead.java,v 1.1 2010/09/26 13:23:08 Thomas Wagner Exp $
 * Copyright (C)2010 by Thomas Wagner
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package de.wagner_ibw.appl;

import java.util.NoSuchElementException;

import de.wagner_ibw.iow.AbstractIowDevice;
import de.wagner_ibw.iow.IowFactory;
import de.wagner_ibw.iow.IowPort;

/**
 * This simple application reports pin status via stdout in human readable format. LSB first.
 * @author Thomas Wagner
 */
public class IowRead {

    private static String reader;
    private static IowFactory devs;
    private static AbstractIowDevice dev;
    

    private void init() {
        devs = IowFactory.getInstance();
        if (devs.getNumDevices() == 0) {
            System.out.println("Cannot find any plugged IO-Warrior device!");
            devs.exit(-1);
            System.exit(-1);
        }

        try {
            dev = devs.getIowDevice();
        } catch (NoSuchElementException e) {
            System.out.println("No IO-Warrior device found!");
            devs.exit(-1);
            System.exit(-1);
        }
    }

    public static void main(String[] args) {
        IowRead reader = new IowRead();
        reader.init();
        
        while(true) {
            try {
                dev.readIOPorts();
                switch (dev.getId()) {
                    case (int) AbstractIowDevice.IOW24ID:
                    case (int) AbstractIowDevice.IOW40ID:        
                        for( int i = 0; i < dev.getPortCount(); i++) {
                            IowPort port = dev.getPort(i);
                            for ( int j = 0; j < 8 ;  j++) {
                                if ( port.isBitSet(j)) {
                                    System.out.print("H ");
                                } else {
                                    System.out.print("L ");
                                }
                            }
                            System.out.print(" ");
                        }
                        System.out.println();
                        break;
                    case (int) AbstractIowDevice.IOW56ID:
                        for( int i = 0; i < 6; i++) {
                            IowPort port = dev.getPort(i);
                            for ( int j = 0; j < 8 ;  j++) {
                                if ( port.isBitSet(j)) {
                                    System.out.print("H ");
                                } else {
                                    System.out.print("L ");
                                }
                            }
                            System.out.print(" ");
                        }
                        IowPort port = dev.getPort(6);
                        for ( int j = 0; j < 8 ;  j++) {
                            if (j == 0 || j == 7) {
                                if ( port.isBitSet(j)) {
                                    System.out.print("H ");
                                } else {
                                    System.out.print("L ");
                                }    
                            } else {
                                System.out.print("X ");
                            }
                        }
                        System.out.println();
                        break;
                }
            } catch (Exception e) {
                e.printStackTrace();
                devs.exit(-1);
                System.exit(-1);
            }
        }
    }
}
towaibw
Posts: 198
Joined: Sat Dec 27, 2003 10:55 pm
Location: Berlin / Germany
Contact:

Re: Linux Scripte starten mit IOW40 Inputs

Post by towaibw »

Jetzt noch das Script dazu (ich habe das mal mit Cygwin unter Windows simuliert ;-):

Code: Select all

 1 #!/bin/sh
 2 while read LINE; do
 3   BIT=`echo $LINE | gawk '{print $1}'`
 4   if [ "$BIT" = "L" ]; then
 5     echo "Taste gedrückt"
 6   else
 7     echo "Taste losgelassen"
 8   fi
 9 done < "/dev/stdin"
Aufgerufen so:

Code: Select all

$ cat read.txt | script
liefert als Output folgendes:

Code: Select all

Taste gedrückt
Taste losgelassen
Taste gedrückt
Taste losgelassen
Taste gedrückt
Taste losgelassen
reat.txt hat folgenden inhalt:

Code: Select all

L H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H
H H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H
L H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H
H H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H
L H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H
H H H H H H H H  H H H H H H H H  H H H H H H H H  H H H H H H H H
Ersetzt man "cat read.txt" durch das neue Programm, sollte es funktionieren.

Gruß Thomas
RudiOnTheAir
Posts: 11
Joined: Fri Sep 24, 2010 9:30 am

Re: Linux Scripte starten mit IOW40 Inputs

Post by RudiOnTheAir »

Moin

Das war schon sehr hilfreich. Danke

Noch ein paar allgemeine Verständnissfragen

Der IOW40 kann ja 8 LED direkt ansteuern. Die Ausgänge könnte ich ja dann direkt zu den Tastern legen, und eine LED da ohne R vorsehen.? Oder muss! das über einen Transisor laufen.?

Der IOW24 hat auch diese 8 LED OUT.?? Oder nur der eine, an dem die LED dran ist.? P0.3...

Oder ist das alles Unsinn, und es ist am besten ein Relais zu nehmen und die 24 Volt vom Pult direkt auf die Lampen zu legen.?

--

Rüdiger
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Linux Scripte starten mit IOW40 Inputs

Post by Guido Körber »

Also an die LEDs sollte ein Vorwiderstand ran, was wir auf dem Starterkit machen ist nicht ganz sauer, funktioniert aber so lange man weiss was man tut. Da nutzen wir die Tatsache aus, dass die Ausgänge der IO-Warrior beim Low-Treiben bei steigendem Strom eine steigende Spannung haben. Die Pins an denen die LEDs hängen werden dadurch aber nie als Low zurück gemeldet.

Also besser wäre Tasten und LEDs an getrennte Pins und auf jeden Fall Widerstände ran an die LEDs.
RudiOnTheAir
Posts: 11
Joined: Fri Sep 24, 2010 9:30 am

Re: Linux Scripte starten mit IOW40 Inputs

Post by RudiOnTheAir »

Also besser wäre Tasten und LEDs an getrennte Pins und auf jeden Fall Widerstände ran an die LEDs.
Ja, die Taster und LED kommen getrennt.

Frage noch. Hat der IOW24 auch die 8 Ausgänge, die eine LED direkt treiben können, so wie der IOW40 .?
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Linux Scripte starten mit IOW40 Inputs

Post by Guido Körber »

Der IOW24 kann nur ca. 2 mA pro Pin sinken, also wird die LED nicht besonders hell.
RudiOnTheAir
Posts: 11
Joined: Fri Sep 24, 2010 9:30 am

Re: Linux Scripte starten mit IOW40 Inputs

Post by RudiOnTheAir »

Der IOW24 kann nur ca. 2 mA pro Pin sinken, also wird die LED nicht besonders hell.
Das stimmt.

Am praktischsten wäre ja beim IOW40, wenn der Port 3 kleine Reedrelais direkt treiben kann. Hab welche gefunden, die mit 5 Volt arbeiten, eine Diode drin haben... Das ganze mit 500 Ohm Spulenwiderstand. Bei 5 Volt sind das 10mA. Das sollte dann doch gehen.??
Möchte nur nichts beschädigen...?!

--
MfG
Rüdiger
pillepalle
Posts: 3
Joined: Tue Oct 21, 2008 4:40 pm

Re: Linux Scripte starten mit IOW40 Inputs

Post by pillepalle »

moin

zum treiben der Relais würde ich einen Treiberbaustein wie zBsp. ULN2803 oder so vorschlagen,da besteht dann auch nicht die Gefahr die Gesamtstromaufnahme des IOW zu überschreiten .

mfg
Test and try before you buy.
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Linux Scripte starten mit IOW40 Inputs

Post by Guido Körber »

Ja, Relais nie direkt mit dem IO-Warrior treiben, Spulen und Microcontroller vertragen sich nicht so gut.
RudiOnTheAir
Posts: 11
Joined: Fri Sep 24, 2010 9:30 am

Re: Linux Scripte starten mit IOW40 Inputs

Post by RudiOnTheAir »

zum treiben der Relais würde ich einen Treiberbaustein wie zBsp. ULN2803 oder so vorschlagen
Aha. Interessant. Da ist ja schon alles drin. Sehe ich das richtig, das hier einfach der OUT des IOW an den IN des ULN kommt.? Und die Relais dann an 5V vom USB, und dann an den OUT des ULN ohne weitere Beschaltung.?

Die Funktion von Pin 10 ist mir noch nicht klar.!? Ist der bei Relais nicht wichtig.?

--

Rüdiger
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: Linux Scripte starten mit IOW40 Inputs

Post by Guido Körber »

Ja, das sind die Freilaufdioden, ich habe die innenschaltung nicht im Kopf, Pin 10 muss so angeschlossen werden, dass sie im normalen Betrieb in Sperrrichtung liegen, dann wird die Spule beim Abschalten kurzgeschlossen wenn die Selbstinduktion die Gegenspannung erzeugt.
Post Reply