Logische poorten

Een logische poort geeft een uitvoersignaal dat maar twee waarden kan aannemen: laag of hoog (0 volt of 5 volt). Het is gebruikelijk om in plaats van laag en hoog de termen False en True of 0 en 1 te gebruiken. De invoer bestaan uit één of meer signalen die eveneens maar twee waarden kunnen aannemen: laag of hoog. Bij de Arduino wordt het lage signaal opgevat als False (of 0) en het hoge als True (of 1). Omdat signalen niet ideaal zijn worden spanningen tot ca. 2 volt als False opgevat en spanningen daarboven als True. Zo wordt bereikt dat altijd duidelijk wat de logische waarde van een spanning is. De uitvoer van logische poorten is gebaseerd op de booleaanse logica. Zo geldt voor een EN-poort dat alleen als alle ingangen waar zijn, de uitgang ook waar is en anders ONWAAR. Bij een OF-poort geldt dat als een of meer van de ingangen waar zijn, de uitgang ook waar is; als alle ingangen onwaar zijn dan is de uitgang onwaar. Waar kun je een OF poort bijvoorbeeld voor gebruiken? Stel je hebt een robotkarretje. Om te voorkomen dat deze ergens tegenop botst, gebruik je drie sensoren: een IR afstandsmeter, een geluidsafstandmeter en als laatste redmiddel twee antennes. Als een of meer van deze sensoren aanslaan moet het karretje meteen stilstaan. Door een OF-poort te gebruiken heb je nu maar een pin van je Arduino nodig. Dat is belangrijk omdat je voor deze toepassing met interrupt functies moet werken en er zijn maar enkele pinnen op de Arduino waarmee dat kan. De werking van een poort kun je makkelijkst weergegeven in een waarheidstabel: hierin staat voor elke waarde wat de uitkomst is van de poort.

Standaard symbolen

Er zijn verschillende systemen om logische poorten aan te duiden. In de documentatie van de IC's zul je vaak Amerikaanse symbolen tegenkomen, maar tegenwoordig zie je ook vaak de door de IEC aanbevolen symbolen. De symbolen van beide systemen zie je hieronder. Andere systemen worden veel minder gebruikt.
Toelichting

Bij de bovenste twee symbolen in de meest linkse kolom is de uitgang gelijk aan de ingang. Dat lijkt zinloos, maar in de praktijk past men dit toe om het signaal te versterken zodat de poort bijvoorbeeld stroom kan leveren. Het is geen toeval dat het Amerikaanse symbool hetzelfde is als dat van een versterker.

Ik gebruik in het vervolg het Amerikaanse systeem.

Koop de juiste IC's

DIP14DIP-14 chip
Als je wilt experimenteren met logische poorten, koop deze dan in DIP-14 uitvoering. DIP betekent dual in package en 14 geeft het aantal pootjes aan. Deze passen precies op een breadboard en hebben altijd dezelfde aansluitingen voor VCC en GND. Aan een kant van de chip zie je een uitsparing in de vorm van een halve cirkel. Links hiervan zit pootje 1 en rechts daarvan pootje 14. Je hebt niet alle soorten logische poorten nodig, want je kunt elke denkbare logische schakeling maken met alleen Niet-EN (Engels: NAND) poorten en inverters.
Tip: bij nieuwe chips staan de pootjes meestal iets te ver uit uitkaar. Het beste kun je de zeven pootjes van een zijde tegen een tafelblad houden en dan het IC voorzichtig kantelen, zodat de pootjes iets naar binnen gaan. Als je dat bij beide zijden doet dan staan de pootjes ook beter recht. Als de afstand precies klopt dan gaat het IC heel gemakkelijk in het breadboard.

Poorten die je niet gebruikt hoef je ook niet aan te sluiten. Als je een poort gebruikt met meer dan twee ingangen moet je ingangen die je niet nodig hebt aan aarde leggen bij een OF (of NIET-OF) poort en aan VCC bij een EN (of NIET-EN) poort. Dat hoeft niet (maar kan ook geen kwaad) als het IC ingebouwde PULL-DOWN respectievelijk PULL-UP weerstanden heeft.
Veel voorkomende configuratie

Een veel voorkomende situatie: een chip met vier poorten. Vaak zijn deze poorten in de chip aangebracht volgens het schema hiernaast. Aan het symbool zie je dat dit een viervoudige OF schakeling is, maar het schema geldt ook voor EN en XOF en de bijbehorende NIET-poorten. Ik geef bij alle door mij gebruikte chips aan hoe de eerste poort moet worden aangesloten. Als je een ander type IC hebt dan die hieronder beschreven zijn dan moet je zelf nagaan hoe dit moet worden aangesloten via de datasheet die bij dat IC hoort. Je kunt een IC kapot maken als je het verkeerd aansluit.
Bij bijna alle DIP-14 IC's sluit je GND aan op pootje 7 en VCC op pootje 14 (zie het schema hiernaast).
schakelaarslinks: geen weerstand als je schakelt tussen VCC en GND; rechts: weerstand nodig.
Pas op als je een schakelaar gebruikt: veel drukknoppen zijn nergens op aangesloten tot je ze indrukt. Daarom moet je de uitgang van de schakelaar met een weerstand verbinden met GND (als de schakelaar is aangesloten op VCC of met VCC (als de schakelaar is aangesloten op GND). Kies een vrij grote weerstand (tientallen kΩ), want als de knop wordt ingedrukt wil je zo weinig mogelijk stroom trekken.

Twee programma's

Hieronder staan twee programma's die je kunt gebruiken om een poort te testen. Ze zijn bedoeld voor poorten waarvan je twee ingangen (A en B) gebruikt. Deze sluit je aan op de Arduino, pin 2 en pin 3. De uitvoer (Y) sluit je aan op pin 4. Als je een poort hebt met meerdere ingangen dan moet je de overige pinnen soms op GND of juist op VCC aansluiten.
Het programma WelkePoort.ino probeert uit te vinden welk type poort is aangesloten; het programma Tabel.ino geeft de waarheidstabel van de aangesloten poort weer.

// Waarheidstabel.ino ©Th.M. Hupkens, 2023
#define pinA 2
#define pinB 3
#define pinY 4
void setup() {
  pinMode(pinA, OUTPUT); 
  pinMode(pinB, OUTPUT);
  pinMode(pinY, INPUT); 
  Serial.begin(9600);
  Serial.println("  A\t  B\t  Y");
  bool tf[] = {false, true};
  for (bool A: tf){
    digitalWrite(pinA, A);
    for (bool B: tf){
      Serial.print(A ? "True\t": "False\t");
      digitalWrite(pinB, B);
      Serial.print(B ? "True\t": "False\t");
      bool Y = digitalRead(pinY);
      Serial.println(Y ? "True": "False");
    }
  }
}

void loop() {}

Dit programma laat de waarheidstabel zien.

// WelkePoort.ino ©Th.M. Hupkens, 2023
#define pinA 2
#define pinB 3
#define pinY 4
void setup() {
  pinMode(pinA, OUTPUT); 
  pinMode(pinB, OUTPUT);
  pinMode(pinY, INPUT); 
  String naam[] = {"EN", "OF", "XOF", "NEN", "NOF", "XNOF"};
  bool poort[] = {true, true, true, true, true, true};
  Serial.begin(9600);
  bool ft[] = {false, true};
  for (bool A: ft){
    digitalWrite(pinA, A);
    for (bool B: ft){
      digitalWrite(pinB, B);
      bool Y = digitalRead(pinY);
      if ( (A and B) != Y ) poort[0] = false;
      else poort[3] = false;
      if ( (A or B) != Y ) poort[1] = false;
      else poort[4] = false;
      if ( (A xor B) != Y) poort[2] = false;
      else poort[5] = false;    }
  }
  for (byte i = 0; i < 6; i++) 
     if (poort[i]) Serial.println("Dit is een " + naam[i] + " poort.");
}

void loop() {}

Dit programma laat zien welk type poort is aangesloten. Als je geen uitvoer krijgt, dan is er iets mis met het IC of de aansluitingen.

EN-poort (Engels: AND-gate)

Getest: 74HC11. Deze chip heeft drie EN-poorten, elk met drie ingangen. Sluit deze als volgt aan: pootje 1 (A) en pootje 2 (B) naar pin 2 en pin 3 van de Arduino, pootje 3 (C) naar VCC en pootje 12 (Y) naar pin 4 van de Arduino.
Uitvoer van Waarheidstabel.ino en van WelkePoort.ino:
  A	  B	  Y
False	False	False
False	True	False
True	False	False
True	True	True
Dit is een EN poort.

OF-poort (Engels: OR-gate)

Getest: type CD4071BCN en de identieke SN74AC32N. Deze chip heeft vier OF-poorten, elk met twee ingangen. Sluit pootje 1 (A) en pootje 2 (B) aan op pin 2 en pin 3 van de Arduino en pootje 3 (Y) op pin 4.
Je kunt een OF-poort met meer ingangen maken door de uitgangen van enkele OF-poorten te verbinden met de ingang van een andere OF-poort.
Uitvoer van Waarheidstabel.ino en van WelkePoort.ino:
False	False	False
False	True	True
True	False	True
True	True	True
Dit is een OF poort.

Niet-OF-poort (Engels: NOR-gate)

Getest: type SN74HC02N.
Deze chip heeft vier apart poorten, met elk twee ingangen. De poorten zijn in deze chip gespiegeld t.o.v. het standaardschema. Sluit pootje 2 (A) en pootje 3 (B) aan op pin 2 en pin 3 van de Arduino en pootje 1 (Y) op pin 4 van de Arduino.
Uitvoer van Waarheidstabel.ino en van WelkePoort.ino:
  A	      B	      Y
False	False	True
False	True	False
True	False	False
True	True	False
Dit is een NOF poort.

Exclusieve OF-poort (Engels: XOR gate = eXclusive OR)

Getest: CD4070BE en de 74HC86. Deze chips hebben vier XOF poorten; ze kunnen worden getest met schema 1. Een XOF port heeft altijd twee ingangen. De uitgang is True als precies een van beide ingangen True is.
Uitvoer van Waarheidstabel.ino en van WelkePoort.ino:
  A	  B	  Y
False	False	False
False	True	True
True	False	True
True	True	False
Dit is een XOF poort.

Exclusieve NIET OF poort (Engels: XNOR gate = eXclusive NOR gate)

Getest: type CD4077BE. Deze poort bevat vier poorten. Hij wordt hetzelfde aangesloten als de Exclusieve OF-poort hierboven.
Uitvoer van Waarheidstabel.ino en van WelkePoort.ino:
  A	  B	  Y
False	False	True
False	True	False
True	False	False
True	True	True
Dit is een XNOF poort.

Niet-EN poort (Engels: NAND gate)

Aansluitschema (A, B en C zijn ingangen. Y is de uitgang)
Getest: type 74HC00. Deze chip heeft vier NEN-poorten. Sluit pootje 1 (A) en pootje 2 (B) aan op pin 2 en pin 3 van de Arduino en pootje 3 (Y) op pin 4.
Ook getest: type 74HC10AP (zie het schema hiernaast). Dit is een chip die drie poorten bevat met elk drie ingangen. Sluit pootje 1 (A) en 2 (B) aan op pin 2 en pin 3 van de Arduino en sluit pootje 12 (Y) aan op pin 3.
Als alle ingangen True zijn dan is de uitgang False; in alle andere gevallen is de uitgang True.
Uitvoer van Waarheidstabel.ino en van WelkePoort.ino:
False	False	True
False	True	True
True	False	True
True	True	False
Dit is een NEN poort.

NIET poort (Engels: NOT gate, inverter)

Deze poort wordt bijna altijd inverter genoemd. Door mij getest: type 74HC04D.
Fritzing schemaTekening van mijn tester met 3 volt knoopcel
De 74HC04 serie heeft 6 inverters, die onafhankelijk van elkaar kunnen worden gebruikt. Toepassingen met de Arduino zie ik alleen in gebruik met andere poorten. Toepassingen buiten de Arduino zijn er genoeg: als je een sensor hebt waarbij het lampje aangaat als de sensor iets meet dan kun je dat omdraaien met zo'n inverter. De eisen van deze chip zijn zo laag, dat ze met een 3 volt knoopcel kunnen worden gebruikt; ik heb dat getest met een schakeling volgens het schema hiernaast. Zoals altijd is pin 14 VCC en pin 7 GND. De oneven genummerde pootjes zijn de ingangen en het eerstvolgende pootje de bijbehorende uitgang. Als je dus één inverter nodig hebt dan kun je daarvoor pootje 1 en pootje 2 gebruiken. De weerstand die je ziet is de PULL-DOWN weerstand; deze zorgt ervoor dat als de schakelaar niet wordt ingedrukt, het pootje op 0 volt staat. Als je de led lang aan laat is het verstandig om een extra weerstand van ca. 100 Ω aan te brengen.

Buitenbeentjes

Er zijn tal van logische IC's met een bijzondere indeling. Ik beschrijf er één van.

74HC30N

Dit is een NIET-EN, met acht ingangen. Een mogelijke toepassing is: de robot mag alleen gaan rijden als aan acht voorwaarden is voldaan. Denk aan: voeding OK, verlichting OK enzovoorts. Sluit de uitgang aan op een van de digitale pinnen van de Arduino en lees in een lus de waarde af, net zolang tot deze nul is.