OctoPrint on Orange Pi Zero

Still alive. Zur Zeit ist’s recht ruhig auf den Blogs, was Arduino, Raspberry oder andere derlei Spielereien anbelangt. Vielleicht weil’s der Industrie gerade gut geht und die Leute mehr arbeiten anstatt zu posten? Wie dem auch sei, ich habe mal wieder die Zeit gefunden.

Etwas seltsam ist es schon, ich 3Drucke (ha ha …) mittlerweile schon sehr lange und habe immer noch keinen einzigen Post über das Thema gemacht. Deshalb fange ich mal mit einem Nischenthema an: Ein Tutorial zum Druckhost. Genauer: Es geht um die Installation von OctoPrint auf einem Orange Pi Zero.

header

OctoPrint

Was ist Octoprint? Im Grunde habe ich im Absatz oben bereits alles darüber gesagt, es ist ein Host für 3D-Drucker und es unterstützt die meisten zur Zeit verfügbaren Boards und deren Firmware, wie etwa Marlin oder Repetier. Die Vorteile sind klar: Drucken übers Netzwerk, keine Kabel, keine SD-Karten.

Jetzt aber zum eigentlichen Thema:

Flash armbian

Erster Schritt: Der Orange Pi Zero benötigt ein Betriebssystem. Ich nutze armbian (headless). Einfach dem Link folgen und der Quick start Anleitung auf der Seite folgen.

Danach kommt die SD-Karte in den Pi, und dieser via LAN ins Netzwerk. Über PuTTY kann man dann den Pi erreichen. Auf der Seite von armbian wird man angehalten, sich beim ersten Mal als ‚root‘ anzumelden. Tut dies indem ihr in PuTTY als Host Name folgenden eintippt: root@192.168.0.100 (als IP-Adresse bitte jene eures Pi eingeben).

Die Anleitung endet damit, dass ein Account erstell werden soll, hier liegt es jedem frei, wie dieser heißen soll. Bei mir hat er den einfachen Namen pi.

Netzwerk einrichten

Gut, dass es auch einfach geht:

sudo nmtui

nmtui ist ein einfaches ‚halb-grafisches‘ Interface, in welchem man sehr leicht das Netzwerk konfigurieren kann.

Ich rate euch, dass ihr dem Board eine fixe IP Adresse zuweist. So erleichter man sich den Logon später im Browser, als auch in PuTTY.

OctoPrint installieren

Als erstes:


sudo apt-get update

sudo apt-get update

 

Module installieren

Octoprint benötigt ein paar Module um zu funktionieren. Diese installieren wir mit einem schicken Einzeiler.

sudo apt-get install python-pip python-dev git virtualenv python-setuptools psmisc
Benutzer verwalten

Um Octoprint nutzen zu können benötigen wir erst einmal einen User. Dieser muss dann noch den entsprechenden Gruppen für die entsprechenden Rechte hinzugefügt werden.

sudo adduser octoprint
sudo usermod -a -G tty octoprint
sudo usermod -a -G dialout octoprint
sudo adduser octoprint sudo

Als nächstes muss die Datei visudo bearbeitet werden.

sudo visudo

In diese wird folgendes am Ende hinzugefügt:

octoprint ALL=(ALL) NOPASSWD:ALL

Denn jetzt lässt sich das Passwort des Users ‚octoprint‘ entfernen. Danch erfolgt der Wechsel des Benutzers.

sudo passwd octoprint -d
sudo su octoprint
Laden und installieren

Jetzt navigieren wir zurück ins Root und laden PySerial.

cd ~
wget https://pypi.python.org/packages/source/p/pyserial/pyserial-2.7.tar.gz
tar -zxf pyserial-2.7.tar.gz
cd pyserial-2.7
sudo python setup.py install

Und schlussendlich sind wir soweit, dass sich Octoprint installieren lässt. Das passiert in einer virtuellen Umgebung (virtualenv).

cd ~
git clone https://github.com/foosel/OctoPrint.git
cd OctoPrint
virtualenv venv
./venv/bin/python setup.py install

Server starten

~/OctoPrint/venv/bin/octoprint serve

Und das war’s. Was fehlt aber noch? Der Server startet noch nicht beim Booten des Orange Pi. Das soll noch geändert werden.

octoprint

Autostart

Um den Autostart zu ermöglichen müssen ein paar Scripte aus dem OctoPrint-Verzeichnis auf den Pi kopiert werden. Solange man noch als User ‚octoprint‘ angemeldet ist, kann man das durch die folgenden Zeilen erledigen:

sudo cp ~/OctoPrint/scripts/octoprint.init /etc/init.d/octoprint
sudo chmod +x /etc/init.d/octoprint
sudo cp ~/OctoPrint/scripts/octoprint.default /etc/default/octoprint

Nun kann die Datei Verzeichnis /etc/default/octoprint bearbeitet werden:

sudo nano /etc/default/octoprint

Wichtig ist, dass die folgenden Informationen sich decken:

PORT=5000
DAEMON=/home/octoprint/OctoPrint/venv/bin/octoprint
DAEMON_ARGS="--port=$PORT"
OCTOPRINT_USER=octoprint

Nachdem die Datei bearbeitet wurde, kann diese mit STRG+O und STRG+X gespeichert und geschlossen werden.

Das war’s. Jetzt läuft Octoprint auf eurem Orange Pi Zero. Erriechen kann man es, indem man in die Adresszeile des Browsers die IP-Adresse des Boards eingibt und den Port vom Server (5000), beispielsweise 192.168.0.100:5000. Eine andere Möglichkeit ist es, den Server per octopi.local zu erreichen, das erfordert aber bonjour als laufenden Dienst.

Für mehr Konfiguration: GitHub.

 

Advertisements

Telegram Bot

Der letzte Blogeintrag ist bereits ein paar Wochen her. Warum? Zur Zeit arbeite ich an zwei sehr großen Projekten, die ich, sobald ich sie abgeschlossen habe, hier vorstellen werde. Das eine Projekt hat wieder mit einer Kamera zu tun (nein, diesmal keine Tropfenfotografie). Das andere, welches ich gemeinsam mit ralph mache, hat wieder mit dem ESP-Controller zu tun. Stay tuned.

So viel sei gesagt, hier folgt ein Lückenfüller. Es kommt nichts sonderlich neues, aber wem fad ist, der darf gerne bleiben. Der Titel verrät es schon, es geht um den Raspberry Pi und um Telegram. Das Vorhaben ist, dass man Statusnachrichten vom Pi direkt aufs Smartphone bekommt. Ich finde das immer recht praktisch, weil ich dann nicht erst meinen PC starten muss um dann via Terminal mit dem Pi kommunizieren zu können.

Get Telegram

Das Prozedere, um einen Bot aufzusetzen, habe ich hier schon gezeigt. Folgt einfach den Anweisungen des BotFathers, dann kann nichts mehr schief gehen.

Der Code

Diesmal nicht auf GitHub, sondern auf meiner Website. Es sind nicht einmal 100 Zeilen Code, das geht sich also dort gut aus.

Das Python-Script lege ich am Raspberry im Verzeichnis ~/Python/Telegram_Bot/Telegram_Bot.py ab. Wie ihr das macht bleibt euch überlassen, aber das Verzeichnis ist später noch wichtig.

Das Script sollte für all‘ jene, die Python verstehen nachvollziehbar sein, auch wenn ich mich nicht immer an die Community-Konventionen halte. Alle, die es (noch) nicht können: Ihr könnt mich gerne dazu fragen!

Was macht das Script? Sobald der Bot läuft bekommt ihr eine Nachricht von ihm. So wisst ihr, dass der Raspberry Pi online ist, sofern ihr das Script im Autostart ausführen lässt. Danach kann eine Konversation so aussehen:

conversation.jpg

Das tolle „neue“ Feature des BotFathers ist es, dass ihr jetzt eure Commands definieren könnt. So fällt das lästige Eintippen weg. Die Commands werden einfach per Klick gesetzt.

Autostart

Startet am Pi den nano-Editor im Verzeichnis

sudo nano /etc/rc.local

und ergänzt ihn um die Zeile

/home/pi/startup.sh

rc_local.jpg

Speichert und schließt die rc.local und erstellt oder öffnet die startup.sh mit

sudo nano /home/pi/startup.sh

und ergänzt sie mit dem Eintrag

/bin/sleep 15 && cd /home/pi/Python/Telegram_Bot/ && sudo python Telegram_Bot.py

startup_sh.jpg

Speichern. Schließen. Schon liegt das Script im Autostart. Die 15 Sekunden Wartezeit sind natürlich keine saubere Art das zu machen, aber ich habe auch nach (kurzer) Suche im Web keine andere, saubere Lösung gefunden.

Bei Fragen (oder der Lösung zum 15 sec Problem) schreibt mir einfach einen Kommentar!

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!

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!

 

 

Water Drop (Pro) – Sensor Add-On

Wie ich es bereits im Water Drop (Pro) Beitrag (diesen sollte man zuerst lesen) angekündigt habe folgt hier das Sensor Add-On. Da die Hardware der Pro-Version bereits für einen Sensor ausgelegt ist, waren nur noch kleinere Änderungen in der Software zu erledigen und ein funktionierender Sensor zu bauen. Wer den Beitrag über die Advanced-Version gelesen hat, der wird bereits einen Verdacht haben, was nun folgt. Die Idee des Sensors beruht nämlich auf der selben wie in der älteren Version der Water Drop Reihe – einer Laserlichtschranke.

Um auch alles Zusatzmaterial auf einmal zu bekommen, habe ich das Projektverzeichnis auf dem Webserver aktualisiert. Die neuen Dateien können hier heruntergeladen werden.

Der Sensor

Für eine Laserlichtschranke braucht man einen Sender und einen Empfänger. Da ich keine Reflexlichtschranke baue sind beide Geräte in unterschiedlichen Gehäusen verbaut. Als Sender nutze ich einen alten Laserpointer, aus dem ich die Batterien entfernt habe, und diese durch zwei Kabel ersetzt habe.

Sensor_Laserpointer.jpg

Der Laserpointer benötigt 3V Spannung und 15mA Strom. Deshalb kann ich ihn direkt mit einem digitalen Output-Pin des Arduinos (max. 40mA) betreiben. Wer einen Laserpointer mit mehr Leistung nutzen will, der muss, um das Arduino nicht zu zerstören, ein Relais oder einen Transistor zwischenschalten. Der Kabelbinder am Gehäuse dient dazu, den Schalter permanent gedrückt zu halten. Wem das stört, der kann auch das Gehäuse öffnen und die Kontakte des Schalters gemeinsam verlöten.

Da der Laserpointer mit 3V arbeitet, das Arduino jedoch 5V ausgibt, benötigt man zusätzlich einen Spannungsteiler (im Grunde die einfache Variante des Logic Level Shifters).

Spannungsteiler_Sensor

Als Empfänger nutze ich einen Phototransistor (620-960nm). Dieser sitzt in einem anderen Gehäuse, doch das Gesamtpaket wird nur mit einem Kabel mit der Switchbox verbunden. Der Schaltplan unten zeigt das gesamte System, für welches ich die folgenden Komponenten verbaut habe:

  • 1 1kΩ Widerstand für den Spannungsteiler
  • 1 2.2kΩ Widerstand für den Spannungsteiler
  • 1 10kΩ Pull-Down Widerstand für den Phototransistor
  • 1 Phototransistor (620-960nm) (BPW 16N oder ähnlich)
  • 1 alten Laserpointer mit rotem Licht (Hier als LED dargestellt)

Water_Drop_Pro_Sensor_Shematic

Achtung, ich nutze einen Laserpointer mit rotem Licht! Falls jemand einen mit grünen Licht nutzen will, so muss er auch den Phototransistor dementsprechend anpassen, da dieser hier nur auf rotes Licht reagiert! Um die Auswahl des Phototransistors zu erleichtern, gibt es hier eine gute Tabelle.

Der Sensor Jack ist ein einfacher 5-poliger Mikrofonstecker, der an die passende Buchse an der Switchbox gesteckt werden kann. Man kann natürlich auch die beiden GND-Leitungen zusammenfassen, da sie an der Platine sowieso am selben Pin landen, doch dann würde es an der Switchbox zwei 4-polige Buchsen geben, was zu einer Verwechslung führen könnte, und so Schäden am Gerät verursachen würde.

Switchbox_Sensor_Interface

Der Stecker wird direkt mit den passende Terminal-Block-Pins an der Platine verbunden. Man muss dann nur noch darauf achten, am anderen Ende des Steckers auch die richtigen Kabel mit dem Phototransistor oder dem Laserpointer zu verbinden. Hierfür nutze ich den akustischen Diodenprüfer eines Multimeters.

Sensor_Pinout_Real.jpg

Achtung, wer hier unachtsam ist könnte einen Kurzschluss verursachen. Also lieber alles zweimal prüfen!

Zur Sicherheit sollte man das Fritzing-File im Projektverzeichnis (der Link am Beginn des Beitrags) zu Rate ziehen.

Fritzing_Sensor

Das Gehäuse des Phototransistors ist ein kleines, günstiges Kunststoffgehäuse. Ich habe drei Bohrungen angebracht:

  • Die Bohrung für das 5-polige Kabel von der Switchbox
  • Eine kleinere Bohrung für das 2-polige Versorgungskabel des Lasers
  • Eine Bohrung als Öffnung für den Laser

Der Rahmen

Um den Rahmen der Pro-Version nur gering umzubauen, habe ich mich für die einfachste Variante entschieden den Sensor zu montieren: Ein dünnes Brett wird an den mittleren Balken geschraubt. So muss man nichts weiteres tun, als zwei Bohrungen (D=12mm) in den Balken zu bohren, und darin jeweils eine Gewindemutter (M8) zu fixieren. So kann man später das Brett einfach mit zwei M8-Flügelschrauben befestigen.

Frame_006.jpg

Das Brett kann man gestallten wie man es gerne möchte, und da ich nicht davon ausgehe, dass jeder die selben Gehäuse für Sender und Empfänger der Laserlichtschranke zur Verfügung hat, habe ich das Brett auch nicht in das Zip-File hinzugefügt. Einzige „Bedingung“ ist, dass die beiden Flügelschrauben einen Abstand von 130mm zur Mitte des Balkens haben (also 260mm Abstand zueinander).

Der Code

Natürlich befindet sich die neueste Version des Programmcodes auch in dem Zip-File. Für all‘ jene, die sich das Programm gerne auf GitHub ansehen möchten: Der Sensor wird erst ab der Version 1.3.0 unterstützt, und läuft ohne Probleme seit der Version 1.3.2.

Um den Sensor auch nutzen zu können, muss, sobald der Host mit der Switchbox verbunden ist, das Häkchen neben dem Start-Button gesetzt werden.

Software_Sensor_Mask

Danach kann man links in der Software die Parameter einstellen.

  • Height 1: Dies ist die Distanz zwischen dem Fallobjekt und dem Sensor oberhalb des Sensors. Hält man beispielsweise einen Apfel 10cm über dem Sensor, bevor man ihn fallen lässt, so muss man hier 100mm einstellen.
  • Height 2: Hier wird die Distanz zwischen Sensor und Boden festgelegt.
  • Delay: Das Delay wird automatisch berechnet, jedoch kann man es noch zusätzlich variieren, je nachdem wie das Bild später aussehen soll.

Ist das Häkchen gesetzt, so werden beim Vorgang die Ventile nicht genutzt! Sollte ich Anfragen bekommen, die Ventile und den Sensor gleichzeitig nutzen zu können, dann werde ich das ins Programm bringen, ansonsten sehe ich für mich keinen Sinn beides gleichzeitig zu nutzen.

Ist der Sensor zu empfindlich, also löst die Kamera aus, ohne dass etwas durch den Sensor fällt? Kein Problem, in den Optionen (Tools -> Options) kann die Empfindlichkeit eingestellt werden. Null ist hierbei die maximale Empfindlichkeit, und 10 die niedrigste (ich weiß, konträr, aber das liegt an meiner Faulheit).

Software_Sensor_Options_Mask

Der Sensortyp gibt an, ob man einen analogen oder einen digitalen Sensor nutzt. Der Sensor, den ich hier vorgestellt habe ist ein analoger, da er den Spannungswert direkt an den Controller schickt (ohne weitere Verarbeitung). Ein digitaler Sensor bereitet das Signal vorher auf, bevor er einen digitalen Wert (5V oder 0V) an den Controller schickt.

Ein solcher Sensor kann zum Beispiel als Reflexlichttaster ausgeführt sein.

Light_Sensor_Advanced

Hierbei muss man darauf achten, dass das digitale Signal LOW wird, wenn ein Objekt erkannt wird, ansonsten funktioniert der Sensor nicht mit der Switchbox.

Das Ergebnis

Um es zu testen habe ich in der Software das Delay auf Null gesetzt, und den Blitz die Arbeit machen lassen. Soll heißen, ich habe die Kamera 4 Sekunden in einem halbdunklen Raum belichten lassen, und der Blitz hat dann das Fallobjekt „eingefangen“.

In_Flight.jpg

Das Bild ist jetzt nicht gerade das schönste, aber es zeigt recht gut wie schnell das System reagieren kann. Wer die Kamera die Arbeit machen lässt, der muss die Verzögerung des Verschlusses mit einrechnen (trotz aktivierter Spiegelverriegelung). Hat man diese Zeit erst einmal durch Probieren gefunden, kann man sie als mehr oder weniger konstant annehmen und damit arbeiten.

Ein paar letzte Worte. Man kann neben diesem Sensor auch noch andere anschließen, etwa Schallsensoren. Wer mehr dazu wissen will, der kann mich gerne per Mail oder in einem Kommentar dazu fragen. Sollten mehrere Anfragen kommen, so schreibe ich gerne einen weiteren Blogeintrag zu diesem Thema.

Edit (22.06.2016)

Wer das Fallobjekt immer aus der gleichen Höhe fallen lassen, und zwar ohne es zudem noch halten zu müssen, der findet die Idee von Resterampe Berlin sicher genau so fein wie ich! Entweder man nutzt dazu einen separaten Mikrocontroller oder legt die Versorgung (Vcc & GND) des Lasers mit der des Phototransistors zusammen (Relais oder Transistor dazwischen und eine eigene Versorgung wegen des maximalen Stroms). Bei dem zweiten Punkt muss man allerdings das Programm des Arduinos etwas ändern, sodass das Servo auch arbeitet. Wer dazu Fragen hat: Einfach ein Kommentar!

So, das war’s.

.

Arduino & Nunchuk

Eines meiner Projekte benötigt einen Joystick und 2 Buttons als Eingabemöglichkeit. Das ganze selbst zu bauen wäre nicht das Problem, doch als ich hörte, dass der Wii Nunchuk mit I2C arbeitet konnte ich gar nicht anders, als ihn für meine Zwecke zu nutzen.

Setup_Bokeh.jpg

In diesem Beitrag zeige ich, wie man die Daten vom Controller via I2C auslesen kann. Diese Daten werden dann auf einem Display und mit 6 LEDs dargestellt.

Der elektrische Aufbau

Für dieses Tutorial benötigt man die folgenden Bauteile

  • 1 Arduino UNO/Nano
  • 1 Wii Nunchuk
  • 1 0.96″ I2C Display
  • 6 LEDs
  • 6 220Ω Widerstände für die LEDs

Neben dem Steckbrett gibt’s auch noch den Schaltplan, da es wegen der LED-Anordnung recht eng geworden ist.

Wii_Nunchuk_Schaltplan

Wii_Nunchuk_Steckplatine

In Real sieht der Setup dann etwa so aus:

Setup

Achtung! Die Versorgungsspannung des Nunchuks beträgt 3.3V. Er darf auf keinen Fall an die 5V Leitung angeschlossen werden, da dies ihn sonst beschädigen würde! Er hat zudem einen Logic Level Shifter integriert, was die Nutzung der I2C-Pins ohne weitere Maßnahmen erlaubt.

Die meisten I2C-Displays dieser Größe arbeiten mit 5V. Mehr zu dem Display und dessen Verwendung kann man hier nachlesen. Wem das Lesen zu viel ist, der kann sich hier die nötige Programmbibliothek für den Display herunterladen und in das Standard-Verzeichnis für Arduino-libs (../Arduino/libraries/) kopieren.

Der Code

Wie immer: GitHub.

Im Hauptverzeichnis auf GitHub findet man 3 *.ino-Dateien. Wer die Standard-Arduino-IDE nutzt, der muss lediglich das Hauptfile – Wii_Nunchuk.ino – öffnen. Die beiden anderen Dateien werden automatisch in neue Tabs geladen. Wenn alle Dateien offen sind folgt hier die Erklärung der Funktionen:

  • setup. Pins festlegen, Controller initialisieren, controllerspezifische Kalibrierung festlegen (dazu später mehr), Display initialisieren.
  • loop. Daten vom Nunchuk anfordern, diese dann auf ein „hübsches“ Outputformat für den Display bringen und ausgeben. Zum Schluss noch die LEDs passend zum Signal ansteuern.
  • printFormNum. Damit die Zahlen rechtsgebunden am Display erscheinen wird der auszugebende String an die Länge der Zahl angepasst.
  • sendDataToNunchuk. Hier wird mit Hilfe der Wire.h-Library ein Datensatz an den Nunchuk gesendet. Für mehr Info über die I2C-Kommunikation: http://playground.arduino.cc/Learning/I2C.
  • initNunchuk. Zu Beginn muss der Nunchuk initialisert werden, wobei festgelegt wird aus welchem Register des Nunchuks wie ausgelesen wird.
  • getNunchukData. Hier passiert das Spannende. Zuerst schickt man dem Controller einen Request für die ersten 6 Register (0x00, 0x01, …). Hinter diesen Registern verbergen sich die Postionsdaten des Joysticks und der Buttons als Zahlenwert. Hat der Controller den Request erhalten, so schickt er an das Arduino die jeweiligen Daten zurück. Die map-Funktion wird hier als controllerspezifische Kalibrierung eingesetzt.

Ist das Programm auf das Arduino geladen, so kann man bei Benützung des Nunchuks die Daten, welche von ihm empfangen werden vom Display ablesen. Zusätzlich ändert sich die Helligkeit der LEDs passend zur Eingabe.

Display_Close.JPG

Was ist nun die ominöse Kalibrierung? Die Daten, welche der Controller an den Arduino schickt sind nicht weiter verarbeitet, sie sind also Rohdaten. Nun kann es passieren, dass man den Joystick ganz nach links drückt, der Zahlenwert der X-Koordinate dennoch nicht Null ist. Um das zu ändern muss man zunächst im Setup alle die Min/Max-Values zurücksetzen auf:

nunchuk.MinX = 0;
nunchuk.MaxX = 255;
nunchuk.MinY = 0;
nunchuk.MaxY = 255;

Nun lädt man das Programm erneut auf das Arduino und notiert sich die angezeigten Werte der äußersten Position des Joysticks:

  • MinX ist jener Wert, wenn der Joystick ganz nach links gedrückt wird (zB: 29).
  • MaxX: Wert, wenn Joystick ganz nach rechts gedrückt wird (zB 228).
  • MinY: Wert, wenn Joystick nach unten gedrückt wird (zB 33).
  • MaxY: Wert, wenn Joystick nach oben gedrückt wird (zB 222).

Diese Werte trägt man dann in die Kalibrier-Variablen ein.

nunchuk.MinX = 29;
nunchuk.MaxX = 228;
nunchuk.MinY = 33;
nunchuk.MaxY = 222;

Nun ist das Programm für diesen einen Controller ausgelegt.

Das war’s, bei Fragen ist ein Kommentar immer erwünscht!

.

 

Water Drop (Pro)

Nachdem ich mit Water Drop (Advanced) gute Erfolge im Bereich der Wassertropfenfotografie verbuchen konnte, war es an der Zeit ein neues Projekt zu starten und die Water Drop Reihe etwas zu erweitern. Und so startet hier das neue und bessere Water Drop (Pro).

.

drop_0.JPG

.

Was ist nun der Unterschied zu den beiden Vorgängern, außer das einfallslose Pro hinter dem noch einfallsloserem Water Drop? Nun zum einen nutze ich hier zum ersten Mal Elektromagnetventile, welche über den Mikrocontroller gesteuert werden. Zum anderen arbeitet der Controller nun mit einer Host-Software zusammen, die vorerst nur unter Windows OS läuft. Zusätzlich unterstützt die Software alle gängigen Canon EOS DSLR Modelle, wodurch sich die Einstellung des Fokus, der Blende, der Filmempfindlichkeit sowie der Verschlusszeit vereinfachen soll – man braucht seine Kamera nun nicht mehr anzufassen, um Änderungen vorzunehmen.

Der Umfang der steuerbaren Ventile beläuft sich derzeit auf drei Stück. Zusätzlich arbeite ich noch an ballistischen Ad-Ons, doch bis diese lauffähig sind wird es noch etwas dauern.

Das Projekt ist doch sehr umfangreich, dennoch will ich versuchen, es für alle vollständig nachvollziehbar zu machen, sodass sich jeder, der Tropfen fotografieren will, daran erfreuen kann. Der Aufbau der elektronischen Schaltung benötigt neben Zeit und etwas Geschick beim Löten (falls man sich für die Verwendung einer Platine entschließt) auch etwas mehr an fotografischer Ausrüstung. Doch zu allem später mehr !

Da ich in diesem Blogpost nicht alles unterbringe, was ich unterbringen will, findet man hier alles weitere. In dem Zip-File (so nenne ich es im weiteren Verlauf) sind nicht nur die neuesten Versionen der Software für Host und Controller zu finden, sondern auch die Fertigungspläne für elektrischen und mechanischen Aufbau und ein kleiner Guide für das gesamte Package.

Vorerst möchte ich ein paar Tricks verraten, wie man das Wasser behandeln kann, sodass es sich besser ablichten lässt.

Das Wasser

Wer meinen Beitrag zu Water Drop (Advanced) gelesen hat, dem mögen die folgenden Zeilen vielleicht bekannt sein, denn es hat sich nicht viel geändert.

Die Tropfflüssigkeit, welche von der Düse auf das Wasser trifft, behandle ich auf zwei verschiedene Arten, je nach gewünschtem Ergebnis:

  • Reines Wasser – ergibt starke Spritzer
  • Wasser-Guarkernmehl-Mischung – ergibt gebundenere Formen.

Abgesehen von der Variante filtere ich das Wasser vor jeder Fotosession, um so wenig Verunreinigungen wie möglich im Bild erkennen zu können (der Raum sollte auch sauber sein, da sich ansonsten Staub aus der Umgebung auf der Wasseroberfläche sammeln kann). Als Filter nutze ich einen Sieb, in das ich ein Stück Küchenpapier oder ein Taschentuch lege. Kaffeefilter sind ebenso gut zu verwenden.

Filter.jpg

Die Guarkernmehl-Mischung (etwa ein Teelöffel) bereite ich mit etwa 5cl Weingeist zu. Nach dem Umrühren gibt man das Gemisch in einen sauberen Behälter mit 2 Litern warmen Wasser. Danach muss 15 Minuten stark umgerührt werden, sodass sich das Guarkernmehl im Wasser lösen kann. Dieses Gemisch lasse ich dann abgedeckt ein paar Stunden so stehen.

Guarkern

Die Dichte des Beckenwassers behandle ich nicht. Ich filtriere lediglich reines Leitungswasser, und achte darauf, dass das Becken sauber ist. Als Becken nutze ich alles Mögliche, von Trinkgläsern bis hin zu Pfannen. Je nach Bildausschnitt sollte das Becken bis zum Rand gefüllt werden, sodass man den “Horizont” nicht mehr erkennen kann. Hinter das Becken kann man verschiedenfarbige Platten stellen, um so eine tolle Farbgebung der Szene zu erreichen.

Zuletzt habe ich auch mit destilliertem Wasser experimentiert. Die Ergebnisse auf den Bildern sind identisch mit jenen des normalen Wassers. Ich nutze es lediglich, um das Ventil und die Schläuche zu schonen (Kalkansammlungen). Wer mit höher viskosen Flüssigkeiten seine Bilder macht, der sollte den Aufbau nach der Arbeit auf jeden Fall mit destillieren (oder normalen) Wasser spülen.

Da alles zum Thema Wasser gesagt wurde, kommen wir nun zum nächsten Schritt.

Der mechanische Aufbau

Wie bereits erwähnt unterstützt der Controller bis zu 3 Elektromagnetventile, welche die Wassertropfen erzeugen. Aus finanziellen Mitteln zeige ich die Konstruktion nur mit einem Ventil, doch die Installation der beiden anderen Ventile funktioniert in jeder Hinsicht gleich. Sowohl die Software, als auch die Hardware unterstützen alle drei Ventile – Plug & Play.

Der Rahmen

Als Rahmen nutze ich ein selbst gebautes Gestell, welches so gebaut ist, dass man es einfach zerlegen und platzsparend verstauen kann, denn nicht jeder ist mit viel Platz gesegnet.

Die kompletten Daten, sowie die Pläne für die Fertigung sind unter dem oben genannten Link – ZIP-File – zu finden.

Frame_001.jpg

Das Gestell hat eine Höhe von etwa ein-ein-halb Metern, sodass man es auch auf einen Beistelltisch stellen kann, um nicht immer am Boden sitzen zu müssen. Die Breite ist so gewählt, dass man ein Backblech darunter legen kann, das als Spritzschutz für die Umgebung dient.

Die Montage ist einfach. Die beiden seitlichen Bretter werden mit Flügelschrauben an den horizontalen Staffeln befestigt. In den Staffeln sind Einschraubmuttern eingeschraubt, welche die Verbindung zwischen Holz und Schraube herstellen.

So kann man das Gestell schnell zusammenbauen und wieder zerlegen.

Der Ventilkopf

Hierauf sitzen die Ventile, deshalb habe ich hier bei der Fertigung besonders auf hohe Genauigkeit geachtet. Die Ventile befinden sich alle auf der selben Höhe und lassen sich in ihrer Entfernung zueinander über Langlöcher verstellen. Das Ventil präsentiere ich etwas später im Beitrag.

Frame_003

.

Frame_004

Vom Controller ausgehend lasse ich ein 6-poliges Kabel zum Ventilkopf laufen, welches dort dann in einem Verteiler endet. An diesem können die Ventile separat angeschlossen werden.

Der Wassertank

Eine Ebene höher befindet sich der Wassertank. Jedes Ventil hat seinen eigenen Wassertank, welcher nach dem Mariotteschen Prinzip gebaut wurde. So bleibt der Druck des Wassers auf das Ventil konstant und erlaubt eine immer gleich bleibende Austrittsgeschwindigkeit. Das ist in der Berechnung der Fallzeit in der Software äußerst wichtig!

Frame_005.jpg

Das Prinzip der Flasche ist im Grunde recht einfach. Läuft Wasser unten aus, so erzeugt das schwindende Volumen des Wassers einen niedrigeren Druck der Luft oberhalb. Ist der Druck der Umgebung groß genug, das er sowohl jenen der Flüssigkeit und der Luft in der Flasche überwinden kann, so wird Luft von außen angesaugt. Dies hat die Folge, das der Druck am unteren Ende des Röhrchens immer der konstante Umgebungsdruck ist (solange der Wasserspiegel nicht unter die Öffnung des Röhrchens fällt).

Mariottesche_Bottle_Concept

Das Gehäuse

Das Gehäuse beinhaltet die Platine, auf welcher das Arduino Nano sitzt. Die nötigen Unterlagen für die Fertigung der Platine sind ebenfalls im oben genannten Zip-File zu finden, die Details zum Schaltplan folgen etwas später in diesem Post.

Switchbox_Front

An der Front des Gehäuses findet man einen Display, der den jeweiligen Status anzeigt, den Hauptschalter, einen Reset-Button und drei Buttons, welche die jeweiligen Ventile kurz öffnen. Dies soll die Einrichtung des Fokus der Kamera erleichtern.

Switchbox_Back

Auf der Rückseite sind die Anschlüsse untergebracht. Das System wird über die Spannungsbuchse (links unten) mit 12 VDC versorgt und benötigt mindestens 2 A Strom. Darüber erkennt man die Klinkenbuchse für die Kamera.

ACHTUNG! Die Versorgungsbuchse muss passend zum Netzteil verlötet werden! Wie die Beschaltung am Netzteil ist, findet man am Gerät selbst, diese sieht in etwa so aus:

Connection

Hier erkennt man, dass der Plus-Pin innen liegt, also muss man auch bei der Buchse an den innen liegenden Pin das Kabel für die +12V anlöten.

Neben der Versorgungsbuchse findet man die 4-polige Buchse für das USB-Kabel, über welches der PC mit dem Controller kommuniziert. Die Buchse ist deshalb keine Standard-USB-Buchse, weil ich diese 4-polige „Mikrofonbuchse“ und den passenden Stecker gesamt günstiger erworben habe, als eine USB-Buchse alleine … naja ..

Die beiden anderen Buchsen sind für die Steuerung der Ventile und für den Sensor zuständig. Zur Zeit wird noch kein Sensor in der Software unterstützt, doch das Interface hierfür ist bereits gegeben.

Alle nötigen Bauteile, sowie die Pläne für das Gehäuse sind ebenfalls im Zip-File unter „Mechanical Engineering“ zu finden.

Wem das nötige Werkzeug fehlt, um die Bleche entsprechend bearbeiten zu können, der kann diese durch Kunststoffplatten ersetzen. Diese lassen sich recht passabel mit einer Laubsäge bearbeiten.

Der elektrische Aufbau

Zu Beginn eine kleine Anmerkung: Ich nutze auch bei diesem Projekt wieder einen kleinen Display, dieser dient allerdings nur der Visualisierung der Zustände (Verbunden, Prozess arbeitet, offene Ventile, etc.). Wer darauf verzichten will, der kann auch auf den Display verzichten.

Ich habe folgende Komponenten verbaut:

Die Verdrahtung zeige ich als Steckbrett-Aufbau und als Schaltplan, da es auf dem Steckbrett recht eng geworden ist, und so die Übersicht etwas gelitten hat. Zusätzlich habe ich die Leiterplatte für das Projekt auf meinem Webserver (Zip-File) zur Verfügung gestellt. Darin findet man auch eine Bauteilliste und eine Bauanleitung für die Platine.

Zu den beiden folgenden Bildern muss ich anmerken, dass das System mit 12V gespeist wird, und nicht mit 9V, wie hier dargestellt. Außerdem sind die Ventile hier als Schubbolzen dargestellt. Die Funktion ist aber die selbe.

.

Water_Drop_Pro_Breadboard

.

Water_Drop_Pro_Circuit

.

Hinweis: Wer bereits ein Arduino Uno besitzt, und dieses auch verwenden mag, der hat hier ein leichtes spiel. Da sich im Nano v3.0 und im Uno Rev3 der selbe Prozessor befindet, und auch die Pinbelegung ident ist, kann man das Nano einfach gegen das Uno austauschen, ohne dabei die Pins ändern zu müssen.

Nun erkläre ich die einzelnen Komponenten im Detail.

Komponente Camera

Der Kameraanschluss ist ein einfacher 3.5mm Stereo-Klinkenstecker. Viele Kameras und Blitze unterstützen ein Auslösen mit einem solchen Stecker. Um einen solchen zu bauen, braucht man folgende Komponenten:

  • 3.5mm Stereo-Klinkenstecker
  • 2.5mm zu 3.5mm Adatperkabel
  • 3.5mm Stereo-Kabel (Male-Male)

Audio_Jack_Real_Image

Die Verdrahtung zwischen Optokoppler und Klinkenstecker muss so ausgeführt sein, dass das Gehäuse (SLEEVE) des Steckers mit dem Emitter des Kopplers verbunden ist. Der Kollektor des Optokopplers muss mit dem Left-Pin des Steckers verbunden werden, da dieser für das Auslösen der Kamera zuständig ist. Mit Right-Pin kann man den Autofokus betätigen.

Audio_Jack_Shematic

Pin 1 des Optokopplers ist die Anode (+) und Pin 2 ist die Kathode (-). Wenn sich nun jemand fragt, warum ich hierfür einen Optokoppler verwende: Keeps you from frying your stuff!

Das Arduino gibt durch den digitalWrite()-Befehl 5V am entsprechenden Pin aus. Diese 5V könnten an der Kamera Schäden verursachen, deshalb muss man etwas zur Sicherheit zwischenschalten. Diese Sicherheit ist der Optokoppler, er ist von der Funktion her vergleichbar mit einem Relais, jedoch ist die Schaltzeit wesentlich kürzer – also perfekt für solche Anwendungen! Wer sich unsicher ist, wo sich die Kontakte des Optokopplers befinden: Datenblatt!

Mehr dazu findet man hier.

Komponente Elektromagnetventil

Die Elektromagnetventile habe ich bei diesem Shop erworben (Spannung 12 V, Leistung 5 W). Zusätzlich habe ich mir noch 2 Schlauchtüllen (Schlauchgröße 6 mm) dazu bestellt, um das Ganze abzurunden.

Valve_G1_8.jpg

Das Magnetventil arbeitet mit einer Gleichspannung von 12V, das Arduino jedoch mit 5V. Aus diesem Grund braucht man eine Transistorschaltung, um mit dem Arduino das Ventil öffnen und schließen zu können.

Ein Transistor ist im Grunde ein Schalter, welcher elektronisch geöffnet und geschlossen wird. Wer mehr darüber wissen mag -> Transistorschaltung.

Transistor_Circuit.jpg

Der Ground (-) muss vom Signalgeber und vom Ventil der selbe sein, damit die Schaltung funktionieren kann. Ich habe zusätzlich die 12V direkt an den Vin-Pin des Arduinos gehängt, so wird dieses auch gleich von dem Netzteil versorgt.

Die Gleichrichterdiode 1N4001 dient als Schutz für die Bauteile, da es durchaus vorkommen kann, dass es wegen der Spule im Ventil zu einem Rückschlag kommen kann.

Das Ventil hat eine Leistung von 5 Watt und benötigt 12 VDC Spannung. Mit dem Zusammenhang P = U * I ergibt sich für den Strom 0,41667 Ampere. Um 3 Ventile gleichzeitig zu nutzen, und das Arduino Nano/Uno mit ausreichend Strom zu versorgen (max. 200mA in Summe an den Ausgängen) rate ich zu einem 2A Netzteil. Ich habe mir ein kleines Netzteil aus China zugelegt, welches bis zu 8 Ampere liefern kann. Die Schaltung benötigt natürlich nie so viel Strom, doch das Netzteil war außerordentlich günstig (6,50 €, kostenloser Versand).

Die Schaltung kann nun nicht mehr mit einem USB-Akku-Pack genutzt werden, wie es zum Beispiel bei Water Drop (Advanced) zum Einsatz kommt, da diese Akkus-Packs nur 5V liefern. Eine ausreichend starke 12V Batterie würde hier funktionieren, doch ich nutze lieber das Netz, da das Projekt ohnehin nicht portabel sein muss.

Komponente Display (optional)

Display_Real_Image

Bei dem Display handelt es sich um einen 0,96″ OLED Display, welcher mit dem BUS-System I²C angesteuert wird. Das Arduino Nano unterstützt dies, indem man die Library Wire.h implementiert. Dann sind allerdings die beiden Pins A4 & A5 für eben diese Übertragung reserviert und können nicht mehr für andere Zwecke verwendet werden. Wichtig ist hier, dass die Verbindung des Displays mit dem Arduino folgendermaßen ausgeführt wird:

  • SDA ⇒ A4
  • SCL ⇒ A5
  • VCC ⇒ 5V
  • GND ⇒ Ground

Um auch tatsächlich etwas auf dem Display anzeigen zu können bedarf es einer eigenen Programmbibliothek. Ich habe für diesen Zweck eine einfache Bibliothek erstellt. Die Erklärung und Verwendung findet man hier. Die Beschreibung des Codes findet man etwas weiter unten im Beitrag!

Die Platine

Um alles sauber abzuschließen habe ich eine Leiterplatte entworfen, auf welcher alle Komponenten sitzen. Die Kabel von den Buttons, dem Display, der Steckerbuchsen, etc … werden einfach über Terminal-Blocks mit der PCB verbunden. Das Bild unten zeigt die Platine, geroutet in Fritzing. Die Datei findet ihr natürlich auch im oben genannten Package.

Water_Drop_Pro_Finale_Without_Copper_Fill.jpg

.

Raw_Circuit_Board

Für die Platine benötigt man zumindest halb-schlechte Fähigkeiten im Löten. Das Arduino und der Optokoppler sitzen beide auf für diese passende Sockel, um sie einfach austauschbar zu machen. Alle Bauteile findet man natürlich im ZIP-File.

Fertig bestückt ist die Platine bereit für das Verlöten.

Circuit_Board

Beim Einsetzen des Optokopplers sollte man besonders auf den Punkt dessen Gehäuse achten, dieser muss sich dort befinden, so sich im Fritzing-File (Skizze oben) der Stern (*) befindet. Oder anders gesagt: Der Punkt definiert die Position der Anode des ersten Optokoppler im Gehäuse.

Optocoupler_Detail

Die Platine selbst habe ich hier bestellt. Das Preis-Leistungsverhältnis ist unschlagbar (unter 20€ für die Platine + Versand nach Österreich). Es reicht völlig, einfach nur das PDF zu senden, und folgendes anzugeben:

  • Die 4 äußeren Bohrungen: D3.2mm
  • Alle anderen Bohrungen: D1.0mm

Der Code

Eines vorweg: Das Programm wurde in Sublime Text 3 ( Stino ) mit der Arduino IDE 1.6.6 geschrieben.

Sowohl das Programm für den Mikrocontroller, als auch das Programm für den PC sind auf GitHub zu finden. Wer auf Nummer sicher gehen will, kann sich natürlich das Programm durchlesen/durchdenken, bevor es ausgeführt wird.

Wem den Weg über GitHub zu Steinig ist, der findet im ZIP-File ebenfalls beide Programme und eine ausführliche Beschreibung für jedes.

Der Mikrocontroller

Wie bereits oben erwähnt, nutze ich das Arduino Nano v3.0 und habe das Programm auch mehrfach auf diesem getestet. Natürlich kann man auch das Arduino UNO nutzen, da beide Boards den gleichen Prozessor (ATmega328) nutzen.

Arduino_Nano.jpg

Wer neu ist, und sich nicht sicher im Umgang mit dem Arduino ist, der kann sich hier einmal einlesen. Für alle, die schon vertraut mit der Umgebung sind: Einfach auf den Controller hochladen & fertig. Das Programm ist in mehrere Files gesplittet. Um alles auf einmal zu öffnen öffnet ihr nur die Water_Drop_Pro.ino Datei. Die Arduino-Software lädt dann automatisch alle im Verzeichnis befindlichen Dateien automatisch nach.

Ich erstelle gelegentlich Updates für das Programm, um eventuelle Bugs zu fixen, oder einfach um Funktionen einfacher zu machen. Daher sollte man öfter mal auf Github vorbei schauen – aus Selbsterfahrung weis ich: macht man im Allgemeinen nicht.

Der Host

Oben habe ich schon darauf verwiesen, das die Host-Software nur unter Windows läuft. Wie kann man das nur machen? Meine Ausrede ist, dass ich keine Lust hatte, ein GUI mit Pyhon oder Java zu schreiben. Ich habe den einfachen Aufbau von Visual Studio C# genutzt, um den grafischen Aspekt der Software schnell und einfach zu erstellen.

Host_Software_Mask

Das Nachfolgerprojekt soll dann aber Plattformübergreifend sein, bis dahin dauert es aber noch (eventuell, dass es Sommer 2016 beginnt).

Wer dennoch das Programm unter Mac nutzen will, der bekommt hier ein paar Möglichkeiten gezeigt. Leider kann ich aufgrund des Fehlens eines Macs nicht sagen, ob die Software dann auch tatsächlich reibungsfrei läuft.

Die Software unterstützt zudem alle Canon EOS DSLR Kameras. Dies hat den großen Vorteil, das man die Kamera für das Setzen der Einstellungen nicht mehr berühren muss und so unter Umständen den Bildausschnitt kaputt macht. Nikon, Sony, Pentax oder ähnliche Kameras unterstützt die Software nicht, da ich zur Zeit noch an einer neueren Version arbeite, welche alle anderen gängigen Marken unterstützt. Wer keine Canon hat muss sich leider vorerst ohne dieses Feature zufrieden geben.

Live_View

Ein besonderes Plus ist der Live-View, mit dem man den Fokuspunkt exakt einstellen kann.

Host & Controller

Hier mal eine einfache Anleitung für den Vorgang:

  • Anschließen des Arduino (mit bereits geladenem Code) an den PC.
  • Starten der Software am PC und auswählen des COM-Ports mit anschließendem Verbinden.
  • Warten, bis beide Geräte verbunden sind.
  • Done. Jetzt können die Ventile mit dem PC gesteuert werden.
Auf der linken Seite in der Software muss man beim ersten Mal benutzen die Höhe zwischen Ventilauslass und Wasseroberfläche einstellen. Danach wird automatisch die nötige Zeit berechnet, die der Tropfen vom Auslass bis zum Wasser braucht. Diese Dauer ist zudem jene für die Kamera, ist sie abgelaufen, dann löst die Kamera aus.
Host_Software_Mask_Height
.
Die Startzeiten für die Ventile sind an Punkt 0 gebunden. Dies bedeutet, dass eine Startzeit für das Ventil kürzer sein muss, als die Zeit für die Kamera, ansonsten würde ja das Ventil erst öffnen, nachdem die Kamera ausgelöst hat – das ist nicht Zweckdienlich!
.
Um die Verbindung zu trennen sollte man immer auf den Button „Disconnect“ klicken. Dies hat zwar was von „USB-Stick sicher entfernen„, doch es gibt am Arduino Nano/UNO keine Möglichkeit zu erkennen, ob ein Gerät verbunden ist oder nicht. So muss man ihm immer brav den Trennen-Befehl senden, sodass das nächste mal Koppeln gut geht.
Oder man drückt den Reset-Knopf – brute force!
.
Alles Weitere findet man im ZIP-File.
.

Die Vorgehensweise

Nun verrate ich noch ein paar Tricks, wie ich meine Bilder mache. Zuerst möchte ich aber auf meine Ausrüstung eingehen.

  • Canon EOS 650D Spiegelreflexkamera
  • Canon 100mm f/2.8 Macro Objektiv
  • Cullmann Stativ (mit Wechselplatte)
  • Yongnuo 560 III Blitz (kein TTL)
  • Yongnuo RF-602/C Funkauslöser (Entfesselter Blitz)
Das ist meiner Meinung nach die „Mindestausstattung“. Mir ist klar, dass das alles viel Geld kostet, ich habe es mir schließlich selbst über Jahre hinweg zusammengespart. Wer ein ähnliches Sortiment zu Hause hat, der ist gut gewappnet!
.
Equipment.JPG
 .
Zusätzlich empfehle ich noch einen Makroschlitten. Das vereinfacht das feine Positionieren enorm, da man mit dem Festbrennweitenobjektiv doch sehr eingeschränkt ist.
.
Ein sehr gutes Resümee zum Blitz gibt es hier.
.
Zu Beginn jedes Shootings sollte man das Ventil so lange offen lassen, bis Wasser unten austritt. Wenn man es dann schließt ist sicher gestellt, dass beim nächsten Öffnen sofort ein Tropfen austritt.
.
Zum Schluss jedes Shootings sollte man das Ventil unbedingt säubern, um die Lebensdauer so hoch wie möglich zu halten.
 .
Der Fokus
 .
Die beste und zugleich einfachste Methode den Fokus der Kamera einzustellen ist, einen Stab oder ein ähnliches Ding dort hinzulegen, wo später der Tropfen im Bild sein soll. Um sicherzustellen, dass der Tropfen auch tatsächlich dort landet wo man will, habe ich an die Front der Steuerbox die Buttons für die drei Ventile gesetzt. So kann man gezielt nur einen Tropfen fallen lassen. Diesen lasse ich dann auf ein einen Holzstab fallen, an dessen Mitte eine Markierung ist.
..
Setup_02
.
Im Anschluss muss man nur noch die markierte Stelle des Stabes fokussieren. Dies kann man entweder über den LiveView der Kamera oder über die Host-Software erledigen.
.
Focus_01.JPG
.
 Focus_02.JPG
 .
Die Position
 .
Eine perfekte Position für die Kamera und den Blitz gibt es nicht. Jede Session wird anders laufen, jede Veränderung der Viskosität der Tropfflüssigkeit bewirkt andere Tropfen und jede Positionsänderung des Blitzes sorgt für eine andere Stimmung. Eines kann ich allerdings bestimmt sagen: Den Blitz nicht auf der Kamera montieren. Irgendwie wirkt das Bild dann nicht.
.
Setup_01
.
 
Die Wassertropfenfotografie ist zu Beginn eher try & error, bis man ein Gespür für die Vorgänge entwickelt und immer mehr probiert. Nur nicht entmutigen lassen!
 .
Der Vorgang
 .
Hier ist eigentlich alles straight forward. Einfach den Host mit dem Controller verbinden, die Zeiten für die Ventile einstellen, die Auslöseverzögerung festlegen und auf Start drücken. Falls die Aufnahme nicht so wird wie gewünscht, einfach an die Zeitdauer einzelner Punkte anpassen, bis alles sitzt.
Bei immer gleichen Parametern sollten auch immer gleiche Tropfen entstehen. Bedingt durch die Flüssigkeit kommt es allerdings recht oft vor, dass ich an unterschiedlichen Tagen auch unterschiedliche Tropfen bekomme (trotz gleicher Settings in der Software). Hin und wieder passieren auch während eines Shootings random Dinge, doch das ist eher die Ausnahme. Ich denke, das liegt vielleicht an lokalen Dichteunterschieden oder sich ändernden Adhäsionskräften zwischen Düse und Fluid. Sicher kann ich das jedoch nicht sagen.

Das Ergebnis

Zum Schluss gibt’s noch ein paar Bilder, die ich mit dem System gemacht habe.

Ich hoffe ich habe nichts ausgelassen, und alle Fragen auch beantwortet. Falls dennoch Fragen offen sind, oder jemand generell ein paar Gedanken zu meinem Projekt hat: Ein Kommentar ist immer erwünscht!