Skip to content

Commit f1109ef

Browse files
author
Stefan Wolf
committed
Dokumentation des Projektes
1 parent 5a390c7 commit f1109ef

File tree

2 files changed

+375
-0
lines changed

2 files changed

+375
-0
lines changed

Dokumentation/Arduino.pdf

130 KB
Binary file not shown.

Dokumentation/Arduino.tex

Lines changed: 375 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,375 @@
1+
\documentclass[a4paper]{scrreprt}
2+
3+
\usepackage[utf8]{inputenc} % Paket, dass angibt, dass der UTF-8 Zeichensatz verwendet wird.
4+
\usepackage[ngerman]{babel} % Paket für die neue deutsche Rechtschreibung
5+
\usepackage{titlesec, blindtext, color}
6+
7+
\usepackage{graphicx}
8+
\usepackage{listings}
9+
\usepackage{hyperref} % Paket, dass Links in die PDF einfügt.
10+
11+
\titleformat{\chapter}[hang]{\LARGE\bfseries}{\thechapter{.}\hspace{10pt}}{0pt}{\LARGE\bfseries}
12+
% Formatierung des \chapter befehls geaendert!
13+
14+
15+
\author
16+
{
17+
Stefan Wolf \\
18+
Angewandte Informatik - Mobile Systeme 2011 \\
19+
20+
Matrikel-Nr: 4054391
21+
}
22+
\date{letzte Bearbeitung: \today}
23+
\title
24+
{
25+
Projekt "Arduino" \\
26+
\vspace{5 mm}
27+
{
28+
\large Erstellung eines Thermometers \\
29+
}
30+
}
31+
32+
\hypersetup % Setup für hyperred-Paket Einstellungen, können auch innerhalb \usepackage mit [] geschrieben werden
33+
{
34+
%hidelinks = false, % hides links completaly
35+
bookmarks=true, % show bookmarks bar?
36+
unicode=false, % non-Latin characters in Acrobat’s bookmarks
37+
pdftoolbar=true, % show Acrobat’s toolbar?
38+
pdfmenubar=true, % show Acrobat’s menu?
39+
pdffitwindow=false, % window fit to page when opened
40+
pdfstartview={FitH}, % fits the width of the page to the window
41+
pdftitle={Arduino}, % title
42+
pdfauthor={Stefan Wolf}, % author
43+
pdfsubject={Erstellung eines Thermometers}, % subject of the document
44+
pdfcreator={Stefan Wolf}, % creator of the document
45+
pdfproducer={Stefan Wolf}, % producer of the document
46+
pdfkeywords={Arduino} {UNO} {Display} {Thermometer}, % list of keywords
47+
pdfnewwindow=true, % links in new window
48+
colorlinks=true, % false: boxed links; true: colored links
49+
linkcolor=black, % color of internal links (change box color with linkbordercolor)
50+
citecolor=black, % color of links to bibliography
51+
filecolor=magenta, % color of file links
52+
urlcolor=cyan % color of external links
53+
}
54+
55+
\begin{document}
56+
\maketitle % Erstellt eine Titelseite. Beinhaltet Autor, Datum, Titel
57+
58+
\tableofcontents % Erstellt ein Inhaltsverzeichnis
59+
\setcounter{tocdepth}{3} % Gibt die max. Gliederungstiefe an, die im Inhaltsverzeichnis gezeigt wird
60+
\chapter{Einleitung und Motivation}
61+
\section{Entstehung der Projektidee}
62+
Als ich zum ersten Mal in die Arduinoveranstaltung meiner Hochschule gekommen bin,
63+
hatte ich keine Ahnung, worum es sich dabei "uberhaupt genau handelt.
64+
Daher war es klar, dass ich mich erstmal mit den Basics vertraut machen muss.
65+
Auf Grund dessen habe ich mir zuerst ein paar B"ucher besorgt
66+
und in diesen gest"obert. \\
67+
Allerdings ging die ganze Problematik nach kurzer Zeit schon relativ leicht von der Hand.
68+
Deshalb musste jetzt langsam eine Idee her. F"ur mich stand fest,
69+
dass das ganze nichts mit LED-W"urfeln oder "Ahnliches zutun haben sollte. \\
70+
Nach langem Hin und Her hab ich mir gedacht, dass ich mir ja ein Display
71+
besorgen k"onnte und auf diesem irgendetwas anzeige.
72+
Das war eigentlich die ganze Entstehung der Idee. Da mir nichts besseres eingefallen
73+
ist, wollte ich eine Temperatur auf dem Display anzeigen lassen.
74+
75+
\section{Vorstellung der Idee}
76+
Bei dem Projekt geht es darum eine Temperatur auf dem Display anzeigen zu lassen.
77+
Zwischenzeitlich hatte sich die Idee eins, zwei mal ver"andert. So sollte mal
78+
zus"atzlich zur aktuellen Temperatur noch der minimale und der maximale
79+
gemessene Wert angezeigt werden. Die Idee wurde allerdings nach den ersten
80+
Entw"urfen der Anzeige wieder verworfen. Auch der Plan die Temperatur
81+
ebenfalls in Kelvin und Grad Fahrenheit anzeigen lassen zu können,
82+
wurde wieder abgewendet.\\
83+
\newline
84+
Meine Hauptintention lag in der Ideesammelphase darin, das genaue
85+
Zusammenwirken der einzelnen Bauteile und deren Ansteuerung
86+
kennenzulernen. Auch das Arbeiten mit den Datenbl"attern
87+
musste trainiert werden. \\
88+
Zu diesem Zeitpunkt dachte ich noch, dass es sich bei diesem Projekt
89+
um eine leicht zu l"osende Aufgabe handelt. Diese hat sich aber schnell schon
90+
als schwieriger herausgestellt als vorher gedacht. Aber dazu an sp"aterer Stelle mehr.
91+
92+
\chapter{Konzept}
93+
%wie soll es gemacht werden, welche Mittel etc.
94+
% -Vorstellung der Bauteile mit Bildern etc.
95+
In der Konzeptionsphase habe ich mich damit befasst, alle ben"otigten Arbeitsmittel
96+
f"ur das Projekt zu besorgen.
97+
Im folgenden werde ich meine Teile auflisten und deren Funktion erl"autern.
98+
Bilder zu den einzelnen Teilen befinden sich im Anhang.
99+
100+
\begin{itemize}
101+
\item \textbf{Arduino-StarterKit} \\
102+
Das Arduino Starterkit haben wir im Rahmen der Veranstaltung bekommen.
103+
Aus diesem Starterkit ben"otigte ich folgende Teile:
104+
\begin{itemize}
105+
\item \textbf{Kabel} \\
106+
Viele Kabel aus diesem Kit wurden f"ur das Projekt verwendet.
107+
Diese braucht man um die einzelnen Bauteile miteinander zu verbinden.
108+
109+
\item \textbf{Potentiometer} \\
110+
Das Potentiometer aus diesem Kit wurde zur Regelung des Kontrastes
111+
genommen.
112+
113+
\item \textbf{Temperatursensor LM35} \\
114+
Um die Temperatur der Umgebung zu messen und auf dem Display auszugeben,
115+
wird dieser Temperatursensor genommen.
116+
117+
\item \textbf{Steckplatine} \\
118+
Da ich alle Teile aus dem Kit wieder abgeben muss, konnte ich an diese
119+
keine Kabel anl"oten.
120+
Zum Verbinden der einzelnen Teile wurde daher die Steckplatine verwendet.
121+
\end{itemize}
122+
123+
\item \textbf{LCD-Display EA DIP204-4} \\
124+
Dabei handelt sich um meinen verwendeten Display. W"ahrend des Projektes wollte ich
125+
die Funktionsweise dieses Teils lernen. Auf Grund dessen sind auch Teile programmiert,
126+
die nicht wirklich gebraucht werden. \\
127+
Beim Endprodukt ist dieses Ger"at daf"ur zust"andig, die aktuelle Temperatur
128+
anzuzeigen. \\
129+
Das Display besitzt 18 Anschl"u"se. Es hat 2 Seiten mit je 9-St"uck mit einem Rasterma"s
130+
von 2,0mm. Da die Steckplatine des Arduinos im Rasterma"s von 2,54mm best"uckt ist,
131+
ist es nicht m"oglich, dieses Display direkt anzuschlie"sen.
132+
\newpage
133+
\item \textbf{2x Buchsenleisten} \\
134+
Bei diesen Buchsenleisten handelt es sich um 2 10-polige, welche ein Rasterma"s von 2mm
135+
besitzen. Diese wurden an das Display gesteckt und daran Kabel angel"otet.
136+
Dieses Teil w"are nicht von N"oten gewesen. Allerdings wollte ich, da ich noch nie
137+
vorher etwas gel"otet hatte, das Display nicht kaputt machen.
138+
139+
\item \textbf{Festspannungsregler} \\
140+
Dieses Teil regelt eine Spannung auf 3.5V.
141+
Der Festspannungsregler wurde daf"ur verwendet, die 5V des Arduinos f"ur die
142+
Hintergrundbeleuchtung des Displays auf 3.5V zu regeln.
143+
\end{itemize}
144+
145+
\chapter{Umsetzung}
146+
Die Umsetzungsphase werde ich im Folgenden in die einzelnen Problem- bzw.
147+
Herausforderungsphasen unterteilen. Der Schwierigkeitsgrad der einzelnen Punkte
148+
ist dabei allerdings nicht gleichm"a"sig verteilt. Das bedeutet, dass einige
149+
Unterpunkte leichter zu erledigen waren als Andere. \\
150+
Im Anhang befinden sich wieder Bilder aus den einzelnen Phasen.
151+
Diese sind zus"atzlich entsprechend nummeriert.
152+
153+
\section{L"oten}
154+
Der erste Schritt den es zu erledigen galt, war das Anl"oten von Kabeln an
155+
die Buchsenleisten. Da ich mich mit dieser Aufgabe noch nie besch"aftigt hatte,
156+
habe ich einen Kumpel um Hilfe gebeten.
157+
Dieser hat mir bei der Realisierung dieses Aufgabenteils geholfen. \\
158+
In der L"otphase wurde jeweils ein Kabelende eines Kabels mit einem Pin
159+
der Buchsenleiste verbunden. Das Andere wurde verzinnt, damit dieses sich
160+
leichter mit der Steckplatine verbinden l"asst.
161+
Damit war das Problem abgeschlossen und ich konnte mich um den
162+
n"achsten Punkt k"ummern.
163+
164+
\section{Display Anschlie"sen}
165+
Beim Anschlie"sen der Pins war es erstmal notwendig, sich "uber die
166+
einzelnen Funktionen schlau zu machen. Daf"ur musste ein Blick in
167+
das Datenblatt des Displays geworfen werden. Im Folgenden werde ich die
168+
einzelnen Pins auflisten und erl"autern.
169+
170+
\begin{itemize}
171+
\item \textbf{Pin 1} \\
172+
Dabei handelt es sich um den Ground bzw. Masse-Pin.
173+
174+
\item \textbf{Pin 2} \\
175+
Dies ist der Pluspol des Displays. Dieser ben"otigt eine 5V
176+
Stromversorgung.
177+
\newpage
178+
\item \textbf{Pin 3} \\
179+
Bei diesem Pin handelt es sich um die Kontrastspannung des Displays.
180+
Diese habe ich an einen Potentiometer angeschlossen, um damit den
181+
Kontrast auf einfache Art und Weise regeln zu k"onnen.
182+
Allerdings habe ich bemerkt, dass das Regeln "uber ein Potentiometer
183+
wenig Sinn macht, da der Toleranzspannungbereich ziemlich klein ist und sich
184+
daher wenig einstellen l"asst.
185+
186+
\item \textbf{Pin 4} \\
187+
Mithilfe dieses Pins l"asst sich dem Display sagen, ob Befehle oder Daten
188+
zum Display geschickt werden.
189+
Wenn Befehle auf den Display geschickt werden, ist dieser Pin LOW,
190+
bei Daten HIGH.
191+
192+
\item \textbf{Pin 5} \\
193+
Der R/W-Pin teilt dem Display mit, ob im n"achsten Schritt auf das Display
194+
geschrieben oder vom Display gelesen wird. Daf"ur muss der Pin mit LOW belegt
195+
sein, wenn geschrieben werden soll und mit HIGH beim Lesen.
196+
197+
\item \textbf{Pin 6} \\
198+
Bei diesem Pin handelt es sich um den Enable-Pin. Die Wirkungsweise
199+
dieses Pins herauszufinden, hat mir die meiste Zeit des Projektes
200+
gekostet. Das lag einfach daran, dass der Enable-Pin nur ganz kurz
201+
im Datenblatt erw"ahnt wurde und sozusagen vom Leser erwartet wurde,
202+
dass er das daf"ur notwendige Know-how besitzt. \\
203+
Dieser Pin muss nachdem alle Pins richtig gesetzt wurden einen Flankenwechsel
204+
von High auf Low haben. Nachdem dies passiert ist, f"uhrt das Display
205+
den gesendeten Befehl aus. \\
206+
Allerdings muss jetzt noch darauf geachtet werden, dass man, bevor das n"achste
207+
zum Display geschickt wird, wartet, bis der Befehl fertig ausgef"uhrt wurde.\\
208+
Daf"ur gibt es zwei M"oglichkeiten.
209+
Zum einen kann man die im Datenblatt stehenden Zeiten abwarten. Dies hat den
210+
Vorteil, dass man den Prozess die n"otige Zeit schlafen legen k"onnte und die
211+
CPU diesen vorerst nicht ausf"uhren muss. Aber es gibt den Nachteil, dass man
212+
unter Umst"anden zu lange wartet, da im Datenblatt die Maximaldauer
213+
der einzelnen Befehle steht.
214+
Zum anderen k"onnte man ein Busy-Flag durch Polling abfragen. Der Vorteil hierbei
215+
besteht darin, dass man immer nur so lange wartet, wie n"otig ist und keine
216+
unn"utze Zeit verstreichen l"asst. Allerdings l"auft hierbei der Prozess immer
217+
auf 100\% und die CPU kann sich ggf. in der Zeit nicht voll und ganz um andere
218+
wichtige Prozesse k"ummern. \\
219+
Bei meinem Projekt hab ich mich für die erste Variante entschieden,
220+
da ich keine zeitkritische Anwendung damit bedienen m"ochte.
221+
222+
\item \textbf{Pin 7 - Pin 14} \\
223+
Dabei handelt es sich um die 8 Datenpins von DB0 - DB7. Mit deren Hilfe, werden
224+
die Daten und Befehle spezifiziert.
225+
226+
\item \textbf{Pin 15} \\
227+
Dieser Pin hat keine Funktion.
228+
229+
\item \textbf{Pin 16} \\
230+
Dieser Pin ist der Reset-Pin. Mithilfe eines Flankenwechsels von High auf Low
231+
kann man damit das Display komplett zur"ucksetzen.
232+
233+
\item \textbf{Pin 17} \\
234+
Hierbei handelt es sich um den Pluspol der LED-Hintergrundbeleuchtung. Dieser
235+
ist mit einem Festspannungsregler verbunden der die Spannung auf 3,5V
236+
herunter regelt.
237+
238+
\item \textbf{Pin 18} \\
239+
Dieser Pin ist der Minuspol der LED-Hintergrundbeleuchtung.
240+
241+
\end{itemize}
242+
Mithilfe dieser Informationen konnte man dann die Pins mit dem Arduino verbinden.
243+
Einen ausf"uhrlichen Schaltplan habe ich im Anhang hinterlegt.
244+
Als das Display fertig angeschlossen war, habe ich mit der Ansteuerung begonnen.
245+
246+
\section{Display Programmieren}
247+
Nachdem das Anschlie"sen des Displays abgeschlossen war, habe ich damit angefangen
248+
mir zu "uberlegen, wie ich das Display jetzt testen kann.
249+
Da ich keine Ahnung hatte, wie das Ganze genau funktioniert, habe ich damit begonnen
250+
eine kleine Displayklasse zu schreiben. Diese sollte anfangs nur ganz spartanische
251+
Methoden besitzen. So ist folgende kleine Headerdatei entstanden:
252+
253+
\begin{lstlisting}[language=c++]
254+
#define RW 12
255+
#define RS 13
256+
257+
#define DB0 10
258+
#define DB1 9
259+
...
260+
#define DB7 3
261+
262+
class Display
263+
{
264+
private:
265+
/*
266+
* Dieses Attribut beinhaltet die 8 Datenbits.
267+
*/
268+
int DB_ARRAY[8];
269+
/*
270+
* Diese Methode bestimmt ob das Byte aus dem
271+
* value-Parameter 1 oder 0 ist und gibt dies
272+
* entsprechend zurueck.
273+
*/
274+
int getBit(int value, int bitNumber);
275+
276+
public:
277+
/*
278+
* Konstruktor hat DB_ARRAY initialisiert
279+
*/
280+
Display();
281+
/*
282+
* Sollte Datenbyte an Display senden
283+
*/
284+
void writeData(int value);
285+
/*
286+
* Sollte Befehl an Display senden
287+
*/
288+
void executeCommand(int value);
289+
}
290+
\end{lstlisting}
291+
Wie man sieht hatte der Enable-Pin zu diesem Zeitpunkt noch gar keinen
292+
Platz im Programm gefunden, da ich damit nicht umzugehen wusste.
293+
(Sieht man daran, dass die passende Pr"aprozessorvariable fehlt!) \\
294+
Nachdem diese Version nicht funktioniert hatte, hat es der Pin
295+
aber trotzdem ins Programm geschafft und nach ewigem Ausprobieren und
296+
Ab"andern das Quelltextes, hat es dann auch irgendwann funktioniert. \\
297+
\newline
298+
Nachdem ich es hinbekommen hatte erfolgreich mit dem Display zu kommunizieren,
299+
musste ich es schaffen, float-Werte an den Display zu senden. Daher
300+
mussten daf"ur auch noch Methoden geschrieben werden.
301+
Dieser Schritt war allerdings im Vergleich zum Vorherigen relativ leicht
302+
und schnell erledigt. \\
303+
Als Letztes musste ich mir jetzt noch "uberlegen, wie ich die Werte
304+
auf dem Display darstelle. Ich habe mich daraufhin ziemlich schnell daf"ur
305+
entschieden, die Temperatur "uber alle 4 Zeilen anzeigen zu lassen und mich
306+
mit Photoshop um ein paar Entw"urfe gek"ummert. Die Schwierigkeit dabei bestand
307+
darin, dass ich f"ur diese Aufgabe nur 8 eigene Zeichen definieren durfte.
308+
Nachdem ich 2 verschiedene Entw"urfe erstellt hatte, habe ich einen Kumpel nach
309+
seiner Meinung "uber diese gefragt. Nach kurzer Zeit hatte er mir ein Bild mit
310+
einer Schriftart gesendet, die er im Internet gefunden hatte. Diese ist dann
311+
schlie"slich auch die finale Schriftart geworden. \\
312+
Als auch dieser Schritt erfolgreich abgearbeitet war, kam ich zum vorerst letzten
313+
Abschnitt meines Projektes. Ich musste jetzt schlie"slich noch den
314+
Temperatursensor anbauen und programmieren.
315+
316+
\section{Temperatursensor Anschlie"sen und Programmieren}
317+
Da ich meine Grundkentnisse, w"ahrend ich die anderen Abschnitte abgearbeitet hatte,
318+
ausbaute, war dieser Schritt mit Abstand am einfachsten zu realisieren.
319+
Den Sensor musste man einfach nur "uber 3 Pins anschlie"sen. Zwei Anschl"usse
320+
davon sind der Plus- und der Minuspol.
321+
Der dritte Pin ist die Ausgangsspannung aus dem Ger"at, die abh"angig von der
322+
Temperatur ist. Dieser wird einfach nur an einen der analogen Eingang des
323+
Arduinos angeschlossen. \\
324+
Um die aktuelle Temperatur auszulesen, muss man jetzt einfach nur den Pin auslesen
325+
und ein bisschen rechnen. Im folgenden zeige ich das Ganze im Quellcode:
326+
\begin{lstlisting}[language=c++]
327+
...
328+
/*
329+
* adc - Analog/Digital-Converter
330+
* gibt Wert von 0 bis 1023 (2^10) zurueck!
331+
*/
332+
int adcValue = analogRead(temperatureSensorPin);
333+
/* milliVolt - Voltzahl in mV, die am Sensor anliegt */
334+
float millivolts = (adcValue / 1024.0) * milliVolt;
335+
336+
/* Sensor-Output ist 10mV pro Grad Celsius */
337+
float celsius = millivolts / 10;
338+
...
339+
\end{lstlisting}
340+
Allerdings musste ich feststellen, dass die Temperatur manchmal ziemlich
341+
gro"se Ausrei"ser hat.
342+
Auf Grund dessen habe ich die Temperatur mittels Mittelwertbestimmung erhalten.
343+
Ich habe immer die letzten 14 gemessenen Werte gespeichert und den Mittelwert aus
344+
diesen Zahlen und der neu gemessenen Zahl bestimmt, um diesem Effekt entgegen
345+
zu wirken.
346+
347+
\section{Coderefactoring}
348+
Im letzten Schritt musste der Code noch h"ubsch gemacht werden. Da man jetzt die
349+
komplette Funktionsweise kennt, konnte man sich nun dar"uber Gedanken machen, wie man
350+
den Quellcode am besten aufbaut. \\
351+
Ich habe mich daf"ur entschieden, das ganze mit 3 Klassen und 2 Strukturen zu realisieren.
352+
Den kompletten Quellcode findet man ebenfalls komplett kommentiert im Anhang.
353+
354+
355+
\chapter{Ergebnisse bzw. Fazit}
356+
W"ahrend des Projektes hab ich eine Menge positive wie negative Erfahrungen dazu
357+
gewonnen und ich denke, dass sich das Ergebnis nicht zu verstecken braucht.
358+
Ich habe gelernt, wie ich mit elektronischen Bauteilen umzugehen habe, wie man
359+
mit diesen kommunizieren kann und wie man ein solches Projekt aufbaut.
360+
Leider musste ich feststellen, dass die Informationen die in den einzelnen
361+
Datenbl"attern stehen nicht immer die Wahrheit erz"ahlen oder gar n"utzlich sind.
362+
Beispielsweise war die Definition von eigenen Zeichen f"ur das Display
363+
vollkommen falsch beschrieben. \\
364+
Au"serdem konnte ich feststellen, dass mir das Programmieren mehr Spa"s bereitet, als
365+
das L"oten und Zusammenstecken. Nichtsdestotrotz hat es einen riesen Spa"s gemacht
366+
und ich w"urde kommenden Arduino-Projekten nicht von vornherein einen Stein in den
367+
Weg legen. \\
368+
Das bedeutet, dass ich auch in Zukunft daf"ur offen w"are, eine Problemstellung
369+
dieses Typs zu realisieren.
370+
Interessant f"ande ich es, eine kleine Art Betriebssystem mit einfachem Dispatcher und
371+
einfachem Scheduler f"ur das Arduino zu bauen.
372+
Sodass man unter Umst"anden mehr als ein Projekt mit dem Arduino verwalten k"onnte.
373+
Vielleicht gibt es ja irgendwann die daf"ur notwendige Zeit.
374+
375+
\end{document}

0 commit comments

Comments
 (0)