Dienstag, 27. Oktober 2020

Welchen Motortreiber verwenden


Auf dem Markt gibt's viele Motortreiber für bestimmte Projekte, aber im Detail unterscheiden sich diese bezüglich ihrer Eignung.

Mein Projekt wird ein neuer Motortreiber für die Lego Powerfunction Motoren. Zuletzt hatte ich einen Motortreiber für zwei Motoren gebaut und programmiert, jetzt soll ein Motortreiber für acht Motoren entstehen.

 

Motortreiber MX1508

Den verwendeten Motortreiber MX1508 findet man fälschlicherweise auch unter L298N. Der bereits gebauten Powerfunction Treiber funktioniert prima und ist im Grunde meine erste Wahl. Allerdings möchte ich ein wenig mehr Spannung haben oder zumindest mehr bei der Versorgungsspannung. Maximal 10V sind in Ordnung, womit aber 3S Akkus mit einer Spannung von 11,1V raus sind. Leider ist für diesen Motortreiber kein Datenblatt zu finden.


 

Motortreiber TB6612FNG

Dieser ist ebenfalls so günstig wie der MX1508, kann jedoch mit einer höheren Spannung betrieben werden. Statt auf 2S Lipos, wäre hier auch 3S möglich. Vielleicht 4S, aber das liegt mir dann doch etwas zu sehr drüber.

Klar sollte sein, dass die Powerfunction für eine Betriebsspannung von 9V ausgelegt ist. Wenn man sich im Internet umschaut, findet man einige Bastler, die mehr als das Dreifache an Spannung angelegt haben, bevor solch ein Lego-Motor das Zeitliche gesegnet hat.


 

Motortreiber L298N

Dieser kostet deutlich mehr und findet in meinem Projekt keinen Platz. Ich habe ihn hier mit aufgeführt, weil die Bezeichnung L298N, oft mit dem Motortreiber MX1508 zusammengebracht werden. Das ist schlicht weg falsch und spätestens mit der Betrachtung des Datenblattes L298N auch ersichtlich. Denn alleine die Bauform zwischen beider Motortreibern unterscheiden sich und die Leistungsdaten gehen hier weit auseinander.

 

 


 

Ansteuerung der Module

Prinzipiell werden alle Motortreiber idealerweise mit einem PWM Signal angesteuert. Alle funktionieren mit der ansteuerbare Frequenz von 50Hz, welche auch von vielen gängigen RC Empfänger ausgegeben wird. Höhere Frequenzen sind sinnvoll bei Schrittmotoren mit Einsatzgebieten wie balancierende Roboter oder die Drehzahl der Rotoren bei Quadrocopter, welche eine genaue, bestimmte Drehzahlen erreichen müssen.



Die Lego Powerfunction Motoren sind keine Schrittmotoren und die Lego Servos sind enttäuschend ungenau, so das höhere Signalfrequenzen nicht wirklich eine Verwendung finden. Also kein Kriterium.

 

Steuerbare Spannung und Strom

Die größte Last schaffen die Lego Powerfunction XL Motoren und können bis zu 600mA Strom ziehen. Auch hier erfüllen alle Motortreiber die Anforderungen für das Projekt und alle bieten noch Spielraum, einen zweiten Motor parallel zu betreiben.

 

Bauform und Größe

Der L298N habe ich selbst nicht, aber wenn man im Internet schon das Bild sieht, sind nicht nur die Kondensatoren auffällig, sondern auch dessen Anschlüsse und der große Kühlkörper benötigen deutlich mehr Platz. Damit fällt dieser dann auch komplett raus.

Der Kompakteste ist der TB6612FNG. Am MX1508 sind wiederum Kondensatoren, womit die Bauhöhe um einige Millimeter höher ausfällt. An der Stelle ist sicher zu stellen, ob nun am TB6612FNG noch zusätzliche Kondensatoren benötigt werden. Einmal googlen und schon findet man von SparkFun ein Beispiel, dass zeigt, das keine weiteren Kondensatoren verlötet werden müssen.

Kompensatoren zum Entstören sind nicht nötig, da diese bereits in den Lego Motoren immer mit verlötet werden.

 

Zusammenfassung der Kriterien

Die Bauform war der Grunde für die Entscheidung des zu empfehlenden Motortreiber. Rückblickend waren doch einige interessante Unterschiede zu entdecken, die für den einen oder anderen Bastler interessant sein dürften.

 


Was den Preis angeht, ist der Kauf einer Zweier- oder Fünfer-Packung deutlich günstiger. Die 6 € für einen TB6612FNG ist doch schon eine große Preisunterschied zu den anderen Motortreibern.

 

Fazit

Welcher Motortreiber soll es sein? Die Frage ist natürlich vom Projekt abhängig. Eigentlich hätte für meinen Bedarf auch schon der Motortreiber MX1508 ausgereicht. Denn hier können die Lego Powerfunction Motoren nahezu in ihrer Nennleistung von 9V betrieben werden. Und wenn doch ein 3S 11,1V Lipo Akku eingesetzt werden sollte, dann könnte an der Stelle einen Step-Down davor geschaltet werden. Aber inoffiziell können die Motoren mit mehr Spannung um, womit noch etwas mehr Drehzahl und Drehmoment zu erwarten sind.

Bei meiner abschließenden Betrachtung aller Kriterien fiel ich immer wieder auf dieselben Themen zurück. Datenblatt, Größe, Versorgungsspannung und Betriebsstrom.

Der Preis war eher irrelevant, auch wenn diese sich stark unterschieden. Dennoch habe ich das in der bereits aufgestellten Tabelle aufgenommen.

Auch wenn klar sein sollte, wie ein Motortreiber angesteuert wird, ist ein Datenblatt hilfreich. Das liegt mit unter daran, dass die Bezeichnung in Web-Shops nicht immer stimmen und nur über den Vergleich im Datenblatt weiterhilft, ob man nun das richtige Produkt hat. Und das brachte mich zu der Information der Baugröße, Versorgungsspannung und Betriebsstrom.

 

Sonntag, 16. August 2020

Analog Digital Wandler ADS1115 einlesen (Meadow)

Meistens, wenn ich ein Modul finde, das ich noch nicht kenne, dann existiert bereits eine Bibliothek, die in C/C++ geschrieben ist.

Schaut man im .NET Umfeld, dann ist wiederum meistens nichts zu finden. Damit ist mein Interesse geweckt, etwas darüber zu schreiben und natürlich ein Beispiel-Code hier auf meinem Blog zu veröffentlichen.

Seit fast einem Jahr liegt bei mir der Meadow und läuft aktuell mit dem Beispielprogramm. Dieser Controller zielt auf ‚Internet of Things‘- Themen ab und ist der direkte Nachfolger vom Netduino. Im Gegensatz zu dem Netduino, kann mit dem Meadow in der aktuellen C# (8.0) und .NET Framework (4.7.3) Version geschrieben werden. Dies bedeutet auch, dass gegenüber dem veraltetem .NET Micro Framework vieles neu aufgebaut wurde und folglich neue Lösungen geschrieben werden können.

 Benötigt:

  • Meadow
  • Breadboard
  • Jumper Leitungen
  • Potentiometer (oder alternative ein Widerstand und ein Lichtempfindlicher Widerstand)
  • ADS1115

 

Kurzes über den AD Wandler

Bevor ich mit der Zielbeschreibung loslege, müssen einige Details zu dem AD Wandler genannt werden. Beispielsweise, wie hoch darf die Eingangsspannung sein, die auf den vier Eingängen angelegt wird?

Betriebsspannung (VDD)

2V bis 5,5V

Stromaufnahme (Continuous Mode)

150uA

Industrieschnittstelle

I²C

Adresse

0x48 (Kann geändert werden durch Pin Select)

Eingänge

4

Abtastrate

8 bis 860

Eingangsspannung

-0,3V bis +0,3V über der Betriebsspannung (VDD)

Eingangsstrom

10mA bei fortlaufender Messung, 100mA bei einzel Messung

Für manche Anwendung ist auch die Betriebstemperatur wichtig, die hier von -40°C bis +125°C sein darf.


Anforderung

An einem Potitiometer soll die anliegende Teilspannungshöhe geändert werden. Die abgeleitete Teilspannung soll am Eingang A0 eingehen. Über einen Methoden Aufruf soll der Eingang eingelesen und dessen Wert über die Output Konsole ausgegeben werden.

 

Schaltungsaufbau

Im folgendem Bild ist zu sehen, dass ich kein Potitiometer verwende (schlichtweg, weil ich keinen hatte). Alternativ verwende ich einen 10k Ohm Widerstand und einen üblichen Lichtempfindlichen Widerstand (Lichtsensor 30 - 90 KOhm).


Verwenden von bestehenden Informationen

Zuerst wollte ich den bestehenden C++ Code migrieren nach C# und .NET Framework. Das bedeutet im Grunde, dass ich die Methodennamen und die #define Direktiven mit dessen Biteinstellungen (HEX Werte) direkt übernehme. Aber nach und nach stellte ich fest, dass einige Inhalte sich auf andere Module wiederum bezogen und ich immer wieder im Datenblatt nach sehen musste, was eigentlich die einzelne Biteinstellung für das Modul bedeutet. Ein Beispiel ist die Standard Einstellung 128SPS (Samples per second) für den ADS1115 Modul, aber im Adafruit Code steht etwas von 1600SPS.

Das Gute daran ist, man erarbeitet sich selbst eine Lösung, wie die Einstellungen abgebildet werden. Das macht den Aufbau der Klasse einfacher und die Beschreibungen zielgenauer.


Programm code

Im folgenden Beispiel aus dem ‚SimpleCode‘-Branch wurde nur das übernommen, was den Standard- Einstellungen entsprach. Z.B. Bitstellungen, die mit 0 belegt sind (bzw. in HEX 0x00 Wert) mussten nicht sein, da das Anlegen der Konfiguration immer mit 0 beginnt. Der folgende Code ist aus der Klasse ‚SimpleAds1115‘ und hat für den Abruf eine öffentliche Methode ‚ReadSingleInputValue‘ zum Abruf der anliegenden Spannung. Die Parameter-Eingabe bestimmt, welcher Eingang gelesen wird.

 internal class SimpleAds1115 : App<F7Micro, SimpleAds1115>  
 {  
   private readonly II2cPeripheral _i2CPeripheral;  
   public SimpleAds1115()  
   {  
     var i2CBus = Device.CreateI2cBus();  
     this._i2CPeripheral = new I2cPeripheral(i2CBus, 0x48);  
   }  
   internal ushort ReadSingleInputValue(AdsInput input)  
   {  
     // disable the comparator  
     // Single-shot mode (default)  
     // Operational status/single-shot conversion start  
     // - Begin a single conversion  
     ushort config = 0x8103;  
     config |= (ushort)input;  
     byte[] data = new byte[] { (byte)(config >> 8), (byte)(config & 0xff) };  
     this._i2CPeripheral.WriteRegisters(0x01, data);  
     Thread.Sleep(9);  
     var result = this._i2CPeripheral.ReadRegisters(0x00, 2);  
     return (ushort)((result[0] << 8) | result[1]);  
   }  
 }  

Vollumfänglich wird später die Klasse ‚Ads1115‘, die zu dem jetzigen Zeitpunkt nicht fertig ist.


Auf den Meadow schreiben

Sobald die Anwendung über Deploy auf dem Meadow geschrieben wurde, kann über das Fenster 'Output' das Ergebnis der anliegenden Spannung gelesen werden. Mit der Static Methode ‚GetVoltage‘ wird der gelesene Wert umgerechnet in Volt. Den Wert 22610 entnahm ich bei einem Eingangssignal von 5V. An der Stelle könnt Ihr den zu kalibrierenden Wert ersetzen, wenn bei Euch mit 5V ein anderer Wert gemessen wird.

 


Vorsicht mit der maximalen Eingangsspannung

In Standard Einstellungen sind die Eingänge bis 6,144V. Bei dieser Einstellung sollte nicht mehr als 0,3V anliegen, weil dies zur einer Beschädigung des Moduls führen könnte.


Fazit

Zunächst das Offensichtliche:  wenn das eigene Projekt mehr Analog-Digital Wandler benötigt, dann ist dieses Modul genau richtig. In einem I²C Bus können bis zu vier Module adressiert werden. Doch dieses Modul hat noch weitere Funktionen, um sich auf die Bedingungen eines Projektes besser anzupassen. Die Eingänge können auf gezielte Maximal-Spannungen eingestellt werden. Die Anzahl der Messungen pro Sekunde gehen bis zu 860SPS (Samples per second). Die vier Eingänge werden durch ein Multiplex Funktion angesprochen, so das von vier Eingänge auf zwei Eingänge umgestellt werden kann. Mit dem einstellbaren Komparator kann auf spezifische Bedingung reagiert werden.

 

Meadow Code
Github – ExampleAds1115 (SimpleCode Branch)

Mittwoch, 24. Juni 2020

RC Fahrtenregler für Lego Kettenfahrzeug



 

Auf dem Markt gibt es viele verschiedene Module an Motortreibern. Diesmal verwende ich einen recht einfachen, der zur Ansteuerung bis zu vier PWM Signale verwendet. Der Motorschield für den Arduino hingegen benötigt noch eine Steuerung eines Shiftregister 74HC595. Ich weiß, das geht auch ohne, aber ich beziehe mich diesmal auf fertige Module, die kompakt aufgebaut sind.

Aber nur ansteuern wäre diesmal zu langweilig und daher habe ich hier als Ziel, den Lego Technic Stunt-Racer damit zu betreiben. Wer das Modell kennt, weiß, dass dieser mit einer Infrarot Fernbedienung ausgeliefert wird und das eher nur in der Wohnung funktioniert.

 

Benötigt wird:

Modul MX1508 (DC Motor Treiber)

Arduino Mini Pro (5V Ausführung)

2x Servo Kabel

2x Lego Power Function Verlängerungskabel

Lego Technic Fahrzeug mit Power Function

Zwei Kanal Fernsteuerung und ein Empfänger mit PWM Signal Ausgängen.

 

Betrieb mit Funk-Fernsteuerung

Der Microcontroller soll zwei PWM Signale verarbeiten, so das damit zwei Motoren gesteuert werden können. Als Fernsteuerung soll links der Stick für die Geschwindigkeit sein und rechts der Stick für das Lenken. Also wie bei jedem anderen RC Auto.

 

Pin Belegung Power Function Kabel

Für die Umsetzung reicht es zu wissen, welche Leitung von den vier was ist. Bei der Suche war immer die Beschriftung 9V, 0V, C1 und C2 gegeben, weshalb ich das ebenfalls übernehme.

 

 

Für den nächsten Schritt müssen die beiden Power Function Kabel so abgeschnitten werden, dass die Verbindung für das eigene Projekt passen.

 

Motor Treiber MX1508

Den verwendeten Motor Treiber MX1508 findet man fälschlicherweise auch unter L298N. Der Motor Treiber L298N funktioniert ebenfalls für dieses Vorhaben, ist allerdings etwas übertrieben und ist auch eher was für größere Projekte geeignet.

 

Daten:

Betriebsspannung 2V bis 10V

Signal Spannung für IN1 bis IN4 1,8V bis 5V

Ausgangspannung für Motor-A und Motor-B 2V bis 10V

Betriebsstrom 1,5A

Maximaler Kurzstrom 2,5A

 

 

 

Aufbau der Schaltung

Der folgende Schaltplan zeigt, wie die Power Function Kabeln mit dem Motortreiber verbunden werden. Die Schaltung funktioniert auch mit einem Lipo Akku. Daher kommt neben dem Power Function Stecker noch ein JST Anschluss. Der Arduino Mini Pro wird über die Spannungsversorgung mitbetrieben und über den Pin RAW angeschlossen.

 

 

 

Der fertige Motortreiber

Anders als auf dem Bild zuvor habe ich noch einen weiteren Anschluss für die Spannungsversorgung angebracht. Das Ermöglicht auch zwei Zellen Lipo Akkus zu verwendend, anstatt der Lego Powerfunction Battery Box. Links auf dem Bild sind vier Leitungen mit Steckern, die für den Anschluss eines Empfängers da sind.

 



Programmcode einstellen

Diesmal beschreibe ich nicht den Aufbau des Programmcode, sondern gehe auf einen fertigen Motortreiber von mir ein. Für das Zielprojekt soll die Eingabe der Fernsteuerung links für die Geschwindigkeitsregelung sein und rechts das Lenken. Also ganz klassisch. Natürlich ginge auch eine Steuerung, wie sie bereits von Lego Power Function mit der Infrarot Fernbediendung vorgegeben wird.

 

Einstellung für den Lego Technic Stunt-Racer

 // Set this value true, for show all Value on Serial Monitor.  
 bool mSerialMonitor = false;        
 // 0 = Car, Input 1 for speed and input 2 for steer  
 //  - Alternate: Tracked vehicle, Input 1 for speed motor A and   
 //         Input 2 for speed motor B  
 // 1 = Tracked vehicle, Input 1 for speed and input 2 for steer  
 int mVehicleMode = 1;           
 // invert steering direction, only tracked vehicle   
 boolean mVehicleModeSteerInvert = false;  
 // Tolerance range in which no reaction should take   
 // place when sticks are in the middle position.  
 int mDeathbandPlusMinus = 10;       
 // change direction signal output for motor A  
 boolean mReverseA = true;  
 // middel state of the input signal. Example: stick on neutral position  
 int mInputMiddleA = 1500;  
 // minimum value of input signal. Example: stick is move complete down  
 int mInputMinA = 1000;  
 // minimum value of input signal. Example: stick is move complete up  
 int mInputMaxA = 2000;  
 // change direaction sinal output for motor B  
 boolean mReverseB = false;  
 // middel state of the input signal. Example: stick on neutral position  
 int mInputMiddleB = 1500;  
 // minimum value of input signal. Example: stick is move complete down  
 int mInputMinB = 1000;  
 // minimum value of input signal. Example: stick is move complete up  
 int mInputMaxB = 2000; 

 

 

Lego Technic Stunt-Racer Umbau

Damit der Empfänger und der Motor Treiber nicht einfach so rum hängen, sollte der Aufbau etwas geändert werden. Der Lego Technic Infrarot Empfänger wird entfernt. Wie nun der Umbau aussieht, ist zweitrangig, Hauptsache die Elektronik ist gut verstaut. Der folgende Umbau ist ein Beispiel.

 


   
 
   
   
   
   

 

Wort zum Schluss

Die Motoren lassen sich noch mit einer höheren Spannung betreiben. Allerdings steigt dann auch die Belastung der Lego Teile in Form von Verschleiß, wegen der fehlenden Kugellager.

Dann noch der hier verwendete Motor Treiber MX1508: Wegen einer falsch ausgewiesenen Information zu L298N, dachte ich zunächst, dass eine höhere Spannung möglich sei. Nach dem ich später für den Blog Eintrag mehr Informationen über den verwendete Komponente suchte, stieß ich auf die richtigen Werte. Zugegeben, ich hatte bereits mit der Fehlinformation den Aufbau mit einem 3S Akku betrieben. Allerdings nur kurz. Für den Betrieb mit einer hören Spannung würde dann der Motor Treiber L293D gehen, aber dann könnten Probleme mit dem maximalen Strom geben, wenn XL-Motoren verwendet werden.

 

Arduino Code - Motortreiber für MX1508

Github - Powerfunction-MotorDriver

 


Montag, 8. Juni 2020

Mit Remote-Atom auf Raspberry pi entwickeln

 

Visual Studio Code läuft auf dem Raspberry Pi nicht sonderlich gut, geschweige denn stabil. Auf dem Betriebssystem Raspbian sind noch die vorinstallierten Interpreter, aber die reichen nur für kleine Sachen.

Bei der Suche im Internet stieß ich auf die Möglichkeit, dass man per Remote den Code entwickeln kann, also am PC schreibt und die Ziel Codedatei auf dem Raspberry Pi bearbeitet.

 

Benötigt:

 

Ziel "Run my edit code"

Am PC soll eine Code Datei bearbeitet werden, die sich auf dem Raspberry Pi befindet. Der Programmcode soll traditionell ein "Hello World" werden und soll dann auch auf dem Raspberry Pi ein "Hello World!" über die Konsole anzeigen.

 

Installation Atom

Herunterladen und installieren. Im Anschluss wird das Paket "Remote-Atom" benötigt.

 


 


SSH Remote und Tunnel einstellen

Bevor auf den Raspberry die Code Remote Verbindung eingerichtet wird, muss die Verbindung per SSH hergestellt werden. Allerdings reicht die einfache SSH Verbindung mit Putty nicht aus, denn für die Verbindung ist die Einstellung eines Tunnels erforderlich. Hier muss der Port 52698 hinzugefügt werden, damit auf dem Raspberry Pi wiederum von der Code Datei eine Verbindung zum Server Remote-Atom hergestellt werden kann.


Adresse einrichten


Port für Tunnel eintragen und...


... hinzufügen



Zurück auf Session und Speichern

 

Ist die Einstellung gespeichert, kann dann auch gleich die SSH Verbindung zum Raspberry Pi hergestellt und mit dem nächsten Schritt fortgesetzt werden.

 

Installation von rmate auf Raspbian

Auf der Packages Seite zu Remote-Atom ist bereits beschrieben, wie man die Verbindung startet. Jedoch der Vollständigkeit halber füge ich die Befehle hinzu, mit dem die Vorbereitung funktioniert.


 sudo curl -o /usr/local/bin/rmate https://raw.githubusercontent.com/aurora/rmate/master/rmate  

 

 sudo chmod +x /usr/local/bin/rmate 

 

Falls der Name rmate nicht zusagt, kann rmate umbenannt werden in ratom.

 

 sudo mv /usr/local/bin/rmate /usr/local/bin/ratom 

 

Code Datei erstellen

Falls keine Code Datei vorliegt, kann in einem Zielordner eine Datei erstellt werden.

 

 touch myHelloWorld.go  

... oder wie im folgenden Beispiel




Remote Verbindung starten

Auf dem PC kann nun in der Anwendung ‚Atom‘, das installierte Remote-Atom unter 'Packages > Remote Atom > Start Server' gestartet werden.

Über Putty kann nun auf dem Raspberry die Verbindung zur einer Datei hergestellt werden.
Am besten zum Pfad wechseln, wo sich die Zieldatei befindet und dann folgenden Befehl eingeben:

 

ratom myHelloWorld.go

 

... oder wie im folgenden Beispiel





Anschließend auf dem PC mit dem Programm ‚Atom‘ das installierte Package starten. Hier sollte sich kurz danach ein neuer Tab öffnen, welcher den Inhalt der Code Datei enthält.



Let's GO

Da aktuell mein Thema die Programmiersprache GO ist, ist der auszuführende Beispiel auch in Code Go geschrieben.

 


Nun können wir mit Putty den Code auf dem Raspberry starten. Dazu folgenden Befehl eingeben und mit Enter ausführen.

go run myHelloWorld.go

Wenn der Code ausgeführt wurde, sollte in der Konsole nun das 'Hello World!' zu lesen sein.


 

Praktisch

Die Installation eines Code Editor ist auf dem Raspberry Pi mit Raspbian nicht nötigt. Vielleicht nur dann, wenn nicht immer ein PC oder Notebook mit Netzwerkverbindung vorliegt. Die Verbindung geht praktisch mit jeder textbasierten Datei und man braucht weniger eine Desktop Version von Raspbian.

Sonntag, 24. Mai 2020

Angular auf dem Raspberry Pi


Zuvor hatte ich den Raspberry Pi nur für Windows 10 IoT mit UWP Entwicklung gesehen. Das lag mit unter daran, dass ich nicht viel Zeit hatte, um mir anderes technologisches Wissen anzueignen. Doch gerade habe ich auf Grund der aktuelle Lage  um Corona und in Kurzarbeit habe ich  Zeit mich mit anderen Technologien zu beschäftigen. Darunter fiel auch das Front-End Webapplikationsframework Angular.

Bei Windows 10 IoT auf dem Raspberry Pi beschränkte es sich leider nur auf eine aktiv laufende Anwendung, was dazu führte eine monolithische Anwendungen zu schreiben. Und zum derzeitigen Zeitpunkt  gibt's auf Windows 10 IoT und Docker nur für x86/x64 Systemen, also leider noch ein Grund, diese Kombination aufzugeben.

 

Mit etwas Weitblick, fand ich heraus, dass Angular auch in einem Docker Container laufen kann und somit dann auch auf einem Raspberry Pi.

 

Voraussetzung

  • Raspberry Pi 2, 3 oder 4
  • Betriebssystem Raspbian (geht auch mit anderen Linux Betriebssystem für Raspberry Pi)
  • Docker Account

 

Anforderung

Eine Angular Hello World Anwendung in einem Docker Container starten auf einem Raspberry Pi.

 

Hello Angular Image

Zunächst brauchen wir eine Angular Projekt. Wenn ihr bereits eins habt, verwendet es einfach. Das Einzige, was hinzugefügt wird, ist die Datei ‚Dockerfile‘ im Root Verzeichnis des Projektes. In meinem Beispiel hat das Projekt den Namen (das auch der Namen, den das Root-Verzeichnis trägt) "ExampleHelloDocker", der in der Dockerfile auch so stehen sollte.

 

 FROM arm32v7/alpine  
 COPY /dist/ExampleHelloDocker /usr/share/nginx/html  
 EXPOSE 80  

 

Nun brauchen wir die Eingabeaufforderung oder das Terminal aus Visual Studio Code. Wechselt dazu in das Projekt Root Verzeichnis und erstellt ein Angular Build.

 

 ng build --prod  

 

Und im Anschluss das Docker Image erstellen. Da hier keine Großbuchstaben verwendet werden, habe ich für die Lesbarkeit Bindestriche eingesetzt.

 

 docker build -t example-hello-docker .  

 

Taggen und pushen

Im nächsten Schritt wird vor dem Pushen auf Docker-Hub, das Image getagt. Dazu braucht ihr euren Benutzernamen von Docker.   

 

docker tag example-hello-docker:latest <username>/example-hello-docker:latest

 

Anschließend kann es nun auf Docker-Hub hochgeladen werden.

 

 docker push <username>/example-hello-docker:latest  

 

Fertig. Nun sollte euer Image auf Docker-Hub zu sehen sein. Falls ihr euer Image nicht öffentlich bereit stellen wollt, sollte ihr auf Docker-Hub das Image im Repositories auf private umstellen.

 


 

Image ziehen und starten

Ab hier sollte das ziehen und starten wie bei jeder anderen Docker Image laufen.

 

 docker pull <username>/example-hello-docker:latest  


Um die Docker Image ID zu erhalten, schauen wir, ob das Image nun vorliegt.

 

 docker image ls  

 

 

Und nun heißt es endlich starten!!
Portnummer 5000 ist die, unter der die Angular Anwendung vom Netzwerk aus zu erreichbar ist.
Hier könnt ihr auch eine andere Portnummer festlegen.

 

 docker run --publish 5000:80 -t <image id>  

 

Oder besser, wenn man den Raspberry pi wieder einschaltet, auch der Container weiter läuft.

 

 docker run --publish 5000:80 -t --restart always <image id>  

 

Lokal auf dem Raspberry Pi sollte nun die Angular Webanwendung im Browser mit der Adresse http://localhost:5000 erreichbar sein. Und natürlich über das Netzwerk von einem anderen Rechner mit der IP Adresse und dem gesetzten Port.



 

HINWEIS: Seit Januar 2021 musste ich feststellen, dass das erstellen des Docker Image von einem Windows System in der Form wie beschrieben nicht funktionieren könnte. Alternativ kann die gebaute Angular Anwendung auf Rasbian kopiert werden und dort mit dem Docker Build Befehle das Image erstellt werden.


Das Thema ist bereits mehrmals auf Stackoverflow vorhanden, aber wenig detailiert. Deshalb habe ich selbst einen Eintrag geschrieben, dass praktisch die Beschreibung dieses Blog-Post in Kurzform und auf Englisch wiedergibt. 

Can't create docker image for raspberry pi with angular app

Ameisen Simulation und andere Dinge

Wer lange sich schon mit C# beschäftig, hat sicherlich schon mal was von AntMe gelesen oder gehört. Diese Idee hatte ich aufgegriffen und mi...