Servo Motor

Ich habe bereits gezeigt, wie ein Schrittmotor am Arduino genutzt wird. Nun will ich zeigen, wie man einen Servomotor steuern kann, und was dahinter steckt.

MG995

Ich nutze meistens den MG995 Servomotor, da er im Vergleich zu anderen Servomotoren mit einem Drehmoment von ~1,47Nm bei 6V viel bietet. Die Betriebsspannung liegt im Bereich zwischen 4,8-7,2 Volt, ich bewege mich eher im Bereich um 6V, das rührt aber eher von der Verwendeung von Batterien. Er hat zudem ein Getriebe aus Stahl und ist zweifach Kugelgelagert (Festlager abtriebsseitig). Der Motor ist zwar teuerer, dafür ist er als Stoßfest deklariert und seine Lebensdauer ist weit höher, als bei Motoren mit Kunststoffgetrieben. Er hat einen Rotationsbereich von 180° (+- 90° vom Nullpunkt), und eine maximale Stellgeschwindigkeit von 0.24 s/90° bei 6V (ohne Last).

mg995.jpg

Der MG955 darf nicht über das Arduino (oder einen anderen Controller) mit Spannung versorgt werden, da er mehr Strom benötigt, als der Spannungswandler oder ein Output-Pin des Arduinos zur Verfügung stellen kann – der Wandler würde überhitzen. Deshalb nutze ich, wie zuvor kurz erwähnt, Batterien, Akkus oder ein Netzteil. Der Controller dient nur als Steuerung für den Motor.

Die Funktionsweise

Der Servoantrieb besteht aus einem Motor (Servomotor) und einer Regelelektronik. Der Motor kann dabei als Gleichstrommotor, Synchron- oder Asynchronmotor ausgeführt sein. Die Regelung dahinter ist in vielen Anwendungen eine Positionsregelung für den Winkel, sie kann aber auch als Geschwindigkeits- oder Momentenregelung ausgeführt sein, oder eine Kombination aus den genannten.

Wer sich den Inhalt zum Schrittmotor durchgelesen hat, und dann den Schrittmotor mit einen Drehgeber und einer Regelung ausstatten würde, der hätte sich so selbst einen Servomotor gebaut. Oft werden aber Servomotoren mit Servos, wie auch der MG995 einer ist, gleichgesetzt. Der Unterschied ist, dass ein ‚Servo‘ lediglich eine Form eines Servomotors ist.

Die Regelung des Servos (ich beziehe mich jetzt auf den MG995 und ähnliche Modelle) erfolgt über den Vergleich zwischen Soll-Wert, also jenem Wert, welcher vom Mikrocontroller vorgegeben wird, und dem Ist-Wert. Der Ist-Wert wird über ein integriertes Potentiometer ermittelt, welches ebenso nur eine Form von Drehgeber ist. Die Elektronik im Servo erledigt den Rest und stellt die Abtriebswelle über das Getriebe auf die gewünschte Position.

pulse

Die obige Grafik zeigt die, wie der Ist-Wert am MG995, oder auch auf anderen gängigen Servos, eingestellt wird. Es ist ersichtlich, dass der Wert über ein 50Hz-Signal eingestellt wird. Für die tatsächliche Positionierung des Winkels wird die Dauer der logisch High und der logsich Low Phase gemessen. Die Grafik macht deutlich, dass 1ms High in der Periodendauer von 20ms einen Winkel von bedeutet. 2ms High korreliert mit 180°.

Kurzer Einfwurf: Ich bin mir nicht sicher, ob das Datenblatt des MG995 einen Fehler hat, oder ob ich doch einen anderen Servo vor mir liegen habe, denn laut Datenblatt sollte dieser nur 120° weit drehen, doch er dreht volle 180°.

Der elektrische Aufbau

Viel bedarf es nicht, lediglich der folgenden paar Bauteile.

Stk. Komponente Ausführung Beschreibung
1 Servo MG995 Antrieb
1 Arduino UNO/Nano Controller
1 Batterie oder Netzteil 6V Versorgung
n Drahtbrücken

Das sind jene Komponenten, um den Servo mit allem zu versorgen, was er benötigt. Das Arduino muss selbst noch mit Spannung versorgt werden. Dies kann entweder über USB oder über den Power-Plug erfolgen.

components

Das Signal, also der Puls, kommt von einem der PWM-Anschlüsse des Boards, dieser kann frei gewählt werden. Neue Servos werden via PPM angesteuert. Wo genau der Unterschied liegt, erkläre etwas weiter unten.

basic_shematic

Sowohl der Ground vom Controller, als auch vom Servo und der Batterien müssen miteinander verbunden sein, da ansonsten die Signalleitung kein gemeinsames Potential hat – der Schaltkreis wäre nicht geschlossen.

Pulsweitenmodulation PWM

Der Grundgedanke war, ein analoges Signal aus einer digitalen Quelle zu bekommen – mit Digital-Analog Umsetzern. Je „schmäler“ der Puls, desto weniger Energie wird über eine Periodendauer frei, die Spannung am Ausgang ist niedrig, und vice versa. Der Grund ist, dass der Controller keine bestimmten Analogwerte am Ausgang liefern kann, sondern nur seine Operationsspannung (hier +5V).

pwm

Beim Servomotor wird allerdings kein analoges Signal genutzt. Die Pulsweite repräsentiert den Winkel am Motor (Beispiel von oben: 1.5ms = 90°). Man sieht, dass die Pulsweitenmodulation also auch Anwendung in der Steuerungstechnik findet. Ein weiteres Beispiel für eine steuerungstechnische Anwendung ist eine LED am PWM Ausgang. Diese wird schnell ein- und ausgeschalten, sodass das Auge dies als konstante Helligkeit wahrnimmt. Je schneller das passiert, desto geringer ist die reusltierende Helligkeit – so kann man das Licht einfach dimmen.

Pulsphasenmodulation PPM

PPM ist eine Erweiterung des PWM-Signals. Dabei werden hintereinander mehrere Pulse in der gleichen 20ms-Periode gesendet. Jeder Puls ist für einen anderen Servo zuständig. Der Vorteil ist klar: Mehrere Motoren können mit nur einer Signalleitung angesteuert werden, ohne dabei Zeit zu verlieren, denn die 20ms-Periode ist ohnehin auch beim „einfachen“ PWM für diese Motoren vorgegeben.

ppm

Der Code

Diesmal gibt es kein GitHub-Repu hierzu, da das Programm sehr kurz ist. Im Grunde zeige ich hier nur die Zusammenfassung des oben beschriebenen Inhalts. Ich zeige auch kein vollständiges Programm, da die Programmbibliothek von Arduino meines Erachtens nach sehr gut ist. Hier findet sich lediglich ein Einblick in den Grundgedanken hinter den Servos.

#define MinAngle 0
#define MaxAngle 180

#define POT 20000
#define MinPWM 1000
#define MaxPWM 2000

#define Multiplier (MaxPWM - MinPWM) / MaxAngle

void setup()
{
    ...
}

void loop()
{
    ...
}
 
void setServo (int Angle)
{
    int PWM = (Angle * Multiplier) + MinPWM;
    PORTD |= _BV(PORTD3);
    delayMicroseconds(PWM);
    PORTD &= ~_BV(PORTD3);
    delayMicroseconds(POT - PWM);
}

Die Definitionen zu Beginn spiegeln lediglich die Eigenschaften des Servos wieder. Der maximale Winkel, den der Servo befahren kann ist zugleich der längste Puls. MaxAngle in Grad entpricht also MaxPWM in Mikrosekunden, ebenso die Min-Werte. Die Periodendauer (Period Of Time [POT]) erhält man ebenso aus dem Datenblatt, bei den meisten Servos ist diese aber 20ms, oder 20000µs.

Der Multiplier ist jener Wert, welcher den gegebenen Winkel zufolge der gegebenen Werte so umrechnet, dass – bei diesem Servotyp – ein Winkel von einem PWM-Signal von 1000ms, und ein Winkel von 180° einem PWM-Signal von 2000ms entspricht. Da die Umrechung keiner Ganzzahldivision entspricht, ist diese mit einem Fehler behaftet.

In der setServo()-Funktion wird zuerst die Dauer des PWM-Signals ermittelt, danach wird für diese Dauer der Ausgang (Pin 3) des Controllers auf HIGH gesetzt. Danach wird die restliche Periodendauer das Signal auf LOW gehalten. Den Zugriff auf den Pin erledige ich nicht mit digitalWrite(Pin, State);, sondern mit dem C-Befehl. Mehr dazu findet man hier.

Durch das Ausführen des restlichen Codes ergibt sich eine Zeitspanne, in welcher die resultierende Periodendauer abweicht. In diesem kurzen Script spielt dies keine tragende Rolle. Sollte das Programm aber länger werden, oder gar Zeitverögernde Funktionen beinhalten, so würde die Periodendauer für die Steuerung des Servos stark abweichen. Abhilfe würde ein Timer schaffen, welcher alle 20ms das PWM-Signal über einen Interrupt triggert.

Diese Grundlogik, und weitere controllerspezifische Absicherungen sind übrigens in der Servo-Library von Arduino enthalten.

Noch eine Anmerkung zum Einschalten des Servos: Wer will, der kann die letzte Position des Servos im EEPROM des Arduinos speichern, sodass er beim Einschalten die Position hält. Das stromlos Schalten des Servos ist im Allgemeinen nicht notwendig, da die Regelung im positionierten Zustand nur wenige Milliampere benötigt.

Das war’s auch schon, ich hoffe, die Idee hinter Servos ist nun klar!

Advertisements

ESP8266 Web Socket

Wer diesen Eintrag zum Setup des ESP8266 WiFi-Moduls gelesen hat und nun mehr mit dem Controller machen will, der ist hier genau richtig. Was genau kann man von diesem Tutorial erwarten? Ich zeige wie man das ESP so programmiert, dass man damit eine LED-Lichtleiste mit Hilfe eines Transistors über ein Smartphone ein- und ausschalten kann. Obendrein gibt’s natürlich wieder alle Erklärungen und Anleitungen bezüglich der verwendeten Hardware.

Da ich in diesem Beitrag unter anderem ein kurzes Video habe, und WordPress die Datei aus Gründen nicht wiedergeben will, gibt es diesen Beitrag nur auf meiner Website. Ein Premiere, wenn man so will.

Und los geht’s! 

OLED Display Rahmen

Wer für diesen Display einen Rahmen für die Montage an einem Blech benötigt, der kann sich hier die nötigen Mittel hohlen. Voraussetzung ist ein 3D-Drucker oder Zugang zu einem. In den meisten großen Städten gibt es bereits „Copy-Shops“ fürs 3D-Drucken.

Der Rahmen ist zum Einklippsen in eine Ausnehmung von 28mm x 33mm bei einer Blechdicke von 1.5mm. Der Display selbst wird ebenfalls in den Rahmen geklippst und hält dort ohne weitere Maßnahmen.

oled_frame

Das STL-File gibt es hier und den davon abgeleiteten G-Code gibt es hier. Für das Erstellen des G-Codes habe ich Slic3r genutzt.

Wer das STL-File selbst in den G-Code umwandeln will, der muss darauf achten, dass der Rahmen wie im Bild unten auf der Ebene liegt.

slic3r_mask

Das war’s. Kurz und bündig.

ESP8266 Setup

Das ESP8266-WiFi-Modul ist klein, günstig und funktioniert problemlos – vorausgesetzt man bekommt es erst einmal zum laufen. Wie man das macht, welche troubleshooting-Möglichkeiten es gibt und was man damit anstellen kann zeige ich hier. Am meisten geholfen hat mir das ‚community wiki‚ des Controllers. Ich programmiere es mit der Arduino IDE 1.6.9, da es leider keinen Support für Sublime Text 3 & Stino gibt. Jede neuere Version der IDE sollte ebenso problemlos funktionieren.

esp8266

Am Ende dieses Tutorials soll das ESP die angeschlossene LED blinken lassen. Das mag sich nicht nach viel anhören, soll aber die Basis für alle weiteren meiner ESP-Tutorials werden. Zu allem später mehr, jetzt folgen erst einmal die …

Spezifikationen

Das Modul hat eine integrierte WLAN-Schnittstelle (802.11 b/g/n [2.4GHz]) und unterstützt neben den Funktionen als Endgerät, Accesspoint auch Peer-To-Peer Kommunikation. TCP/IP ist integriert. Der wichtigste Punkt zu Beginn ist jedoch: Versorgungsspannung 3.3V, nicht 5V tolerant!

Mehr …

Preislich liegt das Modul zwischen 2€ und 5€, abhängig von der Ausführung. Die hier von mir vorgestellte Version (esp-01) ist eine der günstigsten, hat im Gegensatz zu den teureren Varianten nur 2 GPIO-Pins.

Es hat keinen FTDI-Chip integriert, das bedeutet, dass man es nicht so bequem an den PC anstecken kann wie ein Arduino, um es zu programmieren. Abhilfe schafft hier ein günstiger FTDI-Adapter.

ftdi232

Dieser sollte unbedingt neben 5V auch 3.3V unterstützen, da man ansonsten zwischen den Signalpins (RX, TX) einen Logic-Level-Shifter benötigt.

ftdi232_supply

Wer einen zu meinem Adapter ähnlichen verwendet, der muss einfach nur den Jumper zwischen den mittleren und den 3.3V-Pin stecken. Schon ist die Signalpegel-Logik auf 3V3 gestellt.

Den FTDI Adapter sollte man allerdings nicht als Versorgung nutzen, da das ESP oftmals mehr Strom benötigt als der Adapter zur Vrfügung stellen kann.

Der elektrische Aufbau

Für das Tutorial benötigt man neben dem ESP8266-01 noch ein paar weitere Komponenten, um es einerseits programmieren zu können, es andererseits auch nutzen zu können.

Stk. Komponente Ausführung Beschreibung
1 ESP8266 esp-01
1 FTDI-Adapter FTDI232 5V & 3V3
1 Versorgung 3.3V 2AA Batterien oder Netzteil
2 Widerstände 10kΩ
1 Pushbutton Programmer-Mode
1 LED
1 Schalter Optional
n Drahtbrücken

Das nachfolgende Bild zeigt die Pinbelegung des ESP Moduls.pinout

Die Verdrahtung erfolgt nach dem unten gezeigtem Schaltplan. Auch auf die Gefahr hin, dass ich mich wiederhohle möchte ich nochmals darauf hinweisen, das FTDI-Modul so zu nutzen, dass es mit 3.3V arbeitet.

shematic

Wer sich den Schaltplan genau ansieht erkennt, dass die LED nicht wie gewohnt angeschlossen wird, sondern verkehrt. Also die Anode (+) der LED auf Vcc, und die Kathode (-) auf den GPIO_2 Pin. Der Grund hierfür ist, dass beide GPIO Pins (GPIO_0 & GPIO_2) des ESP8266 Moduls beim Booten logisch HIGH (oder in einem Zwischenzustand) sein müssen. Würde man die LED wie gewohnt anschließen, also Anode auf GPIO_2 und Kathode auf GND, so würde das ESP denken, dass man ein Programm via UART darauf laden möchte. Jedoch muss man dann später im Programm darauf achten, die Logik des Ausgangs zu invertieren. Mit digitalWrite(Pin, HIGH); wird die LED ausgeschalten und vice versa.

Zum Schluss sollte der ganze Setup in etwa so aussehen. Anstatt der beiden Batterien kann man natürlich auch eine andere Versorgung nehmen, etwa ein Netzteil mit 3V Output.

setup

Die Arduinno IDE vorbereiten

Damit man mit der Arduino IDE das ESP-Modul programmieren kann muss man dieser das Board erst einmal hinzufügen und konfigurieren. Dazu öffnet man zunächst die IDE und führt die folgenden Schritte aus:

  • Prefrences öffnen (File -> Preferences)
  • Auf das Icon neben ganz rechts neben den Additional Boards Manager URLs klicken.
  • Am Ende, falls bereits Einträge existieren, folgenden Link hinein kopieren:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
  • Alle Fenster mit Ok schließen.
  • Den Board Manager öffnen (Tools -> Board „…“ -> Boards Manager)
  • Den Eintrag esp8266 by ESP8266 Community installieren.

Eine bebilderte Anleitung gibt es hier, allerdings von einem anderen Projekt.

Nun ist das WiFi Modul in der Arduino IDE registriert und kann verwendet werden. Dazu muss man es lediglch von den Boards (Tools -> Boards) auswählen und wie folgt konfigurieren:

  • Board: „Generic ESP8266 Module“
  • Flash Mode: „DIO“
  • Flash Size: „512K (64K SPIFFS)“
  • Flash Frequency: „40MHz“
  • CPU Frequency: „80MHz“
  • Upload Speed: „115200“

esp_ide

Der Port entpricht jenem Port des FTDI-Adapters. Hat man diesen mit dem PC verbunden, kann man seinen Port auswählen.

Das Programm

Wie ich bereits erwähnt habe ist das Programm sehr simpel, da dieser Eintrag nur als Basis für weitere Projekte mit dem WLAN-Modul dienen soll. Man kann es einfach in die Arduino IDE kopieren und dann auf das ESP hochladen.

Aber halt: Wie lädt man das Programm auf den Controller? Nun kommt endlich der Button zum tragen. Wird dieser gedrückt, so wird das ESP in den Programer-Modus versetzt und erlaubt es, von der Arduino IDE programmiert zu werden. Dazu muss man wie folgt vorgehen:

  • Die Spannungsversorgung zum ESP trennen, der FTDI Adapter kann mit dem PC verbunden bleiben.
  • Den Button drücken und gedrückt halten.
  • Die Spannungsversorgung wieder herstellen.
  • Der Button kann losgelassen werden.
  • Das Programm hochladen.
  • Nach dem erfolgreichen Upload muss das ESP eventuell neu gestartet werden.

Anmerkung: Es ist auch möglich, das ESP ohne einen Button zu programmieren, dafür ist allerdings ein anderer FTDI-Adater nötig. Durch das Fehlen eben dieses kann ich darauf leider nicht weiter eingehen.

#define LED_PIN 2

void setup()
{
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, HIGH); // Invertierte Logik!
}

void loop()
{
    digitalWrite(LED_PIN, LOW);
    delay(100);
    digitalWrite(LED_PIN, HIGH);
    delay(100);
}

Nach dem Hochladen (es nimmt etwas Zeit in Anspruch, da die ESP Dateien miteingebunden werden müssen und der Flash komplett überschrieben werden muss) sollte die angeschlossene LED schnell blinken. Tut sie das nicht, so können diese Tipps eventuell hilfreich sein.

Einen Schritt weiter gehen

Das ESP8266-01 hat den gleichen Aufbau wie das nRF24L01+ Funkmodul. Das bedeutet, dass es genauso schlecht auf ein Breadboard passt, wie das genannte Modul. Beim Funkmodul ist das noch nicht so tragisch, man lässt es im Allgemeinen für die Dauer des Projekts am Arduino montiert oder verlötet es zum Schluss auf eine Platine. Beim ESP ist das etwas anders, denn zum Flashen des Programms muss der „Programmer-Aufbau“ verwendet werden, welche unter Umständen nicht für anderes geeignet ist. Deshalb habe ich für das Funkmodul eine kleine Platine aus einer Lochrasterplatine gebaut.

perfboard_setup.jpg

Gut, auf dem Bild kann man nicht viel erkennen, deshalb gibt es im Anschluss das Fritzing-File-Bild. Ich habe 3 Terminal-Blocks (doppelte Ausführung), 3 Stiftleisten (2×4 & 1×6 Pins), 1 Steckerbuchse, den Schalter, den Button und die beiden Widerstände verbaut. Damit, und mit der richtigen Verkabelung kann man die WiFi-Module bequem programmieren und im Anschluss wo anders weiter verwenden.

perfboard

Der Pinout von links (1) nach rechts (6):

Pin Anschluss Anmerkung
1 Vcc 3.3V max.
2 GND
3 3.3V Für Sensoren, etc
4 GND Für Sensoren, etc
5 GPIO 0 SDA
6 GPIO 2 SCL

Zugegeben, auch dieses Bild ist etwas unübersichtlich, doch mit ihm und dem oben gezeigten Schaltplan sollte das Nachbauen kein Problem mehr sein. Ich habe lediglich die LED weggelassen. Zum Testen des hier gezeigten Programms kann man sie aber einfach zwischen die GPIO_2 und GND Pins der Terminal-Blocks stecken.

Troubleshooting

Ich habe einige Zeit gebraucht, bis ich das ESP zum Laufen bekommen habe, da ich Fehler Nummer eins der folgenden Liste begangen habe. Zusätzlich habe ich noch ein paar weitere Ratschläge aufgeschrieben, sodass man das WLAN-Modul tatsächlich zum Funtionieren bringt.

  • Den Taster auf Funktion prüfen. Es ist doch tatsächlich daran gescheitert, dass der Button für den Programer-Modul defekt war, und ich das ESP nie programmieren konnte. Dinge an die man niemals denkt …
  • Eine stabile Spannungsversorgung. Alte Batterien oder eine schwankende Eingangspannung können die Ursache für Fehlverhalten sein. Zu Beginn habe ich die Spannungsversorgung durch herausziehen einer Drahtbrücke unterbrochen. Durch schlechte Kontakte am Steckbrett wurde die Verbindung nicht so hergstellt, wie sie sollte. Nun trenne ich die Spannung nur mehr mit soliden Schaltern.
  • Beide LEDs (rot & blau) am ESP leuchten. Das bedeutet, dass das ESP Daten via UART anfordert und nicht bootet. Der Fehler ist, dass GPIO_2 auf dem Ground-Potential liegt. Umgehen kann man das so.
  • Alle Verbindungen prüfen. Es kann durchaus sein dass man einen Pin falsch angeschlossen hat, oder den Ground nicht mit allen Geräten (ESP8266 & FTDI) geteilt hat.
  • Die Baudrate ist falsch eingestellt. Im Normalfall ist die Baudrate 115200bps oder 9600bps. Das ist wiederum abhängig von der Version, einfach mal beides testen.
  • WLAN Daten prüfen. Wer bereits ein WLAN-fähiges Programm laufen hat, der kann nochmal die WLAN Zugangsdaten prüfen. Beim Passwort habe ich mich schon öfter vertippt.
  • Module neben dem ESP-01: Der GPIO-Pin Nummer 15 muss auf Ground liegen.
  • Fehlerhaftes ESP. Es gibt tatsächlich eine defekte Charge des Moduls, hier ist der Widerstand für die Power-LED zu schwach, was zu einem Durchbrennen dieser führt.

Mit dem ESP arbeiten

Hier werde ich erst einmal einen Schlussstrich ziehen und auf die anderen Tutorials verweisen, welche nach und nach kommen werden.

Easy going

Wem es zu viel Aufwand ist, sich die Lochrasterplatine nachzubauen, oder wer keine Lust auf Kabelsalat hat: ESP8266 NodeMcu ist das Stichwort. Das Board ist Ähnlich dem Aufbau eines Arduino Nanos und es lässt sich auch genauso bequem über einen USB Port programmieren.

Ansonsten bleibt zu sagen: Viel Spaß mit dem ESP8266, ich habe ihn definitiv!

360° Panorama

In einem früheren Beitrag habe ich gezeigt, wie man ein großes Panorama erstellt, und dieses dann im Web vorstellt. Nun gehe ich einen Schritt weiter und erstelle ein 360° Kugelpanorama.

Die Bilder

Um ein Panorama dieser Art zu erstellen braucht man natürlich vernünftige Bilder. Dabei muss man ein paar Dinge beachten, damit man später bei der Verarbeitung nicht in Arbeit untergeht (Stiching-Fehler). Gute Aufnahmen sind hier tatsächlich ein absolutes Muss, vor allem in Innenräumen, da die Abstände der Motive zur Kamera stark variieren. Es sei denn man steht in einem leeren Raum mit quadratischer Grundfläche.

Das Objektiv und die Aufnahmen

Das Objektiv erster Wahl ist hier das Sigma 8-16mm Superweitwinkelobjektiv.

lens

Bei einem Bildwinkel von 121,2° (bei 8mm Brennweite) erlaubt es ein 360° Panorama mit nur 4 Aufnahmen zu erstellen. Wer ein anderes Objektiv nutzt kann die mindestens nötige Anzahl entweder durch probieren herausfinden, oder man hohlt sich einfach eine App.

app

Sollte man sich allerdings an einem Ort befinden, an dem man nicht mehr so schnell zurückkommt, dann lohnt es sich, mehr Aufnahmen als besagte Mindestgrenze zu machen. Besser zu viel als zu wenig. Meistens mache ich gesamt 10 Aufnahmen, sechs im Hochformat um die Hochachse der Kamera, zwei Zenitaufnahmen und zwei Nadiraufnahmen – in genau dieser Reihenfolge.

Die sechs Bilder um die Hochachse überschneiden sich bei mir immer etwas, sodass sich das Stitchen bei etwaigen Aufnahmefehlern leichter bewältigen lässt.

Die Zenitaufnahme zeigt nach oben. In den meisten Fällen, sofern man sich draußen befindet, sieht man hier nur Wolken. Die erste Aufnahme zeigt einfach nach oben, die zweite erstelle ich 180° in der Objektivachseachse gedreht. Warum zuerst Zenit? Meistens sind Wolken in Bewegung – daraum sollte man zuerst die Bilder des bewegten Himmels machen, als vom als statischen zu betrachtenden Boden.

Die Nadiraufnahme ist das Pendant zur Zenitaufnahme – sie zeigt nach unten. Hier macht das Stativ gerne mal Probleme, da seine Beine dann am Bild zu sehen sind. Abhilfe schafft hier wieder die zweite, um 180° gedrehte Aufnahme, wodurch sich das spätere Entfernen der Beine am PC ziemlich einfach gestalltet. Als Notlösung (wer Photoshop nicht mag) kann man mit ausgestreckter Hand die beiden Aufnahmen machen, dabei muss man aber auf die Verwackelungsunschärfe achten!

Weil ich das Stativ erwähnt habe: Am besten werden die Bilder wenn die Kamera auf einem Stativ montiert ist, genauer: Mit einem Nodalpunktadapter.

Der Nodalpunkt

Der Nodalpunk ist jener „Punkt“ in welchem sich alle Lichtstrahlen vor und hinter der Linse kreuzen würden. Das bedeutet also, wenn man die Kamera um ihre Hochachse um den Nodalpunkt dreht fallen alle Lichtstrahlen aller umliegenden Objekte in diesem Punkt zusammen. Nur so erreicht man, dass beim Drehen der Kamera keine Tiefenfehler entstehen und das Bild später beim Stichen fehlerfrei zusammengefügt werden kann.

Um die Kamera auch richtig auf dem Adapter platzieren zu können muss man den Abstand des Nodalpunktes zur Stativschraube kennen. Dazu gibt es hier passende und gut beschriebene Tabellen.

Wer keinen Nodalpunktabadpter hat, der kann zumindest im Freien (große, weite Flächen) freihand arbeiten. Dabei entstehen zwar immer ein paar Fehler beim Stitchen, mit etwas Geduld kann man diese jedoch später in Photoshop retuschieren. Wer es trotz fehlendem Adapter ganz geanu nehmen mag: Einfach ein Stück Schnur am Objektiv auf der Höhe des Nodalpunktes befestigen. Am anderen Ende etwas schweres befestigen (eventuell ein kleiner Stein), damit die Schnur gespannt ist. Dann muss man sich nur noch „um die Schnur drehen“, darauf achtend, dass der Stein auf seiner Position liegen bleibt und die Schnur auch wirklich senkrecht nach unten hängt.

cord

Die Kamerasettings

Kurz und bündig: Manueller Modus, konstante Belichtungszeit, konstante Blende, konstanter ISO-Wert, konstante Brennweite.

Die Brennweite sollte so kurz wie möglich gehalten werden, in meinem Fall also 8mm. Die Belichtungszeit ist abhängig von der Umgebung, sie ist der variable Part der 4 Paramter. Ebenso variabel, allerdings zu Gunsten der Bildqualität niedrig zu halten ist der ISO-Wert. Die Blende sollte so weit offen sein, dass die Schärfentiefe in jeder Bildebene gleich hoch ist.
Ein guter Richtwert bei 8mm ist f/12 bis f/16. Zu klein sollte die Blendenöffnung nicht sein, da sonst die Lichtstrahlen zu stark gebeugt werden, was zu einer Unschärfe führt.

Über den „Schärfebereich“ gibt die hyperfokale Distanz auskunft, für welche es ebenso Apps gibt. Der Fokus sollte so gewählt werden, dass die hyperfokale Distanz dem Abstand zwischen Kamera und nächstgelegenen Objekt entspricht.

Das Histogramm

Das Histogram ist bei 360° Panoramas (oder eigentlich generell) eines der besten Hilfswerkzeuge in der digitalen Fotografie. Es gibt Auskunft über die Anzahl der Pixel zu einem gewissen Helligkeitsbereich. Der linke Rand im Histogram zeigt die Anzahl an rein schwarzen Pixel, der rechte Rand die Anzahl rein weißer Pixel. Dazwischen liegen alle Graustufen. Das folgende Bild zeigt die beiden Extrema und mittleres Grau.

histogram_description_1

Das Histogramm des Teelöffels zeigt recht gut was ich meine. Es sind sehr viele helle Grautöne vorhanden, deshalb liegt der Schwerpunkt auch im rechten Bereich. Ganz links und ganz rechts sind hohe Spitzen erkennbar.

histogram_description_2

Diese hohen Spitzen sind sehr schlecht, da sie keine Informationen mehr enthalten – es ist im Bild an diesen Stellen nur mehr pures Schwarz oder Weis. Für das spätere Bearbeiten ist das eine Katastrophe (ja, es ist wirklich so schlimm).

Deshalb achte ich Aufnahmen immer darauf, innerhalb der beiden Grenzen zu liegen, so wie ich es bei einem der 10 Bilder für das Panorama gemacht habe:

histogram

Hier kommt nun der schwierige Part: Alle Bilder des Panoramas müssen innerhalb der Grenzen liegen, damit keine Bildinformation verloren geht. Dazu ein Tipp: Ein Bild vom Himmel (Zenit) machen, die Belichtungsdauer entsprechend korrigieren, dann ein Bild vom Boden (Nadir) machen und schauen, ob noch alles im grünen Bereich ist. Wenn nicht: Nachkorrigieren.
Generell gilt, dass digitale Kameras wesentlich besser mit dunklen Tönen umgehen können als mit hellen. Deshalb lieber alles etwas dunkler Fotografieren, sodass nichts an den rechten Rand des Histograms rutscht. Beim späteren Bearbeiten kann man dann einfach die zu dunklen Stellen heller machen.
Fotografiert wird natürlich im RAW Format!

Das Stitchen

Sind die Bilder im Kasten kann man sie mit ICE von Microsoft zusammenfügen. Der Editor ist kostenlos und unter allen bisher von mir getesteten mein Favorit.

Als Projektion muss man Spherical wählen, nur so erstellt ICE aus dem Panorama die gewünschte Rektangularprojektion.

ice_projection

Am Ende sollte das Resultat dann so zirka so aussehen, wobei ich die Breite des Bildes meist auf 5000 Pixel setze – die Höhe muss dann die halbe Breite sein, da ein 360° Panorama in seiner Höhe mit 180° beschränkt ist. Sollte das nicht der Fall sein, dann fehlen Bilder – ICE kann dann keine volle Kugeloberfläche erstellen.

ice

three.js

Nun da das Bild endlich fertig ist, muss man es auch irgendwo anzeigen. Und wo geht das besser als im Web? Hierzu nutze ich three.js

Auf GitHub findet man alles nötige. Im Ordner 360_Panorama befindet sich das index.html und die nötigen Java Scripte, außerdem auch das Bild (area.jpg). Achtung! Wer die index.html Datei lokal öffnet wird zunächst nichts sehen, außer einen schwarzen Bildschirm, der Grund ist, dass 3D-Figuren lokal nicht angezeigt werden. Einige Tipps wie man das umgeht findet man hier.
Da man das Ganze aber ohnehin online stellen will kann man den Ordner 360_Panorama auch gleich auf seinen Webspace kopieren, und diesen dann ansurfen.

Kostenlose Webspaces gibt es wie Sand am Meer, ich habe, bevor ich mir eine eigene Domain mit Webspace zugelegt habe, bplaced genutzt. Einfach anmelden, den Ordner hochladen und mit yourname.bplaced.net/360_panorama/ online ansehen.

Im index.html befindet sich das Script, welches alle nötigen Aufgaben für das Anzeigen des Bildes übernimmt (Kugel erstellen, Kamera in die Kugel setzen, Bild auf die Innenseite projizieren, Rendern starten, Mausbefehle abfangen). Hierfür gibt es eine guteDokumentation. Ich habe eingestellt, dass sich die Kugel langsam drehen soll, wem das nicht gefällt, der kann dies mit controls.autoRotate = false; ändern.

controls.noPan = true;
controls.noZoom = true; 
controls.autoRotate = true;
controls.autoRotateSpeed = 0.5;

Das Bild wird, wie bereits erwähnt, auf die Innenseite der Kugel projiziert. Nun erklärt sich auch, warum man in ICE eine Rektangularprojektion erzeugt. Betrachtet man ein „normales“ Bild in 2D, so sieht dieses so aus:

grid_small

In 3D wird daraus jedoch das hier. (Leider unterstützt WordPress wegen Sicherheitsrichtlinien keine iFrames. Den Beitrag gibt’s flawless hier zu sehen)

Das Ergebnis

Hat man alles zusammen, so präsentiert sich am Ende ein 360° Panorama, das man hier interaktiv steuern kann!

Das war’s auch schon.

.

.

 

Online 2.1

Falls es jemanden aufgefallen ist, ich war längere Zeit nicht auf WordPress unterwegs. Das liegt daran, dass ich meine Website nun mit einer ordentlichen Domain betreibe (und im Urlaub war).

deloarts.com

Wer den Beitrag zu Online 2.0 gelesen hat, und sich dadurch auf die alte Website verirrt hat, dem wird auffallen, dass sich das Design nicht wirklich geändert hat.

preview.PNG

Was sich aber geändert hat, ist wie ich die Website nun erstelle. Die Website wird nun automatisch erstellt, ich definiere nur noch in den Content-html-Files, was ich auf der Seite sehen will, den Rest (Inhalt auf ein Base-File führen, alles vereinheitlichen, alles vereinfachen, etc…) erledigt Gulp. Hier läuft dann ein Server auf meinem PC, auf welchem ich ganz einfach die Website lokal betrachten kann.

Weiters kann ich mit Gulp-Watch das Verzeichnis, in dem die Website liegt, überwachen lassen, und bei Änderungen im Verzeichnis werden alle Vorgänge (Base-File, vereinheitlichen, …) automatisch ausgeführt, sowie der Browser aktualisiert. Kurz: Ich speichere das html-File in Sublime Text und einen Augenblick später sehe ich die Änderungen im Browser.

Die Domain habe ich mir bei world4you gehohlt, und der Webspace liegt nun bei uberspace, und nicht mehr bei bplaced.

Alles andere, also die Zweisprachigkeit, der Inhalt und der Support für mobile Geräte ist gleich geblieben.

2 Devices

Lediglich das Design bei Desktop-Nutzern hat sich verändert, da ich gesehen habe, zu was CSS3-Transformationen fähig sind! Auf mobilen Geräten ist das leider nicht verfügbar, da man keine Maus hat, mit der man das :hover-Event triggern könnte.

Bleibt nur noch eins zu sagen: Einen großen Dank an ralphharrer.at, er hat mir einen Einblick in die Web-Entwicklung gewährt und mich bei meinem Vorhaben unterstützt.

Arduino & ATtiny85

In diesem kurzen Beitrag zeige ich, wie man das Arduino als Programmer für den ATtiny85 Mikrocontroller nutzt.

Preview

Arduino IDE vorbereiten

Benötigt wird hierfür zunächst nur das Arduino Uno.

Arduino als ISP konfigurieren.

Als nächstes Öffnet man ArduinoISP (File, Examples, ArduinoISP) und lädt dieses Programm auf das Arduino Uno. Achtung, als Board muss hier das Arduino Uno ausgewählt sein.

ATtiny als Board hinzufügen.

Damit man das Arduino als ISP nutzen kann muss man zunächst den ATtiny in die IDE importieren. Dazu öffnet man die Preferences (File, Preferences) und klickt auf das Icon ganz rechts neben Additional Boards Manager URLs.

Preferences.JPG

Daraufhin öffnet sich ein weiteres Fenster, in welches man folgenden Link kopieren muss.

http://drazzy.com/package_drazzy.com_index.json

Additional_Boards.JPG

Im Anschluss öffnet man den Board Manager 

Boardmanager0.JPG

… und fügt das nötige Modul hinzu. In diesem Fall das ATtinyCore by Spence Konde.

Boardmanager1.JPG

Ist das erledigt kann man das ATtiny im Board Manager auswählen …

Boardmanager2.JPG

… und es im Anschluss konfigurieren.

Boardmanager3.JPG

Man muss darauf achten, alle Einstellungen mit meinen abzugleichen. Also den Timer auf CPU, den Chip auf ATtiny85 und die Clock auf 8MHz setzen.

Danach stellt man sicher, dass der Programmer auf Arduino als ISP eingestellt ist.

Arduino_As_ISP.JPG

Der Setup

Als nächstes folgt der physische Aufbau. Dazu benötigt man die folgenden Bauteile:

  • 1 Arduino Uno
  • 1 ATtiny85
  • 1 10µF Kondensator

Die Pins des ATtiny kann man mit Hilfe der folgenden Abbildung und der Wiring-Tabelle mit dem Arduino Uno verbinden.

ATtiny85_Pinout.png

  • Vcc: +5V
  • GND: GND
  • Reset: Pin 10
  • Pin 0: Pin 11
  • Pin 1: Pin 12
  • Pin 2: Pin 13

ATtiny85_Steckplatine.png

Burn Bootloader

Nun kann man das Arduino wieder mit dem PC verbinden und den Bootloader für den ATtiny auf diesen schreiben.

Burn_Bootloader.JPG

Nun kann man den ATtiny mit der Arduino IDE programmieren.

Programme hochladen

Als kleines Beispiel habe ich ein Programm vorbereitet, das eine LED blinken lässt. Abhängig von dem Status eines Tasters ändert sich die Blinkgeschwindigkeit. Der Aufbau muss dabei um

  • 1 LED
  • 1 220Ω Widerstand für die LED
  • 1 Pushbutton
  • 1 10kΩ Widerstand für den Button

ergänzt werden.

ATtiny85_Steckplatine1.png

Als nächsten Schritt fügt man das folgende Programm in die Arduino IDE ein und lädt es auf das ATtiny85 via dem Arduino Uno hoch.

#define LED 0
#define BUTTON 1

word Delay = 1000;

void setup() 
{
 pinMode(LED, OUTPUT);
 pinMode(BUTTON, INPUT);
}

void loop() 
{
 digitalRead(BUTTON) ? Delay = 250 : Delay = 1000;
 digitalWrite(0, HIGH);
 delay(Delay);
 digitalWrite(0, LOW);
 delay(Delay);
}

Das ganze sieht fertig dann etwa so aus:

Setup.jpg

Zum Schluss kann man noch alle Kabel, die zum Arduino führen, und den Kondensator entfernen, und eine Spannungsversorgung im Bereich von 3V bis 5V herstellen. Die 3V erreicht man beispielsweise durch 2 Batterien des Typs AA. Dann muss man allerdings den 220Ω Widerstand durch eine Drahtbrücke ersetzen.

Bei Fragen dazu, oder falls etwas nicht so funktioniert, wie es soll: Ein Kommentar ist immer erwünscht!