Sonstige
Sonstige
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Sonstige
- Zugriffe: 26725
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.
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Sonstige
- Zugriffe: 30156
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 |
x | A0 |
y | A1 |
z | 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.
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Sonstige
- Zugriffe: 29116
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".
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Sonstige
- Zugriffe: 41084
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); }
- Details
- Geschrieben von Alexander Schulz
- Kategorie: Sonstige
- Zugriffe: 32826
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.
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); }