Sonstige

Sonstige

Ich habe ein wenig mit Anwesenheitserkennung für Arduino experimintiert. Das funktioniert mit einem PIR-Sensor auch ganz zufriedenstellend. Zwar nicht in dem Sinne, dass jemand erkannt wird, der unbeweglich erstarrt ist, sondern als Erkenung des Umstandes, dass jemand das Haus betreten hat. Ich wollte ausprobieren, ob das mit einem Soundsensor noch sinnvoll ergänzt werden kann. Dafür habe ich einen günstigen Modul aus China besorgt.

 

Der Modul basier auf einem LM393-Komparator. Die Verwendung ist denkbar einfach: 5V Betriebsspannung und ein digitaler Ausgang, der bei Überschreitung des eingestellten Geräuschpegel sein Zustand wechselt.

 

Leider hat sich das Gerät als eher ungeeignet erwiesen. Es scheint mir zu sehr richtugngsabhängig zu sein. Das größere Problem ist aber zu grobe Einstellung der Empfindlichkeit. Es ist mir nicht gelungen, diese verlässlich so einzustellen, dass auch leise Geräusche zuverlässig erkannt werden, ohne dass der Modul in ein Dauer-HIGH-Zustand übergeht.

 

Auch wenn ich derzeit keine Verwendung für einen Beschleunigungssensor habe, hat es mich trotzdem interessiert, so einen auszuprobieren. Also habe ich ein MMA7361-BreakBoard besorgt und kurz getestet.

 

 

 

Zum Anschliessen werden ganze 9 Leitungen benötigt. Diese sind wie folgt mit einem Arduino zu verbinden:

MMA7361  Arduino PIN
 5V   NC
 3,3V   3,3V
GND   GND
GS (g-Select)   10
ST (self.test)   12
 A0
 A1
 A2
SL (sleep)   13
0G (0g-signal)   11

Außerdem muss die AREF-Leitung an 3,3V angeschlossen werden.

Zur Ansteuerung habe ich "AcceleroMMA7361"-Bibliothek (s.a. Forumbeitrag auf arduino.cc) mit folgendem Sketch (liegt als Beispiel der Bibliothek bei) verwendet:

#include 
AcceleroMMA7361 accelero;
int x;
int y;
int z;
void setup()
{
  Serial.begin(9600);
  accelero.begin(13, 12, 11, 10, A0, A1, A2);
  accelero.setARefVoltage(3.3);                   //sets the AREF voltage to 3.3V
  accelero.setSensitivity(LOW);                   //sets the sensitivity to +/-6G
  accelero.calibrate();
}
void loop()
{
  x = accelero.getXAccel();
  y = accelero.getYAccel();
  z = accelero.getZAccel();
  Serial.print("\nx: ");
  Serial.print(x);
  Serial.print(" \ty: ");
  Serial.print(y);
  Serial.print(" \tz: ");
  Serial.print(z);
  Serial.print("\tG*10^-2");
  delay(500);                                     //make it readable
}

 

Beim Testen ist mir aufgefallen, dass die Initialisierung des Sensors recht lange gedauert hat (gefühlte 10 Sekunden). Der Sensor hat eine einstellbare Empfindlichkeit (±1.5g, ±6g; 800 mV/g bei 1,5g) und eine Erkennung des freien Fall (0g-detect).

 

Datenblatt zu der MMA7361 IC fand ich unter folgendem Link: https://www.sparkfun.com/datasheets/Components/General/MMA7361L.pdf.

 

 

Ein Hall-Sensor misst magnetische Feldstärke. Einfach ausgedrückt: mit diesem Sensor kann ein Magner in der Nähe erkannt werden. Die Platine hat einen digitalen Ausgang. Dieser wird auf High geschaltet, wenn ein Magnetfeld genügender Stärlke vorhanden ist. Die Empfindlichkeit ist einstellbar (Poti).

Bei der Einstellung einer höheren Empfindlichkeit wird ein kleiner Neodym Magnet wird aus ca. 7 mm sicher erkannt. Bei einer weiteren Erhöhung wird alles Mögliche erkant incl. einer Handbewegung. Dieser Effekt scheint aber nicht stabil zu sein (Sensor entwickelt dabei eine Art "Eigenleben").

Meine Idee war, mit Hilfe diesen Sensors den Zustand meines Garagentores zu erkennen. Dabei habe ich auf höhere Reichweite gehofft, denn die technische Gegebenheiten lassen es nicht zu, die Magnete so nahe am Sensor zu platzieren. Evtl. wäre das mit einem größerem Magner realisierbar, jedoch werde ich wohl eine andere Methode anwenden müssen. Derzeit überlege ich in die Richtung einer Ultraschall Entfernungsmessung. Und dieses kleine Ding geht vorerst in die "Grabbelkiste".

 

Der nächste Sensor, den ich mir angesehen habe, ist ein Sensor zur Messung von Entfernungen mit HIlfe von Ultraschall. Es ist ein kleines Board mit der Bezeichnung HC-SR04.

 

Der Prinzip der Messung ist recht einfach: Es wird ein Ultraschall-Signal gesendet (40 kHz Ultraschall, ein Burst von ca. 200 Mikrosekunden Dauer, ausgelöst durch ein HIGH (mindestens 10 Mikrosekunden) am 'Trigger'-Eingang). Danach geht der 'Echo'-Pin auf HIGH und nach dem Eintreffen eines Echos (falls es denn ankommt) wird wieder auf LOW geschaltet. Die Zeit wird gemessen, durch zwei geteilt (die Strecke muss der Schall in beide Richtungen passieren) und wieder geteilt durch 29 (Entfernung in cm, die Ultraschal in einer Mikrosekunde zurücklegt). Das Egebnis ist die ungefähre Entfernung in cm.

Die Genaugkeit soll ca. 0,3 cm betragen, der Messbereich liegt laut Dokumentation bei 2 bis 400-500 cm. Mein Exemplar schafft jedoch nur etwas über drei Meter, danach werden die Rückgabewerte instabil oder das Echo bleibt ganz aus. In letztem Fall geht der 'Echo'-Ausgang nach 200ms auch auf LOW und zeigt dadurch eine erfolglose Messung an. Nach der Messung benötigt der Sensor eine Pause von ca. 20 Mikrosekunden. Die besten Messergebnisse ergeben sich bei Reflektion an glatten, ebenen Flächen. Bei Distanzen bis 1m ist das Material der Fläche recht unkritisch. Der Winkel zum Objekt kann bei kurzen Distanzen von unter 1m bis etwa 45° betragen. Auch recht dünne Objekte werden zuverlässig erkannt.

Die Betriebsspannung beträgt 5V, die Stromaufnahme liegt bei ca. 15mA.

Im einfachsten Fall sieht die Ansteuerung etwa folgendermaßen aus:

int TrigPin = 11;
int EchoPin = 10;
void setup() { Serial.begin(9600); pinMode(TrigPin,OUTPUT); pinMode(EchoPin,INPUT); }
void loop() { int distance, duration; digitalWrite(TrigPin,HIGH); delayMicroseconds(11); digitalWrite(TrigPin,LOW); duration = pulseIn(EchoPin, HIGH); // In cm umrechnen. Schalgeschwindigkeit ist 340 m/s oder 29 Microseconden per cm. duration = duration/29/2; Serial.print(duration); Serial.print("cm"); Serial.println(); delay(1000);

(s.a http://playground.arduino.cc/Main/UltrasonicSensor)

Bei der Suche nach Beispielen habe ich auch eine bessere Alternative zum 'alles selbst machen' gefunden. Unter http://code.google.com/p/arduino-new-ping/ kann eine bequemm zu benutzende Bibliothek heruntergeladen werden. Sie bietet u.a. die Möglichkeit, ein Durchschnittswert mehreren Messungen zu ermitteln. Dadurch werden kleine Abweichungen und Zufallsfehler weitgehens 'herausgerechnet'.

Auf dieser Basis habe ich ein Sketch für ein LCD-Entfernungsmesser entwickelt.

/* 
 * Sonar_LCD
 * 
 * Version 1.0
 * Datum: 12.08.2013
 * 
 * Das Programm benutzt den Ultraschallmodull HC-SR04 um Entfernungen zu messen.
 * Die gemessene Entfernung wird auf einem per I2C angeschlossenen LCD angezeigt.
 * 
 * Verdrahtung (UNO, Nano...)
 * 
 * HC-SR04:
 *     Sensor Trig pin an pin 11
 *     Sensor Echo pin an pin 10
 *     Sensor VDD pin an 5V
 *     Sensor GND pin an GND
 *  
 * LCD wird per I2C-Modul an I2C Bus (A4, A5) angeschlosen.
 *
 *   Copyright (c) 2013 Alexander Schulz.  All right reserved.
 *  
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 * 
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#include  
#include <LiquidCrystal_I2C.h>
#include 
// Setup LCD-Shield
LiquidCrystal_I2C  lcd(0x20,16,2); //  I2C Addresse: 0x20  LCD:  16x2
#define TRIGGER_PIN  11  // Arduino-Pin verbunden mit dem Trigger-Pin des Ultraschall-Sensors.
#define ECHO_PIN     10  // Arduino-Pin verbunden mit dem Echo-Pin des Ultraschall-Sensors.
#define MAX_DISTANCE 500 // Mxaimale beabsichtigte Entfernung (in cm). Der Sensor liefert max. ca. 400-500cm.
// NewPing setup
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup
void setup() 
{ 
  // Display initialisieren
  lcd.init();
  lcd.backlight(); 
  lcd.home(); 
  lcd.print("Sonar v1.0"); 
  lcd.setCursor(0,1); 
  lcd.print("Initializing..."); 
  delay(1000);
  lcd.clear();
} 
void loop() 
{ 
  // Ermittlung der Entfernung mittels Bildung eines Durchschnittswertes mehrerer Messungen
  unsigned int uS = sonar.ping_median(7);
  lcd.home();
  lcd.print("Dist: ");
  lcd.print((float)uS / US_ROUNDTRIP_CM); // In cm umrechnen (0 steht für 'Entfernung zu weit')
  lcd.print(" cm  ");
  delay(100);
} 

Die Anweseinheits- und Bewegungserkennung ist für Hausautomationsysteme durchaus interessant. Daher habe ich mich nach einem (für Arduino auswertbaren) PIR-Modul umgesehen. Bei eBay werden viele derartige Modulle sehr günstig angeboten (natürlich aus China). Die allermeisten Modelle scheinen geringfügige Variationen von derselben Art zu sein (HC-SR501).

Neulich kam meine Bestellung an.

PIR 1 k

 

Technische Daten laut Angebotsbeschreibung:

 Betriebsspannungsbereich 4,5 - 20V
 Ruhestrom <50µA
 Ausgang High 3,3V, Low 0V
 Triggereinstellung H (wiederholbar), L (nicht wiederholbar)
 Verzögerungszeit 5-200S
 Blockade-Zeit 2,5S
 Größe 32mm x 24mm
 Erfassungswinkel <100°
 Reichweite 3-4 m (seitlich), 5-8 m (vorn)
 Betriebstemperatur -15 bis 70 °C

 

Die Einschaltzeit und die Empfindlichkeit können über zwei Regler (Potis) eingestellt werden. Die Trigger-Vorwal wird mittels eines Jumpers vorgegeben. Position 'H' bedeutet, dass bei einer erneut erkannter Bewegung während der Einschaltzeit diese Zeit verlängert wird. Bei der Einstellung 'L' wird der Ausgang nach dem Ablauf der eingestellter Zeitspanne in jedem Fall ausgeschaltet. Die erneute Bewegung kann erst nach Ablauf der Blockadezeit erkannt werden.

Nach dem Einschalten des Sensors benötigt dieser ca. 1 Minute zur Initialisierung. Erst nach dieser Zeit werden die Bewegungen sicher erkannt.

Die Verwendung mit dem Arduino ist denkbar einfach. Außer Betriebspannung ist lediglich der Ausgang an einen beliebigen digitalen Arduino-Pin anzuschließen und dessen Zustand auszuwerden. Bei einer erkannten Bewegung setzt der Sensor die Ausgangsleitung auf HIGH.


Folgender Sketch soll das auf einfache Weise demonstrieren.

/* 
Testprogramm für Mini Bewegungsmelder.

Alexander Schulz 

Das Programm benutzt den PIR-Sensor zum Schalten des auf dem Arduino Board befindlichen LED (an PIN13).

Verdrahtung (UNO, Nano...)

    Sensor pin VCC pin an 5V
    Sensor pin out an Pin 2
    Sensor pin GND pin an GND
 
*/

int ledPin = 13;
int sensorPin = 2;
 
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(sensorPin, INPUT);
}
 
void loop() {
  digitalWrite(ledPin, digitalRead(sensorPin));
  delay(50);
}