MP1584 buck converter module

This small module MP1584 buck-converter module seems to be a good solution to power small circuits from higher voltages. Especially cool with this chip is that it accepts input voltages up to 29V. This makes it a perfect candidate for additional circuits that connect to a KNX bus. But it’s not limited to KNX buses. If you want to build a WiFi interface for your Roomba, you also have to down-regulate the 15V battery voltage to 5V or even 3.3V. You want to something to power a circuit from a car battery? This seems to be a perfect circuit for there use cases.

mp1584With it’s tiny dimensions of 17 x 22mm it’s size is around the size of 2 MicroSD cards (and much smaller than a single SD card).

The output voltage of the module is controlled by a tiny potentiometer. You will need a multimeter to check the output voltage before connecting it to a circuit.

While the plain voltage range data seems to be quite good, how does the circuit behave on different loads? Some Chinese dealers claim that similar modules should handle 3A load. If you just look at the size of the inductor you might already start thinking that this most likely isn’t true. However, DC resistance of the inductor is approximately 10mOhm (I miss my Kelvin probes and therefore could only measure this very roughly).

Let’s start with 29V input voltage – this will bring everything to the limit. Output voltage is fixed to 5V in this experiment. Without any current drawn, it still looks a bit rough:

29_0

However, a voltage swing of (Vpp) 98mV is no problem at all. Between 0.1A and 0.9A the circuit behaves quite well. Vpp is around 0.2V (a bit lower on low currents, higher in higher currents)

29_0.5

We reach the end at 1A. Now the regulator doesn’t provide a stable output voltage anymore:
29_1

But what about lower input voltages? Let’s go the the other “extreme”: 9V (it will work with even less, but let’s give it a bit headroom).

Almost perfectly clean with no load:
9_0

A bit more stable than at 29V for currents between 0.1A and 0.7A:

9_0.4

And at 0.7A we reach the end of the useable current range:

9_0.7

Conclusion: This module works fine for almost every embedded use case: Arduino, ESP8266 WiFi modules and even a Raspberry Pi without any additional USB devices plugged in.

Here are 2 animation that shows the output voltage under different loads:

29V input, 5V output, 0-1A in 0.1A steps:

29v_animated

9V input, %V output, 0-0.7A in 0.1A steps:

9v_animated

Coole Sensoren für das nächste Automatisierungsprojekt

Hausautomatisierung bedeutet nicht “ich schalte mein Licht mit dem Smartphone an”. Es heisst nämlich “Automatisierung”. Eine Steuerung sollte in erster Linie einen Komfortgewinn bringen und Dinge automatisch tun. Dazu muss das System natürlich wissen, was ringsherum passiert. Und dafür braucht es Sensoren.Einige Sensortypen sind weitverbreitet und bekannt, es gibt aber auch exotischere Sensoren, die dennoch für den kleinen Geldbeutel des Bastlers erschwinglich sind.

Temperatur

35040-img_0674Fast jeder experimentiert mit Temperatursensoren. Der DS18B20 ist ein 1-Wire-Sensor, den man leicht an verschiedenste Geräte (Arduino, Raspberry Pi, …) anschliessen kann. Auch entsprechende Software findet man wie Sand am Meet. Mit einer Genauigkeit von 0.5°C passt dieser Sensor für fast alle Anwendungsfälle. Wer also einfach die Temperatur überwachen möchte, für den ist dieser Sensor perfekt.

Luftfeuchtigkeit

dht-11-1Die DHT-11 und DHT-22 sind zwei Luftfeuchtigkeitssensoren. Sie sind deutlich teurer als ein einfacher Temperatursensor. Dafür bieten Sie auch zusätzliche Anwendungsmöglichkeiten. So könnte z.B. ein Luftbefeuchter eingeschaltet werden, wenn die Luftfeuchtigkeit zu gering ist. Oder wie wäre es mit automatischem Lüften, wenn die Luftfeuchtigkeit zu hoch ist? Der Sensor benutzt ein ähnliches Protokoll wie der 18B20 Temperatursensor, die beiden sind aber inkompatibel. Man kann daher nicht beide an den gleichen Pin eines Mikrocontrollers anschliessen. Allerdings ist das auch nicht notwendig, die diese Sensoren nicht nur die Luftfeuchtigkeit, sondern auch die Temperatur messen können.

Erdfeuchtigkeit

13995201090Die Pflanzen sind mal wieder tot, weil jemand vergessen hat, sie zu giessen? Um dem entgegen zu wirken gibt es Sensoren, die die Feuchtigkeit der Pflanzenerde messen können. Es existieren 2 Typen: resistive und kapazitive Sensoren. Resistive Sensoren messen einfach den Widerstand. Feuchte Erde hat einen geringeren Widerstand als trockene. Allerdings können diese Sensoren schnell korrodieren. Ein relativ neuer Sensortyp sind kapazitive Sensoren. Diese sind allerdings teurer und etwas weniger genau. Man muss also etwas experimentieren um den richtigen Schwellwert zu finden, ab dem die Software alarmieren soll.

Bewegungssensoren

pir-motion-sensor-536x408Ist jemand zu Hause? Bewegungssensoren können hier weiterhelfen. Die gängigen PIR-Typen messen Infrarotstrahlung sich bewegender Objekte. Sie sind relativ günstig und können zuverlässig Menschen, aber auch Haustiere erkennen. Wenn eine Person still sitzt oder schläft, wird dieser Sensortyp jedoch nicht ansprechen. Für einige Anwendungsfälle ist das aber auch kein grosses Problem.

Lautstärke

grove-Sound-SensorDa ist man mal einen Abend nicht zu Hause, aber der 14-jährige Sohn. Was da passieren wird, kann man sich denken. Und die Nachbarn werden es einem am nächsten Tag erzählen. Wie wäre es, die Lautstärke der Stereoanlage zu reduzieren, wenn ein gewisser Schallpegel überschritten ist. Das lässt sich auch recht gut zeitlich steuern, denn um 17 Uhr darf es ja ruhig etwas lauter sein als um 23 Uhr. Ein Lautstärkesensor ist hierfür das richtige Mittel. Das wird natürlich nur funktionieren, solange der Sohn den Sensor nicht entdeckt hat und ihm mit Dämmwolle bearbeitet.

Feinstaub

Particle sensorKleinste Staubpartikel können ein problem für einige Menschen sein – besonders für Asthmatiker. Feinstaub kann verschiedenste Ursachen haben. Die Konzentration dauerhaft zu messen, kann helfen, die Quelle zu finden. Feinstaubsensoren arbeiten mit einer optischen Abtastung und einfache Sensoren für den Heimgebrauch sind recht günstig. Eine Feinstaubmessung in der eigenen Wohnung muss also nicht teuer sein.

Umbau des H801 LED Dimmers

Heute erhielt ich nach nicht allzu langer Wartezeit den H801 LED Dimmer. Beim Untersuchen des Gerätes konnte ich mir jedoch nicht vorstellen, was die Anschlüsse W1 und W2 sein sollen (die anderen Anschlüsse waren mehr oder weniger selbsterklärend). Also habe ich das Gehäuse entfernt und das Board genauer angeschaut. Positiv überrascht stellte ich fest, dass ich sich nicht um einen 3-Kanal-, sondern sogar um einen 5-Kanal-Dimmer handelt. W1 und W2 sind 2 zusätzliche Kanäle, die man z.B. für gemischte RGB/Weiss-LED-Streifen nutzen kann.

Die weitere Installation erschient nicht kompliziert. An die Stromversorgung anschliessen und starten.

Jetzt kann man mit dem Laptop oder Smartphone auf den Accesspoint HCX_856705 (die Zahlen können evtl. anders sein) verbinden. Etwas Suche brauchte das Passwort, aber ich konnte es am Ende finden. Das Standardpasswort ist 8888888. Jetzt fangen die Probleme an, wenn man kein Android-Telefon besitzt. Ich hätte wenigstens ein simples Webinterface erwartet, aber es ist nichts derartiges vorhanden. Die einzige Methode zur Steuerung des Gerätes scheint eine Android-App zu sein.

Nun gab es für mich zwei Option: eine andere Firmware programmieren und aufspielen oder einen Android-Emulator zu benutzen. Letzteres schien die schnellere Methode zu sein. Also probierte ich es mit Droid4X – leider erfolglos. Ich bin nicht sicher, was das Problem war, evtl. wollte der Android-Emulator die Netzwerkverbindung meines Macs nicht nutzen.

Also zurück zur ersten Variante – eine neue Firmware. Etwas derartiges mache ich nicht gerne, aber bei einem Gerät, was weniger als 20 Euro kostet und anderweitig nicht nutzbar ist, was das doch die sinnvollste Option.Glücklicherweise ist das Flashen einer alternativen Firmware sehr einfach. Es gibt bereits einen RX/TX/GND/3.3V header und den J3 header, der zur Programmierung kurzgeschlossen werden muss. Also schnell ein paar Header auflöten und das Board neu programmieren.

h801-header
Als Software nutzte ich die Software von Eryk.io und passte diese leicht an. Den angepassten Code findet man in meinem Github repository.

Die GPIOs sind wie folgt belegt:

Pin Function
15 Ausgang Rot
13 Ausgang Grün
12 Ausgang Blau
14 Ausgang Weiss 1
4 Ausgang Weiss 2
1 Status-LED grün
5 Status-LED rot

433 MHz Fenstersensor

Auf eBay, Alibaba und anderen Webseiten findet man oft günstige Fenstersensoren, die über Funk informieren, wenn ein Fenster geöffnet wird. Sie kosten of unter 10€, das macht sie für Bastler interessant.

Diese Geräte sehen etwas so aus:

Newest-High-quality-1Pcs-433-MHZ-Wireless-Home-Security-Door-Window-Sensor-Detector-with-Battery-for

Aber wie sieht das ganze von innen aus? Das kleine Teil, welches am Fensterflügel befestigt wird ist einfach ein Magnet. Dann kann man sich schon denken, wie es auf der anderen Seite aussehen wird. Das Gegenstück ist wohl ein Reed-Relais. Aber was sonst noch?

Die Schaltung basiert auf dem HS1527. Das gute an diesem Chip ist, dass das Funkprotokoll so trivial ist, dass man es problemlos mit einem Raspberry Pi oder Arduino und einem günstigen 433MHz-Empfänger dekodieren kann. Auch positiv ist der Standby-Stromverbrauch von 1uA. Damit sollte selbst die kleine 12V Batterie (ich habe diese Bauform noch nie vorher gesehen) eine ganze Weile halten.

Allerdings gibt es ein recht grosses Problem: Der Sensor sendet lediglich ein Datenpaket, wenn das Fenster geöffnet wird. Das ist ganz ok, wenn man es nur als Einbruchssensor nutzen will. Allerdings kann man damit nicht den Status eines Fensters (offen/geschlossen) prüfen, da beim Schliessen des Fensters kein Signal gesendet wird. Damit ist der Sensor für Anwendungsfälle wie das Ausschalten der Heizung bei geöffnetem Fenster nicht brauchbar.

Daher kann ich diesen Sensortyp für Automatisierungsanwendungen nicht empfehlen.

Phillips HUE-Emulation mit dem ESP8266

Ich bin bekennender Fan des ESP8266. Auf einigen Chinesischen Webseiten findet man unter dem Namen “H801” einen billigen LED Dimmer, der diesen Chip nutzt. Dieser Dimmer kann RGB-LED-Streifen ansteuern.

Einige technische Informationen sind auf dieser holländischen Webseite zu finden.

H801_small

Ein Problem ist die Ansteuerung dieses Dimmers. Das relativ einfache Protokoll wurde mittlerweile dokumentiert. Es ist allerdings komplett proprietär und daher schwer in bestehende Automatisierungslösungen zu integrieren.

Eine mögliche Lösung dieses Problems könnte eine Phillips Hue Emulation sein. Es gibt das Github-Projekt ESP8266HueEmulator welches das Hue-Protokoll auf dem ESP8266 implementiert.

Achtung: Der Dimmer ist zwar im Internet käuflich erhältlich. Das Gerät hat aber kein CE-Zertifizierung und darf daher in der EU nicht in Betrieb genommen werden.

Batteriebetriebener Sensor auf ESP8266-Basis

Der ESP8266 ist ein leistungsfähiger und günstiger Mikrocontroller. Während früher noch oft proprietäre Funkprotokolle wie z.B. nRF24-basierte Chips genutzt wurden, kann man viele heute für viele Anwendungsfälle gleich auf WLAN setzen. Es gibt allerdings ein grosses Problem mit WiFi: der Stromverbrauch.

Wenn der ESP8266 mit einem WiFi-Netzwerk verbunden ist, verbraucht er mindestens 70mA, teilweise sogar deutlich mehr. Wenn man nur ein System mit einem 2400mAh-Akku betreiben will, ist dieser nach spätestens einem Tag leer. Und niemand möchte wohl für Sensoranwendungen eine Autobatterie nutzen.

Glücklicherweise müssen Sensoranwendungen in vielen Fällen nur selten Daten übertragen. Selbst Messungen müssen oftmals nicht ständig erfolgen. Das heisst, die meiste Zeit kann der Chip einfach schlafen. Um dies umzusetzen, geht man wie folgt vor:

  1. Daten sammeln. Das sollte geschehen, bevor das WLAN-Modul aktiviert wird (ausser, die Datenabfrage benötigt nur wenige Millisekunden)
  2. Mit dem WLAN verbinden
  3. Daten senden
  4. In den “Deep sleep”-Modus wechseln. Hierfür nutzt man die ESP.deepSleep() Funktion.

Bei der ESP.deepSleep() Funktion gibt es im übrigen einige Dinge zu beachten:

  1. Damit der Mikrocontroller nach der entsprechenden Zeitspanne wieder aufwacht, mit GPIO16 des ESP8266 mit dem RESET-Pin verbunden sein. Ansonsten schläft der Controller ewig.
  2. Der delay-Parameter ist in Mikrosekunden anzugeben. Wenn sich der ESP8266 also scheinbar nie schlafen legt, könnte es sein, dass man die Zeit versehentlich in Sekunden oder Millisekunden angegeben hat.
  3. Es gibt einen zweiten – optionalen – Parameter, der 4 Werte annehmen kann: WAKE_RF_DEFAULT, WAKE_RFCAL,WAKE_NO_RFCAL, WAKE_RF_DISABLED. Der Wert WAKE_RF_DISABLED sieht auf den ersten Blick vielversprechend aus, denn irgendwie sollte das WiFi-Modul ja abgeschaltet werden. Allerdings bezieht sich dieses Argument auf die Funktion nach dem Aufwachen. Übergibt man hier also WAKE_RF_DISABLED , ist der ESP8266 nach dem Aufwachen nicht mehr in der Lage über WLAN zu kommunizieren.

Hier noch ein paar zusätzliche Tips zum Stromsparen:

  1. LEDs als optische Signalisierung sollten nur sehr kurz eingeschaltet werden. Einige Millisekunden reichen i.d.R. aus, damit der Benutzer das Aufblitzen wahrnimmt.
  2. Müssen die LEDs etwas länger eingeschaltet bleiben, sollten sie gedimmt werden. Mit der analogWrite Funktion kann man das einfach umsetzen.

Hier ist ein einfaches Beispiel, das die Daten vom Analogeingang des Controllers liest und an einen MQTT-Broker übermittelt:

#include         // Generic ESP8266 WiFi routines
#include        // MQTT client
#include           // Local DNS Server used for redirecting all requests to the configuration portal
#include    // Local WebServer used to serve the configuration portal
#include         // WiFi Configuration Magic


const char* mqtt_server = "192.168.1.88";
const char* mqtt_channel_up = "active";
const char* mqtt_channel_data = "sensor/%d/adc";

const int pin_red = 15;
const int pin_green = 12;
const int pin_blue = 13;
const int pin_button = 4;
const int analog_ldr = 0;

const int sleepSeconds = 60 * 15;

WiFiManager wifiManager;
WiFiClient espClient;
PubSubClient client(espClient);


void send_sensor_data(void) {
  Serial.println("Sending sensor data\n");
  int data = analogRead(A0);
  char s_channel[50];
  char s_id[10];
  char s_data[10];
  sprintf(s_channel, mqtt_channel_data, ESP.getChipId());
  sprintf(s_id, "%d", ESP.getChipId());
  sprintf(s_data, "%d", data);

  digitalWrite(pin_blue, HIGH);
  client.connect("ESP8266Client");
  digitalWrite(pin_blue, LOW);
  if (! client.connected()) {
    Serial.println("Could not connect to MQTT broker, doing nothing");
  } else {
    digitalWrite(pin_green, HIGH);
    client.publish(mqtt_channel_up, s_id); // show that this device is up
    client.publish(s_channel, s_data); // send sensor data
    digitalWrite(pin_green, LOW);
  }
}

void setup() {
  delay(500); // This makes it easier to upload new firmware and/or press the "clean" button

  pinMode(pin_red, OUTPUT);
  pinMode(pin_green, OUTPUT);
  pinMode(pin_blue, OUTPUT);

  digitalWrite(pin_red, HIGH);

  // Setup Serial interface for debugging
  Serial.begin(115200);

  //  Bring up WLAN
  WiFiManager wifiManager;

  //sets timeout until configuration portal gets turned off
  //useful to make it all retry or go to sleep
  //in seconds
  wifiManager.setTimeout(60);

  WiFiManagerParameter custom_mqtt_server("server", "mqtt server", mqtt_server, 40);
  wifiManager.addParameter(&custom_mqtt_server);

  if (digitalRead(pin_button) == 0) {
    // reset settings
    wifiManager.resetSettings();
  }

  //fetches ssid and pass and tries to connect
  //if it does not connect it starts an access point with the specified name
  //here  "AutoConnectAP"
  //and goes into a blocking loop awaiting configuration
  if (!wifiManager.autoConnect()) {
    Serial.println("failed to connect and hit timeout");
    delay(100);
    // do nothing: deep sleep, but longer than usual. Something might be wrong and
    // we should save power
    ESP.deepSleep(sleepSeconds * 10 * 1000000, WAKE_RF_DISABLED);
  }

  mqtt_server = custom_mqtt_server.getValue();

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Setup MQTT client
  client.setServer(mqtt_server, 1883);

  digitalWrite(pin_red, LOW);
}

void loop(void) {
  send_sensor_data();
  Serial.printf("Sleeping deep for %i seconds...", sleepSeconds);
  ESP.deepSleep(sleepSeconds * 1000000);
  delay(100);
}

Programmieren des ESP8266 unter MacOS

Auf Chinesischen Webseiten und auch auf eBay findet man viele billige Module auf Basis des ESP8266. Sie sind recht leistungsfähig und haben bereits ein WLAN-Interface integriert. Für Schaltungen, die extrem wenig Strom verbrauchen sollen, ist dieser Chip zwar nicht ideal, aber dennoch ist es eine gute und günstige Plattform für Sensorapplikationen und kleine Steuerungen. Was die Module noch attraktiver machen: Sie können direkt unter Arduino programmiert werden. Diese Anleitung zeigt, wie man die Arduino-IDE für diesen Chip unter MacOS einrichtet.

Installation der Arduino Entwicklungsumgebung

Die Arduino IDE kann direkt von der Arduino Webseite heruntergeladen werden.

Anschliessen des ESP8266 modules am Mac über USB

Viele ESP8266 modules werden schon mit einem onboard USB-Anschluss ausgeliefert. In diesem Falle muss das Board einfach nur mit einem USB-Kabel mit dem Mac verbunden werden.
Achtung: Manche Module haben zwar einen USB-Anschluss, dieser wird aber nur für die Stromversorgung genutzt. In diesem Fall wird ein externer USB-Seriell-Wandler benötigt.

Prüfen, ob die Hardware erkannt wurde

Unter “Über diesen Mac” gelangt man zu “System report”
systemreport

Hier sollte man jetzt ein USB2.0 Serial Gerät finden. usbserial

Treiberinstallation

Wenn denkt, alles ist bereit und die Arduino IDE startet, so kann man dort ein Gerät namens /dev/cu.usbmodem147741 als serielle Schnittstelle auswählen (die Ziffern hinter usbmoden können anders sein). Wenn man jetzt allerdings versucht, über diese Schnittstelle mit dem Controller zu kommunizieren,  passiert nichts. MacOS erkennt zwar, dass es sich um einen USB-Seriell-Adapter handelt, hat aber die entsprechenden Treiber nicht standardmässig dabei. Der Treiber ist oft ein billiger CH340G, da viele Firmen diesen dem deutlich teureren FTDI chip vorziehen. Die Installation des Treibers ist allerdings einfach. Man kann ihn hier herunterladen und installieren. Nach einem Neustart des Systems sollte die Arduino-Entwicklungsumgebung nun ein Gerät namens /dev/wvhusbserial14460 anbieten. Dieses kann jezt genutzt werden, um mit dem Board zu kommunizieren.

Installation der ESP8266 Module für die Arduino IDE

Da es sich bei den ESP8266-Boards nicht um “offizielle” Arduino-Boards handelt, sind die entsprechende benötigten Bibliotheken nicht in der Arduinio-Standardsoftware enthalten. Um die Treiber zu installieren, gibt man die URL http://arduino.esp8266.com/versions/2.2.0/package_esp8266com_index.json in den Einstellungen unter “Additional board managers” ein.

arduino-settings

Jetzt kann man unter “Tools/Board/Board Manager” and die ESP8266 module unter “Contributed” finden und installieren.

espcontrib

Das war’s schon. Alles ist installiert und es kann losgehen mit der Programmierung einen coolen kleinen IoT-Gerätes.

Falls der Upload der Software über die Arduino IDE nicht klappt, ist das Programm esptool.py eine gute Alternative. Es scheint in vielen Fällen besser zu funktionieren als der Uploader in der Arduino IDE. Es lässt sich zwar nicht einfach in die IDE integrieren, allerdings sind die Kommandozeilenparameter nicht kompliziert und man kann das Program einfach direkt aus einem Terminalfenster starten.