EMF-Detektor: Ab geht's auf Geisterjagd!

Die Idee zum Bau des EMF-Detektors enstand eher durch einen Unfall im letzten Projekt. Beim Zusammenlöten der Platine hab ich eine Leitung verkackt und so sprang das Signal eines Tasters immer zwischen 0 und 1 hin und her. Nachdem ich das gefixt hatte, interessierte mich allerdings der Grund, warum dieses Verhalten auftritt.

Resultat: Wenn man einen Eingang des Controllers nicht auf Masse zieht und so einen definierten Zustand herstellt, interpretiert der µController einfach mal alles was da so ankommt. In diesem Fall elektromagnetische Wellen.
Wieso sich das nichtmal genauer angucken und ein Messgerät bauen, um zu erforschen, was alles elektromagnetische Parties feiert?

Gedacht war eigentlich diesen Detektor "mal eben" zwischen Tür & Angel zu bauen. Eben unter der Woche nach Feierabend. Aber wie es immer so ist, wurden es erst ein paar Tage, dann ein ganzes Wochenende und am Ende mehrere Wochen. Was aber eher daran lag, dass ich in einer Tour gefailed habe...
Als Vorlage dienten zwei Projekte:

Beide Projekte entstanden 2009. Sieben Jahre später also nun der Nachbau. Ich war schon immer eher so der Spätzünder.

Die Teileliste ist ziemlich übersichtlich:

  • Arduino (zum Prototypen)
  • Lochraster
  • 9v Block
  • Spannungsregler (7805 irgendwas, um von 9v auf 5v zu kommen)
  • 2 Elkos (10µF und 0,1µF)
  • 10 Leds (beispielsweise als Bargraph)
  • 10 x 330Ohm Widerstände
  • 1 x 3,3mOhm Widerstand
  • bisschen Draht (ca 15cm)

Weil ich Bock drauf hatte, nach dem Prototypen auf einen Arduino zu verzichten, habe ich den fertigen Code am Ende direkt auf einen µController geflashed. Das spart ein bisschen Platz und Strom (und sieht natürlich viel professioneller aus, was ich durch meine "Feld-Wald-Wiesen"-Kabelage aber natürlich wieder wett gemacht habe).

Tjoa. Im Endeffekt ist da keine große Magie hinter und man stöpselt das Ganze wie auf dem unteren Bild zusammen:

Die LEDs kommen an die digitalen Ausgänge 02-11 (Die 330Ohm Widerstände dazwischen nicht vergessen!) und der Draht (Antenne) zwischen A5 und dem 3,3mOhm Widerstand der gegen Masse gesteckt wird.

Vielleicht fällt dem einem oder anderen ja gerade auf, dass man normalerweise ja 220Ohm nehmen würde. Das stimmt schon, aber wenn alle LEDs gleichzeitig leuchten, sind das 200mA und das ist das Maximum, was der Controller ab kann und mir daher zu sehr am Limit. Deswegen sind die Vorwiderstände ein bisschen größer, um unter diesem Limit zu bleiben. Haha. Ich Fuchs!

Dann sieht das ungefähr so aus:

Wenn man jetzt auch auf die Idee kommt, statt des Arduinos am Ende direkt einen Atmel zu nutzen, braucht man noch ein paar weitere Teile:

Die beiden Kondensatoren werden jeweils pro Quarzpin gegen Masse gesteckt und der Quarz jeweils an Pin 9 und 10 des Mikrocontrollers angeschlossen.
Ziemlich genau so:

Anmerkung: Ein bisschen sollte man darauf achten, dass die Antenne möglichst weit weg von den LEDs platziert wird, sonst misst man sich am Ende noch selbst. Will man ja nicht, wäre dumm.

Der benötigte Code basiert ebenfalls auf dem der obig genannten Projekte. Ich habe ihn lediglich mal ein bisschen aufgeräumt und verkürzt:

/* EMF Detector for LED Bargraph v1.0
original code/project by Aaron ALAI - aaronalai1 ät gmail punked com
modified for use w/ LED bargraph by Collin Cunningham - collin ät makezine punked com
shortened and refactored by Christian Figge - info ät flazer punked net (flazer.com)

Info:
Use IOPins 02 - 12 for LED-Bargraph
*/

#define MEASURES 15
int senseLimit = 15;
int antenna = A5;
int ranges[] = {50, 150, 250, 350, 450, 550, 650, 750, 850, 950};

int ledcount = sizeof(ranges)/sizeof(int); //same size as values in ranges (10)
int ledPinOffset = 2; //offset of starting pinout number
int bucket[MEASURES]; //bucket of values 
int total = 0;
int pos   = 0;
int avg   = 0;
int val   = 0;

void setup() {
  Serial.begin(9600);
  pinMode(antenna, INPUT);
  for (int i=ledPinOffset; i<ledcount+ledPinOffset; i++) {
    pinMode(i, OUTPUT);
  }

  for (int i=0; i<MEASURES; i++) {
    bucket[i] = 0;
  }
}

void loop() {
  val = analogRead(antenna);
  if (val >= 1){
    val = constrain(val, 1, senseLimit);
    val = map(val, 1, senseLimit, 1, 1023);
    total -= bucket[pos];
    bucket[pos] = val;
    total += bucket[pos];
    pos = (pos + 1);

    if (pos >= MEASURES) {
      pos = 0;
    }
    avg = total / MEASURES;

    for (int i=0; i<ledcount; i++) {
      if (avg > ranges[i]) {
        digitalWrite(i+ledPinOffset, HIGH);
      } else {
        digitalWrite(i+ledPinOffset, LOW);
      }
    }
    Serial.println(val);
  }
}

Im Nachhinein muss ich jedoch feststellen, dass es mehr Sinn machen würde, erst die Hardware zu bauen und dann dafür die Software zu schreiben, anstatt andersrum. Ich musste ziemlich dreckig um Ecken und drunter und drüber löten, damit am Ende alles so blinkte, wie es das soll.
Keine Ahnung, wie das in der Industrie gehandhabt wird: Ob man beim Hardwaredesign und bei der Software jeweils Abstriche und Kompromisse eingeht, damit beide einigermaßen ohne Hacks und Workarounds arbeiten können, oder ob einer von beiden am Ende der Gelackmeierte ist.
Beides ist halt Kacke: Entweder ist beides eher so "meh", oder eins ist geil und das andere scheiße.
Wenn das hier jemand liest, der in der Ecke arbeitet: Bitte, bitte verrate es mir!

Die Hardware sieht zusammengebraten dann schonmal so aus:

Und mit einem einigermaßen schniekem Gehäuse kann man sich damit auch eventuell auf die Straße trauen.
Eigentlich wollte ich da noch so ne' Teleskopantenne dranbauen, aber ich hatte keine und extra bestellen war mir dann auch zu blöde.

Die Daten zum Drucken des Gehäuses gibt's auf thingiverse.com.

Nun sieht's halt ein bisschen so aus, wie eine kaputte Glühbirne. Hat irgendwie auch was.

Den Bau des Detektors habe ich auf Video festgehalten, vielleicht ist es für manche ja ganz unterhaltsam: