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

StartHardware.org – Arduino für Schulkinder

Starthardware.org
Heute mal was in eigener Sache. Gestern habe ich mein neues Projekt StartHardware.org veröffentlicht. Wie auf Arduino-Tutorial.de geht es darum, das Wissen um Arduino zu vermitteln. Diesmal ist die Zielgruppe allerdings etwas jünger.

StartHardware.org ist erstmal ein Online-Kurs für den Einstieg in Arduino und das Programmieren von Hardware. Elektronische Grundlagen werden ebenso wie Programmieren Schritt für Schritt erklärt. Am Ende kann man sich sein eigenes elektronisches Haustier basteln, dass mit den Augen blinzelt, meckert, wenn man sich nicht darum kümmert und das schnurre, wenn es gestreichelt wird.

Starthardware.org Starter Kit mit Arduino

Dazu kommt ein sehr günstiges Starter Kit, das ich zusammen mit meinen Partnern von TinkerSoup.de entwickelt habe. Es ist für 39,90 Euro erhältlich und beinhaltet alles für den Arduino-Start.

Also falls Ihr noch didaktisch wertvolle Weihnachtsgeschenke für Eure Kinder sucht, wäre ein StartHardware.org Starter Kit eine tolle Wahl ;-)