\documentclass[]{schulein}
\usepackage[utf8]{inputenc}
\usepackage{schulinf}

% Dieses Dokument ist in der Zusammenarbeit von Informatikreferendaren und
% ehemaligen Informatikreferendaren der Studienseminare (heute ZfsL) Arnsberg,
% Hamm und Solingen entstanden.
%
% Das Dokument steht unter der Lizenz: Creative Commons by-nc-sa Version 4.0
% http://creativecommons.org/licenses/by-nc-sa/4.0/deed.de
%
% Nach dieser Lizenz darf das Dokument beliebig kopiert und bearbeitet werden,
% sofern das Folgeprodukt wiederum unter gleichen Lizenzbedingungen vertrieben
% und auf die ursprünglichen Urheber verwiesen wird.
% Eine kommerzielle Nutzung ist ausdrücklich ausgeschlossen.
%
% Die Namensnennung durch einen Verweis und die Lizenzangabe der ursprünglichen
% Urheber auf den Materialien für Schülerinnen und Schüler ist erforderlich.
%
% Die Sammlung der Dokumente steht unter
% http://ddi.uni-wuppertal.de/material/materialsammlung/
% zur Verfügung.
%
% Das LaTeX-Paket zum Setzen der Dokumente der Sammlung steht
% unter  http://www.ctan.org/pkg/schule
% zur Verfügung.

\usepackage[pdfauthor={Referendare der Informatikfachseminare Arnsberg, Hamm und Solingen}]{hyperref}
\includexmp{lizenz}
\cclizenz{byncsaeu}
\footerQRLink{materialsammlung_qr_url.pdf}

\svnid{$Id: info_07_ad_wandler.tex 1442 2016-03-21 09:55:09Z pieper $}

\dokName{RasPi: Analog/Digital-Wandler}
\jahrgang{9}

\usepackage{inconsolata}

%Anpassungen für die Einbindung im Skript
\newcommand{\singleSection}[1]{\section*{#1}}
\renewcommand{\thesubsection}{\arabic{subsection}}

\usepackage{units}

\lstset{% 
	breaklines=true, % Zeilenumbrüche
	language=python, % Sprache
	basicstyle=\ttfamily\small,
	breakatwhitespace=false,
	tabsize=2
}

\begin{document}

\singleSection{Analog/Digital-Wandler (A/D-Wandler)}

Von Hause aus kann der Raspberry Pi nur digitale Signale verarbeiten. Er kann also nur überprüfen, ob an einem Pin eine Spannung anliegt oder nicht. Dieses wird bei dem Gebrauch von Schaltern eingesetzt. Um analoge Messungen auswerten zu können, bei denen es auch auch Zwischenwerte geht, wird ein Analog/Digital-Wandler, oder auch kurz AD, benötigt. Dieser misst eine Spannung und wandelt sie in eine Zahl in einem bestimmten Zahlenbereich um. Der MCP3008 ist ein solcher 10-Bit A/D-Wandler. Er kann Zahlenwerte zwischen 0 und \(2^{10} - 1 = 1023\) erfassen. Der MCP3208 hat sogar eine Auflösung von 12 Bit und liefert somit Werte von 0 bis \(2^{12} -1 = 4095\). 

\subsection{SPI einrichten}

Damit der A/D-Wandler nicht mit 10 Leitungen angeschlossen werden muss, kommuniziert er mit dem Raspberry Pi über das SPI-Protokoll. Dazu hat der Pi vorbelegte Pins die im Device-Tree aktiviert werden müssen. Dieses kann in \lstinline|raspi-config| unter \enquote{Advanced Options} eingestellt werden oder durch hinzufügen folgender Zeile in die \lstinline|/boot/config.txt|:
\begin{lstlisting}[frame=trBL]
	dtparam=spi=on
\end{lstlisting}
Nach einem Neustart des Raspberry Pi steht dann das SPI zur Verfügung.

\subsection{Anschluss des A/D-Wandlers}
Im ersten Schritt wird nur der A/D-Wandler an den Raspberry Pi angeschlossen. Die Anschlüsse des MCP3008 sind identisch zum MCP3208 und in der linken unteren Zeichnung abgebildet. Wie dieser A/D-Wandler mit dem Raspberry Pi verbunden werden muss, ist der der Schaltzeichnung und der rechten Tabelle zu entnehmen. In dieser Aufstellung ist bereits die Referenzspannung mit angeschlossen, weshalb in dieser Anordunung die zu messende Spannung niemals 3,3\,V überschreiten darf.

\begin{minipage}{0.25\textwidth}
	\input{chip_mcp3008.cir}
\end{minipage}
\begin{minipage}{0.4\textwidth}
	\input{schaltung_gpio_mcp3008.cir}
\end{minipage}
\begin{minipage}{0.3\textwidth}
	\begin{tabular}{|l|l|}
		\hline
			A/D & GPIO \\
		\hline 
			9 (D\(_{GND}\)) & 9 (GND) \\
			10 (CS) & 24 (CE0) \\
			11 (D\(_{IN}\)) & 19 (MOSI) \\
			12 (D\(_{OUT}\)) & 21 (MISO) \\
			13 (CLK) & 23 (SCLK) \\
			14 (A\(_{GND}\)) & 9 (GND) \\
			15 (V\(_{REF}\)) & 1 (3,3\,V) \\
			16 (V\(_{DD}\)) & 1 (3,3\,V) \\
		\hline
	\end{tabular}
\end{minipage}

\subsection{Einbindung in Python}
Die Einbindung des MCP3008 in Python ist durch die Python Bibliothek \enquote{gpiozero}\footnote{Wenn es noch nicht vorhanden ist, kann es mit \lstinline|sudo apt-get install python3-gpiozero| nachinstalliert werden} sehr einfach. Es muss nur bei der Erzeugung des A/D-Wandler Objekts der Kanal angegeben werden, von dem der Wert ausgelesen werden soll.
\begin{lstlisting}[numbers=left, numberstyle=\footnotesize, numbersep=5pt, gobble=2]
	import gpiozero
	adw = gpiozero.MCP3008(channel=3)
	value = adw.value # liefert Wert von 0 bis 1
	value2 = adw.raw_value # liefert Wert von 0 bis 1023
\end{lstlisting}

Bei dem oberen Beispiel ist der Unterschied zwischen \lstinline|value| und \lstinline|raw_value| zu beachten. Beim ersten wird der des A/D-Wandlers so umgerechnet, dass er immer zwischen 0 und 1 liegt. Beim zweiten liegt der Wert direkte Wert vor, der beim MCP3008 bis 1023 geht, beim MCP3208 aber bis 4095.

\subsection{Anschluss eines Potentiometers}
Das Potentiometer ist ein regelbarer Widerstand. Schließt man ihn zwischen der Masse und 3,3\,V an, so erhält man zwischen Masse und dem Anschluss für den regelbaren Widerstand eine Spannung zwischen 0\,V und 3,3\,V, je nachdem wie weit das Potentiometer eingestellt ist. Mit Hilfe des A/D-Wandlers kann man so aus einem Potentiometer einen Regler für Programme machen.

Der Anschluss eines Potentiometers ist der Schaltzeichnung zu entnehmen. In diesem Fall ist er an Kanal 0 angeschlossen, es wäre aber auch jeder andere der 8 Kanäle möglich. Entsprechend sieht auch das dazugehörige Python-Programm aus.

\begin{minipage}{0.6\textwidth}
	\lstinputlisting[firstline=3, numbers=left, numberstyle=\footnotesize,  numbersep=5pt]{poti.py}
\end{minipage}\hfill
\begin{minipage}{0.35\textwidth}
	\input{schaltung_gpio_mcp3008_poti.cir} 
\end{minipage}

\subsection{Anschluss eines analogen Thermometers}
\begin{minipage}{0.75\textwidth}
Ein analoger Thermometerchip hat am Datenpin je nach gemessener Temperatur eine unterschiedliche Spannung. Für den Einsatz am Raspberry Pi eigenen sich dabei Thermometer aus der TMP36-Reihe. Diese haben folgende Belegung: Pin 1 ist für die Spannung, Pin 2 liefert die Daten und an Pin 3 muss die Masse angeschlossen werden.
\end{minipage}\hfill
\begin{minipage}{0.2\textwidth}
	\input{chip_ds1820.cir} 
\end{minipage}

\begin{minipage}{0.35\textwidth}
 \input{schaltung_gpio_mcp3008_thermo.cir}
\end{minipage}\hfill
\begin{minipage}{0.6\textwidth}
	Dem Schaltplan ist zu entnehmen, wie das Thermometer an den Kanal 1 angeschlossen wurde. Um aus dem gemessenen Wert die Temperatur bestimmen zu können, muss dieser passend umgerechnet werden. Beim TMP36 kann man folgende Formel dafür nutzen:
	\[ t = ( v \cdot 3,3 - 0.5 ) \cdot 100 \]
	Dabei ist \(v\) der gemessene Wert zwischen 0 und 1 und die \(3,3\) kommt durch die Referenzspannung am A/D-Wandler.
\end{minipage}

Beim Auslesen ist zu beachten, dass die gemessenen Werte des TMP36 bereits bei der Messung um \(0.5^{\circ}\) vom echten Wert abweichen können. Daher sollte man die errechneten Werte im Programm auf maximal eine Nachkommastelle runden. Das komplette Python-Programm zum auslesen des Thermometers sieht dann so aus:

\lstinputlisting[firstline=3, numbers=left, numberstyle=\footnotesize,  numbersep=5pt]{atemperatur.py}

\end{document}