[Arduino] Programmschnipsel, kleine Routinen, Einfachelektronik

Hier dreht sich alles um die Modellbahn
MHAG
Beiträge: 2011
Registriert: 21 Jan 2019, 01:09

[Arduino] Programmschnipsel, kleine Routinen, Einfachelektronik

Beitrag von MHAG »

Hallo Leute!

In anderen Threads haben wir ja mal diskutiert, für den Arduino eine Sammlung mit Lösungen für die Modellbahn zusammenzustellen (wahrscheinlich ist das auch für andere Microcontroller anpassbar).

Ich mache jetzt einfach mal den Anfang mit einem Miniprogramm, das für ein "TV-Flimmern" (auch als Schweißlichtflackern) verwendet werden kann. Das Programm habe ich getestet, so wie es hier "drinhängt"; aber eigentlich ist es ein Teil eines größeren Projekts für eine "belebte Burg" (also die Burg ist angenommenermaßen um 1970 rum noch vom verarmten Landadel bewohnt) mit mehreren Zimmerbeleuchtungen, einer flackernden Kerze (die Routine stelle ich auch noch hier ein ,ist aber fast gleich) und eben dem TV-Flimmern.
Diese kleinen Programmschnipsel sollte man gut kombinieren können. So sollten sich dann verschiedene eigene Projekte damit zusammenstellen lassen.

Code: Alles auswählen

/*  Simulation "TV-Flimmerkiste" 
    auch als "Schweißlicht" einsetzbar                                            
*/
/* Verschaltung der LED (max.20mA) mit Widerstand (1kOhm), 
   Versorgung über USB-Anschluss

                                                                                  .
                               ___________________                                .
                              |                   |                               .
                              |TX1  | O O O |  VIN|                               .
                              |     |       |     |                               .
                              |RX0  | O O O |  GND|                               .
                              |     |_______|     |                               .
                              |RST             RST|                               .
                              |                   |                               .
     o------------------------|GND              5V|                               .
     |                        |                   |                               .
     |                        |D2               A7|                               .
     |                        |                   |                               .
     |                        |D3               A6|                               .
     |                        |                   |                               .
     |                        |D4               A5|                               .
     |                        |      ARDUINO      |                               .
     |                        |D5               A4|                               .
     |                        |                   |                               .
     |                        |D6    N-A-N-O    A3|                               .
     |                        |                   |                               .
     |                        |D7               A2|                               .
     |                        |                   |                               .
     |                        |D8               A1|                               .
     |                        |                   |                               .
     |                        |D9               A0|                               .
     |                        |                   |                               .
     o---|<LED-------R1K0-----|D10             REF|                               .
                              |        ___        |                               .
                              |D11    |   |    3V3|                               .
                              |       |USB|       |                               .
                              |D12    |   |    D13|                               .
                              |___________________|                               .
                                                                                  .
*/

// Zuerst ein paar Definitionen
// PWM Pin für das "analoge" Flimmern:
byte    pwmFlimmerPin=10;
// Zeitintervall für das Flimmern (ändert sich im Programm per Zufall):
unsigned long flimmerZeit =0;
// wie lange ist eine Helligkeitsphase für das Flimmern
// (ändert sich im Programm per Zufall):
unsigned long flimmerDauer;
// die Helligkeit beim Flimmern (ändert sich im Programm per Zufall):
int flimmerHelligkeit=0;
// Flag für "Flimmern aktiv?"
boolean   flimmerFlag=FALSE;

// Die Grundeinstellungen vornehmen
void setup() {
  // Zufallszahlengenerator initialisieren mit Analog-Only-Pin, 
  // das ist wirklich "Zufall", welcher Wert da eingelesen wird
  randomSeed(analogRead(A7));
  // Leuchtstelle initialisieren
  pinMode(pwmFlimmerPin, OUTPUT);  
}

// Die LED (=TV) flimmern lassen
void flimmernPwmPin() {
	// sobald die Zeit da ist: Flimmern an
  if (flimmerFlag)
  {
  	// Zeitspanne mit Helligkeitsstufe abgelaufen?
    if (millis()>flimmerDauer)
    {
      // neue Flimmerhelligkeit als Zufallswert
      flimmerHelligkeit=random(256);
      // neue Flimmerdauer als Zufallswert
      flimmerDauer=millis()+random(200);
    }
  } 
  else
  {
    // Flimmern aus, wenn kein Flimmern gewünscht
    flimmerHelligkeit=0;       
  } 
  analogWrite(pwmFlimmerPin, flimmerHelligkeit); 
}

// Hauptschleife, endlos
void loop() {
  // wann soll das TV flimmern?
  if (millis()>flimmerZeit) 
  {
  	// das Flag "umdrehen"
  	flimmerFlag = !flimmerFlag
  	// min. 10, max. 60 sec Flimmern (anpassbar)
  	flimmerZeit = millis()+1000*(random(50)+10);
  }
  // flimmern lassen
  flimmernPwmPin();
}
Ich habe auch versucht, mal probehalber die zugehörige Beschaltung mit darzustellen -- was meint Ihr dazu? Ist das sinnvoll?

Zur Erklärung des Widerstand:
R = Symbol für Widerstand (Resistor)
1K0 = 1 kOhm
andere Beispiele:
R470 = 470 Ohm
R5K2 = 5,2 kOhm (kiloOhm)
R1M7 =1,7 MOhm (MegaOhm)
Die Polung der LED sollte wohl klar sein...

Jedenfalls sollte durch die Kommentare im Programm die Routine erklärt sein.

Viele Grüße 8-)
Michael
Zuletzt geändert von MHAG am 01 Jul 2019, 15:58, insgesamt 2-mal geändert.
MHAG
Beiträge: 2011
Registriert: 21 Jan 2019, 01:09

Re: [Arduino] Programmschnipsel, kleine Routinen, Einfachelektronik

Beitrag von MHAG »

Hallo!

Ich stelle noch eine zweite Miniroutine hier ein für Kerzenflackern:

Code: Alles auswählen

/*  Simulation einer flackernden Kerze */

/* Verschaltung der LED (max.20mA) mit Widerstand (1kOhm), 
   Versorgung über USB-Anschluss

                                                                                  .
                               ___________________                                .
                              |                   |                               .
                              |TX1  | O O O |  VIN|                               .
                              |     |       |     |                               .
                              |RX0  | O O O |  GND|                               .
                              |     |_______|     |                               .
                              |RST             RST|                               .
                              |                   |                               .
     o------------------------|GND              5V|                               .
     |                        |                   |                               .
     |                        |D2               A7|                               .
     |                        |                   |                               .
     |                      * |D3               A6|                               .
     |                        |                   |                               .
     |                        |D4               A5|                               .
     |                        |      ARDUINO      |                               .
     |                      * |D5               A4|                               .
     |                        |                   |                               .
     o---|<LED-------R1K0-----|D6    N-A-N-O    A3|                               .
                              |                   |                               .
                              |D7               A2|                               .
                              |                   |                               .
                              |D8               A1|                               .
                              |                   |                               .
                            * |D9               A0|                               .
                              |                   |                               .
                            * |D10             REF|                               .
                              |        ___        |                               .
                            * |D11    |   |    3V3|                               .
                              |       |USB|       |                               .
                              |D12    |   |    D13|                               .
                              |___________________|                               .
                                                                                  .
*/
/* Anmerkung: Alle Pins mit * sind ebenfalls PWM-fähig. Sollten mehrere "Flacker-Kerzen"
              benötigt werden, können entsprechend viele Pins definiert werden.
              Dann wird es günstig sein, das Programm so abzuändern, dass die Pin-Nummer
              als Parameter an die Routine "flackernPwmPin" übergeben wird.
              So können bis zu 6 LEDs als unabhängige "Flacker-Kerzen" betrieben werden */


// PWM Pin für das "analoge" Flackern (dauernd, Kerze)
byte    pwmFlackerPin     = 6;
// Anfangs- und Endzeiten für das Flackern (ändert sich im Programm per Zufall)
unsigned long flackerDauer= 0;
// die Helligkeit beim Flackern (ändert sich im Programm per Zufall)
int flackerHelligkeit     = 0;
// "Flackergeschwindigkeit" (je höher die Zahl, desto langsamer)
int flackertempo          = 3;

// Die Grundeinstellungen vornehmen
void setup() {
  // Zufallszahlengenerator initialisieren mit Analog-Only-Pin, das ist wirklich "Zufall"
  randomSeed(analogRead(A7));
  // Leuchtstelle initialisieren
  pinMode(pwmFlackerPin, OUTPUT); 
}

// Die flackernde LED (=Kerze) im Zufallsmodus flackern lassen
void flackernPwmPin() {
  // Zeitspanne mit Helligkeitsstufe abgelaufen?
  if (millis()>flackerDauer)
  {
    // neue Flackerhelligkeit als Zufallswert
    flackerHelligkeit=random(256);
    // neue Flackerdauer als Zufallswert
    flackerDauer=millis()+flackertempo*random(222);
  }
  analogWrite(pwmFlackerPin, flackerHelligkeit); 
}

// Hauptschleife, endlos
void loop() {
  flackernPwmPin();      // die Kerze flackert immer
}
Widerstand und LED sind wie im ersten Teil bezeichnet.

Mit 6 Flackerlichtern könnte man schon einen kleinen Friedhof illuminieren ;)

Viele Grüße 8-)
Michael
Herbert

Re: [Arduino] Programmschnipsel, kleine Routinen, Einfachelektronik

Beitrag von Herbert »

Danke, Michael - welche LEDs sind da am Besten geeignet von der Größe?
MHAG
Beiträge: 2011
Registriert: 21 Jan 2019, 01:09

Re: [Arduino] Programmschnipsel, kleine Routinen, Einfachelektronik

Beitrag von MHAG »

Hallo Herbert,
was die Bastelkiste so hergab...
Ich habe zum Entwickeln und Testen 5mm LEDs mit ~20mA verwendet (die Kerze rot und TV weiß, aus einer kaputten Weihnachtslichterkette, mit Edding blau gefärbt). Für die endgültige Version werden es vielleicht welche mit 2mA - - mit angepaßten Widerständen. Mal sehen, was im Vorrat ist ;-)

Viele Grüße 8-)
Michael
Herbert

Re: [Arduino] Programmschnipsel, kleine Routinen, Einfachelektronik

Beitrag von Herbert »

Ich meinte eher die Baugröße ... eine 5mm LED auf einem N-Friedhof wird wohl eher nicht sehr realistisch sein, oder?
;)
MHAG
Beiträge: 2011
Registriert: 21 Jan 2019, 01:09

Re: [Arduino] Programmschnipsel, kleine Routinen, Einfachelektronik

Beitrag von MHAG »

Die 5mm LEDs waren erst mal zum Testen. Später kommen sie auch nicht _auf_ dem Friedhof zum Einsatz, sondern drunter! Und dann mehrere Lichtleiter nach oben zu den Grableuchten. Wenn das im Schnitt nur 3 LL pro LED sind, kann man 18 Leuchten illuminieren.
In meiner "belebten Burg" werde ich aber schon so große verwenden, die liegen hier rum. ;-) Und im Gebäude sieht man die sowieso nicht :-)

Viele Grüße 8-)
Michael
Herbert

Re: [Arduino] Programmschnipsel, kleine Routinen, Einfachelektronik

Beitrag von Herbert »

Ahh ... Lichtleiter ... damit hab ich bislang noch keine Erfahrungen. Muss ich mich mal schlau machen. Danke Dir. 8-)
MHAG
Beiträge: 2011
Registriert: 21 Jan 2019, 01:09

Re: [Arduino] Programmschnipsel, kleine Routinen, Einfachelektronik

Beitrag von MHAG »

Hallo Helmut,

für den Arduino gibt es eine komplette freie Umgebung, die Programmiersprache ist C-ähnlich (objektorientiert geht auch). Um ein Programm auf den Arduino zu bekommen, muss man den Chip nur via Kabel mit mini-USB (nicht micro-USB :!: ) mit dem PC verbinden und auf den "Übertragen"-Button drücken. Meistens klappt´s beim ersten Mal ;)
Es kann allerdings mit dem USB-Chipsatz auf dem Arduino (ich habe einen Nano im Einsatz) Probeme geben, ich musste was von einer Chinesischen Seite nachladen; da habe ich natürlich erst mal mit Sandbox und Virenscanner geprüft, aber alles war sauber. Es wurde auch nur der USB-Treiber für diesen Chipsatz geholt, es wird nichts nachgeladen oder gesendet. Puh! :mrgreen: Wurde übrigens auch von anderen Usern entsprechen so kommuniziert...
Der Nano kommt als bestückte Platine mit mini-USB-Buchse, in die man rechts und links die Stiftleisten einlöten muss; eine schnelle Angelegenheit.
Auf dem Arduino ist auch noch ein 6-poliger Anschluß (wird auch mitgeliefert) drauf für die Versorgung, den habe ich momentan nicht bestückt. Aber die mini-USB-Stecker sind nur schwer aufzutreiben, ich werde da bei weiteren Projekten die Pins bestücken und die passenden Stecker mit einem 2-poligen Anschluß versehen. Wenn es mal läuft, brauchte ich (bisher) auch nur die Spannungsversorgung, aber aus Bequemlichkeit :roll: nutze ich den mini-USB.
Auf meinen Nanos sind 4 LEDs drauf, für seriell Rx, seriell Tx, Power und eine, die an Pin D13 hängt (die ist, soweit ich weiß, vorgeschrieben). Letzteres ist auch der Ausgang, den ich als Betriebsanzeige im Tordurchgang der Burg nutze.

Soviel erstmal, bei Fragen fragen :lol:

Viele Grüße 8-)
Michael
Antworten