Input Multiplexer für Arduino oder Mindstorms NXT

Mit diesem Multiplexer kann man mit einem Eingang und einem Ausgang zehn digitale Eingänge abfragen.

Mein Aufbau vom Mux mit allen Eingängen auf LOW

Mein Aufbau vom Mux mit allen Eingängen auf LOW

Der Multiplexer basiert, wie auch mein Output Multiplexer, auf dem IC 4017. Dieses hat 10 Ausgänge, wovon jeweils nur einer HIGH sein kann. Die Ausgänge werden der Reihe nach durch einen Impuls weiter gezählt. Jeder Eingang des Multiplexers wird an ein UND-Gatter angeschlossen, dessen anderer Eingang zu einem Ausgang vom IC 4017 führt.  Die Ausgänge der UND-Gatter werden, durch eine Diode geschützt, mit dem Multiplexer-Ausgang verbunden.

Hinweis: Ich habe cmos ICs verwendet. Wenn ein Eingang des Multiplexers nicht verbunden ist, ist er deshalb meist HIGH. Also empfiehlt es sich, nicht genutzte Eingänge mit Masse zu verbinden.

Teile

  • 1x IC 4017
  • 3x IC 74HC08
  • 10x Diode oder 10x LED + 150Ohm Widerstand
  • Das Übliche (Steckbrett, Kabel, …)
  • Arduino oder Mindstorms NXT + zerschnittenes NXT Kabel

Schaltpläne

Das IC 4017 wird wie folgt beschaltet. Der Clock Eingang des ICs 4017 wird als Steuereingang des Multiplexers genutzt.

Beschaltung des IC 4017

Beschaltung des ICs 4017

Jedes der 10 Input Module wird an einem (eigenen) Ausgang des ICs 4017 angeschlossen. Jedes Input Modul besteht aus einem UND-Gatter und einer Diode bzw. LED + Widerstand zum schützen des Gatters. Die Ausgänge aller Input Module werden zusammen geschlossen und bilden den einzigen Ausgang des Multiplexers.

Das Input Modul aus UND-Gatter und Diode

Das Input Modul aus UND-Gatter und Diode

In dem IC 74HC08 sind 4 UND-Gatter untergebracht.

Das IC 74HC08 mit seinen UND-Gattern

Das IC 74HC08 mit seinen UND-Gattern

Arduino Verbindung

Der Steuereingang des Multiplexers (Clock bei dem IC 4017) wird an den digitalen PIN 13 des Arduinos angeschlossen. Der einzige Ausgang des Multiplexers (alle verbundenen IM-Ausgänge) wird an den digitalen PIN 2 des Arduinos angeschlossen.

Mindstorms Verbindung

An einem SensorPort hat der Mindstorms NXT 3 Ausgänge oder 3 Eingänge zur Verfügung. (Eine genauere Erklärung habe ich hier geschrieben)

Um den Multiplexer mit dem Mindstorms zu nutzen, verbindet man PIN 5 (GELB) mit dem Steuereingang des Multiplexers (Clock bei dem IC 4017) und PIN 6 (BLAU) mit dem einzigen Ausgang des Multiplexers (alle verbundenen IM-Ausgänge).

Arduino Test-Programm

Das Arduino Test-Programm liest der Reihe nach alle Eingänge des Multiplexers aus und schickt sie per Serial an den PC.

int pos = 0;
void setup() {
 //to the clock-input of IC 4017
 pinMode(13, OUTPUT);
 // start serial port at 9600 bps:
 Serial.begin(9600);
 //to the Output of the Mux
 pinMode(2, INPUT);
 //wait 5s (time to open the Serial Monitor)
 delay(5000);
}

void loop() {
 pos ++;
 if(Serial.available() <= 0) {
 if(ledpos == 10){
 ledpos = 0;
   Serial.print('\n');
  }
 Serial.println(digitalRead(2));
 }
 //Wait a bit bevor the next Impuls
 delay(500);
 //Impuls to change to the next IM
 digitalWrite(13, HIGH);
 digitalWrite(13, LOW);
}

Mindstorms NXT Test-Programm (leJOS)

Das Mindstorms Test-Programm gibt der Reihe nach alle Werte des Multiplexers auf dem Display aus:


import lejos.nxt.Button;
import lejos.nxt.SensorPort;

public class DEMUX {

public static void main(String[] args) throws InterruptedException {
 int pos = 0;
 //work with SensorPort 1
 SensorPort sp = SensorPort.S1;
 //define YELLOW as Output and BLUE as Input
 sp.setSensorPinMode(SensorPort.SP_DIGI0, SensorPort.SP_MODE_OUTPUT);
 sp.setSensorPinMode(SensorPort.SP_DIGI1, SensorPort.SP_MODE_INPUT);
 //Read Mux while Escape isn't pressed
 while(Button.ESCAPE.isUp()){
 if(pos == 10){
 pos = 0;
 System.out.println();
 }
 System.out.print(sp.getSensorPin(SensorPort.SP_DIGI1));
 //Wait a bit
 Thread.sleep(500);
 //Trigger Impuls for Clock from IC 4017
 sp.setSensorPin(SensorPort.SP_DIGI0, 1);
 sp.setSensorPin(SensorPort.SP_DIGI0, 0);
 pos++;
 }
 }
}

Mindstorms NXT MuxSensor (lejos)

Die Klasse MuxSensor kann im leJOS-Programm wie jede andere Sensor-Klasse genutzt werden.

Sie wird durch einen einfachen Aufruf von

MuxSensor mux = new MuxSensor(SensorPort.S1, SensorPort.SP_DIGI1, SensorPort.SP_DIGI0);

eingebunden und per

System.out.println(mux.getValueOf(5));

abgefragt.

import lejos.nxt.SensorPort;

public class MuxSensor {

 private SensorPort port;
 private int output;
 private int input;

@SuppressWarnings("unused")
 private MuxSensor(){}

 public MuxSensor(SensorPort port, int InputPin, int OutputPin){
 this.port = port;
 this.output = OutputPin;
 this.input = InputPin;
 port.setSensorPinMode(this.input, SensorPort.SP_MODE_INPUT);
 port.setSensorPinMode(this.output, SensorPort.SP_MODE_OUTPUT);
 }

 //Maybe I'll add a StateChange listener
 //addMuxChangeListener(MuxChangeListener mcl)

 public int getValueOf(int Pin){
 for( int i = 0; i < Pin; i++ ){
 port.setSensorPin(output, 1);
 port.setSensorPin(output, 0);
 }
 return port.getSensorPin(input);
 }
}

Ein Gedanke zu „Input Multiplexer für Arduino oder Mindstorms NXT

  1. Pingback: Lichtsensor aus Reflexkoppler CNY 70 | backsite

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s