Code zoeken

Les 22/31: Gebruik van een Zeven-Segment Display met Arduino en Elektronische Dobbelsteen | SunFounder Robojax

Les 22/31: Gebruik van een Zeven-Segment Display met Arduino en Elektronische Dobbelsteen | SunFounder Robojax

In deze les onderzoeken we hoe we een zevensegmentdisplay met een Arduino kunnen aansturen. In plaats van een dozijn of meer I/O-pinnen te gebruiken om elk LED-segment direct aan te sturen, gebruiken we een slim trucje: een schuifregister. Deze kleine, goedkope chip laat ons alle zeven segmenten (plus de decimale punt) aansturen met slechts drie draden van de Arduino. Dit is een fundamentele techniek in de elektronica waarmee je het aantal uitgangen op je microcontroller kunt uitbreiden, waardoor je complexere projecten kunt bouwen zonder je bord te upgraden.

bedrading op breadboard uit video

Naast de basisteller bouwen we een elektronische dobbelsteen. Dit project versterkt niet alleen de displaybesturing, maar introduceert ook gebruikersinvoer via een drukknop en het concept van interrupts, waardoor een responsief en interactief apparaat ontstaat. Deze gids is gebaseerd op een les uit de Robojax Arduino-cursus, die gebruikmaakt van de SunFounder 3-in-1 Arduino-kit.

Hier zijn een paar praktische ideeën die je met deze kennis kunt bouwen:

  • Maak een eenvoudig scorebord voor spellen zoals tafeltennis of basketbal.
  • Bouw een digitale timer voor bordspellen of een keuken-afteltimer.
  • Maak een willekeurige nummergenerator voor spellen of besluitvorming.
  • Construeer een basis digitale thermometer door een temperatuursensor toe te voegen.

Hardware en componenten

Voordat we beginnen, verzamelen we de benodigde componenten. De kern van dit project is het 74HC595-schuifregister, dat de sleutel is tot het minimaliseren van het aantal benodigde pinnen. In plaats van elk van de zeven segmenten direct op de Arduino aan te sluiten, verbinden we ze met het schuifregister. De Arduino stuurt vervolgens de gegevens voor een cijfer serieel (één bit tegelijk) naar de chip, die vervolgens het juiste patroon uitvoert om de segmenten te laten oplichten.

  • Arduino Uno (of compatibel bord)
  • Zevensegmentdisplay (model 5161AS, gemeenschappelijke kathode)
  • 74HC595-schuifregister IC
  • Drukknop
  • Weerstanden (220Ω - 330Ω)
  • Jumperdraden
  • Breadboard

Het 5161AS-display is van het type gemeenschappelijke kathode. Dit betekent dat alle kathodes (de negatieve zijden) van de interne LED's met elkaar zijn verbonden op een gemeenschappelijke aardingspin. Om een segment te laten oplichten, lever je een positieve spanning aan de specifieke anode-pin. De 74HC595 fungeert als een brug, die seriële gegevens van de Arduino neemt en de parallelle signalen uitvoert die nodig zijn om deze anodes aan te sturen.

Bedradingsgids

circuit_6.5_segment_schematic
segment_wiring_sundounder_3-in-1-kit

Het bedraden van het schuifregister en display kan lastig lijken, maar het stap voor stap volgen van het diagram is cruciaal. De video (op 04:48) biedt een gedetailleerde uitleg van dit proces. De 74HC595-chip heeft een inkeping aan één uiteinde om pin 1 te identificeren. De pinnen zijn tegen de klok in genummerd vanaf de inkeping (1-8 aan de ene kant, 9-16 aan de andere).

Hier is de bedradingssamenvatting uit de video:

  • Voeding en aarde: Verbind pin 8 en pin 13 van de 74HC595 met de aardrail. Verbind pin 10 en pin 16 met de 5V-rail.
  • Gegevenslijnen: Verbind de digitale pinnen van de Arduino met de gegevenspinnen van het schuifregister: Pin 12 (STcp) naar chippin 12, Pin 8 (SHcp) naar chippin 11, en Pin 11 (DS) naar chippin 14.
  • Display naar schuifregister: Dit is het meest complexe deel. De video (op 07:18) beschrijft elke verbinding in detail. Bijvoorbeeld, segment 'a' op het display verbindt met chippin 6, segment 'b' met pin 5, enzovoort. De gemeenschappelijke kathode-pinnen van het display worden via een weerstand met aarde verbonden.

Voor een visuele en nauwkeurige gids, raadpleeg het officiële bedradingsdiagram:

De exacte pinverbindingen zijn cruciaal en het is gemakkelijk om een fout te maken. Neem de tijd en controleer elke draad dubbel tegen het diagram. De video is een uitstekende bron om mee te volgen.

Dobbelsteen

Code-uitleg

Er worden twee codevoorbeelden gegeven in deze les. De eerste is een eenvoudige teller, en de tweede bouwt hierop voort om de elektronische dobbelsteen te creëren. Beide delen dezelfde kernlogica voor het aansturen van het display.

Hier is de code voor de basisteller:

const int STcp = 12;//Pin verbonden met ST_CP van 74HC595
const int SHcp = 8;//Pin verbonden met SH_CP van 74HC595 
const int DS = 11; //Pin verbonden met DS van 74HC595 

int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

Bovenaan de code kun je de drie pinnen configureren die verbonden zijn met het schuifregister. STcp, SHcp en DS zijn toegewezen aan Arduino-pinnen 12, 8 en 11, respectievelijk. De datArray[] is een cruciaal onderdeel. Het is een opzoektabel met de hexadecimale waarden voor cijfers 0 tot en met 9. Elke waarde vertegenwoordigt het patroon van segmenten dat moet oplichten voor dat specifieke cijfer.

De functie loop() laat de teller draaien. Deze gebruikt een for-lus om van 0 tot 9 te tellen. Binnen de lus stuurt de code de gegevens voor het huidige getal naar het schuifregister. De delay(1000) aan het einde bepaalt de snelheid van de teller in milliseconden. Verander deze waarde naar 100 voor een snellere telling, of naar 500 voor een langzamere.

De code voor de elektronische dobbelsteen introduceert een nieuw element: gebruikersinvoer via een knop. De belangrijkste configuratiewijzigingen zijn:

const int buttonPin = 2;
//...
pinMode(buttonPin, INPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), rollDice, FALLING);

Hier wordt buttonPin ingesteld op digitale pin 2. Deze pin is speciaal omdat deze kan worden gebruikt als interrupt. Een interrupt stelt de Arduino in staat om onmiddellijk te stoppen met wat het doet wanneer de knop wordt ingedrukt, wat zorgt voor een snelle en betrouwbare reactie. De FALLING-modus activeert de interrupt wanneer de knop wordt ingedrukt (het signaal gaat van HOOG naar LAAG).

De functie rollDice wordt aangeroepen door de interrupt. Deze schakelt de variabele state tussen 0 en 1. Wanneer state 0 is, is de dobbelsteen aan het "rollen" en zal de hoofd-loop() willekeurige getallen weergeven. Wanneer de knop opnieuw wordt ingedrukt, verandert state naar 1, waardoor de lus stopt en het eindresultaat wordt weergegeven. De functie showNumber() is hetzelfde als de tellerlogica, maar neemt een getal als argument om weer te geven.

Live-project en demonstratie

Zodra de code is geüpload, begint de teller te draaien en geeft getallen van 0 tot 9 weer met een vertraging van één seconde (in de video op 15:04). De video demonstreert het wijzigen van de vertraging om de teller veel sneller te laten draaien.

De demonstratie van de elektronische dobbelsteen (in de video op 20:15) laat de knop in actie zien. Wanneer je er eenmaal op drukt, begint het display snel door getallen te cyclen. Door opnieuw te drukken stopt het cyclen, waardoor een willekeurig getal tussen 1 en 6 wordt weergegeven, net als bij een echte dobbelsteen.

Hoofdstukken

  • [00:00] Introductie tot het project met zevensegmentdisplay
  • [01:25] Het zevensegmentdisplay begrijpen
  • [03:51] 5161AS-displaydatasheet en specificaties
  • [04:48] Het display en schuifregister bedraden
  • [12:24] Arduino-code voor de 0-9-teller
  • [15:04] Tellerdemonstratie en snelheid aanpassen
  • [16:27] Het project voor de elektronische dobbelsteen bouwen
  • [20:15] Demonstratie van de elektronische dobbelsteen en debouncen

Afbeeldingen

Wiring on breadboard from video
Wiring on breadboard from video
Circuit 6.5 segment schematic
Circuit 6.5 segment schematic
Dice
Dice
Segment wiring for Sunfounder 3-in-1 kit
Segment wiring for Sunfounder 3-in-1 kit
Segments of segment display
Segments of segment display
Seven segment pins - common cathode
Seven segment pins - common cathode
Seven segment pins - DP decimal pin
Seven segment pins - DP decimal pin
Seven segment pins - common cathode
Seven segment pins - common cathode
902-Lesson 23/31: Arduino code Using Seven Segment Display
Taal: C++
/*
Lesson 23/31: Using Seven Segment Display 
Get this code and watch video Download and resource page https://robojax.com/RJT605
YouTube video https://www.youtube.com/watch?v=3qoGAYh0lbc

*/
const int STcp = 12;//Pin connected to ST_CP of 74HC595
const int SHcp = 8;//Pin connected to SH_CP of 74HC595 
const int DS = 11; //Pin connected to DS of 74HC595 

int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void setup ()
{
  //set pins to output
  pinMode(STcp,OUTPUT);
  pinMode(SHcp,OUTPUT);
  pinMode(DS,OUTPUT);
}
void loop()
{
  for(int num = 0; num <10; num++)
  {
    digitalWrite(STcp,LOW); //ground ST_CP and hold low for as long as you are transmitting
    shiftOut(DS,SHcp,MSBFIRST,datArray[num]);
    digitalWrite(STcp,HIGH); //pull the ST_CPST_CP to save the data
    delay(1000);
  }
}
903-Lesson 23/31: Electronic dice
Taal: C++
/*
Lesson 23/31: Electronic Dice
Get this code and watch video Download and resource page https://robojax.com/RJT605
YouTube video https://www.youtube.com/watch?v=3qoGAYh0lbc

*/
const int STcp = 12;//Pin connected to ST_CP of 74HC595
const int SHcp = 8;//Pin connected to SH_CP of 74HC595
const int DS = 11; //Pin connected to DS of 74HC595
const int buttonPin = 2;
int datArray[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,  0x6f};
int number = 0;
int state = 0;

void setup ()
{
  //set pins to output
  pinMode(STcp, OUTPUT);
  pinMode(SHcp, OUTPUT);
  pinMode(DS, OUTPUT);
  pinMode(buttonPin, INPUT);

  attachInterrupt(digitalPinToInterrupt(buttonPin), rollDice, FALLING);
}

void loop()
{
  if (state == 0) {
    showNumber((int)random(1, 7));
    delay(50);
  }
}

void showNumber(int num) {
  digitalWrite(STcp, LOW); //ground ST_CP and hold low for as long as you are transmitting
  shiftOut(DS, SHcp, MSBFIRST, datArray[num]);
  //return the latch pin high to signal chip that it
  //no longer needs to listen for information
  digitalWrite(STcp, HIGH); //pull the ST_CPST_CP to save the data
}


void rollDice() {
  state = !state;
}

Hulpmiddelen en referenties

Bestanden📁

Arduino-bibliotheken (zip)