Sieben-Lampen-Rätsel: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(37 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 52: Zeile 52:
|4  || 7 || Lampen/LED mit integriertem Vorwiderstand
|4  || 7 || Lampen/LED mit integriertem Vorwiderstand
|-
|-
|5  || ? || Verbindungskabel
 
|-
|}
|}
=== Funktionaler Systementwurf ===
=== Funktionaler Systementwurf ===
Zeile 73: Zeile 72:
<br>
<br>
<br><br><br><br><br>
<br><br><br><br><br>


== Komponentenspezifikation ==
== Komponentenspezifikation ==
===Stückliste (BOM)===
===Stückliste (BOM)===
In der folgenden Tabelle befinden sich die benötigten Komponenten, mit beigefügtem Datenblatt, für das 7-Lampen-Rätsel. Der Arduino wurde bei Conrad, das Display bei Reichelt und die Taster mit LED bei Funduino bestellt. Der Gesamteinkaufspreis liegt bei 77,53€.


{| class="wikitable"
{| class="wikitable"
Zeile 125: Zeile 123:
|-
|-
|}
|}
== Umsetzung HW (mechanisch)==
== Umsetzung HW (mechanisch)==


Zeile 139: Zeile 138:
In dem gezeigten Schaltplan in Abbildung 6 ist die Schaltung der acht Taster und acht LEDs mit dem Arduino dargestellt. Das LCD Display ist über die I2c Schnittstelle angeschlossen.
In dem gezeigten Schaltplan in Abbildung 6 ist die Schaltung der acht Taster und acht LEDs mit dem Arduino dargestellt. Das LCD Display ist über die I2c Schnittstelle angeschlossen.


=== Anbindung des Tasters ===
=== Verdrahtungsplan ===
Im Schaltplan ist die Anbindung des Tasters dargestellt. Um im nicht-geschaltetem Zustand ein definiertes Potential zu gewährleisten, muss ein Pullup-Widerstand oder Pulldown-Widerstand verwendet werden. Für unsern Projekt wird der interne Pullup-Widerstand des Arduinos benutzt. Somit muss kein Pullup- oder Pulldown-Widerstand verdrahtet werden.
 
{| class="mw-datatable"
! style="font-weight: bold;" |
! style="font-weight: bold;" |
|+ style = "text-align: left"|
|-
|[[Datei:Verdrahtungsplan_7_Lampen_Raetsel.pdf|mini|338px|Abb. 7: Verdrahtungsplan]]
|}
In dem gezeigten Verdrahtungsplan in Abbildung 7 ist die Verdrahtung der acht Taster, acht LEDs und dem Display mit dem Arduino dargestellt. Die Ground Anschlüsse der Taster und LEDs werden auf einer Lochrasterplatte zusammengelötet. Von dieser Platte, die alle Ground-Anschlüsse der Taster und LEDs verbindet, wird über ein Kabel eine Verbindung zum Arduino hergestellt, sodass Ground an allen Tastern und LEDs anliegt.
 
=== Anbindung der Taster und der LEDs ===
Im Schaltplan ist die Anbindung des Tasters und der LED (Bauteil in Abbildung 8) dargestellt. Der Taster kann als Öffner und als Schließer angeschlossen werden. Für unser Projekt wird der Taster als Schließer angeschlossen. Dadurch werden die Anschlüsse C und NO (steht für Normally Open), die auch in Abbildung 8 zu sehen sind, benutzt. Wenn der Taster als Öffner angeschlossen werden sollte, müsste statt NO, NC (Normally Closed) angeschlossen werden. <br>
 
{| class="mw-datatable"
! style="font-weight: bold;" |
! style="font-weight: bold;" |
|+ style = "text-align: left"|
|-
|[[Datei:Taster_LED_Anschlüsse_7_Lampen_Raetsel.jpg|mini|338px|Abb. 8: Taster und LED Anschlüsse]]
|}
 
Über die Anschlüsse des Tasters in Abbildung 8 kann der mitgelieferten Aufsatz (zu sehen in hellblau) gesetzt werden, wo die Anschlüsse direkt mit Kabeln verbunden werden. Die Kabel sind in Abbildung 9 zu erkennen. Das rote und schwarze Kabel gehören zur LED, wobei Pin 1 das rote und Pin 2 das schwarze Kabel ist. Das grüne, gelbe und weiße Kabel gehören zu den drei Anschlüssen des Tasters, dabei ist Pin C an das grüne, Pin NO an das gelbe und NC an das weiße Kabel angeschlossen.
 
{| class="mw-datatable"
! style="font-weight: bold;" |
! style="font-weight: bold;" |
|+ style = "text-align: left"|
|-
|[[Datei:Taster_LED_Kabel_7_Lampen_Raetsel.jpg|mini|338px|Abb. 9: Verkabelung des Projekts]]
|}
 
=== Pullup-Widerstand des Tasters ===
Um im nicht-geschaltetem Zustand ein definiertes Potential zu gewährleisten, muss ein Pullup-Widerstand oder Pulldown-Widerstand verwendet werden. Für unsern Projekt wird der interne Pullup-Widerstand des Arduinos benutzt. Somit muss kein Pullup- oder Pulldown-Widerstand verdrahtet werden.


=== Vorwiderstände der LEDs ===
=== Vorwiderstände der LEDs ===


Die LED ist über die Anschlüsse 1 und 2 am Bauteil in Abbildung 8 anzuschließen. <br>
Um den Strom, der durch die LED fließt, zu begrenzen, wird ein Vorwiderstand benötigt. Dieser Vorwiderstand schützt die LED vor Beschädigung durch Überstrom und sorgt dafür, dass der Strom innerhalb der zulässigen Grenzen bleibt. Die verwendete LED, hat nach Anfrage beim Verkäufer, einen bereits integrierten Vorwiderstand. Es muss damit kein weitere Vorwiderstand verdrahtet werden.
Um den Strom, der durch die LED fließt, zu begrenzen, wird ein Vorwiderstand benötigt. Dieser Vorwiderstand schützt die LED vor Beschädigung durch Überstrom und sorgt dafür, dass der Strom innerhalb der zulässigen Grenzen bleibt. Die verwendete LED, hat nach Anfrage beim Verkäufer, einen bereits integrierten Vorwiderstand. Es muss damit kein weitere Vorwiderstand verdrahtet werden.
=== Verdrahtung des Projekts ===
{| class="mw-datatable"
! style="font-weight: bold;" |
! style="font-weight: bold;" |
|+ style = "text-align: left"|
|-
|[[Datei:Projekt_Verkabelung_7_Lampen_Raetsel.jpg|mini|338px|Abb. 10: Verdrahtung des Projekts]]
|}
In Abbildung 10 ist die Verdrahtung des Arduinos mit dem Display und den acht Tastern/LEDs dargestellt. Die Verdrahtung ist nach Vorgabe des Verdrahtungsplans in Abbildung 7 durchgeführt worden. Nachfolgend ein paar Hinweise zur Verdrahtung der Taster und der LEDs.<br>
Auf den Aufsetzungen der Taster/LEDs ist die Nummer der Taster und der LED geschrieben. Ein Beispiel ist T/L 1 für Taster 1 und LED 1.
Die Kabel, die an die Anschlüsse des Bauteils (Taster/LED) angeschlossen sind (Erklärung im Abschnitt [[#anbindung_der_taster_und_der_leds|Anbindung der Taster und der LEDs]]) und direkt an den Arduino angeschlossen werden müssen (rotes und gelbes Kabel), wurden an ein Jumper Kabel mit männlichem Stecker gelötet. Die grünen und schwarzen Kabel, die an Ground angeschlossen werden müssen, wurden auf eine Lochrasterplatte, die in Abbildung 10 in der Mitte zu erkennen ist, gelötet. Die Kabel auf der Platte sind alle miteinander verbunden. Auf dieser Platte wurde zusätzlich ein Jumper Kabel mit männlichem Stecker gelötet, welcher an einem Ground Stecker des Arduinos angeschlossen wird.


== Umsetzung SW==
== Umsetzung SW==
'''Verwendete Toolbox:''' Matlab Support Package für Arduino Hardware, Simulink Support Package für Arduino Hardware
'''Verwendete Toolbox:''' Simulink Support Package für Arduino Hardware, LiquidCrystal_I2C aus der Arduino IDE
=== Programmablaufplan ===
=== Programmablaufplan ===


Zeile 155: Zeile 201:
|+ style = "text-align: left"|  
|+ style = "text-align: left"|  
|-
|-
|[[Datei:Programmablaufplan_7_Lampen_Raetsel.PNG|mini|338px|Abb. 7: Programmablaufplan]]
|[[Datei:Programmablaufplan_7_Lampen_Raetsel.PNG|mini|500px|Abb. 11: Programmablaufplan]]
|}
In Abbildung 11 ist der Ablauf dargestellt, der für das Projekt implementiert bzw. erstellt werden muss.
 
=== Simulink ===
Das Projekt wird mit der Simulationsfunktion von Matlab: Simulink durchgeführt. Dafür wird die Toolbox "Support Package für Arduino Hardware" benötigt. In der folgenden Abbildung 12 ist das gesamte Modell einmal zusehen.
{| class="mw-datatable"
! style="font-weight: bold;" |
! style="font-weight: bold;" |
|+ style = "text-align: left"|
|-
|[[Datei:Simulink_Modell_7_Lampen_Raetsel.PNG|mini|1010px|Abb. 12: Simulink Modell]]
|}
 
Dieses Modell mit den Verschiedenen In- und Outputs ist das entwickelte Modell für dieses Projekt. Die einzelnen Bestandteile dieses Modells werden nachfolgend einzeln beschrieben.
==== LCD Display mit I2C-Anschluss ====
 
Das LCD Display wurde in Simulink integriert, indem das [https://wiki.hshl.de/wiki/index.php/Erstellen_eigener_Code-Bl%C3%B6cke_f%C3%BCr_den_Hardware-Zugriff_mittels_IO_Device_Builder Tutorial von Professor Göbel] durchgeführt wurde (siehe Video 1).
 
'''URL:''' https://youtu.be/BXF9x-Tmzhg
{{#ev:youtube|https://youtu.be/BXF9x-Tmzhg | 500| | Video 1: Tutorial Video von Professor Göbel |frame}}
<br>
Das Display ist der Block LCD_I2C_DDAppGeneratedBlock mit einem Eingang "Input". Davor ist ein Convert Block, um den Datentyp "int8" festzulegen (zu sehen in Abbildung 12). In den Convert Block geht der Ausgang Out8 aus dem Stateflow Diagramm. Dort liegt die Anzahl der aktiven LEDs an.<br>
Damit auf dem Display das richtige Angezeigt wird, bekommt der erstellte Block die Anzahl der im Kreis leuchtenden LEDs übergeben. In der ersten Zeile wird immer ausgegeben wie viele LEDs leuchten. In der zweiten Zeile wird der Code ausgegeben, wenn alle sieben Lampen leuchten.<br>
 
Im folgenden wird der C++ Code gezeigt, mit dem der Display Block in Simulink die Logik bekommt, was angezeigt wird. Wie diese Datei erstellt werden kann, wird ebenfalls in Video 1 gezeigt.
 
<div style="width:1200px; height:1000px; overflow:scroll; border: hidden">
<syntaxhighlight lang="cpp" style="border: none; background-color: #EFF1C1; font-size:larger">
 
//%*************************************************************** *
//%                  Hochschule Hamm-Lippstadt                    *
//%*************************************************************** *
//% Modul         : Simulink model of LCD Display with I2C      *
//%                                                                *
//% Datum          : 18.12.2024                                  *
//%                                                                *
//% Funktion        : Code for the display block in Simulink with  *
//%                  the rules for when to display what.          *
//%                                                                *
//% Implementation  : MATLAB 2024b                                *
//%                                                                *
//% Req. Toolbox    : LiquidCrystal_I2C from Arduino IDE          *
//%                                                                *
//% Author          : Jan van Pels                                *
//%                                                                *
//% Letzte Änderung : 29.12.2024                                  *
//%****************************************************************
 
#include "LCD_I2C.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adress 0x27, 16 columns, 2 rows
bool show_code = false; // True if all 7 LEDs are on and the COde is shown
                        // on Display
 
// Setup Function for LCD
void setupFunctionLCD_I2C(){
  lcd.init();
  lcd.backlight();
  // Insert initial state
  lcd.setCursor(0, 0); // Cursor on row 0, column 0
  lcd.print("LEDs on:  /7");
}
 
// Function to check what needs to be displayed with the currently
// active number of LEDs.
void stepFunctionLCD_I2C(int8_T Input,int size_vector_a){
  // Insert the number of LEDs that are currently on
  lcd.setCursor(9, 0);
  lcd.print(Input);
  // Are all 7 LEDs on?
  if (Input == 7){
    lcd.setCursor(0, 1); // Cursor on row 1, column 0
    lcd.print("Code: 1768"); // Show the Code
    show_code = true;
  }else if (show_code){ // Only if the Code was shown before
    lcd.setCursor(0, 1); // Cursor on row 1, column 0
    lcd.print("          "); // Hide the Code
    show_code = false;
  }
}
 
</syntaxhighlight>
</div>
<br clear=all>
</div>
 
==== Taster ====
Die Taster sind durch die acht Digital Input Blöcke umgesetzt. Diese Blöcke benötigen den jeweiligen Pin, an dem der Taster am Arduino angeschlossen ist. Darüber hinaus wird der Modus des Pins, wie im Abschnitt Umsetzung HW (elektrisch) beschrieben, auf "Input Pullup" gesetzt. Um das Signal eines gedrückten Tasters zu bekommen, wird an den Digital Input Block ein Detect Decrease Block angeschlossen. Dieser bekommt den Initialen Zustand von eins. Durch den Input Pullup liegt am Eingang des Detect Decrease Block eins an, wenn der Taster nicht gedrückt ist. Wenn der Taster gedrückt wird, erkennt der Block den Tastendruck indem am Eingang eine null anliegt. Wenn eine null anliegt, sendet der Detect Decrease Block eine eins weiter, was für die nachfolgende Logik bedeutet, dass der Taster gedrückt wurde. Die Signale aus den Detect Decrease Blöcken werden an das Stateflow Diagramm weiter geleitet.
 
==== Stateflow Diagramm ====
Das Stateflow Diagramm ist dafür da, dass aus den Eingaben, hier das Drücken der Taster, die dazugehörigen Ausgaben ausgeben werden, hier die LEDs und das Display.
Die acht Eingänge des Stateflow Diagramms sind die acht Taster die unter dem Bereich "Taster" beschrieben sind und eine eins angelegt haben, wenn der Taster gedrückt wurde. Die acht Ausgänge sind für die LEDs da. Wenn eine eins an den ersten sieben Ausgängen anliegt, heißt das, dass diese LED an sein soll. Am achten Ausgang liegt an, wie viele LEDs der anderen sieben an sind. Das bedeutet, dass wenn von den sieben LEDs, die im Kreis montiert sind, fünf an sind, wird an Ausgang acht eine fünf angegeben. Wie die LEDs funktionieren wird im nächsten Kapitel "LEDs" beschrieben.
 
{| class="mw-datatable"
! style="font-weight: bold;" |
! style="font-weight: bold;" |
|+ style = "text-align: left"|
|-
|[[Datei:Stateflow_Diagramm_7_Lampen_Raetsel.PNG|mini|1000px|Abb. 13: Stateflow Diagramm]]
|}
|}
In Abbildung 7 ist der Ablauf dargestellt, der für das Projekt implementiert bzw. erstellt werden muss.
 
In Abbildung 13 sind die Zustände des Stateflow Diagramms zu sehen. Der Zustand "Start" ist der erste Zustand. Der setzt alle Ausgänge erstmal auf null. Somit sind alle LEDs inaktiv. Von dort wird direkt in den Zustand "Wait_for_Button_Press". In diesem Zustand wird jedes Mal berechnet wie viele LEDs aktiv sind. Dies wird in Out8 gespeichert. In diesem Zustand wird gewartet bis einer der Taster gedrückt wird.We nn einer der sieben Taster gedrückt wird und über die Eingänge "In1" bis "In7" eine eins im Diagramm ankommt wird in den jeweiligen Zustand "Toggle_Button_1" bis "Toggle_Button_7" gewechselt. In diesem Zustand wird der Zustand der dazugehörigen LED sowie der beiden Nachbarn gewechselt. Dafür wird von eins der jeweilige aktuelle Wert am Ausgang abgezogen und wieder dem Ausgang zugewiesen. Wenn am Ausgang eine eins anliegt und die LED aktiv ist liegt danach eine null an und die LED ist inaktiv. Bei einer anliegenden null am Ausgang, liegt danach eine eins an. Nachdem der Zustand aller drei LEDs gewechselt wurde, wird wieder in den Zustand "Wait_for_Button_Press" gewechselt.
Wenn der Reset-Taster betätigt wird (IN8 wird 1), wird in den Zustand "Start" gewechselt und alle LEDs wieder inaktiv.
 
==== LEDs ====
 
Für die LEDs sind in Simulink Digital Output Blöcke. Diese Blöcke bekommen den Pin, an dem die LED angeschlossen ist zugeordnet. Dieser Digital Output Block hat einen Eingang. Wenn an diesem Eingang eine null anliegt, ist die LED inaktiv. Wenn eine eins anliegt, ist die LED aktiv. <br>
Aus dem beschriebenen Stateflow Diagramm, werden Nullen oder Einsen für die sieben im Kreis angeordneten LEDs ausgegeben. Diese Werte sollen an den Digital Output Block weitergegeben werden, solange nicht alle sieben LEDs aktiv sind. Wenn alle sieben LEDs aktiv sind und somit der Ausgang OUT8 des Stateflow Diagramms sieben ist, sollen alle sieben LEDs, sowie die LED des Reset Tasters, gleichmäßig Blinken. Das signalisiert, dass das Rätsel gelöst wurde. Umgesetzt wird das Blinken, indem ein Puls Generator ein Signal erstellt das gleichmäßig den Wert zwischen null und eins verändert. Wenn alle sieben LEDs leuchten, schaltet ein Switch das Signal von jedem Digital Output Block vom Ausgang des Stateflow Diagramms auf das Signal vom Puls Generator um. Wenn, während die LEDs blinken, einer der sieben im Kreis angeordneten Taster betätigt wird, hören die LEDs aufzublinken. Alle LEDs, bis auf die LED und die beiden Nachbarn des betätigten Tasters, leuchten wieder durchgehend.


== Komponententest ==
== Komponententest ==
Um sicher zu stellen, dass die Bauteile auch funktionieren bevor sie eingebaut werden, werden Tests gemacht. Diese werden von 2 Prüfern durchgeführt. Die Tests sind in Tabelle 4 zusammen mit den Ergebnissen aufgeführt.
{| class="wikitable"
{| class="wikitable"
|+ style = "text-align: left"|Tabelle 4: Komponententest
|+ style = "text-align: left"|Tabelle 4: Komponententest
Zeile 165: Zeile 320:
! ID  !! Komponente !! Prio!! Durchgeführter Test !! erwartetes Ergebnis !! 1.Prüfer !! Datum !! Ergebnis 1.Prüfung!! 2.Prüfer !! Datum !! Ergebnis 2.Prüfung  
! ID  !! Komponente !! Prio!! Durchgeführter Test !! erwartetes Ergebnis !! 1.Prüfer !! Datum !! Ergebnis 1.Prüfung!! 2.Prüfer !! Datum !! Ergebnis 2.Prüfung  
|-
|-
| 1  || Taster  || 1 || Taster 2x betätigen  || LEDs gehen an und aus || Joe Schröder || 27.11.2024 || || Jan van Pels || ||  
| 1  || Taster  || 1 || Taster 2x betätigen  || LEDs gehen an und aus || Joe Schröder || 27.11.2024 || Erfolgreich || Jan van Pels || 16.12.2024 || Erfolgreich
|-
|-
| 2  || Arduino || 1 || Angeschlossen, hochgefahren, Pins überprüft || Arduino fährt hoch, Pins senden und empfangen gewünschte Signale || Joe Schröder || 27.11.2024 || || Jan van Pels || ||  
| 2  || Arduino || 1 || Angeschlossen, hochgefahren, Pins überprüft || Arduino fährt hoch, Pins senden und empfangen gewünschte Signale || Joe Schröder || 27.11.2024 || Erfolgreich || Jan van Pels || 16.12.2024 || Erfolgreich
|-
|-
| 3  || Display || 1 || Angeschlossen und diverse Werte/Zeichen ausgeben lassen || Alles wird angezeigt || Joe Schröder || 27.11.2024 || || Jan van Pels || ||
| 3  || Display || 1 || Angeschlossen und diverse Werte/Zeichen ausgeben lassen || Alles wird angezeigt || Joe Schröder || 27.11.2024 || Erfolgreich || Jan van Pels || 16.12.2024 || Erfolgreich
|}
|}



Aktuelle Version vom 30. Dezember 2024, 21:07 Uhr

Abb. 1: Aufbau des Sieben-Lampen-Rätsels [1]
Autor: Jan van Pels, Joe Schröder
Betreuer: Prof. Göbel

Autor: Jan van Pels, Joe Schröder


Einleitung

Das Knobelspiel „Sieben-Lampen-Rätsel“ ist ein einfaches Knobelspiel, in dem das Ziel ist, alle 7 Lampen zum Leuchten zu bringen. In Abbildung 1 ist der Aufbau der Lampen im Kreis zu erkennen. Die Lampen haben außerdem einen zugeordneten Taster. Zusätzlich gibt es einen Taster zum Zurücksetzen des Spiels (alle Lampen ausschalten). Wenn alle 7 Lampen leuchten wird auf dem Display ein Zahlencode angezeigt, um das nächste Escape Game spielen zu können.
Wenn ein Taster einer Lampe gedrückt wird, geht diese Lampe an. Es gehen ebenfalls die Lampen rechts und links neben der gedrückten Lampe an. Wenn eine dieser Lampen leuchten sollte, geht diese Lampe wieder aus.

Anforderungen

Tabelle 1: Anforderungen an das Escape Game
ID Inhalt Prio Ersteller Datum Geprüft von Datum
1 Die entsprechenden Lampen müssen angehen, wenn ein Taster gedrückt wurde. 1 Jan van Pels 28.09.2024 Joe Schröder 30.09.2024
1 Die Lampen müssen ausgehen, wenn diese leuchtet und ein entsprechender Taster gedrückt wird. 1 Jan van Pels 28.09.2024 Joe Schröder 30.09.2024
1 Die Zahlenkombination muss angezeigt werden, wenn alle Lampen an sind. 1 Jan van Pels 28.09.2024 Joe Schröder 30.09.2024
1 Das Betätigen des Zurücksetzen-Buttons muss alle Lampen ausschalten. 1 Jan van Pels 28.09.2024 Joe Schröder 30.09.2024
1 Das Rätsel soll nach Erklärung innerhalb von 5 Minuten lösbar sein. 1 Jan van Pels 28.09.2024 Joe Schröder 30.09.2024
1 Das System muss zur Aufbewahrung in einen Schuhkarton passen. 1 Jan van Pels 28.09.2024 Joe Schröder 30.09.2024

Funktionaler Systementwurf/Technischer Systementwurf

Das System ist in Abbildung 1 zu sehen und besteht aus den Komponenten in Tabelle 2. Die sieben Taster und Lampen können alternativ auch in ein Bauteil zusammengeführt werden. Die Taster und Lampen werden über den Arduino ausgelesen und angesteuert. Eine Zahlenkombination, die vorher festgelegt wurde, wird auf dem Display angezeigt, wenn der Arduino erkennt das alle Lampen leuchten. Dafür wird das Signal mit der Zahlenkombination vom Arduino an das Display versendet.

Tabelle 2: Materialliste
Nr. Anz. Beschreibung
1 1 Funduino Arduino UNO R3
2 8 Taster
3 1 16x2 LCD-Display mit I2C-Modul
4 7 Lampen/LED mit integriertem Vorwiderstand

Funktionaler Systementwurf

Der funktionale Systementwurf ist in Abbildung 1 dargestellt. Dazu kommt das Display zum Anzeigen der Zahlenkombination. Außerdem ist es möglich das die Lampen und Taster nicht in einem Bauteil wie in Abbildung 1 zusammengefasst sind.

Technischer Systementwurf

Möglicher Schaltplan für einzelne Taster und Lampen:

    Abb. 2: Systementwurf des Sieben-Lampen-Rätsels [2]


  • Taster 1 bis 8 an den Pins D2 bis D9 angeschlossen und Pull-Down Widerstand mit GND verbunden oder Pull-Up Widerstand des Arduinos aktiviert.
  • Lampen 1 bis 7 an den Pins D10 bis D13 sowie A0 bis A2.
    • Anoden mit Widerstand und Arduino Pins verbunden (möglicherweise 220 Ohm) oder LEDs mit integriertem Vorwiderstand genutzt.
    • Kathoden mit GND verbunden.
  • LCD-Display mit I2C an SDA (Pin A4) und SCL (Pin A5) angeschlossen, zusätzlich mit 5V und GND.






  • Komponentenspezifikation

    Stückliste (BOM)

    In der folgenden Tabelle befinden sich die benötigten Komponenten, mit beigefügtem Datenblatt, für das 7-Lampen-Rätsel. Der Arduino wurde bei Conrad, das Display bei Reichelt und die Taster mit LED bei Funduino bestellt. Der Gesamteinkaufspreis liegt bei 77,53€.

    Tabelle 3: BOM
    ID Anzahl Kosten pro Stück € Summe Bezeichnung / Komponente Einkaufsseite Beschreibung Datenblatt Abbildung
    1 1x 22,08€ 22,08€ + 4,16€ Versand Arduino Uno Rev 3 smd Breadboard + Kabel Arduino Uno Rev 3 Einkaufsseite Der Arduino Uno Rev 3 verfügt über 14 digitale I/O - Schnittstellen. Des weiteren sind 6 analoge Eingänge für die Verarbeitung analoger Signale vorhanden. Arduino Uno Rev 3
    Abb. 03: Arduino Uno Rev 3
    2 1x 5,80€ 5,80€ + 5,95€ Versand LCD 16x2 Display LCD 16x2 Display Einkaufsseite Das Display hat eine I2c Schnittstelle, mit der das Display am Arduino angeschlossen wird. Datenblatt LCD 16x2 Display
    Abb. 04: LCD 16x2 Display
    3 8x 4,33€ 34,64€ + 4,90€ Versand Drucktaster, Chrom - 5V, LED beleuchtet Taster mit LED Einkaufsseite Der Drucktaster mit LED wird mit 5V betrieben und die Farbe der LED ist Blau.
    Abb. 06: Datenblatt Taster mit LED
    Abb. 05: Taster mit LED

    Umsetzung HW (mechanisch)

    Umsetzung HW (elektrisch)

    Schaltplan

    Abb. 6: Schaltplan

    In dem gezeigten Schaltplan in Abbildung 6 ist die Schaltung der acht Taster und acht LEDs mit dem Arduino dargestellt. Das LCD Display ist über die I2c Schnittstelle angeschlossen.

    Verdrahtungsplan

    Abb. 7: Verdrahtungsplan

    In dem gezeigten Verdrahtungsplan in Abbildung 7 ist die Verdrahtung der acht Taster, acht LEDs und dem Display mit dem Arduino dargestellt. Die Ground Anschlüsse der Taster und LEDs werden auf einer Lochrasterplatte zusammengelötet. Von dieser Platte, die alle Ground-Anschlüsse der Taster und LEDs verbindet, wird über ein Kabel eine Verbindung zum Arduino hergestellt, sodass Ground an allen Tastern und LEDs anliegt.

    Anbindung der Taster und der LEDs

    Im Schaltplan ist die Anbindung des Tasters und der LED (Bauteil in Abbildung 8) dargestellt. Der Taster kann als Öffner und als Schließer angeschlossen werden. Für unser Projekt wird der Taster als Schließer angeschlossen. Dadurch werden die Anschlüsse C und NO (steht für Normally Open), die auch in Abbildung 8 zu sehen sind, benutzt. Wenn der Taster als Öffner angeschlossen werden sollte, müsste statt NO, NC (Normally Closed) angeschlossen werden.

    Abb. 8: Taster und LED Anschlüsse

    Über die Anschlüsse des Tasters in Abbildung 8 kann der mitgelieferten Aufsatz (zu sehen in hellblau) gesetzt werden, wo die Anschlüsse direkt mit Kabeln verbunden werden. Die Kabel sind in Abbildung 9 zu erkennen. Das rote und schwarze Kabel gehören zur LED, wobei Pin 1 das rote und Pin 2 das schwarze Kabel ist. Das grüne, gelbe und weiße Kabel gehören zu den drei Anschlüssen des Tasters, dabei ist Pin C an das grüne, Pin NO an das gelbe und NC an das weiße Kabel angeschlossen.

    Abb. 9: Verkabelung des Projekts

    Pullup-Widerstand des Tasters

    Um im nicht-geschaltetem Zustand ein definiertes Potential zu gewährleisten, muss ein Pullup-Widerstand oder Pulldown-Widerstand verwendet werden. Für unsern Projekt wird der interne Pullup-Widerstand des Arduinos benutzt. Somit muss kein Pullup- oder Pulldown-Widerstand verdrahtet werden.

    Vorwiderstände der LEDs

    Die LED ist über die Anschlüsse 1 und 2 am Bauteil in Abbildung 8 anzuschließen.
    Um den Strom, der durch die LED fließt, zu begrenzen, wird ein Vorwiderstand benötigt. Dieser Vorwiderstand schützt die LED vor Beschädigung durch Überstrom und sorgt dafür, dass der Strom innerhalb der zulässigen Grenzen bleibt. Die verwendete LED, hat nach Anfrage beim Verkäufer, einen bereits integrierten Vorwiderstand. Es muss damit kein weitere Vorwiderstand verdrahtet werden.

    Verdrahtung des Projekts

    Abb. 10: Verdrahtung des Projekts

    In Abbildung 10 ist die Verdrahtung des Arduinos mit dem Display und den acht Tastern/LEDs dargestellt. Die Verdrahtung ist nach Vorgabe des Verdrahtungsplans in Abbildung 7 durchgeführt worden. Nachfolgend ein paar Hinweise zur Verdrahtung der Taster und der LEDs.
    Auf den Aufsetzungen der Taster/LEDs ist die Nummer der Taster und der LED geschrieben. Ein Beispiel ist T/L 1 für Taster 1 und LED 1. Die Kabel, die an die Anschlüsse des Bauteils (Taster/LED) angeschlossen sind (Erklärung im Abschnitt Anbindung der Taster und der LEDs) und direkt an den Arduino angeschlossen werden müssen (rotes und gelbes Kabel), wurden an ein Jumper Kabel mit männlichem Stecker gelötet. Die grünen und schwarzen Kabel, die an Ground angeschlossen werden müssen, wurden auf eine Lochrasterplatte, die in Abbildung 10 in der Mitte zu erkennen ist, gelötet. Die Kabel auf der Platte sind alle miteinander verbunden. Auf dieser Platte wurde zusätzlich ein Jumper Kabel mit männlichem Stecker gelötet, welcher an einem Ground Stecker des Arduinos angeschlossen wird.

    Umsetzung SW

    Verwendete Toolbox: Simulink Support Package für Arduino Hardware, LiquidCrystal_I2C aus der Arduino IDE

    Programmablaufplan

    Abb. 11: Programmablaufplan

    In Abbildung 11 ist der Ablauf dargestellt, der für das Projekt implementiert bzw. erstellt werden muss.

    Simulink

    Das Projekt wird mit der Simulationsfunktion von Matlab: Simulink durchgeführt. Dafür wird die Toolbox "Support Package für Arduino Hardware" benötigt. In der folgenden Abbildung 12 ist das gesamte Modell einmal zusehen.

    Abb. 12: Simulink Modell

    Dieses Modell mit den Verschiedenen In- und Outputs ist das entwickelte Modell für dieses Projekt. Die einzelnen Bestandteile dieses Modells werden nachfolgend einzeln beschrieben.

    LCD Display mit I2C-Anschluss

    Das LCD Display wurde in Simulink integriert, indem das Tutorial von Professor Göbel durchgeführt wurde (siehe Video 1).

    URL: https://youtu.be/BXF9x-Tmzhg
    
    Video 1: Tutorial Video von Professor Göbel


    Das Display ist der Block LCD_I2C_DDAppGeneratedBlock mit einem Eingang "Input". Davor ist ein Convert Block, um den Datentyp "int8" festzulegen (zu sehen in Abbildung 12). In den Convert Block geht der Ausgang Out8 aus dem Stateflow Diagramm. Dort liegt die Anzahl der aktiven LEDs an.
    Damit auf dem Display das richtige Angezeigt wird, bekommt der erstellte Block die Anzahl der im Kreis leuchtenden LEDs übergeben. In der ersten Zeile wird immer ausgegeben wie viele LEDs leuchten. In der zweiten Zeile wird der Code ausgegeben, wenn alle sieben Lampen leuchten.

    Im folgenden wird der C++ Code gezeigt, mit dem der Display Block in Simulink die Logik bekommt, was angezeigt wird. Wie diese Datei erstellt werden kann, wird ebenfalls in Video 1 gezeigt.

    //%*************************************************************** *
    //%                   Hochschule Hamm-Lippstadt                    *
    //%*************************************************************** *
    //% Modul	        : Simulink model of LCD Display with I2C       *
    //%                                                                *
    //% Datum           : 18.12.2024                                   *
    //%                                                                *
    //% Funktion        : Code for the display block in Simulink with  *
    //%                   the rules for when to display what.          *
    //%                                                                *
    //% Implementation  : MATLAB 2024b                                 *
    //%                                                                *
    //% Req. Toolbox    : LiquidCrystal_I2C from Arduino IDE           *
    //%                                                                *
    //% Author          : Jan van Pels                                 *
    //%                                                                *
    //% Letzte Änderung : 29.12.2024                                   *
    //%****************************************************************
    
    #include "LCD_I2C.h"
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    
    LiquidCrystal_I2C lcd(0x27, 16, 2); // Adress 0x27, 16 columns, 2 rows
    bool show_code = false; // True if all 7 LEDs are on and the COde is shown
                            // on Display
    
    // Setup Function for LCD
    void setupFunctionLCD_I2C(){
      lcd.init();
      lcd.backlight();
      // Insert initial state
      lcd.setCursor(0, 0); // Cursor on row 0, column 0 
      lcd.print("LEDs on:  /7");
    }
    
    // Function to check what needs to be displayed with the currently 
    // active number of LEDs. 
    void stepFunctionLCD_I2C(int8_T Input,int size_vector_a){
      // Insert the number of LEDs that are currently on
      lcd.setCursor(9, 0);
      lcd.print(Input);
      // Are all 7 LEDs on?
      if (Input == 7){
        lcd.setCursor(0, 1); // Cursor on row 1, column 0 
        lcd.print("Code: 1768"); // Show the Code
        show_code = true;
      }else if (show_code){ // Only if the Code was shown before
        lcd.setCursor(0, 1); // Cursor on row 1, column 0 
        lcd.print("          "); // Hide the Code
        show_code = false;
      }
    }
    


    Taster

    Die Taster sind durch die acht Digital Input Blöcke umgesetzt. Diese Blöcke benötigen den jeweiligen Pin, an dem der Taster am Arduino angeschlossen ist. Darüber hinaus wird der Modus des Pins, wie im Abschnitt Umsetzung HW (elektrisch) beschrieben, auf "Input Pullup" gesetzt. Um das Signal eines gedrückten Tasters zu bekommen, wird an den Digital Input Block ein Detect Decrease Block angeschlossen. Dieser bekommt den Initialen Zustand von eins. Durch den Input Pullup liegt am Eingang des Detect Decrease Block eins an, wenn der Taster nicht gedrückt ist. Wenn der Taster gedrückt wird, erkennt der Block den Tastendruck indem am Eingang eine null anliegt. Wenn eine null anliegt, sendet der Detect Decrease Block eine eins weiter, was für die nachfolgende Logik bedeutet, dass der Taster gedrückt wurde. Die Signale aus den Detect Decrease Blöcken werden an das Stateflow Diagramm weiter geleitet.

    Stateflow Diagramm

    Das Stateflow Diagramm ist dafür da, dass aus den Eingaben, hier das Drücken der Taster, die dazugehörigen Ausgaben ausgeben werden, hier die LEDs und das Display. Die acht Eingänge des Stateflow Diagramms sind die acht Taster die unter dem Bereich "Taster" beschrieben sind und eine eins angelegt haben, wenn der Taster gedrückt wurde. Die acht Ausgänge sind für die LEDs da. Wenn eine eins an den ersten sieben Ausgängen anliegt, heißt das, dass diese LED an sein soll. Am achten Ausgang liegt an, wie viele LEDs der anderen sieben an sind. Das bedeutet, dass wenn von den sieben LEDs, die im Kreis montiert sind, fünf an sind, wird an Ausgang acht eine fünf angegeben. Wie die LEDs funktionieren wird im nächsten Kapitel "LEDs" beschrieben.

    Abb. 13: Stateflow Diagramm

    In Abbildung 13 sind die Zustände des Stateflow Diagramms zu sehen. Der Zustand "Start" ist der erste Zustand. Der setzt alle Ausgänge erstmal auf null. Somit sind alle LEDs inaktiv. Von dort wird direkt in den Zustand "Wait_for_Button_Press". In diesem Zustand wird jedes Mal berechnet wie viele LEDs aktiv sind. Dies wird in Out8 gespeichert. In diesem Zustand wird gewartet bis einer der Taster gedrückt wird.We nn einer der sieben Taster gedrückt wird und über die Eingänge "In1" bis "In7" eine eins im Diagramm ankommt wird in den jeweiligen Zustand "Toggle_Button_1" bis "Toggle_Button_7" gewechselt. In diesem Zustand wird der Zustand der dazugehörigen LED sowie der beiden Nachbarn gewechselt. Dafür wird von eins der jeweilige aktuelle Wert am Ausgang abgezogen und wieder dem Ausgang zugewiesen. Wenn am Ausgang eine eins anliegt und die LED aktiv ist liegt danach eine null an und die LED ist inaktiv. Bei einer anliegenden null am Ausgang, liegt danach eine eins an. Nachdem der Zustand aller drei LEDs gewechselt wurde, wird wieder in den Zustand "Wait_for_Button_Press" gewechselt. Wenn der Reset-Taster betätigt wird (IN8 wird 1), wird in den Zustand "Start" gewechselt und alle LEDs wieder inaktiv.

    LEDs

    Für die LEDs sind in Simulink Digital Output Blöcke. Diese Blöcke bekommen den Pin, an dem die LED angeschlossen ist zugeordnet. Dieser Digital Output Block hat einen Eingang. Wenn an diesem Eingang eine null anliegt, ist die LED inaktiv. Wenn eine eins anliegt, ist die LED aktiv.
    Aus dem beschriebenen Stateflow Diagramm, werden Nullen oder Einsen für die sieben im Kreis angeordneten LEDs ausgegeben. Diese Werte sollen an den Digital Output Block weitergegeben werden, solange nicht alle sieben LEDs aktiv sind. Wenn alle sieben LEDs aktiv sind und somit der Ausgang OUT8 des Stateflow Diagramms sieben ist, sollen alle sieben LEDs, sowie die LED des Reset Tasters, gleichmäßig Blinken. Das signalisiert, dass das Rätsel gelöst wurde. Umgesetzt wird das Blinken, indem ein Puls Generator ein Signal erstellt das gleichmäßig den Wert zwischen null und eins verändert. Wenn alle sieben LEDs leuchten, schaltet ein Switch das Signal von jedem Digital Output Block vom Ausgang des Stateflow Diagramms auf das Signal vom Puls Generator um. Wenn, während die LEDs blinken, einer der sieben im Kreis angeordneten Taster betätigt wird, hören die LEDs aufzublinken. Alle LEDs, bis auf die LED und die beiden Nachbarn des betätigten Tasters, leuchten wieder durchgehend.

    Komponententest

    Um sicher zu stellen, dass die Bauteile auch funktionieren bevor sie eingebaut werden, werden Tests gemacht. Diese werden von 2 Prüfern durchgeführt. Die Tests sind in Tabelle 4 zusammen mit den Ergebnissen aufgeführt.

    Tabelle 4: Komponententest
    ID Komponente Prio Durchgeführter Test erwartetes Ergebnis 1.Prüfer Datum Ergebnis 1.Prüfung 2.Prüfer Datum Ergebnis 2.Prüfung
    1 Taster 1 Taster 2x betätigen LEDs gehen an und aus Joe Schröder 27.11.2024 Erfolgreich Jan van Pels 16.12.2024 Erfolgreich
    2 Arduino 1 Angeschlossen, hochgefahren, Pins überprüft Arduino fährt hoch, Pins senden und empfangen gewünschte Signale Joe Schröder 27.11.2024 Erfolgreich Jan van Pels 16.12.2024 Erfolgreich
    3 Display 1 Angeschlossen und diverse Werte/Zeichen ausgeben lassen Alles wird angezeigt Joe Schröder 27.11.2024 Erfolgreich Jan van Pels 16.12.2024 Erfolgreich

    Ergebnis

    Zusammenfassung

    Lessons Learned

    Projektunterlagen

    Projektplan

    Der Projektplan zeigt den zeitlichen Ablauf des Projekt von Ende September 2024 bis Januar 2025. In der Ganttproject ist ein Gantt-Diagramm aufgebaut, dass die Einzelnen Aufgaben als Balken darstellt. Es ist Start- und Endzeit, der Bearbeiter und der Fortschritt der jeweiligen Aufgabe dargestellt.

    Projektdurchführung

    YouTube Video

    Weblinks

    [1] Beschreibung des Rätsels: Sieben-Lampen

    Literatur


    → zurück zur Übersicht: WS 23/24: Angewandte Elektrotechnik (BSE)