{"id":238,"date":"2018-05-18T20:37:04","date_gmt":"2018-05-18T20:37:04","guid":{"rendered":"https:\/\/www.wpvs.de\/iot-2018\/?p=238"},"modified":"2021-05-14T10:07:06","modified_gmt":"2021-05-14T08:07:06","slug":"hardware-des-smart-lock-projekts","status":"publish","type":"post","link":"https:\/\/www.iot-embedded.de\/iot-2018\/projekt-smart-lock\/hardware-des-smart-lock-projekts\/","title":{"rendered":"SmartLock (2): Hardware des Projekts"},"content":{"rendered":"<p>In diesem Blogeintrag wird die hardwareseitige Umsetzung des SmartLock-Projektes n\u00e4her beleuchtet. Daf\u00fcr soll auch auf die Herausforderungen bei der Programmierung des Arduinos eingegangen werden. Zu Beginn dieses Eintrags m\u00f6chte ich allerdings erst einen Blick auf die verwendeten Hardwarekomponenten werfen und deren Funktion im gesamten System thematisieren. Bei der genutzten Kamera handelt es sich um das Raspberry Pi Kamera Modul in der Version 1.3. Diese kann ein Video mit bis zu 30 Frames bei 1080p aufnehmen, welches vom Raspberry Pi verarbeitet wird. Auf der anderen Seite dieses Projektes steht der Arduino Uno (Blaues Board Abb. 1), mit welchem die restlichen Hardwarekomponenten angesprochen werden. Die Entscheidung fiel auf diese Zweiteilung, da der Arduino eine viel hardwaren\u00e4here Programmierung erlaubt. Dies liegt haupts\u00e4chlich in zwei Faktoren begr\u00fcndet; einmal erlaubt er durch seine vielen Libraries, die in C++\/C\/Assembler geschrieben sind, einen schnellen und pr\u00e4zisen Zugriff auf die Hardware, welches durch den Fakt, dass der Arduino in C++ programmiert wird, zus\u00e4tzlich unterst\u00fctzt wird. Als zweiter Faktor ist anzuf\u00fchren, dass der Chip \u00fcber kein Scheduling verf\u00fcgt und damit eine planbare Ausf\u00fchrung gew\u00e4hrleistet ist. Nichtsdestotrotz ergaben sich gro\u00dfe Herausforderungen bei der Programmierung, auf welche ich an sp\u00e4terer Stelle eingehen werde. Die Kommunikation zwischen den Beiden (Arduino und Pi) findet \u00fcber eine UART Schnittstelle statt. Diese wird daf\u00fcr genutzt, einzelne Chars in Byte Form zu \u00fcbertragen. Bis jetzt wurden folgende Befehle definiert (es werden mit gro\u00dfer Sicherheit weitere folgen, welche hier sp\u00e4ter erg\u00e4nzt werden):<\/p>\n<table class=\" aligncenter\" width=\"604\">\n<tbody>\n<tr>\n<td width=\"293\">Pi-&gt; Arduino<\/td>\n<td width=\"312\">Arduino -&gt; Pi<\/td>\n<\/tr>\n<tr>\n<td width=\"293\">o= Open Door (Servo 180)<\/td>\n<td width=\"312\">P= Button pressend<\/td>\n<\/tr>\n<tr>\n<td width=\"293\">c= Close Door (Servo 0)<\/td>\n<td width=\"312\">A= Action finished (Just for lights)<\/td>\n<\/tr>\n<tr>\n<td width=\"293\">l= Left neo Pix light<\/td>\n<td width=\"312\"><\/td>\n<\/tr>\n<tr>\n<td width=\"293\">r= Right neo Pix light<\/td>\n<td width=\"312\"><\/td>\n<\/tr>\n<tr>\n<td width=\"293\">u= Up neo Pix light<\/td>\n<td width=\"312\"><\/td>\n<\/tr>\n<tr>\n<td width=\"293\">d= Down neo Pix light<\/td>\n<td width=\"312\"><\/td>\n<\/tr>\n<tr>\n<td width=\"293\">O= OK all Pixel green<\/td>\n<td width=\"312\"><\/td>\n<\/tr>\n<tr>\n<td width=\"293\">F= Fail all Pixel red<\/td>\n<td width=\"312\"><\/td>\n<\/tr>\n<tr>\n<td width=\"293\">L= White light on<\/td>\n<td width=\"312\"><\/td>\n<\/tr>\n<tr>\n<td width=\"293\">D= All lights off<\/td>\n<td width=\"312\"><\/td>\n<\/tr>\n<tr>\n<td width=\"293\">S= Setup (Cool light Animation)<\/td>\n<td width=\"312\"><\/td>\n<\/tr>\n<tr>\n<td width=\"293\">C= Capture pictures (needs to be caled 8 times to complete capture)<\/td>\n<td width=\"312\"><\/td>\n<\/tr>\n<tr>\n<td width=\"293\">!= Pay GOT (easter egg)<\/td>\n<td width=\"312\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"text-align: center\">Tabelle 1: Serielle Befehle<\/p>\n<p style=\"text-align: left\">Als Bindeglied zwischen dem Pi und dem Arduino dient ein sogenannter \u201eLevel shifter\u201c. Dieser \u00fcbernimmt die Umwandlung der Betriebsspannungen und stellt so sicher, dass die 5v des Arduinos den auf 3.3v laufenden Pi nicht besch\u00e4digen.<\/p>\n<p style=\"text-align: left\">An dieser Stelle soll nun ein genauerer Blick auf die angeschlossene Peripherie des Arduinos geworfen werden. Dazu geh\u00f6rt ein Lichtsensor (rote Platine rechts neben dem Servo Abb. 1), der ein analoges Signal an den Arduino liefert, welches von einer Library decodiert wird (der Chip, der das Signal generiert hei\u00dft LM393 und wird f\u00fcr viele Sensoren verwendet. Seine Verbreitung l\u00e4sst sich darauf zur\u00fcckf\u00fchren, dass er gleichzeitig auch ein digitales Signal generiert und sehr kosteng\u00fcnstig ist). Der gewonnene Helligkeitswert wird in einen Algorithmus eingespeist, der die Lichtintensit\u00e4t f\u00fcr den LED-Ring dynamisch bestimmt. Dabei unterscheidet er zwischen den unterschiedlichen Modis dieses Ringes. So wird er daf\u00fcr genutzt, bei Dunkelheit das Gesicht f\u00fcr die Gesichtserkennung auszuleuchten. Dabei steigt die Helligkeit des Kreises gegenproportional zur Umgebungshelligkeit. Wohingegen die Signale, wie OK (LED-Kreis flackert Gr\u00fcn) oder Failed (LED-Kreis flackert Rot) mit zunehmender Umgebungshelligkeit auch an Helligkeit zunehmen, um somit bei starker externer Lichteinstrahlung sichtbar zu bleiben. Auch wurde an den Arduino ein Piezo-Lautsprecher (links unten blaue Platine Abb. 1) angeschlossen. Dieser dient zur Audiountermalung der auf dem LED Kreis dargestellten Signale. Des Weiteren ist er in der Lage, die Titelmusik von \u201eGame of Thrones\u201c zu spielen. Als zus\u00e4tzliche Komponente wird ein Button mit dem Arduino verbunden, dieser hat die Aufgabe die T\u00fcr von innen zu \u00f6ffnen, da das System nach dem Eintreten die T\u00fcr automatisch abschlie\u00dft und somit die Person eingeschlossen w\u00e4re.<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" loading=\"lazy\" class=\"size-large wp-image-239 aligncenter\" src=\"http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/05\/smartcam_Steckplatine-937x1024.png\" alt=\"\" width=\"750\" height=\"820\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/05\/smartcam_Steckplatine-937x1024.png 937w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/05\/smartcam_Steckplatine-274x300.png 274w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/05\/smartcam_Steckplatine-768x840.png 768w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/05\/smartcam_Steckplatine-1405x1536.png 1405w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/05\/smartcam_Steckplatine-1873x2048.png 1873w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/05\/smartcam_Steckplatine-1568x1714.png 1568w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/p>\n<p style=\"text-align: center\">Abbildung 1: Hardware-Skizze<\/p>\n<p style=\"text-align: left\">An dieser Stelle m\u00f6chte ich auf die bereits angesprochene Problematik mit dem Arduino eingehen. Auch wenn er eine der hardwarenahesten M\u00f6glichkeiten ist, ihn mit h\u00f6heren Programmiersprachen, wie C++ Hardware zu programmieren, so hat er von Haus aus ein Problem. Denn auch er ist, wie der Pi, nicht in der Lage bei komplexen Programmen ein stabiles PWM Signal zu gew\u00e4hrleisten. Dies f\u00fchrt dazu, dass der Servo sich unkontrolliert bewegt und Ger\u00e4usche von sich gibt. Was f\u00fcr ein professionelles Produkt, wie wir es anstreben, nat\u00fcrlich inakzeptabel ist. Die L\u00f6sung f\u00fcr dieses Problem ist es, das PWM Signal nicht vom Chip generieren zu lassen, sondern von einem der zwei Hardwaretimern des ATmega328P (Chip des Arduino uno). Diese relativ unbekannte M\u00f6glichkeit erlaubt es, dass Interrupts alle 20ms (der PWM Periode die der Servo SG90 ben\u00f6tigt) getriggert werden und in diesen Interrupts der Duty Cycle f\u00fcr die n\u00e4chste Periode festgelegt wird. Dadurch, dass die Interrupts vom Hardwaretimer getriggert werden, kann ein nahezu 100 prozentiges Timing erreicht und somit jegliches \u201eJittern\u201c unterbunden werden.<\/p>\n<p style=\"text-align: left\">Nun soll auf die Stromversorgung eingegangen werden. Diese wird \u00fcber USB zur Verf\u00fcgung gestellt. Dabei steht es dem Nutzer frei, ob er das erstellte Produkt mittels Powerbank oder mittels USB Netzteil betreiben m\u00f6chte, wobei mindesten 3A geliefert werden m\u00fcssen. Die zwei verbauten Kondensatoren dienen dazu, den Strom zu \u201egl\u00e4tten\u201c, also eventuelle Spannungsspitzen als Unterspannungen auszugleichen. Kondensatoren werden h\u00e4ufig zum Schutz von empfindlichen Komponenten genutzt.<\/p>\n<p style=\"text-align: left\">Abschlie\u00dfend soll noch auf ein spezielles Programmierparadigma eingegangen werden. So wurde die gesamte Arduino Programmierung in diesem Projekt \u201eNon-Blocking\u201c aufgebaut. Dies bedeutet trotz dem Fakt, dass der Arduino nur \u00fcber einen Task verf\u00fcgt, der das Programm in einer Dauerschleife durchl\u00e4uft, jederzeit die Operationen unterbrochen werden k\u00f6nnen. Dies kann dadurch erreicht werden, dass Wartezeiten im Programm nicht etwa \u00fcber ein Anhalten des Tasks realisiert, sondern die einzelnen Ausf\u00fchrungsdauern auf Basis der Systemzeit definiert werden. Dies erh\u00f6ht zwar die Komplexit\u00e4t bei der Programmierung massiv und f\u00fchrt zu teilweise unsch\u00f6nem Code, zahlt sich aber im Live-Betrieb aus, in welchem es dann ohne Probleme m\u00f6glich ist, einzelne Ausf\u00fchrungen abzubrechen, um dem Nutzer ein fl\u00fcssigeres Benutzungserlebnis zu erm\u00f6glichen. (Anbei noch ein Artikel, der das Programmierkonzept n\u00e4her erl\u00e4utert https:\/\/bit.ly\/2KMNkZQ). Der erstellte Arduino Quellcode findet sich <a href=\"https:\/\/www.wpvs.de\/iot-2018\/wp-content\/uploads\/2018\/05\/arduino.txt\">hier<\/a>.<\/p>\n<p style=\"text-align: left\">Ich hoffe, dass durch diesen Blog ein umfassendes Bild \u00fcber das komplexe Hardwaresetup dieses Projektes vermittelt werden konnte. Als n\u00e4chster Blogeintrag wird eine \u00dcbersicht \u00fcber das Backend unseres Servers folgen und damit ein Umschwenken auf die Software eingeleitet.<\/p>\n<p style=\"text-align: center\">\n","protected":false},"excerpt":{"rendered":"<p>In diesem Blogeintrag wird die hardwareseitige Umsetzung des SmartLock-Projektes n\u00e4her beleuchtet. Daf\u00fcr soll auch auf die Herausforderungen bei der Programmierung des Arduinos eingegangen werden. Zu Beginn dieses Eintrags m\u00f6chte ich allerdings erst einen Blick auf die verwendeten Hardwarekomponenten werfen und<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/238"}],"collection":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/comments?post=238"}],"version-history":[{"count":1,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/238\/revisions"}],"predecessor-version":[{"id":658,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/238\/revisions\/658"}],"wp:attachment":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/media?parent=238"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/categories?post=238"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/tags?post=238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}