INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Meine Projekte - für RC-Modelle
14.01.2016, 20:02 (Dieser Beitrag wurde zuletzt bearbeitet: 15.01.2016 05:28 von dqb312.)
Beitrag #1
Meine Projekte - für RC-Modelle
Hallo,

ich möchte hier meine Projekte vorstellen. Kann ja sein, dass hier Jemand was mit meinen Ideen anfangen kann.
Die Projekte brachten mich zur Arduino-Plattform, da mir die kaufbaren Geräte zu teuer und nicht meinen Ansprüchen genügend erschienen.
Mir ist klar, dass meine Programme weit weg von optimalen Coding sind. Mir geht es darum, dass es (für mich akzeptabel) funktioniert.

Videos der Modelle und Lichtfunktionen sind bei Youtube unter dqb312 (als Suchwort eingeben) zu finden.

Hier mein Lichtsteuermodul der ersten Generation mit Atmega328P-PU:
   

und hier die zweite Generation mit Attiny85 (bisher in Entwicklung - noch nicht im Modell verbaut)
   
Links der Empfänger, rechts das Kabel zu einem 16er Neopixelring zum Testen.

Lichtmodul für den Crawler mit Steuerung einer Funktion (Anhänger klappen) und Seilwinde über 3-Kanal Funke. (Das Youtube-Video zeigt eine vorhergehende Version ohne separate Blinker)

Hinweis: zwischen Winde und Windenregler ist ein 2 poliger (Ein-Aus-Ein) Schalter zum Einschalten und zur Drehrichtungsumkehr eingefügt. Die Winde kann dadurch mit dem Gaskanal mit gesteuert werden.

Code:
//Lichtsteuerung über Gaskanal und Schaltkanal für Rainers Honcho
//by dqb312

#include <Servo.h>  //Servolibrary einbinden

Servo Funktion;     //Funktionsservo definieren
Servo Seilwinde;    //Seilwinde definieren

int Gas;                //Wert des Eingangssignale
int Gas0;               //alter Gaswert
int Gasup = -38;        //Schwellwert Gas positiv
int Gasdown = -48;      //Schwellwert Gas negtiv
int Brems = 9;          //Wertänderung für Bremslicht an
int Nobrems = 3;        //Wertänderung für Bremslicht aus
int Schalt;             //Wert ds Schaltkanals
int pos = 180;          //Stellung Funktionsservo bei Programmstart (0 bis 180 zulässig)
int posStep = 2;        //Schrittweite Servo je Programmdurchlauf (180 / posStep muss ganze Zahl ergeben)
int dimm = 50;          //Wert für gedimmte LED
int Monitor = 1;        //Werte an serielle Schnittstelle senden (0=aus, 1=an)
int SF = 0;             //Servovariable
int Blinkspeed = 500;    //Blinkgeschwindigkeit
long Blinkmillis = 0;    //Variable zur Ermittlung der Blinkerschaltung, auf 0 für erste Verwendung
boolean Blink = LOW;    //Variable für Blinker
long An = 0;            //Fernsteuerung aus?
long Waitmillisup;      //Wartezeit nach Vorwärts
long Waitmillisdown;    //Wartezeit nach Rückwärts
int Wait = 5000;        //Variable für Wartezeit
int Winde = 93;         //Variable für Windensteuerung
int Windenwert = 93;    //Neutralwert des Steuersignales an die Winde
int Abroll = 0;         //Abrollknopf
boolean Value = LOW;    // Startwert der LED
int Value2 = 0;
int Licht = 0;          //Licht an oder aus
int Bremslicht = 0;     //Bremslicht an oder aus
int Blinker = 0;        //Blinker an oder aus
int Rueckfahrt = 0;     //Rückfahrtscheinwerfer an oder aus
int Zusatz = 0;         //Zusatzscheinwerfer



void setup()
{
  if (Monitor == 1)
  {
    Serial.begin(9600);    //startet Serielle Kommunikation
  }
  pinMode(2, INPUT);     //Gas vom Empfänger
  pinMode(3, OUTPUT);    //Rücklicht / Bremslicht (zusätzlich)
  pinMode(4, INPUT);     //Schaltkanal
  pinMode(5, OUTPUT);    //Rücklicht / Bremslicht Auto
  pinMode(6, OUTPUT);    //Rücklicht / Bremslicht Auto
  pinMode(7, OUTPUT);    //drittes Bremslicht
  pinMode(8, INPUT);     //Abrollschalter
  pinMode(9, OUTPUT);    //Blinker
  pinMode(10, OUTPUT);   //Blinker
  pinMode(11, OUTPUT);   //Rücklicht / Bremslicht (zusätzlich)
  pinMode(12, OUTPUT);   //Seilwinde
  Seilwinde.attach(12);  //Pin für Winde zuweisen
  pinMode(13, OUTPUT);   //Funktionsservo
  Funktion.attach(13);   //Pin für Funktionsservo zuweisen
  pinMode(A0, OUTPUT);   //Scheinwerfer
  pinMode(A1, OUTPUT);   //Scheinwerfer
  pinMode(A2, OUTPUT);   //Zusatzscheinwerfer
  pinMode(A3, OUTPUT);   //Zusatzscheinwerfer
  pinMode(A4, OUTPUT);   //Rückfahrtscheinwerfer
  pinMode(A5, OUTPUT);   //Rückfahrtscheinwerfer
}

void loop()
{
  Gas0 = Gas;
  An = millis();
  Gas = pulseIn(2, HIGH);                 //PWM vom Gaskanal messen
  Schalt = pulseIn(4, HIGH);              //PWM vom Schaltkanal messen
  An = millis() - An;

  Gas = map(Gas, 1000, 2000, -100, 100);   //Arbeitswerte Gas erzeugen

  Abroll = digitalRead(8);   //Schalter

  if (Monitor == 1)
  {
    Serial.print(Gas);
    Serial.print("     ");
    Serial.print(Schalt);
    Serial.print("     ");
    Serial.print(pos);
    Serial.print("     ");
    Serial.println(SF);
  }

  if (Schalt < 1200)
  {
    Schalt = 2;
  }
  else
  {
    if (Schalt > 1400)
    {
      Schalt = 0;
    }
    else
    {
      Schalt = 1;
    }
  }
  if (An > 500)   //wenn die Funke aus ist
  {
    //alles aus
    digitalWrite(3, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    digitalWrite(A0, LOW);
    digitalWrite(A1, LOW);
    digitalWrite(A2, LOW);
    digitalWrite(A3, LOW);
    digitalWrite(A4, LOW);
    digitalWrite(A5, LOW);
    //Rücklicht und Scheinwerfer 3x blinken
    digitalWrite(3, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(11, HIGH);
    delay(100);
    digitalWrite(3, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    delay(100);
    digitalWrite(3, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(11, HIGH);
    delay(100);
    digitalWrite(3, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
    delay(100);
    digitalWrite(3, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(11, HIGH);
    delay(100);
    digitalWrite(3, LOW);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
  }
  else    //wenn die Funke an ist
  {
    //alles auf aus
    Licht = 0;
    Bremslicht = 0;
    Blinker = 0;
    Rueckfahrt = 0;
    Zusatz = 0;

    //-----------------
    // Wartezeit setzen
    //-----------------

    if (Gas > Gasup)
    {
      Waitmillisup = millis();
    }
    if (Gas < Gasdown)
    {
      Waitmillisdown = millis();
    }

    //----------------
    // Licht ermitteln
    //----------------

    //Scheinwerfer und Rücklichter
    if (Schalt >= 1)
    {
      Licht = 1;
    }

    //Zusattzscheinwerfer
    if (Schalt >= 1)
    {
      Zusatz = 1;
    }
    if (millis() - Waitmillisup > Wait)
    {
      Zusatz = 0;
    }
    if (Gas < Gasdown)
    {
      Zusatz = 0;
    }
    if (Waitmillisdown > Waitmillisup)
    {
      Zusatz = 0;
    }


    //Rückfahrtscheinwerfer
    if (Gas < Gasdown)
    {
      Rueckfahrt = 1;
    }

    // Bremslicht
    if (Gas >= Gasup && Gas0 - Gas > Brems)
    {
      Bremslicht = 1;
    }
    if (Gas <= Gasdown && Gas - Gas0 > Brems)
    {
      Bremslicht = 1;
    }
    if (Gas > Gasdown && Gas < Gasup)
    {
      Bremslicht = 1;
    }

    // Blinker
    if (millis() - Waitmillisup > Wait && millis() - Waitmillisdown > Wait)
    {
      if (millis() - Blinkmillis > 500)
      {
        Blinker = 1;
      }
      if (millis() - Blinkmillis > 1000)
      {
        Blinkmillis = millis();
      }
    }
    else
    {
      Blinkmillis = millis();
    }

    //---------------
    // Licht ausgeben
    //---------------

    if (Licht == 1)
    {
      digitalWrite(A0, HIGH);
      digitalWrite(A1, HIGH);
    }
    else
    {
      digitalWrite(A0, LOW);
      digitalWrite(A1, LOW);
    }

    if (Zusatz == 1)
    {
      digitalWrite(A2, HIGH);
      digitalWrite(A3, HIGH);
    }
    else
    {
      digitalWrite(A2, LOW);
      digitalWrite(A3, LOW);
    }

    if (Rueckfahrt == 1)
    {
      digitalWrite(A4, HIGH);
      digitalWrite(A5, HIGH);
    }
    else
    {
      digitalWrite(A4, LOW);
      digitalWrite(A5, LOW);
    }

    if (Bremslicht == 1)
    {
      analogWrite(3, 255);
      analogWrite(5, 255);
      analogWrite(6, 255);
      analogWrite(11, 255);
      digitalWrite(7, HIGH);
    }
    else
    {
      digitalWrite(7, LOW);
      if (Licht == 0)
      {
        analogWrite(3, 0);
        analogWrite(5, 0);
        analogWrite(6, 0);
        analogWrite(11, 0);
      }
      else
      {
        analogWrite(3, dimm);
        analogWrite(5, dimm);
        analogWrite(6, dimm);
        analogWrite(11, dimm);
      }
    }

    if (Blinker == 1)
    {
      digitalWrite(9, HIGH);
      digitalWrite(10, HIGH);
    }
    else
    {
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
    }


    //Seilwinde
    if (Abroll == 0)
    {
      if (Gas > Gasup)
      {
        Winde = 0;
      }
      if (Gas < Gasdown)
      {
        Winde = 179;
      }
      if (Gas <= Gasup && Gas >= Gasdown)
      {
        Winde = Windenwert;
      }
    }
    if (Abroll == 1)
    {
      Winde = 179;
    }
    Winde = constrain(Winde, 0, 179);
    Seilwinde.write(Winde);

    //Funktionsservo steuern
    if (Schalt >= 2)
    {
      SF = 1;
      if (pos > 0)        //Minimaler Ausschlag Funktionsservo (min. 0)
      {
        pos -= posStep;
      }
    }
    else
    {
      if (pos < 179)          //Maximaler Ausschlag Funktionsservo (max. 180)
      {
        pos += posStep;
        if (pos > 175)
        {
          SF = 0;
        }
      }

    }
    pos = constrain(pos, 0, 179);
    Funktion.write(pos);
  }
}
   

Lichtmodul für den Drifter

Code:
//MST Rainer
// by dqb312

int Gas;        //Variable für Gasstellung
int Lenk;        //Variable für Lenkung
int Schalt;        //Variable für Schaltkanal
int Dimm = 50;        //Variable Dimmer (Rücklicht und Fernlicht normal)
int Dimmrand = 15;      //Variable Dimmer (Rücklicht und Fernlicht Effekt)
boolean Blink = LOW;    //Variable für Blinker
int Wait = 3000;    //Zeit bis Warnblinker oder Blinker an geht
long Waitmillis = 0;    //Variable für Wartezeitermittlung, auf 0 für erste Verwendung
int Blinkspeed = 500;    //Blinkgeschwindigkeit
long Blinkmillis = 0;    //Variable zur Ermittlung der Blinkerschaltung, auf 0 für erste Verwendung
int Monitor = 1;        //Werte an seriellen Monitor senden (0=aus, 1=an)
long An = 0;            //Fernsteuerung aus?
int Gasup = 4;          //oberer Gaswert
int Gasdown = -4;       //unterer Gaswert
int randNumber;         //Variable für Zufallswert

void setup()
{
  if (Monitor==1)
  {
    Serial.begin(9600);    //startet Serielle Kommunikation
  }
  pinMode(0, INPUT);    //Rauschen empfangen
  pinMode(2, INPUT);    //Gas vom Empfänger
  pinMode(3, OUTPUT);    //Scheinwerfer
  pinMode(4, INPUT);    //Lenkung vom Empfänger
  pinMode(5, OUTPUT);    //Rücklicht
  pinMode(6, OUTPUT);    //Rücklicht
  pinMode(7, INPUT);    //Schaltkanal vom Empfänger
  pinMode(8, OUTPUT);    //Blinker links
  pinMode(9, OUTPUT);    //Blinker links
  pinMode(10, OUTPUT);    //drittes Bremslicht
  pinMode(11, OUTPUT);    //Scheinwerfer
  pinMode(12, OUTPUT);    //Blinker rechts
  pinMode(13, OUTPUT);    //Blinker rechts
  //pinMode(A0, OUTPUT);  //
  //pinMode(A1, OUTPUT);  //
  pinMode(A2, OUTPUT);  //Bremslicht
  pinMode(A3, OUTPUT);  //Bremslicht
  pinMode(A4, OUTPUT);  //Bremslicht
  pinMode(A5, OUTPUT);  //Bremslicht
}

void loop()
{
  An = millis();
  Gas = pulseIn(2, HIGH);    //PWM vom Empfänger messen Gas
  Lenk = pulseIn(4, HIGH);    //PWM vom Empfänger messen Lenkung
  Schalt = pulseIn(7, HIGH);    //PWM vom Empfänger messen Schaltkanal
  An = millis() - An;
  if (Monitor==1)
  {
    Serial.print(Gas);
    Serial.print("     ");
    Serial.print(Lenk);
    Serial.print("     ");
    Serial.print(Schalt);
    Serial.print("     ");
  }

  Gas = map(Gas, 890, 2074, -100, 100);        //Arbeitswerte erzeugen (die ersten beiden Werte aus min / max des Kanals ableiten)
  Lenk = map(Lenk, 890, 2074, 100, -100);    //Arbeitswerte erzeugen (die ersten beiden Werte aus min / max des Kanals ableiten)
  Schalt = map(Schalt, 890, 2074, 100, -100);    //Arbeitswerte erzeugen (die ersten beiden Werte aus min / max des Kanals ableiten)
  if (Monitor==1)
  {
    Serial.print(Gas);
    Serial.print("     ");
    Serial.print(Lenk);
    Serial.print("     ");
    Serial.println(Schalt);
  }

  if (An > 500)   //wenn die Funke aus ist
  {
    //alles aus
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(10, LOW);
    digitalWrite(8, LOW);
    digitalWrite(3, LOW);
    digitalWrite(11, LOW);
    digitalWrite(A2, LOW);
    digitalWrite(A3, LOW);
    digitalWrite(A4, LOW);
    digitalWrite(A5, LOW);
    //Blinker 3x blinken
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(12, HIGH);
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    digitalWrite(12, LOW);
    digitalWrite(13, LOW);
    delay(100);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(12, HIGH);
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    digitalWrite(12, LOW);
    digitalWrite(13, LOW);
    delay(100);    
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(12, HIGH);
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    digitalWrite(12, LOW);
    digitalWrite(13, LOW);
    analogWrite(3, Dimm);
    analogWrite(5, Dimm);
    analogWrite(6, Dimm);
    digitalWrite(10, HIGH);
    analogWrite(11, Dimm);
    digitalWrite(A2, HIGH);
    digitalWrite(A3, HIGH);
    digitalWrite(A4, HIGH);
    digitalWrite(A5, HIGH);
    delay(100);
  }
  else    //wenn die Funke an ist
  {
    //Normales Licht
    if (Schalt > -70)
    {    
      //Scheinwerfer
      if (Schalt <= 70)
      {
        digitalWrite(3, HIGH);
        digitalWrite(11, HIGH);
      }
      else
      {
        digitalWrite(3, LOW);
        digitalWrite(11, LOW);
      }
      //Blinker
      if(Gas > Gasdown && Gas < Gasup)        //ausführen, wenn Gas im Neutralbereich ist
      {
        //Timer für Wartezeit vor Blinken
        if (millis() - Waitmillis > Wait)        //ausführen, wenn Timer für Wartezeit um ist
        {
          //Scheinwerfer dimmen
          if (Schalt <= 70)
          {
            analogWrite(3, Dimm);
            analogWrite(11, Dimm);
          }
          //Timer für Blinkfrequenz
          if (millis() - Blinkmillis > Blinkspeed)        //ausführen, wenn Blinktimer um ist
          {
            Blinkmillis = millis();
            Blink = !Blink;
            if(Lenk >=-10)    //linker Blinker
            {
              digitalWrite(8, Blink);
              digitalWrite(9, Blink);
            }
            else
            {
              digitalWrite(8, LOW);
              digitalWrite(9, LOW);
            }
            if(Lenk <=10)    //rechter Blinker
            {
              digitalWrite(12, Blink);
              digitalWrite(13, Blink);
            }
            else
            {
              digitalWrite(12, LOW);
              digitalWrite(13, LOW);
            }
          }
        }
      }
      else    //ausführen, Wenn Gas nicht im Neutralbereich ist
      {
        digitalWrite(8, LOW);
        digitalWrite(9, LOW);
        digitalWrite(12, LOW);
        digitalWrite(13, LOW);
        Waitmillis = millis();   // aktuelle Zeit abspeichern
      }

      //Rücklicht
      if (Schalt <=70)
      {
        analogWrite(5, Dimm);
        analogWrite(6, Dimm);
      }
      else
      {
        analogWrite(5, 0);
        analogWrite(6, 0);
      }

      //Bremslicht
      if (Gas > Gasdown && Gas < Gasup)
      {

        digitalWrite(10, HIGH);
        digitalWrite(A2, HIGH);
        digitalWrite(A3, HIGH);
        digitalWrite(A4, HIGH);
        digitalWrite(A5, HIGH);
      }
      else
      {
        digitalWrite(10, LOW);
        digitalWrite(A2, LOW);
        digitalWrite(A3, LOW);
        digitalWrite(A4, LOW);
        digitalWrite(A5, LOW);
      }
    }
    else //Effektprogramm
    {
      delay(100);
      randNumber = random(0,2);
      if (randNumber > 0)
      {
        digitalWrite (3, HIGH);
        digitalWrite (11, HIGH);
      }
      else
      {
        analogWrite (3, Dimmrand);
        analogWrite (11, Dimmrand);
      }
      randNumber = random(0,2);
      if (randNumber > 0)
      {
        digitalWrite (5, HIGH);
        digitalWrite (6, HIGH);
      }
      else
      {
        analogWrite (5, Dimmrand);
        analogWrite (6, Dimmrand);
      }
      randNumber = random(0,2);
      if (randNumber > 0)
      {
        digitalWrite (8, HIGH);
        digitalWrite (9, HIGH);
        digitalWrite (12, HIGH);
        digitalWrite (13, HIGH);
      }
      else
      {
        digitalWrite (8, LOW);
        digitalWrite (9, LOW);
        digitalWrite (12, LOW);
        digitalWrite (13, LOW);
      }
      randNumber = random(0,2);
      if (randNumber > 0)
      {
        digitalWrite (10, HIGH);
        digitalWrite (A2, HIGH);
        digitalWrite (A3, HIGH);
        digitalWrite (A4, HIGH);
        digitalWrite (A5, HIGH);
      }
      else
      {
        digitalWrite (10, LOW);
        digitalWrite (A2, LOW);
        digitalWrite (A3, LOW);
        digitalWrite (A4, LOW);
        digitalWrite (A5, LOW);
      }
    }
  }
}
   

Lichtmodul mit Attiny85 und Neopixel-LED

Da die bisherigen Lichtmodule für meinen Geschmack zu aufwändig in der Herstellung waren, musste der Attiny85 herhalten.
Wegen der Neopixel-Library muss er auf 8 MHz gefused werden.

Code:
//Lichtsteuerung über Gaskanal und Schaltkanal 16 Neopixel-LED (8 vorn / 8 hinten)
//by dqb312

int Gas;                    //Wert des Eingangssignale
int Gas0;                   //alter Gaswert
const int Gasup = 10;       //Schwellwert Gas positiv
const int Gasdown = -10;    //Schwellwert Gas negtiv
const int Schaltup = 1750;  //Schwellwert Schaltkanal Licht an
const int Brems = 9;        //Wertänderung für Bremslicht an
const int Nobrems = 3;      //Wertänderung für Bremslicht aus
int Schalt;                 //Wert des Schaltkanals
int SF = 0;                 //Servovariable
long An = 0;                //Fernsteuerung aus?
long Waitmillis;            //Wartezeit für Zusatzscheinwerfer aus
const long Wait = 5000;     //Variable für Wartezeit
long Blinkmillis;           //Variable für Blinker
boolean Value = LOW;        //Startwert der LED

int Blinker = 0;
int Bremslicht = 0;
int Licht = 0;
int Fernlicht = 0;
int Backlight = 0;


#include <Adafruit_NeoPixel.h>

//Neopixel initialisieren und zuweisen
#define PIN 4
#define NUMofPIXELS 16

const int TfVL = 0;   //Tagfahrlicht vorn links
const int BlVL = 1;   //Blinker, Standlicht
const int HsVL = 2;   //Hauptscheinwerfer vorn links
const int ZsVL = 3;   //Zusatzscheinwerfer vorn links
const int ZsVR = 4;   //Zusatzscheinwerfer vorn rechts
const int HsVR = 5;   //Hauptscheinwerfer vorn rechts
const int BlVR = 6;   //Blinker, Standlicht
const int TfVR = 7;   //Tagfahrlicht vorn rechts

const int BlHR = 8;   //Blinker hinten rechts
const int RlHR = 9;   //Rücklicht hinten rechts
const int BrHR = 10;  //Rücklicht, Bremslicht hinten rechts
const int RfHR = 11;  //Rückfahrtscheinwerfer hinten rechts
const int RfHL = 12;  //Rückfahrtscheinwerfer hinten links
const int BrHL = 13;  //Rücklicht, Bremslicht hinten links
const int RlHL = 14;  //Rücklicht hinten links
const int BlHL = 15;  //Blinker hinten links

//Auswahl der verschiedenen Ansteuer-Typen - nur eine Zeile aktiv lassen!
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMofPIXELS, PIN, NEO_GRB + NEO_KHZ800);  //bei Verwendung von SMD mit GrünRotBlau-Ansteuerung
//Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMofPIXELS, PIN, NEO_RGB + NEO_KHZ800);  //bei Verwendung von 5mm bedrahtet mit RotGrünBlau-Ansteuerung

//Einstellungen Farben
const int aus[] = { 0, 0, 0};
const int hellweiss[] = { 255, 255, 255};
const int weiss [] = { 65, 65, 65};
const int dunkelweiss[] = { 15, 15, 15};
const int blau[] = { 0, 0, 75};
const int hellrot[] = { 255, 0, 0};
const int dunkelrot[] = { 20, 0, 0};
const int orange[] = { 100, 50, 0};
const int gruen[] = { 0, 75, 0};

void setup()
{
  pixels.setBrightness(255);   //Global Brightness
  pixels.begin();              //initializes the NeoPixel library.
  
  pinMode(1, INPUT);   //Gas vom Empfänger
  pinMode(2, INPUT);   //Schaltkanal

}

void loop()
{
  Gas0 = Gas;
  An = millis();
  Gas = pulseIn(1, HIGH);       //PWM vom Gaskanal messen
  Schalt = pulseIn(2, HIGH);    //PWM vom Schaltkanal messen
  An = millis() - An;

  Gas = map(Gas, 1000, 2000, -100, 100);   //Arbeitswerte Gas erzeugen


  if (Schalt > Schaltup)
  {
    Schalt = 0;
  }
  else
  {
    if (Schalt < (Schaltup - 1))
    {
      Schalt = 1;
    }
  }
  if (An > 500)   //wenn die Funke aus ist
  {
    pixels.setPixelColor(TfVL, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(BlVL, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(HsVL, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(ZsVL, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(TfVR, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(BlVR, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(HsVR, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(ZsVR, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(BlHR, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(RlHR, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(BrHR, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(RfHR, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(BlHL, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(RlHL, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(BrHL, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(RfHL, pixels.Color(gruen[0], gruen[1], gruen[2]));
  }
  else    //wenn die Funke an ist
  {
    Bremslicht = 1;
    //bei Stillstand Zusatzscheinwerfer nach 5 Sekunden aus und Warnblinker an
    if (Gas < Gasup && Gas > Gasdown)
    {
      if (millis() - Waitmillis > Wait)      //ausführen, wenn Timer für Wartezeit um ist
      {
        Fernlicht = 0;

        if (millis() - Blinkmillis > 500)
        {
          Blinkmillis = millis();   //aktuelle Zeit abspeichern
          Value = !Value;

          if (Value == true)
          {
            Blinker = 1;
          }
          else
          {
            Blinker = 0;
          }
        }
      }
    }
    else
    {
      Waitmillis = millis();
      Blinker = 0;
      Fernlicht = 0;

      //Rück- / Bremslicht

      //Bremslicht vorwärts verzögert
      if (Gas >= Gasup && Gas0 - Gas > Brems)
      {
        Bremslicht = 1;
      }
      if (Gas >= Gasup && Gas0 - Gas < Nobrems)
      {
        Bremslicht = 0;
      }
      //Bremslicht rückwärts verzögert
      if (Gas <= Gasdown && Gas - Gas0 > Brems)
      {
        Bremslicht = 1;
      }
      if (Gas <= Gasdown && Gas - Gas0 < Nobrems)
      {
        Bremslicht = 0;
      }
      //Bremslicht im Stand
      if (Gas > Gasdown && Gas < Gasup)
      {
        Bremslicht = 1;
      }

    }
    //Rückfahrtscheinwerfer steuern / Zusatzscheinwerfer aus
    if (Gas < Gasdown)
    {
      Backlight = 1;
      Fernlicht = 0;
    }
    else
    {
      Backlight = 0;
    }
    //Scheinwerfer und Tagfahrlicht steuern
    if (Schalt >= 1)
    {
      Licht = 1;
    }
    else
    {
      Licht = 0;
    }
    //Zusatzscheinwerfer steuern
    if (Gas > Gasup && Schalt >= 1)
    {
      Fernlicht = 1;
    }

    //Bremslicht im Stand
    if (millis() - Waitmillis < Wait && Gas < Gasup && Gas > Gasdown)
    {
      Bremslicht = 1;
    }

    //alles aus, Tagfahrlicht an
    pixels.setPixelColor(TfVL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(BlVL, pixels.Color(weiss[0], weiss[1], weiss[2]));
    pixels.setPixelColor(HsVL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(ZsVL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(TfVR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(BlVR, pixels.Color(weiss[0], weiss[1], weiss[2]));
    pixels.setPixelColor(HsVR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(ZsVR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(BlHL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(RlHL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(BrHL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(RfHL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(BlHR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(RlHR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(BrHR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(RfHR, pixels.Color(aus[0], aus[1], aus[2]));

    //Licht steuern
    if (Licht == 1)
    {
      pixels.setPixelColor(BlVL, pixels.Color(dunkelweiss[0], dunkelweiss[1], dunkelweiss[2]));
      pixels.setPixelColor(HsVL, pixels.Color(weiss[0], weiss[1], weiss[2]));
      pixels.setPixelColor(HsVR, pixels.Color(weiss[0], weiss[1], weiss[2]));
      pixels.setPixelColor(BlVR, pixels.Color(dunkelweiss[0], dunkelweiss[1], dunkelweiss[2]));
      
      pixels.setPixelColor(RlHR, pixels.Color(dunkelrot[0], dunkelrot[1], dunkelrot[2]));
      pixels.setPixelColor(BrHR, pixels.Color(dunkelrot[0], dunkelrot[1], dunkelrot[2]));
      pixels.setPixelColor(BrHL, pixels.Color(dunkelrot[0], dunkelrot[1], dunkelrot[2]));
      pixels.setPixelColor(RlHL, pixels.Color(dunkelrot[0], dunkelrot[1], dunkelrot[2]));
      
    }

    //Fernlicht steuern
    if (Fernlicht == 1)
    {
      pixels.setPixelColor(HsVL, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(ZsVL, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(ZsVR, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(HsVR, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
    }

    //wenn Bremslicht an
    if (Bremslicht == 1)
    {
      pixels.setPixelColor(BrHR, pixels.Color(hellrot[0], hellrot[1], hellrot[2]));
      pixels.setPixelColor(BrHL, pixels.Color(hellrot[0], hellrot[1], hellrot[2]));
    }

    //Rückfahrtscheinwerfer
    if (Backlight == 1)
    {
      pixels.setPixelColor(RfHR, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(RfHL, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
    }

    //wenn Blinker an
    if (Blinker == 1 )
    {
      pixels.setPixelColor(TfVL, pixels.Color(orange[0], orange[1], orange[2]));
      pixels.setPixelColor(TfVR, pixels.Color(orange[0], orange[1], orange[2]));
      pixels.setPixelColor(BlHR, pixels.Color(orange[0], orange[1], orange[2]));
      pixels.setPixelColor(BlHL, pixels.Color(orange[0], orange[1], orange[2]));
    }
  } //Ende Funke an

  pixels.show();
}

Stoppuhr für den Crawler

Die Rundenzeit manuell ermitteln? Viel zu langweilig.
Daher entstand eine automatische Zeitmesseinrichtung für Single-Use (keine gleichzeitige Messung mehrerer Fahrzeuge).
Als Bonus kann man die Fernsteuersignale auslesen und anzeigen lassen.

Der Laser ist ein fertiges Modul aus einem Pointer (mit zusätzlichen 1 KOhm Poti als Vorwiderstand) etwas schwächer eingestellt, da die erste Photodiode "gebraten" wurde.

Code:
//Stopuhr mit Laserlichtschranke / PWM-Messung
//by dqb312

#include <LiquidCrystal.h>
#include <LcdBarGraph.h>


LiquidCrystal lcd(13, 12, 8, 7, 6, 5); // Pins für LCD
LcdBarGraph lbg(&lcd, 4, 10, 1); // Einstellingen Bargraph
int Uhr = 1; //Uhr wartet (1) oder Uhr läuft (2)
int minute = 0, sekunde = 0, zehntelsekunde_neu, zehntelsekunde_alt, minutealt = 0, sekundealt = 0, zehntelsekundealt = 0; // Uhr initialisieren
long startzeit = 0, laufzeit; //Variablen für die Zeitmessung
int P1, P1graph, P1min = 1024, P1max = 0, schwellwert = 1000; //Variablen für die Lichtchranke
long wait;
int Sensor = A0, Schalter = 2, Laser = 3, Gelb = 4, Signal = 10; //Variablen für Input / Outrput
int wertin, wertmin = 2500, wertmax = 500; //Variablen Pulse-Messung
long Beginn, Ende; //Variablen Pulse-Messung
int Periode = 0;

int Program = 0; //0 = PWM-Messung, 1 = Stopuhr

//eigene Zeichen definieren
byte uuml[8] = {  B01010, B00000, B10001, B10001, B10001, B10011, B01101, B00000 };
byte lon[8] = {  B00000    , B11111, B11111, B11111, B11111, B11111, B11111, B00000 };
byte loff[8] = {  B00000, B11111, B10001, B10001, B10001, B10001, B11111, B00000 };

void setup()
{
  pinMode(Schalter, INPUT_PULLUP); //Programmschalter
  delay (100);

  //Schalter lesen und Variable Program setzen
  Program = digitalRead(Schalter);

  //Setup für beide Programme
  lcd.clear();
  lcd.begin(16, 2);

  //------------Modus PWM-------------
  if (Program == 1)
  {
    pinMode(Signal, INPUT); //definiert Eingang
    lcd.createChar(0, uuml); //erzeugt ü
  }

  //------------Modus Uhr-------------
  if (Program == 0)
  {
    pinMode(Sensor, INPUT_PULLUP); //Sensor
    pinMode(Laser, OUTPUT); //Laser
    pinMode(Gelb, OUTPUT); //gelbe LED  (Messung läuft)
    lcd.createChar(6, lon); //erzeugt eingeschaltet-Symbol
    lcd.createChar(7, loff); //erzeugt ausgeschaltet-Symbol
    lcd.setCursor(0, 0);
    lcd.print("00:00.0");
    lcd.setCursor(0, 1);
    lcd.print("00:00.0");
  }
}

void loop()
{
  //------------Modus PWM-------------Beginn
  if (Program == 1)
  {
    wertin = pulseIn(Signal, HIGH);                //PWM vom Empfänger messen
    Ende = millis();
    Periode = (Ende - Beginn);
    Beginn = millis();

    //Kalibrierung des Sensors
    if (wertin > 500 && wertin < 2500)
    {
      if (wertmin > wertin)
      {
        wertmin = wertin;
      }
      if (wertmax < wertin)
      {
        wertmax = wertin;
      }

      if (millis() - wait > 250)
      {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("in=");
        if (wertin > 999)
        {
          lcd.setCursor(3, 0);
        }
        else
        {
          lcd.setCursor(4, 0);
        }
        lcd.print(wertin);

        lcd.setCursor(0, 1);
        lcd.print("Wh=");
        lcd.setCursor(3, 1);
        lcd.print(Periode);
        lcd.setCursor(5, 1);
        lcd.print("ms");

        lcd.setCursor(7, 0);
        lcd.print("|min=");
        if (wertmin > 999)
        {
          lcd.setCursor(12, 0);
        }
        else
        {
          lcd.setCursor(13, 0);
        }
        lcd.print(wertmin);

        lcd.setCursor(7, 1);
        lcd.print("|max=");
        if (wertmax > 999)
        {
          lcd.setCursor(12, 1);
        }
        else
        {
          lcd.setCursor(13, 1);
        }
        lcd.print(wertmax);

        wait = millis();
      }
    }
    else
    {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Signal pr");
      lcd.write((byte)0);
      lcd.print("fen,");
      lcd.setCursor(0, 1);
      lcd.print("Werte unstimmig.");
      delay(250);
    }
  }
  //------------Modus PWM-------------Ende

  //------------Modus Uhr-------------Beginn
  if (Program == 0)
  {
    if (millis() > 2500)
    {
      digitalWrite(Laser, HIGH);
    }

    //Lichtschranke lesen
    P1 = analogRead(Sensor);

    //Kalibrierung
    if (millis() < 5000)
    {
      //min- max-Werte für Kalibrierung ermitteln
      if (P1min > P1)
      {
        P1min = P1;
      }
      if (P1max < P1)
      {
        P1max = P1;
      }
    }
    else
    {
      P1 = constrain(P1, P1min, P1max);
    }

    //Mittelwert als Schwellwert berechnen
    schwellwert = (P1min + P1max) / 2;

    // Info Lichtschranke im Display zeigen
    if (P1 < schwellwert)
    {
      lcd.setCursor(8, 1);
      lcd.write((byte)6);
    }
    else
    {
      lcd.setCursor(8, 1);
      lcd.write((byte)7);
    }

    // Graph der Lichtschranke
    P1graph = map (P1, P1min, P1max, 19, 1);
    lbg.drawValue( P1graph, 19);

    //Sperrzeit nach Auslösung der Lichtschranke
    if (millis() - wait > 5000)
    {
      lcd.setCursor(15, 1);
      lcd.write((byte)6);
    }
    else
    {
      lcd.setCursor(15, 1);
      lcd.write((byte)7);
    }

    //wenn Lichtschranke unterbricht
    if (P1 > schwellwert)
    {
      if (Uhr == 1 && millis() - wait > 5000)
      {
        Uhr = 2;
      }
      else
      {
        if (Uhr == 2 && millis() - wait > 5000)
        {
          Uhr = 1;
        }
      }
      wait = millis();
    }

    if (Uhr == 1)
    {
      digitalWrite(Gelb, LOW);

      //Uhr wartet

      startzeit = millis();
      if (millis() - wait > 5000)
      {
        //Uhr zeigt Zeit an
        minute = 0;
        sekunde = 0;
        zehntelsekunde_neu = 0;
        lcd.setCursor(0, 0);
        lcd.print("00:00.0");
        lcd.setCursor(0, 1);
        
        if (minutealt < 10) lcd.print("0"); //damit die Zahl immer zweistellig angezeigt wird
        lcd.print(minutealt);
        lcd.print(":");
        if (sekundealt < 10) lcd.print("0"); //damit die Zahl immer zweistellig angezeigt wird
        lcd.print(sekundealt);
        lcd.print(".");
        lcd.print(zehntelsekundealt);


        lcd.setCursor(8, 0);
        lcd.print("Bereit   ");
      }
      else
      {
        lcd.setCursor(8, 0);
        lcd.print("Warten ");

        if (millis() - wait > 0 && millis() - wait < 10)
        {
          lcd.setCursor(15, 0);
          lcd.print("!");
        }
        if (millis() - wait > 10 && millis() - wait < 1000)
        {
          lcd.setCursor(15, 0);
          lcd.print("5");
        }
        if (millis() - wait > 999 && millis() - wait < 2000)
        {
          lcd.setCursor(15, 0);
          lcd.print("4");
        }
        if (millis() - wait > 1999 && millis() - wait < 3000)
        {
          lcd.setCursor(15, 0);
          lcd.print("3");
        }
        if (millis() - wait > 2999 && millis() - wait < 4000)
        {
          lcd.setCursor(15, 0);
          lcd.print("2");
        }
        if (millis() - wait > 3999 && millis() - wait < 5000)
        {
          lcd.setCursor(15, 0);
          lcd.print("1");
        }
      }
    }

    if (Uhr == 2)
    {
      digitalWrite(Gelb, HIGH);
      lcd.setCursor(8, 0);
      lcd.print("Messung!");
      lcd.setCursor(0, 0);
      laufzeit = millis() - startzeit;
      zehntelsekunde_neu = (laufzeit / 100) % 10; // Das %-Zeichen ist der Modulo-Operator

      // Zeit nur ausgeben, wenn Zehntelsekunde sich verändert hat
      if (zehntelsekunde_neu != zehntelsekunde_alt)
      {
        if (zehntelsekunde_neu == 0)
        {
          sekunde++;
          if (laufzeit < 50)
          {
            sekunde = 0;
          }
          if (sekunde == 60)
          {
            sekunde = 0;
            minute++;
            if (minute == 60)
            {
              minute = 0;
            }
          }
        }

        if (minute < 10) lcd.print("0"); //damit die Zahl immer zweistellig angezeigt wird
        lcd.print(minute);
        lcd.print(":");
        if (sekunde < 10) lcd.print("0"); //damit die Zahl immer zweistellig angezeigt wird
        lcd.print(sekunde);
        lcd.print(".");
        lcd.print(zehntelsekunde_neu);
        zehntelsekunde_alt = zehntelsekunde_neu;
      }
      minutealt = minute;
      sekundealt = sekunde;
      zehntelsekundealt = zehntelsekunde_neu;
    }
  }
  //------------Modus Uhr-------------Ende
}
   


Angehängte Datei(en) Thumbnail(s)
   
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.01.2016, 06:55
Beitrag #2
RE: Meine Projekte - für RC-Modelle
Änderung des Programmes für Neopixel-LED und Anpassung an ein Modell.
Da bei diesem Projekt Stripes mit je 8 LED für vorn verwendet wurden, aber nur je 6 sichtbar sind, mussten die versteckten LED deaktiviert werden.
Code:
//Lichtsteuerung über Gaskanal und Schaltkanal 16 Neopixel-LED (12 vorn / 8 hinten) für Voltec Fighter
//by dqb312

int Gas;                    //Wert des Eingangssignale
int Gas0;                   //alter Gaswert
const int Gasup = 10;       //Schwellwert Gas positiv
const int Gasdown = -10;    //Schwellwert Gas negtiv
const int Schaltup = 1750;  //Schwellwert Schaltkanal Licht an
const int Brems = 13;       //Wertänderung für Bremslicht an
const int Nobrems = 3;      //Wertänderung für Bremslicht aus
int Schalt;                 //Wert des Schaltkanals
int SF = 0;                 //Servovariable
long An = 0;                //Fernsteuerung aus?
long Waitmillis;            //Wartezeit für Zusatzscheinwerfer aus
const long Wait = 5000;     //Variable für Wartezeit
long Blinkmillis;           //Variable für Blinker
boolean Value = LOW;        //Startwert der LED

int Blinker = 0;
int Bremslicht = 1;
int Licht = 0;
int Fernlicht = 0;
int Backlight = 0;


#include <Adafruit_NeoPixel.h>

//Neopixel initialisieren und zuweisen
#define PIN 4
#define NUMofPIXELS 24

// vorn links
// 0 verdeckt und nicht belegt
const int BlVL = 1;   //Blinker, Standlicht vorn links
const int ZsVL = 2;   //Zusatzscheinwerfer vorn links
const int ZsVL2 = 3;  //Zusatzscheinwerfer vorn links
const int HsVL = 4;   //Hauptscheinwerfer vorn links
const int HsVL2 = 5;  //Hauptscheinwerfer vorn links
const int TfVL = 6;   //Tagfahrlicht vorn links
// 7 verdeckt und nicht belegt

//vorn rechts
// 8 verdeckt und nicht belegt
const int TfVR = 9;   //Tagfahrlicht vorn rechts
const int HsVR2 = 10; //Hauptscheinwerfer vorn rechts
const int HsVR = 11;  //Hauptscheinwerfer vorn rechts
const int ZsVR2 = 12; //Zusatzscheinwerfer vorn rechts
const int ZsVR = 13;  //Zusatzscheinwerfer vorn rechts
const int BlVR = 14;  //Blinker, Standlicht
// 15 verdeckt und nicht belegt

//hinten rechts
const int BlHR = 16;   //Blinker hinten rechts
const int RlHR = 17;   //Rücklicht hinten rechts
const int BrHR = 18;  //Rücklicht, Bremslicht hinten rechts
const int RfHR = 19;  //Rückfahrtscheinwerfer hinten rechts

//hinten links
const int RfHL = 20;  //Rückfahrtscheinwerfer hinten links
const int BrHL = 21;  //Rücklicht, Bremslicht hinten links
const int RlHL = 22;  //Rücklicht hinten links
const int BlHL = 23;  //Blinker hinten links

//Auswahl der verschiedenen Ansteuer-Typen - nur eine Zeile aktiv lassen!
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMofPIXELS, PIN, NEO_GRB + NEO_KHZ800);  //bei Verwendung von SMD mit GrünRotBlau-Ansteuerung
//Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMofPIXELS, PIN, NEO_RGB + NEO_KHZ800);  //bei Verwendung von 5mm bedrahtet mit RotGrünBlau-Ansteuerung

//Einstellungen Farben
const int aus[] = { 0, 0, 0};
const int hellweiss[] = { 255, 255, 255};
const int weiss [] = { 65, 65, 65};
const int dunkelweiss[] = { 15, 15, 15};
const int blau[] = { 0, 0, 75};
const int hellrot[] = { 255, 0, 0};
const int dunkelrot[] = { 20, 0, 0};
const int orange[] = { 100, 50, 0};
const int dunkelorange[] = { 8, 4, 0};
const int gruen[] = { 0, 75, 0};

void setup()
{
  pixels.setBrightness(255);   //Globale Helligkeit
  pixels.begin();              //initializes the NeoPixel library.
  
  pinMode(1, INPUT);   //Gas vom Empfänger
  pinMode(2, INPUT);   //Schaltkanal

//verdeckte LED abschalten  
  pixels.setPixelColor(0, pixels.Color(aus[0], aus[1], aus[2]));
  pixels.setPixelColor(7, pixels.Color(aus[0], aus[1], aus[2]));
  pixels.setPixelColor(8, pixels.Color(aus[0], aus[1], aus[2]));
  pixels.setPixelColor(15, pixels.Color(aus[0], aus[1], aus[2]));

}

void loop()
{
  Gas0 = Gas;
  An = millis();
  Gas = pulseIn(1, HIGH);       //PWM vom Gaskanal messen
  Schalt = pulseIn(2, HIGH);    //PWM vom Schaltkanal messen
  An = millis() - An;

  Gas = map(Gas, 1000, 2000, -100, 100);   //Arbeitswerte Gas erzeugen


  if (Schalt > Schaltup)
  {
    Schalt = 0;
  }
  else
  {
    if (Schalt < (Schaltup - 1))
    {
      Schalt = 1;
    }
  }
  if (An > 500)   //wenn die Funke aus ist
  {
    pixels.setPixelColor(TfVL, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(BlVL, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(HsVL, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(HsVL2, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(ZsVL, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(ZsVL2, pixels.Color(gruen[0], gruen[1], gruen[2]));
    
    pixels.setPixelColor(TfVR, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(BlVR, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(HsVR, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(HsVR2, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(ZsVR, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(ZsVR2, pixels.Color(gruen[0], gruen[1], gruen[2]));
    
    pixels.setPixelColor(BlHR, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(RlHR, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(BrHR, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(RfHR, pixels.Color(blau[0], blau[1], blau[2]));
    
    pixels.setPixelColor(RfHL, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(BrHL, pixels.Color(blau[0], blau[1], blau[2]));
    pixels.setPixelColor(RlHL, pixels.Color(gruen[0], gruen[1], gruen[2]));
    pixels.setPixelColor(BlHL, pixels.Color(gruen[0], gruen[1], gruen[2]));
  
  }
  else    //wenn die Funke an ist
  {
    //bei Stillstand Zusatzscheinwerfer nach 5 Sekunden aus und Warnblinker an
    if (Gas < Gasup && Gas > Gasdown)
    {
      if (millis() - Waitmillis > Wait)      //ausführen, wenn Timer für Wartezeit um ist
      {
        Fernlicht = 0;

        if (millis() - Blinkmillis > 500)
        {
          Blinkmillis = millis();   //aktuelle Zeit abspeichern
          Value = !Value;

          if (Value == true)
          {
            Blinker = 1;
          }
          else
          {
            Blinker = 0;
          }
        }
      }
    }
    else
    {
      Waitmillis = millis();
      Blinker = 0;
      Fernlicht = 0;

      //Rück- / Bremslicht

      //Bremslicht vorwärts verzögert
      if (Gas >= Gasup && Gas0 - Gas > Brems)
      {
        Bremslicht = 1;
      }
      if (Gas >= Gasup && Gas0 - Gas < Nobrems)
      {
        Bremslicht = 0;
      }
      //Bremslicht rückwärts verzögert
      if (Gas <= Gasdown && Gas - Gas0 > Brems)
      {
        Bremslicht = 1;
      }
      if (Gas <= Gasdown && Gas - Gas0 < Nobrems)
      {
        Bremslicht = 0;
      }
      //Bremslicht im Stand
      if (Gas > Gasdown && Gas < Gasup)
      {
        Bremslicht = 1;
      }

    }
    //Rückfahrtscheinwerfer steuern / Zusatzscheinwerfer aus
    if (Gas < Gasdown)
    {
      Backlight = 1;
      Fernlicht = 0;
    }
    else
    {
      Backlight = 0;
    }
    //Scheinwerfer und Tagfahrlicht steuern
    if (Schalt >= 1)
    {
      Licht = 1;
    }
    else
    {
      Licht = 0;
    }
    //Zusatzscheinwerfer steuern
    if (Gas > Gasup && Schalt >= 1)
    {
      Fernlicht = 1;
    }

    //Bremslicht im Stand
    if (millis() - Waitmillis < Wait && Gas < Gasup && Gas > Gasdown)
    {
      Bremslicht = 1;
    }

    //alles aus, Tagfahrlicht an
    pixels.setPixelColor(TfVL, pixels.Color(weiss[0], weiss[1], weiss[2]));
    pixels.setPixelColor(BlVL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(HsVL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(HsVL2, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(ZsVL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(ZsVL2, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(TfVR, pixels.Color(weiss[0], weiss[1], weiss[2]));
    pixels.setPixelColor(BlVR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(HsVR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(HsVR2, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(ZsVR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(ZsVR2, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(BlHL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(RlHL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(BrHL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(RfHL, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(BlHR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(RlHR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(BrHR, pixels.Color(aus[0], aus[1], aus[2]));
    pixels.setPixelColor(RfHR, pixels.Color(aus[0], aus[1], aus[2]));

    //Licht steuern
    if (Licht == 1)
    {
      pixels.setPixelColor(TfVL, pixels.Color(dunkelweiss[0], dunkelweiss[1], dunkelweiss[2]));
      pixels.setPixelColor(HsVL, pixels.Color(weiss[0], weiss[1], weiss[2]));
      pixels.setPixelColor(HsVL2, pixels.Color(weiss[0], weiss[1], weiss[2]));

      pixels.setPixelColor(ZsVL, pixels.Color(dunkelweiss[0], dunkelweiss[1], dunkelweiss[2]));
      pixels.setPixelColor(ZsVL2, pixels.Color(dunkelweiss[0], dunkelweiss[1], dunkelweiss[2]));
      pixels.setPixelColor(ZsVR, pixels.Color(dunkelweiss[0], dunkelweiss[1], dunkelweiss[2]));
      pixels.setPixelColor(ZsVR2, pixels.Color(dunkelweiss[0], dunkelweiss[1], dunkelweiss[2]));
      
      pixels.setPixelColor(HsVR, pixels.Color(weiss[0], weiss[1], weiss[2]));
      pixels.setPixelColor(HsVR2, pixels.Color(weiss[0], weiss[1], weiss[2]));
      pixels.setPixelColor(TfVR, pixels.Color(dunkelweiss[0], dunkelweiss[1], dunkelweiss[2]));

      pixels.setPixelColor(BlVL, pixels.Color(dunkelorange[0], dunkelorange[1], dunkelorange[2]));
      pixels.setPixelColor(BlVR, pixels.Color(dunkelorange[0], dunkelorange[1], dunkelorange[2]));
      pixels.setPixelColor(BlHR, pixels.Color(dunkelorange[0], dunkelorange[1], dunkelorange[2]));
      pixels.setPixelColor(BlHL, pixels.Color(dunkelorange[0], dunkelorange[1], dunkelorange[2]));
      
      pixels.setPixelColor(RlHR, pixels.Color(dunkelrot[0], dunkelrot[1], dunkelrot[2]));
      pixels.setPixelColor(BrHR, pixels.Color(dunkelrot[0], dunkelrot[1], dunkelrot[2]));
      pixels.setPixelColor(BrHL, pixels.Color(dunkelrot[0], dunkelrot[1], dunkelrot[2]));
      pixels.setPixelColor(RlHL, pixels.Color(dunkelrot[0], dunkelrot[1], dunkelrot[2]));
      
    }

    //Fernlicht steuern
    if (Fernlicht == 1)
    {
      pixels.setPixelColor(HsVL, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(HsVL2, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(ZsVL, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(ZsVL2, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(ZsVR, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(ZsVR2, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(HsVR, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(HsVR2, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
    }

    //wenn Bremslicht an
    if (Bremslicht == 1)
    {
      pixels.setPixelColor(BrHR, pixels.Color(hellrot[0], hellrot[1], hellrot[2]));
      pixels.setPixelColor(BrHL, pixels.Color(hellrot[0], hellrot[1], hellrot[2]));
    }

    //Rückfahrtscheinwerfer
    if (Backlight == 1)
    {
      pixels.setPixelColor(RfHR, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
      pixels.setPixelColor(RfHL, pixels.Color(hellweiss[0], hellweiss[1], hellweiss[2]));
    }

    //wenn Blinker an
    if (Blinker == 1 )
    {
      pixels.setPixelColor(BlVL, pixels.Color(orange[0], orange[1], orange[2]));
      pixels.setPixelColor(BlVR, pixels.Color(orange[0], orange[1], orange[2]));
      pixels.setPixelColor(BlHR, pixels.Color(orange[0], orange[1], orange[2]));
      pixels.setPixelColor(BlHL, pixels.Color(orange[0], orange[1], orange[2]));
    }
  } //Ende Funke an

  pixels.show();
}
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.04.2016, 18:16 (Dieser Beitrag wurde zuletzt bearbeitet: 03.04.2016 18:17 von dqb312.)
Beitrag #3
RE: Meine Projekte - für RC-Modelle
Die ersten 3 Modelle haben nun eine Lichtsteuerung mit Attiny85 und WS2812- bzw. APA106-LED.
Ein Video ist auf Youtube - https://www.youtube.com/results?search_query=dqb312 - VoltecFighter zu finden.
Fotos zu den Modellen auf meiner Webseite in der Galerie unter http://www.barney-web.de/galerie .
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.04.2016, 19:10
Beitrag #4
RE: Meine Projekte - für RC-Modelle
Das ist ein interessantes Projekt.
In den Schaltbildern ist mir dabei aufgefallen, das du hier keinerlei Abblockkondensatoren verwendest.
Du brauchst an jedem Spannungsanschluss am Atmega jeweils einen 100 nF Keramikkondensator. Der unterdrückt Störungen auf der Betriebsspannung.
Diese Kondensatoren findest du auch auf den originalen Arduinos.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.04.2016, 04:27
Beitrag #5
RE: Meine Projekte - für RC-Modelle
Hallo Hotsystems,

beim Drifter musste ich trotz Brushless-Antrieb Abblockkondensatoren und Stützkondensatoren nachrüsten, da durch die Motorleistung Störungen in der Versorgungsspannung auftreten. Bei den Crawlern mit Atmega328P-PU ist interessanterweise noch keine Störung aufgetreten, das liegt warscheinlich u.a. an den sauber arbeitenden Brushlessantrieb, einem bereits sehr stabil arbeitendnen BEC und dass der Stützkondensator (Bild ganz oben auf der Platine rechts - die sollte beim RC-Car eh immer an allen zusätzlichen Schaltungen hängen, daher habe ich sie nicht extra im Schaltbbild dargestellt) das schon mit erledigt. Bei den Attiny´s mit WS2812- / APA106-LED sind in allen Fahrzeugecken Stützkondensatoren verbaut, sonst kommen bei den hinteren LED Störungen an.

Gruß Rainer
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.04.2016, 09:26 (Dieser Beitrag wurde zuletzt bearbeitet: 04.04.2016 09:30 von hotsystems.)
Beitrag #6
RE: Meine Projekte - für RC-Modelle
(04.04.2016 04:27)dqb312 schrieb:  Hallo Hotsystems,

beim Drifter musste ich trotz Brushless-Antrieb Abblockkondensatoren und Stützkondensatoren nachrüsten, da durch die Motorleistung Störungen in der Versorgungsspannung auftreten. Bei den Crawlern mit Atmega328P-PU ist interessanterweise noch keine Störung aufgetreten, das liegt warscheinlich u.a. an den sauber arbeitenden Brushlessantrieb, einem bereits sehr stabil arbeitendnen BEC und dass der Stützkondensator (Bild ganz oben auf der Platine rechts - die sollte beim RC-Car eh immer an allen zusätzlichen Schaltungen hängen, daher habe ich sie nicht extra im Schaltbbild dargestellt) das schon mit erledigt. Bei den Attiny´s mit WS2812- / APA106-LED sind in allen Fahrzeugecken Stützkondensatoren verbaut, sonst kommen bei den hinteren LED Störungen an.

Gruß Rainer

Auch wenn es nicht nötig erscheint, solltest du dich an die "minimal Schaltung" gewöhnen. Damit werden Störungen direkt am Atmega unterdrückt.
Atmega-StandAllone

Sind längere Leitungen am Board angeschlossen, können diese wiederum Störungen senden bzw. empfangen. Dies kann nur durch die Abblockkondensatoren direkt am Atmega verhindert werden. Da es sich hier meist um höher frequente Störungen handelt, helfen Elkos hier nicht.

Dies gilt übrigens generell für alle IC's auf einer Platine. Ein Keramik 100 nF an VCC und GND und die "Probleme" werden weniger. Wink
Deine Kondensatoren an den Motoren helfen da nicht.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.04.2016, 18:20
Beitrag #7
RE: Meine Projekte - für RC-Modelle
Ich danke dir für den Hinweis und vor allem für die Erläuterung. Ich werden mal meine Grabbelkiste nach passenden Kondensatoren durchsuchen und die Schaltungen ergänzen.

Gruß Rainer
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.04.2016, 21:11
Beitrag #8
RE: Meine Projekte - für RC-Modelle
Alles klar, es freut mich, wenn ich dir mit Informationen helfen konnte.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Meine Freunde und ihre Ideen Gandalf 2 1.333 25.05.2016 18:25
Letzter Beitrag: SkobyMobil
  6 Projekte fuer Arduino MICRO, UNO, MEGA ... andreas002 20 9.804 28.11.2015 18:34
Letzter Beitrag: andreas002
  Meine Arduino/Attiny-Projekte Retian 8 3.825 25.11.2015 23:42
Letzter Beitrag: hotsystems
  Kleinere Projekte speedax 5 2.237 15.10.2015 22:29
Letzter Beitrag: hotsystems
  Meine Lampe flackert... Thorsten Pferdekämper 3 1.384 26.07.2015 17:21
Letzter Beitrag: Thorsten Pferdekämper
  Arduino-Projekte von dqb312 (Modellbau) dqb312 4 4.167 19.04.2015 17:08
Letzter Beitrag: dqb312
  Vorstellung / Projekte mschumi 1 2.221 31.07.2013 10:14
Letzter Beitrag: NoWay

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste