Vom Breadboard zum Produkt

Wenn man ein Projekt auf dem Breadboard fertig gestellt hat, stellt sich oft die Frage, wie man daraus ein Produkt macht. Vielleicht möchte man nicht dauernd ein neues und teures Arduino-Board verbauen und natürlich sind Schaltungen auf Breadboards nicht besonders stabil. Wenn man auf den USB-Port verzichten kann, kann man einfach den Mikrocontroller des Arduinos allein verwenden.

Atmega328pu Arduino Mikrocontroller

Mikrocontroller Atmega328-PU

Hier gibt es wieder viele Möglichkeiten, von denen ich Euch eine an Hand eines Beispiels vorstellen möchte, das ich für Fritzing.org entwickelt hatte.

Bei dem Projekt handelt es sich um ein kleines Party-Gimmick: das Schnaps-O-Meter.

Schnapsometer

Schnapsometer im Einsatz

Es besteht im Grunde aus einem Arduino, einem Ethanol-Sensor und einem Streifen adressierbarer RGB-LEDs (NeoPixel). Man kann hineinpusten und je mehr Alkohol sich in der Atemluft befindet, desto mehr LEDs leuchten auf. Im Grunde ist es also eine Art Hau-Den-Lukas mit Alkohol.

Schnapsometer Breadboard Schaltung

Schnapsometer auf dem Breadboard (Made with Fritzing)

Ist das Projekt auf dem Breadboard fertig, kann man den Schaltplan per Layout-Editor in ein Platinenlayout umwandeln. Ich benutze dafür Fritzing. Es ist auch für Nicht-Elektroniker geeignet. Alternativ könnte man z.B. Eagle verwenden.

Schnapsometer Platine

Schnapsometer Platinenentwurf (Made with Fritzing)

Als erstes baut man die Schaltung auf dem Breadboard nach, dann wechselt man in die Platinenansicht und arrangiert alle Bauteile. Nun müssen die Kupferbahnen angelegt werden. Ist das alles fertig, kann man einen Design Rule Check durchführen und die Platine entweder als Gerber-Daten exportieren oder direkt über Fritzing Fab bestellen.

Platine-Fritzingfab

Fertige Platine mit Fritzing Fab produziert

Sind die Platinen geliefert, muss man sich noch mit Bauteilen bestücken. An der Stelle des Mikrocontrollers sollte ein IC-Sockel eingesetzt werden.

Bestückte Platine

Bestückte Platine

Den Mikrocontroller selbst kann man in ein Arduino-Board einsetzen und das gewünschte Programm darauf hochladen. Vorher muss allerdings der Arduino-Bootloader installiert werden. Wie das geht, hab ich in diesem Tutorial beschrieben: Arduino Bootloader auf ATMEGA Chip übertragen. Nun kann der Chip aus dem Arduino auf die eigene Platine gesteckt werden. Das Programm läuft, sobald die Platine mit Strom versorgt wird.

In meinem Beispiel füge ich nur noch einen Kondensator am Netzteil und einen 470Ω Widerstand an den Neopixeln ein. Fertig. Fehlt nur noch die passende Kickstarter Kampagne ;-)

Arduino Bootloader auf ATMEGA Chip übertragen

Der Arduino Bootloader ist so etwas wie das Betriebssystem auf dem Chip. Es wird benötigt, um z.B. einen ATMEGA328 IC(z.B. Arduino UNO) oder den älteren ATMEGA168 IC auf einem Arduino-Board zu nutzen.

Atmega328pu Arduino Mikrocontroller

Mikrocontroller Atmega328-PU

Ich zeige hier einen von vielen möglichen Wegen auf, um den Arduino-Bootloader auf einen neuen ATMEGA328 IC zu brennen (zu übertragen).

Dafür wird ein Arduino-UNO-Board (R3) und ein so genannter In System Programmer (ISP) benötigt. Ich verwende den AVR ISP MK2. Ob sich die Investition lohnt muss sich natürlich jeder selbst überlegen. Bei mir war das auf jeden Fall so. Das Gerät ist sehr einfach zu bedienen.

Als erstes tauscht man den originalen ATMEGA328 IC auf dem Arduino gegen den aus, den man brennen will. Den Chip aus dem Sockel zu heben kann etwas schwierig sein. Am besten, man hebelt ihn Schrittweise abwechselnd von links und rechts vorsichtig heraus. Beim Einsetzen des neuen Chips muss auf die richtige Ausrichtung geachtet werden. Sowohl Sockel als auch Chip haben eine sichtbare Aussparung an einer der schmalen Seiten.

ISP Arduino Verbindung

Nun kann man das Kabel des AVR ISP MK2 auf die ISP-Header stecken. Die rote Markierung des Flachbandkabels zeigt zu den digitalen Pins. Sowohl das Arduino als auch der ISP werden nun via USB-Kabel mit dem Computer verbunden.

ISP Arduino Verbindung

Unter Werkzeuge>Board muss nun das Arduino UNO ausgewählt werden. Dann wird unter Werkzeuge>Programmer der AVRISP mkII ausgewählt. Zum Schluss muss man nur noch unter Werkzeuge auf Bootloader brennen klicken.

Arduino Bootloader

Das Übertragen des Bootloaders kann ein paar Minuten dauern. Nach Abschluss kann man die USB-Kabel trennen und den ISP vom Arduino abschließen.

Wenn man jetzt ein Beispielprogramm z.B. Blink auf das Arduino überträgt, sollte das zum gewohnt Resultat führen.

Wie steuert man einen Motorfader mit Arduino?

Motorfader sind im Grunde Potentiometer mit eingebautem Motor. Sie lassen sich also per Software in eine bestimmte Position bewegen. Einsatz finden sie z.B. in professionellen Mischpulten, wo sie sich per Computer in voreingestellte Konfigurationen fahren lassen.

Sie sind auf jeden Fall ziemlich coole Bauteile und bestens geeignet, um per Arduino gesteuert zu werden.

Schaltung

Motorfader Arduino Schaltung

Die Schaltung besteht aus einem Motorcontroller (L293D), dem Motorfader (dargestellt als Fader und Motor), dem Arduino und einem Button.

Der Button ist optional und wird nur für dieses Beispiel benötigt. Er ist mit dem GND und dem digitalen Pin 8 verbunden. Da für dieses Beispiel ein interner Pullup-Widerstand verwendet wird (pinMode(button, INPUT_PULLUP);) wird kein Hardware-Pullup-Widerstand benötigt.

Der Motorcontroller ist mit den Pins 5 und 6 verbunden. Hier wird über die Drehrichtung des Motors entschieden. Der Enable Pin ist mit dem digitalen Pin 3 verbunden. Über ihn wird der Motor an- und ausgeschaltet. Weitere Informationen finden sich hier: …

Der Fader wird einfach an Plus, Minus und einen analogen Input geschaltet.

Code

Hierbei handelt es sich nur um einen Besipielcode. Wir wollen fünf verschiedene Positionen anfahren. Da das Potentiometer via Analog In Werte von 0 bis 1023 ausgeben kann, müssen auch die Positionswerte in diesem Wertebereich liegen.

// pins
int motorA = 5;
int motorB = 6;
int enablePin = 3;
int button = 8;
int poti = 0;

// config
int target[] = {800, 100, 1000, 0, 500};
int targetsTotal = 5;
int theThreshold = 30;
int movingTimeout = 300;
long myTime = 0;

// programming stuff
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int currentTarget = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(enablePin, OUTPUT);
  pinMode(button, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {


  buttonState = digitalRead(button);

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      currentTarget++;
      myTime = millis();
      if (currentTarget > targetsTotal - 1) currentTarget = 0;
    }
  }

  if (myTime + movingTimeout > millis()) {
    digitalWrite(enablePin, HIGH);
    if (analogRead(poti) > (target[currentTarget] + theThreshold) ) {
      analogWrite(motorA, 255);
      analogWrite(motorB, 0);
    } else if (analogRead(poti) < (target[currentTarget] - theThreshold) ) {
      analogWrite(motorA, 0);
      analogWrite(motorB, 255);
    } else {
      analogWrite(motorA, 0);
      analogWrite(motorB, 0);
    }
  } else {
    digitalWrite(enablePin, LOW);
  }

  lastButtonState = buttonState;
  //Serial.println(analogRead(poti));
}

Code Erklärung

int target[] = {800, 100, 1000, 0, 500};

Der Wechsel von einer zur anderen erfolgt über das Drücken des Buttons:

buttonState = digitalRead(button);

  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      currentTarget++;
      myTime = millis();
      if (currentTarget > targetsTotal - 1) currentTarget = 0;
    }
  }

Der Wechsel selbst dauert natürlich etwas, da sich der Motor ja von der einen in die andere Position bewegen muss. Das lösen wir mit einem einfachen Timeout:

  if (myTime + movingTimeout > millis()) {

Jetzt fragen wir, ob der Wert des Faders größer, kleiner oder im Zielbereich liegt.

    if (analogRead(poti) > (target[currentTarget] + theThreshold) ) {
      analogWrite(motorA, 255);
      analogWrite(motorB, 0);
    } else if (analogRead(poti) < (target[currentTarget] - theThreshold) ) {
      analogWrite(motorA, 0);
      analogWrite(motorB, 255);
    } else {
      analogWrite(motorA, 0);
      analogWrite(motorB, 0);
    }

Sollte der Motorfader jetzt hin und herzucken, ist der Zielbereich zu eng gewählt und sollte erweitert werden.

int theThreshold = 30;

Anmerkung

Auf jeden Fall sollte dieser Sketch vorsichtig getestet werden. Es ist gut möglich, dass der Motor anders herum gepolt werden muss, weil er sich falsch herum dreht. Das lässt sich am einfachsten durch das Tauschen der Kabel des Motors realisieren.

Bezugsquellen

Motorfader kann man z.B. hier bei Amazon kaufen: Motorfader ALPS 10K

H-Bridge L293D

Video

Hier habe ich mal ein Videotutorial zum Motorfader gemacht

Viele LEDs mit Arduino steuern – WS2812

Wenn man LEDs mit Arduino steuern möchte, stößt man schnell an die Grenzen der verfügbaren Kanäle. Wenn es RGB-LEDs sein sollen, geht das sogar noch schneller. Das Arduino UNO kann direkt nur zwei RGB-LEDs steuern, da diese jeweils drei analoge Kanäle brauchen (rot, grün, blau).

Abhilfe schaffen da LEDs mit integrierten Controllern, z.B. dem WS2812. Diese LEDs gibt es in unterschiedlichen Bauformen, von der 5mm LED bis zum LED-Streifen. Adafruit hat eine eigene Serie dazu entwickelt, die NeoPixel heißt.

LEDs

Arduino WS2812 LED 5mm
Jede LED mit WS2812 Controller verfügt über vier Anschlüsse. 5V+, GND, Din und Dout. Din steht für Data In, DO für Data Out. Bei den 5mm LEDs in diesem Tutorial ist die Pin-Belegung Din, 5V+, GND (längstes Beinchen), Dout.

Stromversorgung

WS2812 Stromversorgung
Jede WS2812 LED benötigt bis zu 60mA. Es ist also ratsam, ein Netzteil zu verwenden. Dieses Netzteil sollte mit einem Elektrolyt-Kondensator (1000uF, 6,3V) unterstützt werden. Der GND des Netzteils und der GND des Arduinos müssen verbunden werden.

Datenanschluss

ws2812 Anschluss Arduino NeoPixel
Nun kann man einfach einen digitalen Kanal des Arduinos über einen Widerstand (300 – 500 Ohm) mit dem Din der ersten LED verbinden. Ihr Dout wird dann wiederum mit dem Din der nächsten LED verbunden usw. Der Widerstand ist nur vor der ersten LED nötig.

Code

Wir nutzen einfach die NeoPixel-Library von Adafruit. Man kann sie von hier (https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-installation) herunterladen und sie muss ins Arduinoverzeichnis in den Unterordner libraries kopiert werden. Das Verzeichnis muss von Adafruit_NeoPixel-master auf Adafruit_NeoPixel umbenannt werden. Startet man nun die Arduino-Software neu, findet man unter Datei>Beispiele>Adafruit NeoPixel>simple.

#include <Adafruit_NeoPixel.h>
#include <avr/power.h>

#define PIN            6
#define NUMPIXELS      10

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int delayval = 500;

void setup() {
  pixels.begin();
}

void loop() {
  for(int i=0;i<NUMPIXELS;i++){
    pixels.setPixelColor(i, pixels.Color(255,255,255)); // Moderately bright green color.
    pixels.show(); // This sends the updated pixel color to the hardware.
    delay(delayval); // Delay for a period of time (in milliseconds).
  }
}

Jetzt kann man einfach NUMPIXELS auf die Menge der LEDs einstellen, wie man verwenden will. Über den Befehl

pixels.setPixelColor(ledNumber, pixels.Color(255,255,255)); // Moderately bright green color.

lässt sich nun jede gewünschte Farbe (pixels.Color(255,255,255)) auf jede LED (ledNumber – Position der LED in der Reihe) anwenden.

Ich empfehle, sich auch mal das Beispiel>strandtest anzusehen. In diesem Beispiel sind schon ein paar Animationsfolgen eingebaut.

Woher bekommt man die Bauteile?

Kaufen kann man NeoPixel direkt bei Adafruit und man findet auch einiges bei Amazon:
WS2812 Produkte.

In diesem Beispiel habe ich diese LEDs verwendet:
WS2812 5mm LEDs

Inspiration

Vor einiger Zeit habe ich mal ein Glowboard mit WS2812 LED-Strips ausgestattet. Hier das Video dazu:

Referenzen

NeoPixel Best Practices
NeoPixel Library Installation