I2S Mikrofon und PIC32MX170F256 als Alternative zu MSGEQ-7

Als günstige Alternative zu einem MSGEQ-7 (Einzelpreis 5,45€) für ein Graphic Equalizer Display (5-Kanal Lichtorgel) ein kleiner Exkurs in die DSP Welt:

Von Knowles gibt es sehr (sehr) kleine Mikrofone, die direkt das Audio Signal als I2S Datenstrom ausgeben (Einzelpreis 2€).

Dieses wird direkt an den I2S Port des PIC32 (Einzelpreis 4€) angeschlossen und mittels DMA im Hintergrund ausgelesen. Nach jeweils 4096 Samples bei 48 kHz wird der DMA Interrupt ausgelöst (etwa 48 mal pro Sekunde) und die Samples des unbeschalteten Kanals weggeworfen und je zwei aufeinanderfolgende Samples des verbleibenden Kanals gemittelt.

Die so übrig bleibenden 1024 Samples (mit einer Abtastfrequenz von nun 24 kHz) werden dann mittels FFT in den Frequenzraum überführt und auf die 5 Bänder aufgeteilt.

Die Anzeige der Balken erfolgt über eine Matrix aus WS2812 LEDs:

bildschirmfoto-2016-09-23-um-21-14-11

RS485 Interface an einem PIC16F1708

Neues Projekt mit RS-485 Interface: 29 Module mit je 37 LEDs, die über einen Raspberry Pi gesteuert werden sollen.

Problem: der PIC16F1708 ist nicht in der Lage festzustellen, ob noch eine Übertragung via EUSART Modul aktiv ist (Quote: “The TSR register is not mapped in data memory, so it is not available to the user.”). Die Transmitter-Enable Leitung (DE) kann also nicht mit dem letzten gesendeten Bit wieder deaktiviert werden.

Lösung: Beim Senden von jedem Zeichen die DE Leitung auf High setzen (und so den 75176 in Sendemodus bringen), den TMR0 (re-)starten und im Interrupt-Handler von TMR0 dann die DE Leitung wieder auf Low setzen:

void TMR0_CallBack(void) {
  IO_DE_SetLow();
}

void RS485_Put(uint8_t c) {
  IO_DE_SetHigh();
  TMR0_Reload();
  EUSART_Write(c);
}

void RS485_Print(const unsigned char* message) {
  char c; 
  while (c = *message++) {
    RS485_Put(c);
  } 
}

char to_hex(uint8_t v) {
  v = v & 0xf;
  if (v<10) {
    return '0'+v;
  }
  return 'A'-10+v;
}

void RS485_PrintHex8(uint8_t val) {
  RS485_Put(to_hex(val>>4));
  RS485_Put(to_hex(val));
}

void RS485_PrintHex16(uint16_t val) {
  RS485_Put(to_hex(val>>12));
  RS485_Put(to_hex(val>>8));
  RS485_Put(to_hex(val>>4));
  RS485_Put(to_hex(val));
}

void RS485_PrintDecimal(uint16_t val) {
  RS485_Put('0'+ ((val/10000) % 10 ));
  RS485_Put('0'+ ((val/1000) % 10 ));
  RS485_Put('0'+ ((val/100) % 10 ));
  RS485_Put('0'+ ((val/10) % 10 ));
  RS485_Put('0'+ ((val/1) % 10 ));
}

Mailserver mit Postfix, dovecot, spamassassin, opendkim und postgrey unter debian jessy

Der alte Server war dann doch etwas langsam, daher der Umzug auf neue Hardware. Mit dem Umzug galt es auch den bisherigen IMAP Server (cyrus) durch dovecot zu ersetzen. Soweit der Vorsatz, die Umsetzung war dann weitaus schwieriger…

Setup

Neben der Grundfunktionalität (Mails empfangen und senden) sollte der Mailserver wenigstens folgendes können:

  • DKIM zur Authentifizierung
  • SPF
  • Greylisting
  • spamassassin Unterstützung
  • Volltextsuche über IMAP
  • Mehrere virtuelle Domains
  • Weiterleitungen
  • Mehrere Benutzer für IMAP/SMTP
  • TLS Unterstützung

Continue reading

Dimmen von Leuchtstoffröhren über DMX

Normale Leuchtstoffröhren lassen sich ja nicht dimmen. Hierfür gibt es spezielle Vorschaltgeräte, die meistens einen Steuereingang 0-10V haben (z.B. diese hier: http://www.methline.de/methline-p806h14s76-EVG-dimmbar-1-10V-fu.html).  Die Kopplung an den DMX-Bus ist mit einem Arduino und einem Levelshifter (z.B. wie hier beschrieben), einem 10 Volt fähigen DAC (MAX528) oder der fertigen Lösung von dmx4all (DMX 0-10V Interface) schnell erledigt.

Touch-Slider mit AT42QT2120

Der AT42QT2120 von Atmel bietet eine sehr einfache Möglichkeit einen linearen Schieberegler über ein Touchpad zu realisieren:

Bildschirmfoto 2015-03-07 um 14.35.03

Dabei ist nur das Layout für die vier Felder des Touchsensors zu beachten:

Bildschirmfoto 2015-03-07 um 14.37.35

Die Felder dürfen dabei recht groß werden (Länge eines Felds bis 20cm ohne nennenswerte Einschränkungen nutzbar).

S0-Messwerterfassung von Stromzählern

Neuere Stromzähler sind zum Teil mit einem Optokoppler ausgestattet, der für jede verbrauchte Wattstunde einen Impuls liefert (1000 Impulse = 1 kWh). Der Anschluss an einen Arduino gestaltet sich dem entsprechend einfach: D+ Ausgang des Zählers auf 5V legen und den D- Ausgang an einen digitalen Eingang des Arduino anschließen, dieser muss noch mit einem 4k7 Widerstand gegen Masse gezogen werden um ein klares Signal zu erhalten.


Continue reading

INA219 Leistungssensor

Für die einfache Überwachung von Stromverbrauchern (Gleichstrom) eignet sich der INA219 hervorragend. Über I2C liefert dieser bis zu 15-Bit genaue Werte über die aktuelle Spannung, den Strom und die daraus berechnete Leistung.

Als externe Komponente ist neben dem obligatorischen Abblockkondensator nur noch der Shunt notwendig. Bis zu 16 Sensoren lassen sich gemeinsam an einem I2C-Bus betreiben: Zwei Adresseingänge, die an Vcc, Gnd, SDA oder SCL gelegt werden legen die Adresse des im kompakten SO-8 Gehäuse daherkommenden Chips fest:

Messwertaufnehmer für 4 Verbraucher mit jeweils bis zu 30A bei 12V, die über M6-Schrauben direkt an den Shunts befestigt werden

Als Shunt kommt die WSMS5515-Serie von Vishay Dale mit 500μΩ zum Einsatz, die bei 30A Last einen Spannungsabfall von 15mV liefern. Durch die Auflösung des INA219 kann diese Kombination Ströme von 1mA messen und die Leistung auf 20mW genau bei einem Maximum von 524W bestimmen.