Ein Roboter mit bürstenlosem Antrieb, differenzial und NRF24L01 Funk. Großflächig gebaut um ein großes Solarpanel aufzunehmen. https://gitlab.informatik.hs-fulda.de/fdai5253/roboter
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

432 lines
28 KiB

4 years ago
4 years ago
4 years ago
  1. %---------------------------------------------
  2. % Lachaise Assignment
  3. % LaTeX Template
  4. % Version 1.0 (26/6/2018)
  5. %
  6. % This template originates from:
  7. % http://www.LaTeXTemplates.com
  8. %
  9. % Authors:
  10. % Marion Lachaise & François Févotte
  11. % Vel (vel@LaTeXTemplates.com)
  12. %
  13. % License:
  14. % CC BY-NC-SA 3.0 (http://creativecommons.org/licenses/by-nc-sa/3.0/)
  15. %
  16. %---------------------------------------------------
  17. %----------------------------------------------------------------------------------------
  18. % PACKAGES AND OTHER DOCUMENT CONFIGURATIONS
  19. %----------------------------------------------------------------------------------------
  20. \documentclass[12pt]{article}
  21. % Include the file specifying the document structure and custom commands
  22. \input{structure.tex}
  23. %----------------------------------------------------------------------------------------
  24. % INFORMATION
  25. %----------------------------------------------------------------------------------------
  26. % Title
  27. \title{Open Source Roboter Plattform}
  28. \author{Lukas Reichwein\\ Yves Ehrlich\\ Nick Gnoevoj}
  29. \date{University of Applied Science Fulda --- \today}
  30. %----------------------------------------------------------------------------------------
  31. \begin{document}
  32. \maketitle % Print the title
  33. \tableofcontents % Inhaltsverzeichniss, Achtung zweimal Compilerien!
  34. \newpage
  35. %----------------------------------------------------------------------------------------
  36. % INTRODUCTION
  37. %----------------------------------------------------------------------------------------
  38. \section{Vorwort} % Unnumbered section
  39. \paragraph{Motivation: }
  40. Eine Plattform bieten ist etwas, das momentan sehr stark im Trend liegt, sei es im Software oder im Hardware Bereich. Im Softwarebereich zeigt sich dies meist durch Open-Source Bibliotheken, welche möglichst variabel einsetzbaren Code für jeden frei zugänglich machen.
  41. Ein solches Projekt war auch von einem der Projektmitglieder (Yves Ehrlich) als Privates Projekt geplant und so kam die Überlegung dies innerhalb des Modules Embedded Networking zu wählen.
  42. \paragraph{Basis des Projektes: }
  43. Als Basis des Projektes dient einer schon bereits von Yves Ehrlich angefertigter Arduino Nano Shield samt Code,
  44. \cite{nanoGame} welcher als Fernsteuerung verwendet wird.
  45. \paragraph{Ziel des Projektes: }
  46. Ziel des Projektes ist ein ferngesteuerte, Open-Source basierende Roboterplattform.
  47. \newpage
  48. \section{Überlegung}%Yves
  49. Die urprüngliche Idee war die Entwicklung eines Solarroboters, also eines Roboters, der tagsüber mit Hilfe der Sonneneinstrahlung seinen Eigenbedarf decken kann und somit nur einen kleinen Pufferakku benötigt.
  50. Praktische Anwendungen könnten z.B. die Nutzung als kompakte Straßenkehrmaschine oder als Rasenmäher sein. Bedingt durch die eingeschränkte Leistungsabgabe der Solarzellen vermutlich nur für kleine zu bearbeitende Flächen.
  51. Da es nur wenige brauchbare und frei zugängliche Quellen für solche Plattformen gibt, wollten wir eine eigene schaffen. Daher sollte das Projekt exemplarisch als Grundlage für eine Quelloffene Plattform dienen, die auch von anderen genutzt und weiterentwickelt werden kann.
  52. Da wir bei der Entwicklung der mechanischen Komponenten schnell feststellen mussten, dass das Fahrwerk recht komplex ist, insbesondere die Vorderachse, schwenkten wir schnell auf eine andere Bauweise um. Zunächst war der Aufbau mit 4 gleichen Rädern geplant, von denen zwei Stück (Hinterachse) von einem bürstenlosen Gleichstrommotor angetrieben werden sollten. Die Entwicklung eines Differenzials gestaltete sich noch als relativ einfach. Die Vorderachse aber mit dem Servo gestaltete sich dann, hinsichtlich des Zeitaufwandes, für zu komplex.
  53. \begin{figure}[h]
  54. \includegraphics[width=12cm]{hinterachse.png}
  55. \centering
  56. \caption{Hinterachse des urpsrünglichen Aufbaus}
  57. \end{figure}
  58. \begin{figure}[h]
  59. \includegraphics[width=12cm]{lagerschalen.png}
  60. \centering
  61. \caption{Lagerschalen}
  62. \end{figure}
  63. Somit schwenkten wir kurzer Hand zu einem sehr viel einfacheren Aufbau um, um uns schneller den wichtigeren Komponenten widmen zu können.
  64. Der neue Aufbau sah eine schlichte Grundplatte als Plattform für die weiteren Bauteile, wie Motoren (Mabuchi N20 mit Getriebe), Ultraschallsensor, Akku, Hauptplatine und uvm. vor.
  65. Um möglichst viele Montagemöglichkeiten zu bieten, wurde die Grundplatte mit Bohrungen in regelmäßigen Abständen versehen. Diese Bohrungen können zum durchstecken für Schrauben oder zum versenken von Gewindemuffen genutzt werden.
  66. Zum anbringen unserer Komponenten haben wir auf Messinggewindebuchsen und passende M3 Schrauben gesetzt.
  67. Alle selbstentworfenen Komponenten haben wir mit einem FFF 3D-Drucker aus PLA gedruckt.
  68. Mit Ausnahme der Hauptplatine natürlich.
  69. Bedingt durch den Zeitaufwand des gesamten Projektes und anderer Studienmodule haben wir uns entschieden, die Implementierung eines MPPT Ladereglers fallen zu lassen, somit wurde die Idee des Solarroboters auf die Idee der Entwicklung eines Roboters reduziert.
  70. \begin{figure}[h]
  71. \includegraphics[width=12cm]{roboter.png}
  72. \centering
  73. \caption{Der Roboter, aktueller Aufbau}
  74. \end{figure}
  75. \newpage
  76. \section{Mechanik}%Yves
  77. Wie bereits unter „Überlegung“ erwähnt, gestaltete sich der Aufbau mit Achsträger, Radlager und Lagerschalen uvm. als zu Zeitintensiv um in der vorgegebenen Zeit bewältig werden zu können.
  78. Zum Entwurf der mechanischen Bauteile wurde das CAD Programm Fusion 360 von Autodesk verwendet. Dabei gab es kaum Schwierigkeiten, da Yves Ehrlich bereits sehr viel Erfahrung mit 3D-CAD Programmen gesammelt hat. Lediglich der Zwang Windows zu benutzen stellt eine ständige Unannehmlichkeit dar.
  79. Alle Entwürfe wurden mit einem 3D Drucker gedruckt, einem HCmaker7, ein Klon des bekannten Creality CR-10S.
  80. Das Material der Wahl war PLA. Für einen Außeneinsatz ist das Material wegen der geringen Witterungsbeständigkeit kaum geeignet. Insbesondere die geringe Temperaturbeständigkeit (max. 60°C) disqualifizieren das Material für den Einsatz in der Sonne. Da dies aber ohnehin nicht mehr geplant war, ist das Material für unseren Zweck geeignet.
  81. \subsection{Montagemöglichkeiten}
  82. Die zur Befestigung von Bauteilen nötigen Gewindebuchsen in den Kunststoff einzusetzen ist relativ einfach, man benötigt dafür lediglich eine Schraube die man in die Buchse einschraubt und einen Lötkolben mit einer Temperatur von etwa 240°C. Ohne Druck auszuüben legt man die Spitze des Lötkolbens auf den Schraubenkopf. Wenn die Schraube ausreichend Wärme an die Muffe übertragen hat, fängt die Muffe an im Kunststoff zu versinken. Die Schwerkraft sorgt hier für alles nötige. Wenn die Muffe weit genug versunken ist, kann der Lötkolben entfernt werden und man sollte die Schraube schnell abkühlen, z.B. durch pusten oder ein kleines Gebläse wie z.B. einen Radiallüfter.
  83. Beim Design der Kunststoffteile muss man darauf achten, dass für Gewindemuffen stehts eine ausreichend große Fase vorhanden sein muss, damit die Muffe einerseits zentriert wird beim versinken und andererseits kein verdrängtes Material die Muffe beim versinken behindert oder verstopft. Letzterem wird aber auch durch die eingeschraubte Schraube vorgebeugt.
  84. \subsection{Antrieb}
  85. Der Aufbau sieht zwei Antriebsmotoren vor, welche jeweils ein Rad treiben. Zum abstützen verfügt der Roboter über ein selbstentworfenes Kugelrad. Dieses Kugelrad verwendet als Kugeln vier handelsübliche Airsoft Kugeln mit einem Durchmesser von 6mm.
  86. Die Gleiteigenschaften dieser Konstruktion sind nicht die besten, aber für diesen Prototypen ausreichend. Um die Reibung zu vermindern haben wir Silikonöl auf die Kugeln aufgetragen.
  87. \subsection{Verbesserung}
  88. Da Kunststoffe auf glatten Oberflächen sehr wenig Bodenhaftung haben, wurden die Räder mit einer Nut versehen. In diese Nut kann man später ein einfaches Haushaltsgummiband einlegen, somit hat der Roboter auch auf glatten Oberflächen relativ gute Haftung.
  89. \newpage
  90. \section{Elektronik}%Yves
  91. Lochrasterplatinen, wie sie häufig für Prototypzwecke genutzt werden, sind nicht nur unpraktisch für SMD Komponenten, auch wenn man ein 2,54mm Raster mit einigen Tricksereien durchaus auch für SMD Komponenten nutzen kann, sie sind auch relativ unzuverlässig und die Fehlersuche gestaltet sich z.T. als schwierig (je nach Menge und Komplexität der Verdrahtungslagen).
  92. Deshalb entschieden wir uns, eine eigene Platine zu entwickeln.
  93. Als Software nutzten wir dafür das kommerzielle Programm Sprint Layout 6 von der Firma Abacom.
  94. Da die Herstellung der Platine von Hand erfolgen sollte, haben wir die Strukturen der Platine sehr grob gezeichnet. Was auch durch die geringe Anzahl an Komponenten und deren modulare Bauweise begünstigt wurde.
  95. \subsection{Verfahren}%Yves
  96. Als Verfahren zum beschichten der Platine diente die Tonertransfermethode. Dabei wird die Schaltung mit einem Laserdrucker auf geeignetes Papier gedruckt, in diesem Fall Photopapier, und dann mit Hitze auf die blanke Platine gedrückt. Für diesen Zweck hat Yves Ehrlich ein Laminiergerät umgebaut, welches den Vorgang erheblich erleichtert.
  97. Da unsere Platine doppelseitig ist, müssen zuvor die zwei Seiten, welche die Schaltung enthalten Deckungsgleich aufeinander ausgerichtet werden und dann an den Rändern verklebt werden, damit man am Ende eine Art Tasche erhält, in welche dann die Platine eingesteckt werden kann.
  98. Das ganze läuft dann einige Male durch das Laminiergerät. Nach dem das erfolgt ist, lässt man die Platine etwas abkühlen und ab einer Temperatur von etwa 30-40°C schneidet man die Tasche seitlich auf und zieht vorsichtig das Papier ab. Der Toner bleibt am Kupfer haften und schützt an diesen Stellen, wie ein Fotolack, das Kupfer davor weggeätzt zu werden.
  99. Anschließen gibt man die beschichtete Platine in eine Ätzküvette welche mit einer Natriumpersulfat-Lösung gefüllt ist. Nach einiger Zeit kann man beim durchleuchten der Küvette sehen, wie sich das Kupfer immer weiter auflöst, bis am Ende die Schaltung klar und deutlich zu sehen ist. Dann wird die Platine entnommen und gründlich mit Wasser abgespült.
  100. Zum entfernen des Toners benötigt man etwas Aceton und einen Lappen.
  101. Für die THT Komponenten müssen nun noch Bohrungen gesetzt werden. 1,2mm, passend für die Durchkontaktiernieten von Bungard.
  102. Nach dem verpressen (mangels passender Presse eher mit einem Körner breitschlagen) der Nieten, müssen diese beidseitig verlötet werden. Danach können alle Komponenten bestückt werden.
  103. \begin{figure}[h]
  104. \includegraphics[width=16cm]{laminiergeraet.png}
  105. \centering
  106. \caption{Laminiergerät}
  107. \end{figure}
  108. %Platine
  109. \begin{figure}[h]
  110. \centering
  111. \subfigure[Top-Layer]{\includegraphics[width=7.5cm]{pcbTop.png}}
  112. \subfigure[Bottom-Layer]{\includegraphics[width=7.5cm]{pcbBottom.png}}
  113. \caption{fertig geätzte Platine}
  114. \end{figure}
  115. \newpage
  116. \subsection{Bestückung}%Yves
  117. Zum verlöten der Komponenten kam SMD-Lot mit Bleianteil zum Einsatz.
  118. Für SMD Komponenten wurde eine Pinzette als Hilfswerkzeug verwendet.
  119. \subsection{Schaltung}%Yves
  120. Die Schaltung ist relativ einfach gehalten. Im wesentlichen dient die Platine nur als Träger für die modularen Komponenten und für diverse Anschlussmöglichkeiten. Für den NRF24 wurde ein 3,3V Spannungsregler integriert.
  121. Um etwaige Motorenwechsel zu erleichtern, sind zu deren Anschluss Federzugklemmen verbaut worden.
  122. Wegen der Überschaubarkeit der Schaltung haben wir auf einen Schaltplan verzichtet, da das Layout selbsterklärend ist.
  123. \newpage
  124. \section{Fernsteuerung}%Yves
  125. Auf die Fernsteuerung soll an dieser Stelle nicht näher eingegangen werden, da diese zum Zeitpunkt der Erstellung dieses Projektes bereits „fertig“ war.
  126. Es wurden lediglich ein Joystick sowie ein NRF24 ergänzt.
  127. Detaillierte Informationen finden sich im dazugehörigen Repositorium\cite{nanoGame}.
  128. Im Rahmen eines Arduino Workshops für Anfänger entwickelte Yves Ehrlich eine Platine, welche als Shield für einen Arduino Nano fungiert. Sie enthält grundlegende Dinge wie Tasten, einen Akku, eine stabile 5V Spannungsversorgung sowie ein monochromes LCD Display mit Hintergrundbeleuchtung, um nur die wichtigsten Sachen zu nennen.
  129. Dank der Buchsenleiste auf der Rückseite, welche neben 3,3V und 5V Spannungsversorgung auch diverse I/Os und Analogeingänge bereitstellt, lässt sich das Shield „nanoGame“ hervorragend erweitern und für viele verschiedene Dinge nutzen, so auch als Fernsteuerung für unseren Roboter.
  130. Bei dem Joystick handelt es sich um eine Platine welche ein original Ersatzteil der Sony PSP enthält. Dieser Joystick ist sehr kompakt und ließ sich dadurch recht einfach in unsere Projekt integrieren. Es musste lediglich eine Halterung konstruiert werden, um den Joystick an das Gehäuse der Fernsteuerung zu schrauben.
  131. Beim Funkmodul sind wir kompromissloser vorgegangen. Dieses wurde mit ein wenig Silikonklebstoff an der Oberseite fixiert.
  132. Alle Verbindungsleitungen wurden Freiluft auf der Rückseite der Fernsteuerung zum Schacht der bereits erwähnten Buchsenleiste gelegt und dort mit Steckerleisten angeschlossen.
  133. \begin{figure}[h]
  134. \includegraphics[width=12cm]{rcVorn.png}
  135. \centering
  136. \caption{Fernsteuerung vorn}
  137. \end{figure}
  138. \begin{figure}[h]
  139. \includegraphics[width=12cm]{rcHinten.png}
  140. \centering
  141. \caption{Fernsteuerung hinten}
  142. \end{figure}
  143. \newpage
  144. \section{Code allgemein}%Yves
  145. Um die Einsatzmöglichkeiten für den Code möglichst flexibel zu gestalten, haben wir uns bemüht, nicht blockierenden Quelltext zu schreiben.
  146. Somit lässt sich auch mit dem recht kleinen Atmega328p bei 16 MHz Takt eine ganze Menge bewältigen.
  147. Aktuell ist der Roboter in der Lage auf Kommandos, die er von der Fernsteuerung erhält, zu reagieren. Aus Zeitgründen konnten wir leider nur einen manuellen Fahrmodus implementieren. Dieser beinhaltet das fahren mit digitalen Tasten sowie „analog“ mit dem ergänzten Joystick.
  148. Weiterhin implementiert wurden das erfassen von Temperaturen mit Hilfe eines DS1820 und eine Distanzmessung mit einem HC-SR04 Ultraschallsensor.
  149. Die Übertragung von Kommandos ist relativ einfach gehalten. Das erste Byte im commands Array ist ein Kommando, gefolgt von 2 Bytes mit Daten. Diesem Muster folgend ist jedes dritte Byte ein Kommando, gefolgt von zwei Datenbytes.
  150. Da das Array eine feste Größe von 32 Byte hat, lassen sich folglich bis zu 10 Kommandos übertragen. Wie viele Kommandos jeweils übertragen werden und in welcher Reihenfolge diese im Array vorkommen, also ob Byte 0,3,6,9...usw., spielt keine Rolle.
  151. \newpage
  152. \section{SPI}%Lukas
  153. \subsection{Was ist SPI?} %Lukas
  154. SPI - Serial Peripheral Interface ist der Standard für ein Synchronen Seriellen Datenbus. Dieser Datenbus kann zwei digitale Schaltungen mittels Master-Slave prinzip verbinden \cite{SPI}. Der Bus ermöglicht die verwendung von Mehreren Slaves, jedoch wird die Anzahl der Slaves durch die Anzahl der CS - ChipSelect Leitungen begrenzt. Die Datenübertragung geschiet über eine Seperate Leitung, auch SD (Serial Data) genannt.
  155. \paragraph{Rolle des Masters}
  156. Der Master gibt das Taktsignal über den SCK (Serial Clock) Ausgang an, desweiteren wählt er einen Slave mit welchem er kommunizieren möchte über den CS (ChipSelect).
  157. \paragraph{Rolle des Slaves}
  158. Der Slave ist solange inaktiv bis dieser über den CS Pin aktiviert wird. Nach der Aktivierung wird über Serial Data kommuniziert, das Taktsignal wird über den SCK Synchronisiert bzw vom Master übernommen.
  159. \subsection{Einsatz von SPI innerhalb des Projektes}
  160. \paragraph{Verbindung: }
  161. Um die Verbindung zwischen dem nRF24L01 Chip und dem Arduino herzustellen wurden zunächst alle Verbindungen getätigt. Im Folgender Graphik ist das Pinout vom nRF24L01 Chip abgebildet. Dabei sind die Kürzel wie folgt benannt: CE - Chip Enable dieser entspricht dem Chip Select Pin, CSN -Ship Select Not dieser ist die Invertierte version des CE, SCK - Serial Clock, MISO - Master in Slave out, MOSI - Master out Slave in und die beiden Pins für die Stromversorgung VCC und Ground. Die beiden pins MISO und MOSI sind die Datenleitungen und werden an den Gleichnamingen Pins des Arduinos angeschlossen. Desweiteren ermöglicht der IRQ Interruptsteuerung dieser Pin ist Optional zu verwenden.
  162. \begin{figure}[h]
  163. \includegraphics[width=8cm]{nRF24L01Pinout.png}
  164. \centering
  165. \caption{Pinout des nRF24L01 Chips \cite{nRF24Pinout}}
  166. \end{figure}
  167. \newpage
  168. \section{Drahtlose Verbindung} %Lukas
  169. Wie schon zuvor erwähnt wird für die Basis der Funksteuerung das Arduino Shield verwendet, welches mit dem nRF24L01 Chip erweitert wurde. Der Roboter wurde ebenfalls mit dem nRF24L01 ausgestattet.
  170. \subsection{Allgemeine Verwendung von RF24} %Oder nur als paragraph je nachdem wie viel zusammen kommt.
  171. Die Opensoucre Bibliothek RF24 \cite{RF24Lib} diente als Codebasis für die Funksteuerung. Da diese Bibliothek bei korrekter Verwendung genau auf die Kommunikation zwischen zwei nRF24L01 Chips abgestimmt ist.
  172. Zur Verwendung der Bibliothek muss sie nur inkludiert und Instanziiert werden dabei werden die Beiden Pins CE und CSN für das Hardware-SPI konfiguriert.
  173. \begin{file}[RF24 initialisieren]
  174. \begin{lstlisting}[language=C++]
  175. #include <RF24.h>
  176. RF24 radio(A2, A3); // CE, CSN
  177. const byte address[6] = "00001";
  178. \end{lstlisting}
  179. \end{file}
  180. Damit sind bereits Sämtliche Konfigurationen für die Hardware-SPI Kommunikation zwischen Arduino nano und dem nRF24L01 erledigt.
  181. Kommunizieren zwischen zwei dieser Setups wird dann durch die Funktionen read und wirite,
  182. jedoch muss vor dem Start einer Kommunikation die Methoden begin(),
  183. openWritingPipe(address) mit address als Kommunikationsleitung und stopListening() bei Sender bzw startListening() beim Empfänger aufgerufen werden.
  184. Die Methode setPALevel() setzt den Power Amplifiyer Level umso höher dieser Wert umso Stärker das Signal,
  185. wodurch der Stromverbrauch Steigt.
  186. Der Anstieg des Stromverbrauchs kann auch bei einer nicht ganz konstanten Stromversorgung dazu führen das das Modul nicht korrekt funktioniert.
  187. \begin{file}[RF24 initialisieren]
  188. \begin{lstlisting}[language=C++]
  189. //An der Sender Seite
  190. radio.begin();
  191. radio.openWritingPipe(address);
  192. radio.setPALevel(RF24_PA_MAX);
  193. radio.stopListening();
  194. radio.write(&payload, sizeof(payload));
  195. //An der Empfaenger Seite
  196. radio.begin();
  197. radio.openReadingPipe(0, address);
  198. radio.setPALevel(RF24_PA_MAX);
  199. radio.startListening();
  200. if (radio.available()) {
  201. radio.read(&payload, sizeof(payload));
  202. //Payload weiter verarbeiten.
  203. }
  204. \end{lstlisting}
  205. \end{file}
  206. \subsection{Verwendung von RF24 innerhalb dieses Projektes}
  207. \paragraph{Am Anfang des Projektes: }
  208. Zu Begin des Projektes wurde zuerst die Funkkommunikation zwischen zwei Arduino's mittels nRF24L01 getestet, dabei gab es schon die ersten Komplikationen. Da der Chip nicht korrekt mit den Hardware SPI Anschlüssen des Arduino verbunden wurde. Nach dem weiteren Einlesen in die Funktionsweise von SPI konnten die Verbindungen richtig gesetzt und diese Komplikation wieder aufgehoben werden.
  209. \paragraph{Logik hinter der Kommunikation: }
  210. Um den Roboter mit der Fernsteuerung auch Steuern zu können musste erst ermittelt werden welche Daten der Roboter benötigt um zu fahren. Diese Daten wurden dann in ein 32Byte großes Commands Array gespeichert, welches dann übertragen wurde. Das Array besteht aus Folgenden Inhalten:
  211. \begin{enumerate}
  212. \item speedA - Geschwindigkeit des rechten Motors.
  213. \item dirA - Vorzeichen der Geschwindigkeit des rechten Motors.
  214. \item speedB - Geschwindigkeit des linken Motors.
  215. \item dirB - Vorzeichen der Geschwindigkeit des linken Motors.
  216. \item goDrive - startet autodrive.
  217. \item stopDrive - stoppt autodrive.
  218. \item getTemp - löst Temperaturübertragung aus.
  219. \item timeToDrive - Zeit die der Roboter fahren soll.
  220. \item nothing - Stoppt den Roboter.
  221. \end{enumerate}
  222. \paragraph{Übertragung der Commands}
  223. Das Commands Array wurde dann wie in der Sektion allgemeine Verwendung von RF24 beschrieben Übertragen, dabei ist die Payload das Commands Array. Der Sender ist Die Fernsteuerung und der Roboter ist der Empfänger. Der Empfänger besitzt daher auch die commandInterpretation() Funktion, welche die entsprechenden Kommandos liest und umsetzt.
  224. \newpage
  225. \section{Steuerung} %Lukas
  226. Der Roboter kann über ein Steuerkreuz mit 4 Buttons oder einen Joystick gesteuert werden. Begonnen wurde mit der Steuerung über die Buttons, dann wurde die Steuerung mittels Joystick realisiert und anschließend wurde diese dann noch stark variable als C++ Library Implementiert.
  227. \subsection{Button Steuerung} %Yves/Lukas
  228. %TODO verwendet wurde die lib ShiftRegButtons...
  229. Die Button Steuerung ermöglicht entweder Vorwärts, Rückwärts, Links oder Rechts zu fahren. Dabei werden die Beiden Motoren mit den jeweilig maximalen PwM-Werten angesprochen, sprich sie sind entweder eingeschaltet oder abgeschaltet.
  230. \paragraph{Logik hinter der Steuerung}
  231. Der Roboter soll für Folgende Tasten folgende Bewegungen durchführen:
  232. \begin{itemize}
  233. \item Oben - vorwäts fahren
  234. \item Unten - rückwärts fahren
  235. \item Rechts - Drehung im Uhrzeigersinn
  236. \item Links - Drehung gegen den Uhrzeigersinn
  237. \end{itemize}
  238. Realisiert wurde es folgendermaßen:
  239. \begin{itemize}
  240. \item vorwäts fahren - setzte PWM-Werte beider Motoren auf das Maximum
  241. \item rückwärts fahren - setzte PWM-Werte beider Motoren auf das minimum
  242. \item Drehung im Uhrzeigersinn - setze den PWM-Wert des rechten Motors auf das minimum und den des linken auf das maximum
  243. \item Drehung gegen den Uhrzeigersinn - setze den PWM-Wert des rechten linken auf das minimum und den des rechten auf das maximum
  244. \end{itemize}
  245. \subsection{Joystick Steuerung} %Lukas
  246. Die Steuerung über einen Joystick ermöglicht das kontrolieren über die Aussteuerung des Joysticks. Verwendet wurde ein klassischer Joystick, welcher aus dem Consolen bereich stammt.
  247. %TODO Joysticknamen mit verlinkung auf datenblatt...
  248. \paragraph{Grundlegende Verwendung des Joysticks}
  249. Der Joystick besitzt zwei analoge Anschlüsse und überträt dort werte von 0 bis 511 je nach aussteuerung des Joysticks, jede Achse hat somit ihren eigenen Pin.
  250. Die Werte der jeweiligen Achsen können dann über AnalogRead() mit dem Pin der Achse als Argument abgefragt werden.
  251. Die Mittelstellung des Joysticks ist demnach bei 255.
  252. \subparagraph{Mapping:}
  253. Da der Bereich der Werte nicht zu dem der benötigten PWM- Werten passt werden diese mithilfe der map() Funktion von 0 bis 511 auf -255 bis 255 gemapt.
  254. Nach dem Mapping kann die Auswertung über die Richtung durchgeführt werden um dann in den entsprechenden fällen die gemappten werte als geschwindigkeit zu interpretieren.
  255. \subparagraph{Anbringung und dessen Auswrikung auf die Steuerung}
  256. Der Joystick wurde so an das Shield angebracht, so dass druch ein nach Vorne drücken die Achsenwerte für die Y-Achse kleiner werden und ein nach Links drücken die X-Achse ebenfalls kleiner werden. Die Aussteuerung nach Rechts folgt demnach zu einer erhöhung der Achsenwerte der X-Achse und die Aussteuerung nach unten eine erhöhung der Achsenwerte der Y-Achsen.
  257. \paragraph{Logik hinter der Steuerung}
  258. Zuerst wurde die Logik der Button Steuerung übernommen, jedoch mit folgenden veränderungen.
  259. Vorwärtsfahren wird jetzt aktiviert, wenn der Achsenwert der Y-Achse kleiner als die Mittelstellung abzüglich einses toleranzbereiches ist.
  260. Das Rückwärtsfahren wird aktiviert, wenn der Achsenwert der Y-Achse größer als die Mittelstellung zuzüglich eines toleranzbereiches ist.
  261. Eine Drehung im Uhrzeigersinn wrid ausgelöst, wenn der Achsenwert der X-Achse größer als die Mittelstellung zuzüglich eines toleranzbereiches ist. Demnach wird eine Drehung gegen den Uhrzeigersinn ausgelöst, wenn der Achsenwert der X-Achse kleiner als die Mittelstellung abzüglich eines toleranzbereiches ist.
  262. In dieser Version ist der Toleranzbereich im Code mit 20 Festgeschrieben.
  263. \paragraph{Umsetzung der Steuerung}
  264. Die Umsetzung ist nichts anderes als die PWM-Werte für die beiden Motoren in jedem der Steuerungsfälle zu ermitteln. Da die werte schon gemappt wurden können diese nun hier wieder verwendet werden. In der Folgenden Graphik ist zu erkennen wann welche werte gesendet werden und ab welcher Aussterung die PWM-Werte negativ bzw. positiv werden.
  265. %TODO Graphik für die Übersetzung
  266. \subsection{Überführung der Joystick Steuerung in eine Library} %Lukas
  267. %TODO Hier wurde besonderes Augenmerk auf wiederverwendbarkeit und varibilität gelegt.
  268. \newpage
  269. \section{Arduino Libaries} %Lukas
  270. \newpage
  271. \section{Motorsteuerung} %Yves
  272. %Folgende beiden ließen sich auch durch subsections mittels sensoric als section realisieren, kommt aber auf die menge des textes an subsections sollten nicht über eine halbe seite lang sein.
  273. \newpage
  274. \section{Thermosensor} %Nick
  275. Wie bereits erwähnt benutzen wir einen Dallas DS1820 1-Wire Digital Thermometer, um die Motortemperatur zu messen. Der DS1820 speichert die Temperatur als einen 9bit Wert und kann Temperaturen im Bereich von -55°C bis 125°C messen. Für unsere Bedürfnisse reicht es wenn wir in 1-er Schritten messen. Der Sensor kommt aber auch mit halben Graden zu recht.
  276. Eine Messung wird durchgeführt indem der Sensor Takte, innerhalb eines Zeitfensters zählt. Der Zähler startet bei einem Wert, der -55°C darstellt. Erreicht der Zähler 0 schneller als das vorgegebene Zeitfenster wird das Temperaturregister inkrementiert. Der Zähler wird auf einen vom Slope Accumulator Circuitry abhängigen wert gestellt und wieder runtergezählt. Dies wiederholt sich solange bis das festgelegte Zeitfenster abgelaufen ist.
  277. \newpage
  278. \section{Ultraschallsensor} %Nick
  279. \newpage
  280. %----------------------------------------------------------------------------------------
  281. % Latex Beispeiele
  282. %----------------------------------------------------------------------------------------
  283. \section{Beispiele für Spezielle LaTeX Strukturen}
  284. \begin{info} % Information block
  285. benutze den Info block um wichtige informationen hervorzuheben.
  286. \end{info}
  287. %----------------------------------------------------------------------------------------
  288. % Beispiel für Pseudo Code.
  289. %----------------------------------------------------------------------------------------
  290. \begin{center}
  291. \begin{minipage}{0.5\linewidth} % Adjust the minipage width to accomodate for the length of algorithm lines
  292. \begin{algorithm}[H]
  293. \KwIn{$(a, b)$, two floating-point numbers} % Algorithm inputs
  294. \KwResult{$(c, d)$, such that $a+b = c + d$} % Algorithm outputs/results
  295. \medskip
  296. \If{$\vert b\vert > \vert a\vert$}{
  297. exchange $a$ and $b$ \;
  298. }
  299. $c \leftarrow a + b$ \;
  300. $z \leftarrow c - a$ \;
  301. $d \leftarrow b - z$ \;
  302. {\bf return} $(c,d)$ \;
  303. \caption{\texttt{FastTwoSum}} % Algorithm name
  304. \label{alg:fastTwoSum} % optional label to refer to
  305. \end{algorithm}
  306. \end{minipage}
  307. \end{center}
  308. %-----------------------------------------------------------------------------------------
  309. % Beispiel für Code Snippets.
  310. %----------------------------------------------------------------------------------------
  311. % File contents
  312. \begin{file}[hello.py]
  313. \begin{lstlisting}[language=Python]
  314. #! /usr/bin/python
  315. import sys
  316. sys.stdout.write("Hello World!\n")
  317. \end{lstlisting}
  318. \end{file}
  319. %----------------------------------------------------------------------------------------
  320. % Example for Console Prints (can also be usefull for displaying Serial monitor)
  321. %----------------------------------------------------------------------------------------
  322. % Command-line "screenshot"
  323. \begin{commandline}
  324. \begin{verbatim}
  325. $ chmod +x hello.py
  326. $ ./hello.py
  327. Hello World!S
  328. \end{verbatim}
  329. \end{commandline}
  330. % Warning text, with a custom title
  331. \begin{warn}[Notice:]
  332. Warungen könnten auch nützlich sein, immerhin braucht der RF24 3.3V und nicht 5V
  333. \end{warn}
  334. %----------------------------------------------------------------------------------------
  335. % Beispiel für ein Bild.
  336. %----------------------------------------------------------------------------------------
  337. \begin{figure}[h]
  338. \includegraphics[width=8cm]{fish.png}
  339. \centering
  340. \end{figure}
  341. %----------------------------------------------------------------------------------------
  342. % BIBLIOGRAPHY
  343. %----------------------------------------------------------------------------------------
  344. \bibliographystyle{unsrt}
  345. \bibliography{references.bib}
  346. %----------------------------------------------------------------------------------------
  347. \end{document}