PWM-Library für Arduino-Basis für Beleuchtung und Servoansteuerung (Open Source)

Sepp62

User
Im Rahmen eines Semi-Scale-Projekts habe ich eine kleine Steuerung für LEDs und ein Scheinwerferservo geschrieben.

Man kann damit bis zu 10 PWM-Kanäle unabhängig aber phasensynchron steuern. Es lassen sich verschiedene Beleuchtungsmuster über einen Empfängerkanal schalten. Dabei können die einzelnen Kanäle lineare "Rampen" in der Pulsweite fahren. Damit lässt sich z.B. ein Servo langsam verfahren oder ein Rundumlicht simulieren. "Programmiert" wird mit ein paar simplen Makros.

Die Verarbeitung ist komplett Interrupt-getrieben, damit bleiben ein paar Prozent Rechenleistung (je nach Anzahl der Kanäle) für sonstige Aufgaben frei.

Das Video zeigt ungefähr, wie das Ganze arbeitet.
http://www.rcmovie.de/video/7350e23b...r-Arduino-Nano

Entscheidend war für mich ein möglichst geringer Lötaufwand. Das Arduino-Modul kann für ca. 10 Euro erworben werden, damit halten sich die Kosten ebenfalls im Rahmen. Der Arduino Nano ist direkt per USB an den PC anschliessbar und man muss nicht mit unhandlichen "Programmern" rumhantieren. Die LED-Ansteuerung ist nicht Teil des Projekts, eine einfache Schaltung mit einem Darlington-Treiber liegt der Doku jedoch bei. Eine direkte Ansteuerung durch die Arduino-Ports ist bis 40mA Strombedarf ebenfalls möglich, so dass externe Bauteile komplett entfallen können.

Die Software inklusive Dokumentation kann hier heruntergeladen werden:
http://sourceforge.net/projects/arduinounipwmlib/

Ein paar Beispiele für die Programmierung liegen bei.

An wen richtet sich das Projekt ?
--> An alle, die sich ein Beleuchtungsmodul selbst bauen möchten (und lötfaul sind).
--> An Leute mit ein wenig Arduino-Erfahrung oder solchen, die dieselbe im Rahmen eines solch einfachen Projekts erwerben möchten.

Viel Spaß damit!
Bernd
 

Sepp62

User
Mit dieser Zeile lässt sich z.B. ein Beacon-Licht programmieren:

SEQUENCE( beacon) = { RAMP(0,45,20), RAMP(45,200,20), CONST(200,20), RAMP(200,45,20), RAMP(45,0,20), PAUSE(20) };

Das Beacon-Licht schwillt dabei über 2 lineare Rampen an und wieder ab.

Insgesamt kann man so mit wenigen Zeilen ein komplettes phasenkonstantes Beleuchtungschema programmieren, das sich über den Sender umschalten lässt. Das "beacon"-Beispiel arbeitet auf einem "nackten" Arduino-Modul ohne dass man einen Lötkolben in die Hand nehmen muss.
 

Sepp62

User
Hier noch ein Beispiel, wie man das Servo für den Landescheinwerfer programmiert.

Es gibt zwei Sequenzen, eine zum Ausfahren und eine zum Einfahren. Das Server fährt bei beiden innerhalb einer Sekunde in die Position.

#define RETRACT_POS 10
#define ASCEND_POS 255
SEQUENCE( retract ) = { RAMP( ASCEND_POS, RETRACT_POS, 100 ), HOLD( RETRACT_POS ) };
SEQUENCE( ascend ) = { RAMP( RETRACT_POS, ASCEND_POS, 100 ), HOLD( ASCEND_POS ) };

So fährt man das Servo aus:

pwm.SetOutChannel( LANDING_SERVO, ARRAY( ascend ), UniPWMChannel::ANALOG_SERVO );


Eine solche Sequenz lässt sich millisekundengenau mit dem Einschalten des Landescheinwerfers koppeln. Man kann diesen einschalten, sobald das Servo in der Ausgefahren-Position ist. Der Landeschweinwerfer lässt sich dann auch wieder über eine Sequenz steuern, man kann ihn z.B. langsam" verlöschen lassen.
 

BZFrank

User
Auch von mir ein grosses Danke! Es hat mir bei einem aktuellen Projekt sehr geholfen.

Gruß

Frank
 

Sepp62

User
Würde mich interessieren, wie Ihr mit der Art der Programmierung zurecht kommt. Das Ganze ist ein wenig "gewachsen". Die Makros habe ich erst am Ende "draufgepfropft".

Was mich auch interessieren würde: Reicht die Auflösung für die Servoansteuerung und den Empfängereingang ? Mir ist letztens ein "Teensy 3.1" in die Hände gefallen. Der könnte von der Hardware her deutlich mehr bringen.

Viele Grüße
Bernd
 

Kyrill

User
Es funktioniert mit Mosfet wie erwartet.

Es funktioniert mit Mosfet wie erwartet.

So 2 Tests mit unterschiedlichen Pattern. Beacon light und Doppelblitz:

http://youtu.be/yvgNoxtw4Ww

http://youtu.be/UC1cid73keA

Real geht es gleichmäßig, wenns ruckelt liegts am Rechner oder an Youtube...

Nun noch 5 Endstufen auf eine kleine Platine und fertig...
 

Kyrill

User
Ein paar Bildchen zur Endstufe (Prototyp mit nur 5 Ausgängen)

Ein paar Bildchen zur Endstufe (Prototyp mit nur 5 Ausgängen)

5.jpg

1.jpg

2.jpg

2.jpg

4.jpg

Die Grundfunktion sieht nun so aus:


ACL-Doppelblitz, Einfachblitz, Beacon, Landescheinwerfer...


Testweise habe ich die Landescheinwerfer mal als MG geschaltet. Dies ist aber auch über einen weiteren Kanal möglich.

Als MOSFET habe ich IRLZ34N benutzt nach der obigen Schaltung. Es geht aber auch jeder andere N-dotierte MOSFET mit Logik Level Gatespannung.

Die Spannungsüberwachung des 3S Lipo läuft über einen Spannungsteiler 8,2 und 2,7 Kiloohm an Eingang A0 des Arduino.

Im RC-Heli Forum, läuft ebenfalls ein Entwicklungsthread dazu. Bernd (Sepp62), der Programmierer der Software, ist sehr hilfsbereit und will noch eine Leistungsplatine entwickeln. Mal sehen ob die leichter und kompakter wird.
 

Otti

User
Hi Peter,

na, da hast Du aber auch ein paar "Bauklötze" als MOSFETs genommen! ;)
Dabei ist dieser Typ hierfür noch nicht mal besonders gut, was z.B. den RDSon betrifft - 60 mOhm bei 4V Gatespannung, naja...

Ich würde nach einem passenden FET im SO-8 Gehäuse suchen. Die Auswahl ist groß und die FETs wiegen im Vergleich zu den TO-220 Brummern praktisch nix! Ok, das SO-8 Gehäuse ist nicht ganz so "bastlerfreundlich", weil es keine Pins hat, die man durch die Löcher in der Lochrasterplatine stecken kann. Das ist aber nicht so schlimm, man kann ihn auf der Kupfer-Seite auf die Lötpunkte der Platine auflöten. Oder Du machst Dir selbst ein "Through Hole" Bauteil draus, indem Du Drähtchen anlötest. Wenn nicht gerade extrem große Ströme geschaltet werden sollen, kann man evtl. auch einen Dual-MOSFET (2 Stück in einem Gehäuse) nehmen. Es gibt auch Power-MOSFETs im SOT-23 Gehäuse, die auch schon ein paar Ampere verkraften! Auch diese Gehäuseform lässt sich noch gut mit Hausmitteln verarbeiten!

Bei der Auswahl muss man auf folgende Kriterien achten:
- maximale Spannung (Vdss) zwischen Drain und Source, muss natürlich über der maximal angelegten Spannung liegen. Bei 3s-Akku wird man damit eher keine Probleme haben.
- möglichst kleiner Einschalt-Widerstand (RDSon). Wenn Strom durch den FET fließt, fällt durch den Widerstand eine Spannung ab, und diese Spannung x Strom gibt die Verlustleistung (->Wärme!) am FET, also P=R*I*I. Bei Deinem IRLZ34N (mit 60mOhm) und 5A wären das schon 1,5W.
FETs in kleinen Gehäusen können natürlich nicht soviel Verlustleistung abführen. Mit weniger als 200 mW ist man aber selbst beim winzigen SOT-23 Gehäuse auf der sicheren Seite.
- Der FET sollte einen niedrigen RDSon schon bei kleiner Gate-Spannung erreichen (deshalb "logic-Level"). In den Daten muss man dafür nach dem Parameter "Threshold Voltage" suchen (Vth). Diese sollte nicht über 2V liegen. Ich nehme an, der Arduino hat einen 3,3V Spannungsregler on Board und gibt demzufolge auch keine höhere Spannung als diese an den FET. Also ist der Einschaltwiderstand des FETs bei UGS=3V relevant!

Grüße,

Thomas
 

Kyrill

User
Danke Thomas, für die Hinweise, alles richtig. Meine Platine ist ein Prototyp. Die nächste baue ich mit Mosfets im D-Pak Gehäuse. Mit der Verlustwärme haben die Brummer keinerlei Probleme Sie werden bei meiner Belastung nicht warm und schalten auch komplett durch. Die habe ich nur genommen, weil sie mit 40 Cent gerade günstig zu bekommen waren. Das Hauptziel war mit der gesamten Schaltung unter 8 Euro zu bleiben incl. Arduino. Das ist gelungen. Ich stand in Konkurenz mit einem Projekt wo es um umprogrammierte Fahrtregler ging auch zur Beleuchtungszwecken. Die sind aber unflexibel und nicht so einfach umzuprogrammieren wie die hier gezeigte Softwarelösung vom Bernd.
 

Otti

User
Hallo Peter,

Die habe ich nur genommen, weil sie mit 40 Cent gerade günstig zu bekommen waren.

habe gerade bei Reichelt ein paar IRLML2502 bestellt. Die sind im SOT-23-Gehäuse, haben 50mOhm bei Ugs = 2,5V und kosten nur18 Cent. Für Lasten bis ca. 2A Dauer, im Blitzbetrieb deutlich mehr, kann man die gut nehmen!
 

Kyrill

User
Ich war auch noch mal einkaufen..

Ich war auch noch mal einkaufen..

War gerade beim blauen C und habe mir 10 Stück IRLML0030 (0,14 das St.) bestellt. Die schaffen so 5 Ampere das reicht auf alle Fälle aus. Bin durch den Originalbeitrag mit dem LED Maschinengewehr darauf gekommen. Da ist ein Foto bei wie die kleinen Winzlinge auf einer Lochrasterplatine mit Streifen montiert sind Das scheint durchaus ein gangbarer Weg zu sein. Ich muß dazu sagen ich bin kein Elektroniker sonder Laie, aber ich traue mich dran...

Ich überlege noch ob man wirklich die beiden Schutzwiderstände weglassen sollte. habe immer einen 180 Ohm zwischen Pin und Gate und einen 10 KOhm zwischen Gate und Source liegen. Was meinst du einfach mal weglassen und gucken? Der 10 KOhm soll für einen definierten Einschaltzustand beim hochfahren sorgen und der 180er den Pin schützen. Wenn es ohne die Widerstände auch ginge bekäme man alle 10 Kanäle zwischen die Beine des Arduino Nano das wäre schon schön kompakt. Bei dem angeführten LED MG im Amiforum haben sie auch keine Widerstände verbaut.
 

Otti

User
Hallo Peter,

der IRLML0030 ist hierfür wohl nicht gerade das Gelbe vom Ei - vielleicht hättest Du besser die 4 Cent mehr in den IRLML2502 investieren sollen, Conrad hat den ja auch! Das Problem beim '0030 ist, daß er erst richtig leitet bei deutlich höheren Gatespannungen, als der '2502.
Schau mal im Datenblatt (Fig. 1, "typical output characteristic"): Bei Vgs = 3V und 2A fällt über den '0030 schon fast 0.2V Spannung ab, das ergibt fast 0,4W Verlustleistung, für SOT23 ist das schon ziemlich viel! Beim '2502 sind die Linien bei 2A noch nicht mal im Bereich der Graphik. Erst bei ca. 3A hat der FET 0.1V Spannungsabfall, d.h. er muß bei 3A erst 0,3W "verbraten"!
Naja, bei kleinen Strömen wird's schon gehen... (5A gehen mit 3V Gatespannung beim '0030 gar nicht, beim IRLML2502 wären >10A-Impulse kein Problem)

Die 10k Pull-Down Widerstände würde ich keinesfalls weglassen! Wenn der Controller den Ausgang nicht treibt, kann es sonst passieren, daß der FET die halbe Versorgungsspannung "verbraten" muss, was je nach Last eine Verlustleistung erzeugen kann, die den FET in Sekunden zerstört.
Ports können auch durch Softwarefehler hochohmig werden bzw. bleiben.
Den 180 Ohm-Gatewiderstand kann man evtl. eher ungestraft weglassen, wobei seine Funktion wohl weniger dem "Schutz" dient, als der Begrenzung der Steilheit der Schaltflanken. Ich würde aber auch diesen Widerstand drinlassen. Wg. Platzproblemen könntest Du ja auch auf SMD-Widerstände zurückgreifen. In 0603er-Bauform lassen sich diese noch gut mit einer feinen Lötspitze und spitzer Pinzette verarbeiten.

Gruß

Thomas
 

Kyrill

User
Nano Betriebs Daten

Nano Betriebs Daten

Die Daten des Nano übernommen von der Arduino.cc Seite:
...
Microcontroller Atmel ATmega168 or ATmega328
Operating Voltage (logic level) 5 V
Input Voltage (recommended) 7-12 V
Input Voltage (limits) 6-20 V
Digital I/O Pins 14 (of which 6 provide PWM output) (3,5,6,9,10,11)
Analog Input Pins 8
DC Current per I/O Pin 40 mA
Flash Memory 16 KB (ATmega168) or 32 KB (ATmega328) of which 2 KB used by bootloader
SRAM 1 KB (ATmega168) or 2 KB (ATmega328)
EEPROM 512 bytes (ATmega168) or 1 KB (ATmega328)
Clock Speed 16 MHz
Dimensions 0.73" x 1.70"
Length 45 mm
Width 18 mm
Weigth 5 g


Power:
The Arduino Nano can be powered via the Mini-B USB connection, 6-20V unregulated external power supply (pin 30), or 5V regulated external power supply (pin 27). The power source is automatically selected to the highest voltage source.
...
 

Kyrill

User
Nachtrag zur Software... (Zusammenfassung und link zu den Programmfiles)

Nachtrag zur Software... (Zusammenfassung und link zu den Programmfiles)

Der Arduino Nano ist mit der Library von Bernd in der Lage an 10 Ausgängen unterschiedliche "Licht-Sequenzen" (Blinkmodi) gleichzeitig darzustellen. Die Sequencen bekommen Namen und enthalten jeweils die Komandos für jeden einzelnen Ausgang an dem Leuchtmittel angeschlossen sind und können über die RC Anlage (Signaleingang an D2 des Arduino Nano) umgeschaltet werden.
Dazu wird das Kanalsignal des RC Empfängers ausgewertet und je nach Wert (Stellung des proportionalen Gebers) wird ein bestimmtes Pattern angewählt.
An D9 liegt eine Servosignal vor, mit dem ein Landescheinwerfer aus und eingefahren werden kann. Diese Vorarbeit hat komplett der Programmautor übernommen, der die Library entwickelt hat. Nochmals meinen Dank und meinen tiefen Respekt vor deiner Programmierleistung und Hilfestellung Bernd.

Meine Arbeit bestand darin Schaltstufen mit Mosfets zu bauen, über die ich dann Leistungsemmiter oder LED-Stripes direkt an 12 Volt (3S Lipo) ansteuern kann. Ich habe mich dazu langsam von großen TO220 Mosfets zu den kleinen SMD Varianten vorgearbeitet. Ich bin kein Lötprofi!
Die TO220 können 50 Ampere pro Kanal schalten die SMD schaffen dann noch 3-5 Ampere was für einzelne Emmiter oder LED Strips immer noch ausreicht. Es eignen sich alle N-Kanal Mosfets die eine Gatespannung von unter 5 Volt benötigen (logic-level-Gatespannung) um voll durchzuschalten. Es wurden an jedem Ausgang zusätzlich Pulldown Widerstände von 10 KOhm eingeplant.

Die Bilder im Anhang zeigen die verschiedenen Versionen die zwischenzeitlich entstanden sind. Einen Schaltplan für 5 Kanäle kann jeder sicherlich auf die max. möglichen 10 Kanäle erweitern. Er dient nur der Übersicht.

Die Software die ich per Link anhänge ist für die 10 Kanal Version bei der die Pins D3-D8 und D10-D13 angesteuert werden. Der Spannungsteiler der Batterieüberwachung (Variablen sind eingestellt für einen 3S Lipo) liegt mit der Mitte an A0.

An D2 wird das Empfängersignal eingespeist, an D9 wird der optionale Landescheinwerfer-Servo angeschlossen.

Der Youtube Film im letzten Beitrag zeigt das 5 Kanal Modul in meinem Testträger mit 12 Volt LED Stripes.

Zum Austesten der Funktionen kann der Software in der doloop () Klammer ein Wert übergeben werden, der dem Eingang D2 zugeordnet wird, sodass dann kein RC Empfänger angeschlossen sein muß. Z.B. setzt doLoop (20) den Eingangswert auf 20.

Es kann dort in der Klammer auch doLoop "(analogRead(A1))" eingesetzt werden dann kann ein Poti als Spannungsteiler an A1 angeschlossen werden und damit die Software gesteuert werden. Der Poti liegt dann zwischen +5Volt Pin und Masse Pin und der Schleifer kommt an A1.

Diese Funktion nutze ich bei dem Projekt "Lipo-Wärmekiste" für den NTC-Spannungsteiler für die Temperaturkontrolle im Inneren der Kiste. Die Software ist dann zwar total überdimmensioniert aber was solls es geht, und es ist einfach zu händeln, und zeigt die Vielfältigkeit der UniPWM-Library.

2.jpg

20150203_191052_resize_20150204_094048.jpg

20150203_191014_resize_20150204_094048.jpg

20150212_213854_resize_20150213_071003.jpg

20150212_214840_resize_20150213_071000.jpg

PWM-Modul.jpg

Der Schaltplan für die Lipo Heizkiste:

PWM-Modul-Heizung-MonLED.jpg

Die Links zur Software:

Beleuchtungsmodul mit 10 Ausgängen:

Beleuchtungssoftware

Lipo Wärmekiste mit einem Ausgang und einer Diode als Monitorlicht außen:

Wärmekisten-Software

Die Wärmekiste läuft mit einem selbstgewickelten Heizdraht vor einem PC Lüfter mit 2 Ampere Stromaufnahme ca 3-4 Stunden bei 38 Grad im Inneren mit einem 3S 2200er Lipo als Energiequelle. Der Lipo wird selbstverständlich von der Software geschützt vor Tiefentladung.

lk-11.jpg

lk-12.jpg

lk-14.jpg
 
Ansicht hell / dunkel umschalten
Oben Unten