Der Prototyp

Das Auto soll eine Beleuchtung haben und beim Abbiegen blinken können. Dazu braucht es etwas Elektronik, die man nicht so einfach fertig kaufen kann.

Das normale Licht brennt, sobald der Strom eingeschaltet wird. Es besteht aus zwei weissen Lampen vorne und zwei roten Rücklichtern.

Wenn das Auto abbiegt, blinken links oder rechts je zwei gelbe Lampen.

Ein erster Prototyp wurde mit einem Arduino UNO realisiert. Die LED's wurden in eine Kartonschachtel eingebaut. Mit den gelben Knöpfen konnte Abbiegen und Bremsen simuliert werden. Der Prototyp eignete sich auch gut zur Entwicklung der Software.

Stacks Image 47033

Der definitive Aufbau

Der Arduino UNO wäre etwas zu gross für diese einfache Schaltung. Deshalb habe ich den notwendigen Teil der Schaltung mit einem ATtiny 84A realisiert. Ein Spannungsregler (7805) mit den beiden Kondensatoren sorgt für die notwendige 5V - Spannung.

Stacks Image 37739

Die Hardware

Die Beleuchtung wird mit Leuchtdioden realisiert.

Das Licht vorne wird durch zwei weisse LED's erzeugt. Die beiden Dioden sind parallel geschaltet und besitzen einen gemeinsamen Vorwiderstand.

Hinten am Wagen befinden sich zwei rote LED's. Auch sie haben einen gemeinsamen Vorwiderstand. Die Software lässt sie nur mit halber Kraft leuchten. Die volle Leuchtstärke erhalten sie, wenn gebremst wird. Diese Bremslichtfunktion wurde aber im Modellauto nicht verwendet.

Die vorderen und hinteren Lampen sind aktiv, sobald der Strom eigeschaltet wird.

Links und rechts sind je zwei gelbe LED's zu finden, die jeweils beim Richtungswechsel blinken. Auch hier haben wir eine paarweise Parallelschaltung mit gemeinsamem Vorwiderstand.

Stacks Image 47057

Die Spannungsregelung ist mit einem LM7805 realisiert. Dieser ist etwas überdimmensioniert, aber es stand gerade kein kleinerer Regler zur Verfügung.

Stacks Image 47075

Der Blinkerschalter gibt Kontakt, wenn das Fahrzeug ganz nach links oder ganz nach rechts gesteuert wird. Die Kontakte sind mit dem ATtiny verbunden und veranlassen diesen zu blinken.

Stacks Image 47071

Der Prozessor wird durch das untenstehende Programm gesteuert und hat folgende Funktionen:

  • Wenn A1 mit Masse verbunden wird, gibt D10 ein Blinksignal aus (blinken links).
  • Wenn A2 mit Masse verbunden wird, gibt D9 ein Blinksignal aus (blinken rechts).
  • Wenn A3 mit Masse verbunden wird, gibt der PWM-Ausgang D8 ein stärkeres Signal aus (Bremslicht).

Stacks Image 47079

Die Software

Der Sketch

Der ATtiny ist softwaremässig dem Arduino UNO sehr ähnlich. Er kann in der normalen Arduino - IDE programmiert werden.

Das Blinkintervall wird selbstverständlich ohne delay() erzeugt. Die Funktion arbeitet mit millis(). Dabei wende ich dieselbe Technik an, die ich im Video Programmieren 1 vorgestellt habe.

// Blinker und Bremslich für Modelauto
// März/April 2016 
// Der Hobbyelektroniker (http://www.hobbyelektroniker.ch)
// This code is in the public domain
//
// Zur Programmierung wurde die Version 1.6.7 verwendet
// ATtiny - Support mit https://github.com/damellis/attiny
//
const int hintenPin = 8;
const int linksPin = 10;
const int rechtsPin = 9;
const int bremsInputPin = 3;
const int rechtsInputPin = 2;
const int linksInputPin = 1;

boolean bremsen;
boolean blinkRechts;
boolean blinkLinks;


void setup() {
  pinMode(linksPin,OUTPUT);
  pinMode(rechtsPin,OUTPUT);
  pinMode(bremsInputPin,INPUT_PULLUP);
  pinMode(rechtsInputPin,INPUT_PULLUP);
  pinMode(linksInputPin,INPUT_PULLUP);
}

void check() {
  bremsen = (!digitalRead(bremsInputPin));
  blinkRechts = (!digitalRead(rechtsInputPin));
  blinkLinks = (!digitalRead(linksInputPin)); 
}

void bremslicht() {
  if (bremsen) analogWrite(hintenPin,255); else analogWrite(hintenPin,63);
}

void blinken() {
  unsigned long currentMillis = millis();
  static unsigned long previousMillis = 0;
  if (currentMillis > previousMillis + 333) {
    previousMillis = currentMillis;
    if (blinkRechts) digitalWrite(rechtsPin,!digitalRead(rechtsPin)); else digitalWrite(rechtsPin,LOW); 
    if (blinkLinks) digitalWrite(linksPin,!digitalRead(linksPin)); else digitalWrite(linksPin,LOW); 
  }
}

void loop() {
  check();
  bremslicht();
  blinken();
}