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

Hallo zusammen,

ich habe den Code soweit verwendet, Ihn allerdings für meine Zwecke angepasst. Ich habe eine eigene Platine mit Treiberstufen entwickelt, gefräst und aufgebaut und getestet. Passt soweit alles ganz gut und stelle ich auch gerne zur Verfügung.
Jetzt habe ich ein paar Fragen (Sepp62). Habe alles für 2s LiPos´s ausgelegt und den Spannungsteiler entsprechend, und hoffentlich richtig, geändert. Nach VCC 3k9 und nach GND 2k7 an A0.



In der Software habe ich mir einen Alarm Pattern gemacht. Dazu soll alles andere ausgehen und nur eine Engine on LED blinken, damit man weiß, dass der Akku fast leer ist.
Welche Werte muss ich denn für eine Min-Spannung eintragen. Habe hier noch nicht verstanden, wie man da auf 400 kommt, bzw. was ich bei meinem Spannungsteiler für Werte für 2s brauche:


ctrl.Init( 10 ); // max 10 output channels
ctrl.SetLowBatt( 400, PATTERN_ALARM, A0 ); // 840 ~8.28 Volt, switch off value ~ 755 (3.7V) on Pin A0, default 400
ctrl.SetInpChannelPin( RECEIVER_INP, UniPWMInpChannel::INP_NORMAL );



// Alarm (bei zu niedriger Akkuspannung blinkt eine Motor LED (ENGINELIGHT_TOP) schnell)
ctrl.AddSequence( PATTERN_ALARM, ENGINELIGHT_TOP, ARRAY( alarm ) );



Dann habe ich noch das Problem, dass bei verschiedenen Schaltvorgängen (Umschalten am Schalter) und dem Ausschalten über den Schalter z.B. der Landescheinwerfer aufblitzt. Ich kann mir noch nicht erklären woher das in der Software kommt.

Kann mir da jemand helfen?
 
/*
Universal Software Controlled PWM function library for Arduino nano
--------------------------------------------------------------------

Example program for high level control using UniPWMContrl class

1.03 01/15/2015 SetLowBatt(...) changed
*/

#include <UniPWMControl.h>
#include <UniPWMMacros.h>

//#define ONBOARD_LED 13

// Pins for LEDs
#define LANDING_LIGHT 2 // Port 1: Landing light,switchable to on or off, without PWM
#define ENGINELIGHT_BOT 3 // Port 2: Engine on light (bottom), switchable to on or off
#define ENGINELIGHT_TOP 5 // Port 3: Engine on light (top), switchable to on or off
#define ACL_BOT 6 // Port 4: white anti collision light (bottom), flashing, switchable to on or off
#define ACL_TOP 9 // Port 5: white anti collision light (top), flashing, switchable to on or off
#define POSI_GREEN 10 // Port 6: green position light, switchable to on or off
#define POSI_RED 11 // Port 7: red position light, switchable to on or off
#define LANDING_SERVO 7 // Port 8: use pin 9 for analog servo, not routed on pcb in V.1.6_SMD
#define RECEIVER_INP 13 // receiver signal


// constant lights: on, off, dimmmed
SEQUENCE( constOn ) = { HOLD( 150 ) };
SEQUENCE( constOff ) = { HOLD( 0 ) };
SEQUENCE( dimmedOn ) = { HOLD(50) };
// single flash 200ms, dark 1200ms
SEQUENCE( singleFlash ) = { PAUSE(80), CONST(150,20), PAUSE(40) };
// double flash 2x200ms, pause 800ms
SEQUENCE( doubleFlash ) = { PAUSE(10), CONST(30,7), PAUSE(12), CONST(30,7), PAUSE(100) };
// fader
SEQUENCE( fader ) = { PAUSE(20), RAMP(0,200,150), RAMP(200,0,150 ) };

// beacon - 2 ramps up - hold - 2 ramps down
SEQUENCE( beacon_1 ) = { RAMP(0,45,20), RAMP(45,200,20), CONST(200,20), RAMP(200,45,20), RAMP(45,0,20), PAUSE(20) };

// beacon - 2 ramps up - hold - 2 ramps down, etwas zeitversetzt zu beacon_1
SEQUENCE( beacon_2 ) = { PAUSE(50), RAMP(0,45,20), RAMP(45,200,20), CONST(200,20), RAMP(200,45,20), RAMP(45,0,20), PAUSE(20) };

// beamer
SEQUENCE( beamOn ) = { CONST(0,40), RAMP(0,250,20 ), HOLD(250) };
SEQUENCE( beamOff ) = { RAMP(250,0,20), HOLD(0) };

// beamer retract servo
#define RETRACT_POS 10 // 238
#define ASCEND_POS 255 // 198
SEQUENCE( retract ) = { RAMP( ASCEND_POS, RETRACT_POS, 100 ), HOLD( RETRACT_POS ) };
SEQUENCE( ascend ) = { RAMP( RETRACT_POS, ASCEND_POS, 100 ), HOLD( ASCEND_POS ) };
SEQUENCE( retracted) = { HOLD( RETRACT_POS ) };

// Battery Low Alarm, benutzt wird dafür das TOP Motorlicht
SEQUENCE( alarm ) = { PAUSE(10), RAMP(0,45,20), RAMP(45,200,20), CONST(200,20), RAMP(200,45,20), RAMP(45,0,20), PAUSE(20) };

UniPWMControl ctrl;

void setup()
{
enum { PATTERN_ALARM, PATTERN_STARTUP, PATTERN_OFF, PATTERN_FLIGHT, PATTERN_LANDING };

Serial.begin(9600);

// high level object
ctrl.Init( 10 ); // max 10 output channels
ctrl.SetLowBatt( 400, PATTERN_ALARM, A0 ); // 840 ~8.28 Volt, switch off value ~ 755 (3.7V) on Pin A0, default 400
ctrl.SetInpChannelPin( RECEIVER_INP, UniPWMInpChannel::INP_NORMAL );

// retract servo at startup
ctrl.AddSequence( PATTERN_STARTUP, LANDING_SERVO, ARRAY( retracted ), UniPWMChannel::ANALOG_SERVO ); // servo


// off
ctrl.AddSequence( PATTERN_OFF, ENGINELIGHT_BOT, ARRAY( constOff ) );
ctrl.AddSequence( PATTERN_OFF, ENGINELIGHT_TOP, ARRAY( constOff ) );
ctrl.AddSequence( PATTERN_OFF, ACL_BOT, ARRAY( constOff ) );
ctrl.AddSequence( PATTERN_OFF, ACL_TOP, ARRAY( constOff ) );
ctrl.AddSequence( PATTERN_OFF, POSI_GREEN, ARRAY( constOff ) );
ctrl.AddSequence( PATTERN_OFF, POSI_RED, ARRAY( constOff ) );
ctrl.AddSequence( PATTERN_OFF, LANDING_LIGHT, ARRAY( beamOff ) );
ctrl.AddSequence( PATTERN_OFF, LANDING_SERVO, ARRAY( retract ), UniPWMChannel::ANALOG_SERVO );


// flight
ctrl.AddSequence( PATTERN_FLIGHT, ENGINELIGHT_BOT, ARRAY( beacon_1 ) );
ctrl.AddSequence( PATTERN_FLIGHT, ENGINELIGHT_TOP, ARRAY( beacon_2 ) );
ctrl.AddSequence( PATTERN_FLIGHT, ACL_BOT, ARRAY( doubleFlash ) );
ctrl.AddSequence( PATTERN_FLIGHT, ACL_TOP, ARRAY( doubleFlash ) );
ctrl.AddSequence( PATTERN_FLIGHT, POSI_GREEN, ARRAY( constOn ) );
ctrl.AddSequence( PATTERN_FLIGHT, POSI_RED, ARRAY( constOn ) );
ctrl.AddSequence( PATTERN_FLIGHT, LANDING_LIGHT, ARRAY( beamOff ) );
ctrl.AddSequence( PATTERN_FLIGHT, LANDING_SERVO, ARRAY( retract ), UniPWMChannel::ANALOG_SERVO );


// landing
ctrl.AddSequence( PATTERN_LANDING, ENGINELIGHT_BOT, ARRAY( beacon_1 ) );
ctrl.AddSequence( PATTERN_LANDING, ENGINELIGHT_TOP, ARRAY( beacon_2 ) );
ctrl.AddSequence( PATTERN_LANDING, ACL_BOT, ARRAY( doubleFlash ) );
ctrl.AddSequence( PATTERN_LANDING, ACL_TOP, ARRAY( doubleFlash ) );
ctrl.AddSequence( PATTERN_LANDING, POSI_GREEN, ARRAY( constOn ) );
ctrl.AddSequence( PATTERN_LANDING, POSI_RED, ARRAY( constOn ) );
ctrl.AddSequence( PATTERN_LANDING, LANDING_LIGHT, ARRAY( beamOn ) );
ctrl.AddSequence( PATTERN_LANDING, LANDING_SERVO, ARRAY( ascend ), UniPWMChannel::ANALOG_SERVO );

// Alarm (bei zu niedriger Akkuspannung blinkt eine Motor LED (ENGINELIGHT_TOP) schnell)
ctrl.AddSequence( PATTERN_ALARM, ENGINELIGHT_TOP, ARRAY( alarm ) );

// assign 3 switch positions to corresponding patterns
ctrl.AddInputSwitchPos( 43, 99, PATTERN_LANDING );
ctrl.AddInputSwitchPos( 37, 42, PATTERN_FLIGHT );
ctrl.AddInputSwitchPos( 1, 35, PATTERN_OFF );


// initalize patterns "flight" and "retracted servo"
ctrl.ActivatePattern( PATTERN_FLIGHT );
ctrl.ActivatePattern( PATTERN_STARTUP );
}


void loop()
{
ctrl.DoLoop();
// delay( 5 );
return;
}
 

onki

User
Hallo zusammen,

ließe sich das auch auf einem ATTiny 85 realisieren?
Es sind nur 4 Ausgänge sowie der Servoeingang nötig.
Reicht es die Pinangaben zu berichtigen und die überschüssigen Ports zu löschen?
Der ATTiny ist halt unschlagbar klein und hat genau das, was benötigt wird.

Gruß
Onki
 

onki

User
Hallo,

ich hab mal nassforsch den Beispielcode verwendet (weil das genau möchte ich zuerst machen).
Allerdings hagelt es Fehlermeldungen, die z.T. auf unterschiedliche Pinbelegungen zurückzuführen sind.

Code:
In file included from C:\Users\onki\Documents\Arduino\libraries\UniPWM_1.0.5/UniPWMControl.h:42:0,

                 from C:\Users\onki\Documents\Arduino\ATTiny_Strobe\ATTiny_Strobe.ino:7:

C:\Users\onki\Documents\Arduino\libraries\UniPWM_1.0.5/UniPWM.h: In member function 'void UniPWMFastPWM::InitTimer1Pin9()':

C:\Users\onki\Documents\Arduino\libraries\UniPWM_1.0.5/UniPWM.h:145:36: error: 'WGM11' was not declared in this scope

     TCCR1A = (1 << COM1A1) | (1 << WGM11);                 // Fast PWM on OC1A

                                    ^

C:\Users\onki\Documents\Arduino\libraries\UniPWM_1.0.5/UniPWM.h:146:5: error: 'TCCR1B' was not declared in this scope

     TCCR1B = (1 << WGM13)  | (1 << WGM12) | (1 << CS11);   // Fast PWM with TOP = ICR1, prescaler = 8

     ^

C:\Users\onki\Documents\Arduino\libraries\UniPWM_1.0.5/UniPWM.h:146:20: error: 'WGM13' was not declared in this scope

     TCCR1B = (1 << WGM13)  | (1 << WGM12) | (1 << CS11);   // Fast PWM with TOP = ICR1, prescaler = 8

                    ^

C:\Users\onki\Documents\Arduino\libraries\UniPWM_1.0.5/UniPWM.h:146:36: error: 'WGM12' was not declared in this scope

     TCCR1B = (1 << WGM13)  | (1 << WGM12) | (1 << CS11);   // Fast PWM with TOP = ICR1, prescaler = 8

                                    ^

C:\Users\onki\Documents\Arduino\libraries\UniPWM_1.0.5/UniPWM.h:147:5: error: 'ICR1' was not declared in this scope

     ICR1  = 40000;     // 50 Hz

     ^

Bibliothek UniPWM_1.0.5 im Ordner: C:\Users\onki\Documents\Arduino\libraries\UniPWM_1.0.5 (legacy) wird verwendet
exit status 1
Fehler beim Kompilieren für das Board ATtiny25/45/85.

Klingt das lösbar oder macht das keinen Sinn?

Gruß
Onki
 

ingo_s

User
Der ATTiny85 hat keine Bootloader Sektion wie die Mega Reihe, programmieren geht eigentlich nur über Programmer. Zumindest müsste man erst mal einen spezial ATTiny Bootloader auf den 85 bringen, der dann auch möglichst noch Arduino kompatible ist.

Am besten erst mal die ATMega Variante Compilieren und prüfen, ob Flash und RAM vom 85 überhaupt ausreichen.
Wobei da noch zu beachten ist, das der "new" Operator scheinbar mit eingesetzt wird, der zur Laufzeit RAM anfordert.

Eventuell ist ja langfristig eine Lösung mit der mbed IDE und einem kleinem STM32F0xx möglich, denn die haben einen internen Bootloader.

Gruß Ingo
 

onki

User
Hallo Ingo,

der Upload ist dank eines vorhandenen mySmartUSB light vermutlich kein größeres Problem.
Notfalls muss der olle Uno herhalten (oder ein ProMini).
Testen kann ich es auch mit einem ProMini.
Aber die anvisierte Zielplattform ist nunmal ein ATTiny85.
Ich hab mich erst einmal nach dieser Anleitung herangetastet, ohne jedoch bisher was übertragen zu haben (nur Kompiliert).
https://www.frag-duino.de/index.php...-arduino-arduinoisp-flashen-und-programmieren

Gruß
Onki
 
Moin Onki

Für die Attinys in Arduino empfehle ich den Spence-Code: https://github.com/SpenceKonde/ATTinyCore
oder direkt eintragen in der IDE EInstellung: http://drazzy.com/package_drazzy.com_index.json

der 25/45/86 hat halt nur die 8Bit Timer, also auch nur 8Bit PWM (256Schritte, beim Servo davon die Hälfte), man kann ihn etwas aufbohren, ist aber etwas frickelei und es ist dann C angesagt.

Für Arduino gibt es aber auch eine 8Bit Servo Library für den 85er, wenn dir die Auflösung ausreicht.
edit, gefunden: https://github.com/fri000/Servo8Bit




Auf alle "älteren" Attinys rennt hervorragend der One-Wire Bootloader vom Hagen -AVROOTLOADER, damit kann der Attiny dann ganz einfach über das Servokabel geflasht werden. Funzt mit jedem USB-Update-Adapter für z.B: Hott oder Jeti Fernsteuerungen. Oder man kann jeden USB-Arduino zum One-Wire Adapter umflashen. (Im einfachstem Fall lädt man sich dazu die BLHelisuite runter, und klickt dort auf "Make-Adapter", (weil, BLHeli nutzt auch den AVRootloader).




Es gibt gute Alternativen, z.B. der Attiny 44/84, der hat einen 8 und einen 16Bit Timer, die nutze ich für so kleine Projekte sehr gerne

Attiny 841 hat ein 8Bit und zwei 16Bit Timer, zwei Harware UART, einer davon sogar auf andere Pins um-nappbar, PWM auf jeden Pin mappbar, u.s.w. Luxus-Attiny, leider funktioniert der nicht mit dem AVRrootloader, mit TinySaveBoot funzt OneWire, bei mir aber nicht sehr stabil. Mit dem Arduinio SpenceCode und Bootloader klappt der Serielle Upload she gut, über dieselbe Schnittstelle nutze ich dann auch SumD und SBUS zum einlesen, was sogar ohne externen Quarz super funzt :)

Es gibt neue 8Pin Attinys, der 212/412 nicht in Dip, nur in SOIC, (gibt Adapterplatinen für ein paar Cent)
https://www.microchip.com/wwwproducts/en/ATTINY412
Leider warte ich auf meinen noch (sind grad erst lieferbar)
One-Wire Upload hat er von Haus aus.
1 x 8-bit, 2 x 16-bit Timer
Uart SPI I2C u.s.w.
Denke das ist würdiger Attiny85 Nachfolger,allerdings muss man sich erst reinarbeiten, da ist erstmal alles irgendwie etwas anders (halber PIC), für die Arduino-IDE sieht das aber vorerst noch bitter aus.
 

charly_a

User
die Billigversion mit Tiny45

die Billigversion mit Tiny45

Ich hab da mal was schnell mit Teilen aus der Wühlkiste für ein Scale-Modell gebaut.
Über 3-Stufenschalter gibts die Funktionen Licht-aus, ACL-Blitz und Positionslichter ein, Landescheinwerfer dazuschalten.

Das Programm ist minimalistisch:
Der Tiny hat einen freilaufenden 8bit-Timer mit 16µs ticker. der Empfängerkanal löst an beiden Flanken einen PinChangeInt aus, damit mess ich die Zeit. die 20ms der Empfänger-PWM sind dann auch gleich die Zeitbasis für Blink und Blitzfunktionen. Das Programm in C braucht 500 Byte Flash und 8 Byte RAM. Da ist noch reichlich Platz.

Die Schaltung besteht nur dem Prozessor und 3 MosFets, die sind in Dil4 und damit praktisch für Lochraster, und brauchen nur 4V Ugs für 2A bis max 60V.
Kosten des ganzen Boards ca 4€.

Auf dem Board ist noch ein Spannungsregler, das war eine Version für Blinklichter ohne RC-Kanal.

Programmierstecker gibts nicht, da kommt einfach der Testclip mit Programmer auf den Prozessor.

sw_3ch.jpgCIMG2878.JPGCIMG2879.JPG
 

vivi-56

User
Hallo,
das sieht sehr gut aus und genau das was sich suche.
Würdest Du den Code zur Verfügung stellen?

Danke und viele Grüße aus Moers
Siggi
 

Thomas L

Vereinsmitglied
@charly_a: tolle minimalistische Lösung, Respekt !

was ich aber nicht verstehe ist die direkte Spg. Versorung des Käfers aus dem Empfänger, die Dinger vertragen doch max. nur 5,5V. Ich denke der Spg. Regler macht schon Sinn und sollte nicht weggelassen werden.
 
was ich aber nicht verstehe ist die direkte Spg. Versorung des Käfers aus dem Empfänger, die Dinger vertragen doch max. nur 5,5V. Ich denke der Spg. Regler macht schon Sinn und sollte nicht weggelassen werden.


Hallo Thomas,

bei 5V oder 5.5V BEC Spannung macht das schon Sinn. Ansonsten muß man ein 3V oder 3.3V Spg. Regler verwenden, welches sich wiederum nicht für die direkte Ansteuerung vom FET eignet. Die absolute Maximum Operating Voltage vom Attiny liegt bei 6 Volt.

Gruß
Micha
 

Bernie

User
Der Arduino Nano hat einen Spannungregler verbaut. Als Eingangsspannung vertägt der bis zu 12V. Das macht ihn ja gerade für Anwendungen im Modellbau so spannend.
Siehe auch Beitag #8. Da wurden die Leistungsdaten des Nano dokumentiert.

LG, Bernie.
 
Hallo Arduno Freunde,

Ich habe die Platine nach den Sketches nachgebaut ...

Funktioniert so weit ganz gut ...

Jedoch habe ich Probleme den Example Sketch 3 mit den Ansteuerung über den 3 Stufen Schalter zu verstehen ...

Kann mir da vielleicht jemand helfen?

Gruß aus Österriech
Martin

PWM_PCB.png
 

onki

User
Hallo,

ich grab das hier nochmal aus.
Mittlerweile hab ich mir Digispark-ATTiny85 Platinen mit USB Bootloader besorgt (Digistumb).
Die bringen neben einem 5V Spannungsregler alles nötige für ein ACL mit.
Nur softwaremaäßig komm ich nicht weiter. ELSE von Jenniffer mag kein Arduino IDE und die PWMLibrary mag den 85er nicht (vmtl. wegen des 8 Bit Timers).

Für ein einfaches ACL mit Umschaltung Doppelblitz/Dreifachblitz sollte der 85er aber mehr als ausreichen.
Hat das schon mal jemand mit der Arduino IDE realisiert?
Treiber brauch ich keine weil ich dimmbare KSQs direkt ansteuere.

Gruß
Onki
 

VOBO

User
Hallo Onki,
Warum machst du das nicht mit einem Arduino?
Wäre nett wenn du deine vorgesehene HW hier mal bekannt geben würdest. Ich plane nämlich auch sowas, aber erst zum Winter.

Gruß Volker
 
Hi,

also der heisse Tip für Leute die nicht tief in der µC-Programmierung stecken und die etwas nachbauen wollen ist das sie genau das nachbauen was in dem Projekt bechrieben ist. Oder wenn man unbedingt eine Library verwenden will dann eben deren Vorraussetzungen erfüllt.

Alles andere endet in Frust ...
 

onki

User
Hallo,

Nun - der ATTiny in der Art hat nunmal einige Vorteile. Wesentlich kompakter und hat einen direkten PC-Anschluss.
Ein Update (z.B. zum anpassen der Blitzsequenz) ist mit dem ProMini immer so eine Sache. Und ein Nano ist mir echt zu groß.
Das Zeug soll auch in schmalere Rümpfe wo es nicht so voluminös zugeht wie in Scale-Rümpfen.

Das die Thematik nicht ohne Probleme bleibt ist mir schon klar. Aber das macht es auch etwas interessanter.

Gruß
Onki
 
  • Like
Reaktionen: rv2
Ansicht hell / dunkel umschalten
Oben Unten