Technische Dokumentation MDK DC Motion Control V1.0 David Wemhöner 19. Juli 2014 1
1 Funktionsübersicht MDK DC Motion Control ist eine Arduino basierende Steuerung für Gleichstrommotoren und Kamera für Timelapse Fotografie. ACHTUNG: Maximale Spannung 12V, Maximaler Motorstrom 2A pro Motor ACHTUNG: Nie die Motoren anstecken oder abziehen, wenn Controller mit Spannungsquelle verbunden ist, dies beschädigt den Motortreiber und ist explizit von der Garantie ausgeschlossen! Die derzeitige Version erlaubt eine Steuerung von 2 Gleichstrommotoren und 1 Kamera im Shot Move Shot und im Continous Modus. Die Einstellungen können im EEPROM des Arduino gesichert und wieder geladen werden. 2
2 Hardware 2.1 Controller Als zentrale Steuereinheit wird ein Arduino UNO basierender Controller benutzt auf den ein Arduino MotorShield R3 aufgesteckt ist. Das Arduino Motor-Shield basiert auf dem L298, einem Brückentreiber für die Steuerung von induktiven Lasten wie Relays, Magnete, Gleichstromund Schrittmotoren. Das Arduino Motor-Shield ermöglicht die Steuerung von zwei Gleichstrommotoren, wobei die Drehzahl und die Drehrichtung unabhängig von beiden Motoren kontrolliert werden kann. Ebenfalls möglich ist die Messung des Stromverbrauchs jedes einzelnen Motors. Das Arduino Motor-Shield muss über eine externe Quelle mit Spannung versorgt werden. Der integrierte L298-IC auf dem Shield besitzt zwei Eingänge für die Spannungsversorgung. Dabei ist einer für die Logik, der andere für den Betrieb der Motoren vorgesehen. Die Verwendung von unabhängigen Eingängen ist durchaus sinnvoll, da der Stromverbrauch eines Motors in der Regel die maximale Stromabgabe eines USB-Ports übersteigt. Die externe Spannungsversorgung (nicht USB) kann dabei über ein passendes Netzteil oder über Batterien realisiert werden. Die externe Spannungsversorgung sollte direkt an den Motor-Shield über Schraubklemmen angeschlossen werden. Damit mögliche Beschädigungen am Arduino-Board vermeiden werden können, empfiehlt es sich, eine externe Spannungsversorgung mit einer Spannung zwischen 7 und 12V zu verwenden. Sollte der angeschlossen Motor mehr 3
als 9V benötigen, dann sollte der Stromkreis zum Arduino-Board unterbrochen werden. Dazu wird der Vin Connect -Jumper auf der Rückseite des Shields getrennt. Die maximale Eingangsspannung an den Schraubklemmen des Motor Shields beträgt 18V. Die Versorgungsanschlüsse sind folgendermassen bezeichnet: Vin auf der Schraubklemme bezeichnet die Versorgungsspannung des Motors. Eine angeschlossene externe Spannungsversorgung versorgt ebenfalls das Arduino-Board mit Spannung. Durch Trennung des Vin Connect - Jumpers wird die Spannungsversorgung ausschliesslich für den Motor verwendet. GND auf der Schraubklemme bezeichnet den Ground-Anschluss. Das Motor-Shield verträgt maximal 2A pro Kanal und insgesamt höchstens 4A. Das Shield verfügt über zwei unabhängige Kanäle, welche mit A und B bezeichnet sind. Jeder Kanal benötigt dabei 4 Anschlüsse auf dem Arduino- Board, also insgesamt 8 Pins. Die Kanäle ermöglichen das unabhängige Steuern von zwei Gleichstrommotoren. Die Anschlüsse des Motor-Shields, aufgeteilt nach Kanälen sind in der folgenden Tabelle ersichtlich: Arduino PIN Belegung 12 Motor 1: Direction 3 Motor 1: PWM 9 Motor 1: Bracket A0 Motor 1: Current 13 Motor 2: Direction 11 Motor 2: PWM 8 Motor 2: Bracket A1 Motor 2: Current Es können zwei Gleichstrommotoren angeschlossen werden. Dazu müssen die beiden Kabel des Motors in die (+) und in die (-) Schraubklemme des jeweiligen Kanals gesteckt werden. Die Drehrichtung wird kontrolliert, in dem ein HIGH oder ein LOW auf die DIR A und DIR B Pins gegeben wird. Die Drehgeschwindigkeit wird gesteuert, in dem das PWM-Signal auf dem PWM A and PWM B verändert wird. Werden die beiden Anschlüsse Brake A und Brake B auf HIGH gesetzt, dann wird der Motor effektiv gebremst, anstatt dass er einfach durch Unterbrechung der Spannungsversorgung ausläuft. Der Strom, welcher durch die beiden Motoren fliesst kann gemessen werden, indem die SNS0 und SNS1 Pins ausgelesen werden. Jeder der beiden Kanäle 4
liefert auf den beiden Pins eine Spannung, die proportional zum gemessenen Strom ist. Die Funktion analogread() auf den analogen Eingängen A0 und A1 ermöglicht die Erfassung der Spannung. Dabei ist die maximale Spannung auf 3,3V kalibriert, was einem maximalen Strom von 2A entspricht. Schaltplan: Weitere PINs: A3 Drehpoti mit Mittelklick 10k linear zwischen 5V and GND 4 Navigation Button: UP 5 Navigation Button: DOWN 6 Navigation Button: ESCAPE 7 Navigation Button: CONFIRM A2 Camera Control Pin: Focus 10 Camera Control Pin: Shutter A4 SDA SDA signal I 2 C Bus A5 SCL SCL signal I 2 C Bus Hinweis: die Navigation Buttons werden über den internen Pull-Up Widerstand auf High gesetzt. D.h. bei Betätigung des Tasters wird der PIN auf Masse (LOW) gelegt. 5
2.2 Auslösesteuerung Die Auslösung der Kamera erfolgt galvanisch getrennt über Optokoppler. Es wird Auslöser andrücken simuliert, indem 100ms vor dem eigentlichen auslösen, der Fokus-Kontakt geschlossen wird. 2.3 Verwendete Motoren 1. DC Motor max 2A modelcraft RB350200-0A101R 2. DC Motor max 2A 2.4 Display hintergrundbeleuchtetes I2C Display mit 20 Zeichen und 4 Zeilen I2C/TWI LCD2004 Module LCD Display 4 Zeilen 20 Stellen mit I2C Interface. Neue Version - Adresse 0x27 6
3 Schaltplan Kameraanschluß galvanisch getrennt mit Optokoppler mit Vorwiderstand 75 Ω Taster (UP, DOWN, ENTER, BACK) sind per Software auf PULL UP gesetzt, d.h. beim drücken des Tasters wird Eingang LOW 7
4 Software 4.1 Arduino Entwicklungsplatform Version 1.5.6-r2 4.2 Benutze Bibliotheken Wire.h LCD.h Buttons MENWIZ.h (LCDMenuLibrary) LiquidCrystal I2C EEPROM 5 Interne Details 5.1 Umsetzung: Analoges Signal vom Drehpotentiometer zu Motorgeschwindigkeit Das Drehpotentiometer liefert Werte zwischen 0 und 1023. Die Mittelposition liegt etwa bei 522 wegen Ungenauigkeiten in der Mittelposition wird ein Bereich von 522 ± 80 um die Mittelposition in Speed 0 konvertiert. #define POTIMITTE 522 // Analoger Wert für Mittelposition des Potis #define POTIDELTA 80 // rechts und links um die Mitte gilt in diesem Bereich Speed = 0 Die Umsetzung des analogen Poti-Signals wird per map in die Geschwindigkeit umgesetzt: lowerlimit = POTIMITTE - POTIDELTA; upperlimit = POTIMITTE + POTIDELTA; manualspeed = map(potivalue, lowerlimit, 0, 0, 254); manualspeed = map(potivalue, upperlimit, 1023, 0, 254); 8
6 Menustruktur 1. manual drive: für manuelle Fahrten motor 1: Auswahl Motor 1, Geschwindigkeitsregelung erfolgt mit Poti motor 2: Auswahl Motor 2, Geschwindigkeitsregelung erfolgt mit Poti 2. start sequence: Aufnahmesequenz wird mit den gewählten Parametern gestartet. Um die Sequenz abzubrechen, bitte UP oder DOWN lange (bis zur nächsten Aufnahme) drücken (ESC beendet die Sequenz nicht) 3. sequence settings interval time: Zeit zwischen 2 Belichtungen (0..255s) motor ON time: Zeit, die die Motoren AN sind (0..2,55s in 1/100s Schritten) delay time: Zeit zwischen Ende der Motorbewegung und Auslösen der Kamera (0..30s) exposure time: Belichtungszeit (1..25,5s in 1/10s Schritten ) no. of exposures: Anzahl Bilder (0..10000), 0 entspricht unendlich viele Belichtungen motor 1 direction: Drehrichtung Motor 1 (0..1) motor 2 direction: Drehrichtung Motor 2 (0..1) motor 1 speed: Geschwindigkeit Motor 1 (0..100% ) motor 2 speed: Geschwindigkeit Motor 2 (0..100% ) 4. load settings: Einstellungen laden 5. save settings: Einstellungen sichern 9