BT2k
HOME

Arduino als CompuLab (updated)
Compact erkennt Arduino
Mit einem kleinen Programm, was in Arduinokreisen Sketch genannt wird, gaukelt der Mikrocontroller Arduino einige Funktionen des CompuLab vor, so, dass Compact-Definition ihn als CompuLab erkennt und behandelt. Man hat somit ein USB-CompuLab an einer seriellen Schnittstelle ...
Die zwei Onboard-Spannungen des Arduino 5 V und 3,3 V werden angezeigt.

Die Möglichkeiten
Es werden zwei Analogeingänge (8 Bit-Auflösung) und acht Digitalausgänge unterstützt in diesem Sketch. Digitaleingaben sind nicht vorgesehen. Analogausgaben kennt CompuLab nicht. Mit diesen wenigen Möglichkeiten kann man in Compact aber:

- Zwei Analogwerte (A-Eingang und B-Eingang) mit Analogmetern anzeigen.
- Zwei Analogwerte in einem Zeitschreiber darstellen und exportieren.
- Zwei Analogeingänge in einem XY-Schreiber darstellen und exportieren.
- Acht Digitalports Schalten.

UND

- Programme für den compacteigenen Interpreter verfassen (Ein Lauflicht liegt bei)


Der Sketch
#define AIN1 60
#define AIN2 58
#define DIN 211
#define DOUT 81

//DIGITAL OUT 0 - 7
byte Douts[] = {6,7,8,9,10,11,12,13}; //DIGITALPINS
byte Bits[]  = {1,2,4,8,16,32,64,128};//BitValue
byte Ains[]  = {0,1}; //ANALOGPINS

void setup()
{ Serial.begin(9600);
  for(int i= 0;i<8;i++)pinMode(Douts[i],OUTPUT);
  for(int i= 0;i<2;i++)pinMode(Ains[i], INPUT);
}

void loop()
{ int i,val,inbyte ;byte b;
  val = Serial.available(); //Was da?
  if (val>0)
  {inbyte=Serial.read(); //abholen
   delay(1);
   switch(inbyte)
  { case 13  : Serial.write(2);delay(2);break; //ID
    case DIN : Serial.write(255);break; //Für Compact
    case AIN1: Serial.write(analogRead(Ains[0])>>2);break;
    case AIN2: Serial.write(analogRead(Ains[1])>>2);break;
    case DOUT: b=Serial.read(); //Ausgabebyte holen
               for(i=0;i<8;i++)
                digitalWrite(Douts[i],b&Bits[i]?HIGH:LOW);
               break;
    default:   break;
  }
 }
 delay(5);
}

Die Benutzung (how to)
  • CompactDefinition 1.75b herunterladen und in ein Verzeichnis entpacken.
  • Den Sketch in den Arduino übertragen
  • Die Ausgänge 6,7,8,9,10,11,12,13 mit Leuchtdioden versehen.
  • Eine Verbindung AnalogIn 0 zu 5 Volt und AnalogIn 1 zu 3,3 Volt als Beispiel.
  • CompactDefinition starten. (Startet erst mit langsam wechselnden Spannungen)
  • Hardware Suchen drücken. (evtl. mit der Strg-Taste)

Bei gedrückter Strg-Taste sollte nebenstehende Meldung sichtbar werden. Wenn alles richtig funktioniert, kann man nun die Leuchtdioden schalten, die Analogspannungen registrieren oder das Lauflicht laden (Rechte Maustaste im Programmfenster). Eine ausführliche Beschreibung zu CompactDefinition findet man hier.


Erweiterung

Betrachtet man die Anschlussmöglichkeiten des Arduino, so kommt man auf die Zahl 20. Zwei der Digitalleitungen werden für die serielle Kommunikation benutzt und sollten darum unbeschaltet bleiben. Es bleiben 18 I/O-Leitungen.
Das CompuLab hat 2 Analogeingänge, 8 Digitaleingänge und 8 Digitalausgänge. In der Summe 18 I/O-Leitungen. Das kann kein Zufall sein.

Mit einem weiteren Sketch könnte die Emulation perfektioniert werden. Die Dummyfunktion DIN aus dem ersten Sketch wird zum Leben erweckt (mit DIN prüft Compact, ob die Hardware noch lebt. Darum zunächst die Rückgabe von konstant 255). Die Pins werden etwas umgeordnet und 4 Analogeingänge werden als Digital-Anschlüsse benutzt, wie schon bei der Rheinturmuhr. Also an die Arbeit ...

//COMMANDS CLAB
#define AIN1 60
#define AIN2 58
#define DIN 211
#define DOUT 81

//DIGITAL OUT PINS 0 - 7 CLAB
byte Douts[] = {10,11,12,13,  16,17,18,19};
//DIGITAL IN  PINS 0 - 7 CLAB
byte Dins[]  = { 2, 3, 4, 5,   6, 7, 8, 9}; 
//ANALOG IN PINS A - B CLAB
byte Ains[]  = {0,1}; 
//BitValues
byte Bits[]  = {1,2,4,8,16,32,64,128};

void setup()
{ Serial.begin(9600); //Special CLAB
  for(int i= 0;i<8;i++)pinMode(Douts[i],OUTPUT);
  for(int i= 0;i<2;i++)pinMode(Ains [i],INPUT);
  for(int i= 0;i<8;i++)
  {pinMode(Dins [i],INPUT);    //OPEN IS HIGH
   digitalWrite(Dins[i],HIGH); //WITH PULLUP 
  }
}

void loop()
{ int i, val, inbyte; byte b;
  val = Serial.available(); //Was da?
  if (val>0)
  {inbyte=Serial.read(); //abholen
   delay(5);
   switch(inbyte)
  { case 13  : //CLAB ID nur bei Compact 1.75!
               Serial.write(2);delay(2);break; //ID
    case DIN : for(i=0,b=0;i<8;i++) //PINS to BYTE
                b+= (digitalRead(Dins[i])==HIGH?Bits[i]:0);
               Serial.write(b);break; 
    case AIN1: Serial.write(analogRead(Ains[0])>>2);break;
    case AIN2: Serial.write(analogRead(Ains[1])>>2);break;
    case DOUT: b=Serial.read(); //Ausgabebyte holen
               for(i=0;i<8;i++)
                digitalWrite(Douts[i],b&Bits[i]?HIGH:LOW);
               break;
    default:   break;
  }
 }
 delay(10);
}

Die Arduino-Pins 0, 1 wurden ausgespart wegen der seriellen Kommunikation. Pin 13 bleibt Ausgang, da er auf dem Board schon eine LED speist. Die Pullup-Widerstände sorgen bei den Digitaleingängen dafür, dass offene Pins als HIGH erscheinen. Somit ergeben die Eingänge unbeschaltet das Byte 255, wie schon in der Version 1.

Jetzt kann schließlich der Bitschreiber benutzt werden, der die acht Digitaleingänge als Datenlogger darstellt.

Der Quelltext als gepackte Datei (zip) kann hier geladen werden.

Jetzt fehlen noch die Schraubklemmen und das Gehäuse ...


Weitere Software

.
Startseite Bücher Software Digital TV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt