Go Down

Topic: Besucherzähler / infrarot Lichtschranke (Read 7 times) previous topic - next topic

Leanderlike

Hallo zusammen,

ich möchte einen Besucherzähler am Eingang eines Raums installieren, der immer dann ein Signal ausgibt, wenn jemand den Raum betritt. Das ganze möchte ich mit einer Infrarot Lichtschranke lösen.
Nun einige grundsätzliche Fragen. Ich denke da an eine Lichtschranke wie diese hier:
http://www.conrad.de/ce/de/product/191710/IR-LICHTSCHRANKESENDEREMPFAeNGER

Mein Arduinoboard ist ein Duemilanove. Lässt sich so ein Lichtschranken Sender/Empfänger an das Bord anschließen? Wenn ja, gibt es da vll. eine Art Tutorial oder Anleitung für?
Ich habe bisher nur sowas hier gefunden http://makeprojects.com/Project/PIR-Sensor-Arduino-Alarm/72/1
Dort wird aber nicht mit einer Lichtschranke gearbeitet und ich denke, dass eine solche doch wesentlich "zuverlässiger" ist als ein Bewegungssensor, oder?

Für jegliche Tipps bin ich dankbar! Es geht mir erstmal um die generelle Möglichkeit sowas ans Laufen zu bringen. Die Tatsache, dass natürlich auch zwei Personen gleichzeitig durch die Schranke gehen können oder rein und wieder raus gehen, ist mir bewusst, aber lasse ich hier erstmal außen vor.

Gruß,
leander

Joghurt

So ne Lichtschranke ist bei der Beschaltung im Prinzip nichts anderes als ein Button, kein Problem für den Arduino.

Guck Dir mal das Tutorial zum entprellen eines Buttons an, das könnte Dir da helfen.

Leanderlike

Hallo Joghurt,

danke für deine schnelle Antwort. Dass diese Lichtschranke gut zu meinem Projekt passt beruhigt mich schon mal. Vielen Dank dafür.
Mit den entsprechenden Tutorials meinst du dann sicherlich diese Links hier?
http://arduino.cc/en/Tutorial/Button
http://arduino.cc/en/Tutorial/ButtonStateChange
http://arduino.cc/en/Tutorial/Debounce

Wenn die Lichtschranke nach dem selben Prinzip funktioniert (Signal an/ Signal aus) und auch technisch so funktioniert wie in den Tutorials - wunderbar! Dann komm ich damit hoffentlich weiter!

Joghurt

Ja, die meinte ich.

Wenn ich nach den Bildern hinter dem von Dir gelieferten Link gehe arbeitet das mit einem Relais, was Dir den ganzen Kram auch elektrisch entkoppelt, sollte also wirklich kein Problem sein.

Du könntest ein Bein der Kontakt-Seite des Relais auf Masse am Arduino legen und die andere an ein Digital-In-Pin des Arduino. Wenn Du dann noch die Lichtschranke mit Strom versorgst sollte das elektrisch eigentlich alles sein. :)

Du müsstest dann noch bei besagtem Digital-In-Pin des Arduino per Software den Pull-Up einschalten, ansonsten fällt mir auf der "Pflicht"-Seite nichts mehr ein, der Rest wäre dann "Kür"... ;)

kurti

Hallo,

hast Du daran gedacht, dass
- die Besucher den Raum auch wieder verlassen ?
- das einige Leute hin und her laufen
- Spielkinder wie ich, wenn sie so eine Lichtschranke erkennen, mehrfach mit der Hand davor herum wedeln
- mehrere Leute gleichzeitig die Lichtschranke unterbrechen ( eine große Menschenmasse würde eventuell nur als eins gezählt )

Gruss
kurti
hier könnte Ihre Werbung stehen

Leanderlike

Hallo Kurti,

danke für deine Einwände!
Das verlassen des Raumes ist nicht so entscheidend, da gibt es einen seperaten Ausgang am anderen Ende.
Das hin und herlaufen sollte eigentlich kein Problem sein, da man aus einem dunklen Flur in einen hellen Raum kommt. Die wenigsten werden da zurücklaufen, für den Fall dass doch, wäre es nicht allzu schlimm.
Die Lichtschranke erkennen ist noch ein interessanter Punkt. Wenn man hindurchgeht soll das Signal erkannt werden, aber das was damit ausgelöst wird erst später. Stell dir vor du gehst in den Raum und dadurch wird am anderen Ende immer eine LED aufleuchten. Diese siehst du aber nur wenn du dort auch bist. Also nur für diejenigen interessant, die dort stehen, du bist in dem Fall nur der Signalgeber.

Aber danke für die Einwände genau das macht mir nämlich auch noch Gedanken. Aber ich versuche zunächst mal die Technik zu begreifen. Da ich Arduino Neuling bin wird das sicherlich komplex genug ;-)

Joghurt

Die Richtung zu bestimmen wäre kein Problem wenn Du zwei Lichtschranken parallel verwenden würdest. :)

Leanderlike

So, also dieses Tutorial hab ich soweit jetzt:
http://arduino.cc/en/Tutorial/Debounce

Ich drücke meinen Button und die LED leuchtet auf. Denke auch, dass ich das mit der Lichtschranke dann hinbekommen sollte. Kurze Frage, die ein wenig abschweift.
Ich würde gerne das Signal (Lampe leuchtet / Lampe leuchtet nicht) bzw. Button gedrückt / Button nicht gedrückt an Processing senden. Durch den Knopfdruck soll eine Processing Animation abgespielt werden. Jetzt kämpfe ich hier den halben Abend und bekomm die beiden Dinge irgendwie nicht verbunden.

Ich habe dies hier versucht...
http://www.sundh.com/blog/2011/05/get-processing-and-arduino-to-talk/
.. allerdings blinkt meine LED da nur kurz auf wenn ich das ganze von Processing aus laufen lasse und das wars dann... hmm, gibts da irgeneine zusätzliche Einstellung wie man Arduino und Processing verbinden kann? So schwer kann das doch einfach nicht sein ...

Ich danke für eure Hilfe!!!!

Joghurt

Bei Processing kann ich Dir leider überhaupt nicht helfen, da muss jemand anderes ran. ;)

Saasemer

Hallo an alle,

der Arduino muss mit Processing auf gleicher Baudrate kommuniziern.
Das muss auch im Arduino-Sketch programmiert sein -  schau z.B. mal bei http://raumfuehler.andreasmuxel.com/index.php/arduino-und-processing/kommunikation-arduino-board-zu-processing/

Gruß
Harald

Leanderlike

Hallo Harald,
danke für den Link, nach genau diesem Tutorial habe ich die beiden auch kommunizieren lassen. Das funktioniert *puhhh*

Jetzt wollte ich das ganze aber mal abwandeln. Ich habe einen Pushbutton an mein Arduino gebaut und wann immer ich diesen drücke, soll in Processing etwas passieren. Dafür will ich mir zunächst mal das Signal auslesen lassen um überhaupt zu sehen ob Processing registriert, wenn ich den Button drücke.

Ich bekomme in Processing keine Fehlermeldung, der Code wird ausgeführt. Sobald ich das Fenster in Processing schließe, erhalte ich diese Meldung im Ausgabefenster: Experimental:  JNI_OnLoad called.
Hm, ich hab das Gefühl, so schwer kann das doch nicht sein. Ist vll. int die falsche Variable um sich die Werte des Pushbuttons anzeigen zu lassen?

Ich danke euch!!!!!!

Mein Arduino Script ist folgendes:

Code: [Select]

int ledPin = 13; // choose the pin for the LED
int inPin = 2;   // choose the input pin (for a pushbutton)
int val = 0;     // variable for reading the pin status

void setup() {
    Serial.begin(57600);
  pinMode(ledPin, OUTPUT);  // declare LED as output
  pinMode(inPin, INPUT);    // declare pushbutton as input
}

void loop(){
  val = digitalRead(inPin);  // read input value
  if (val == HIGH) {         // check if the input is HIGH (button released)
    digitalWrite(ledPin, LOW);  // turn LED OFF
  } else {
    digitalWrite(ledPin, HIGH);  // turn LED ON
  }
  Serial.println(digitalRead(inPin));
}


Und mein Processing Code ist dieser hier:
Code: [Select]


// libraries
import processing.serial.*;
// serial connection
Serial port;
String message = null;
String elements[] = null;
// arduino
int sensorValues;

void setup() {
  // size
  size(800, 600);
  println(Serial.list());
  port = new Serial(this, Serial.list()[0], 57600);
}

void draw() {
}

// serial event
void serialEvent(Serial p){
  // get message till line break (ASCII > 13)
  message = port.readStringUntil(13);
  // just if there is data
  if (message != null) {
    // try catch function because of possible garbage in received data
    try {
      elements = splitTokens(message);
      // loop through sensor values
    println(sensorValues);
    }
    catch (Exception e){
    }
  }

}


hammerhai

Hier http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=71&products_id=222 gibts übrigens eine schönen Sensor der perfekt geeignet ist für Lichtschranken.

Saasemer

deinen Code habe ich nicht ganz verstanden (bin noch Anfänger). Deshalb habe ich mal folgendes probiert:

Arduino-Code:

Code: [Select]
/*
  DigitalReadSerial
Reads a digital input on pin 2, prints the result to
the serial monitor

This example code is in the public domain.
*/

void setup() {
  Serial.begin(19200);
  pinMode(2, INPUT);
}

void loop() {
  int sensorValue = digitalRead(2);
  Serial.println(sensorValue, DEC);
}





Processing-Code:

Code: [Select]
import processing.serial.*;

int sensorValue;
int linefeed = 10;
float valFloat;


Serial serport;

void setup()
{
  size(600,600);
  serport = new Serial(this, "COM40", 19200);
}

void draw()
{
while (serport.available()>0)
{
  String valString = serport.readStringUntil(linefeed);
  if (valString !=null)
  {
    print (valString);
    valFloat=float(valString);
    sensorValue=int(valFloat);
  }
}
background(153);
fill(255,200,0);
ellipse(200,200,sensorValue*100,sensorValue*100);
serport.clear();
}


Vielleicht hilft die das weiter. Bei einem Tastendruck erscheint ein gelber Kreis, solange bis du den Taster wieder los lässt.


Leanderlike

Hallo zusammen,

@ Saasemer: super, vielen Dank für deinen Code, der hat ein riesen Problem für mich gelöst!!!!!

Die Lichtschranke habe ich ans Laufen bekommen. Einziger kleiner Schönheitsfehler:
Ich bekomme - mittels dem Code von Saasemer - in Processing das Signal vom Pin2.
Wenn man die Lichtschranke durchbricht, wird dieses Signal nun ständig gesendet, bis man die Lichtschranke verlässt. Dadurch werden alle Befehle natürlich viel zu oft ausgeführt. Ich möchte das Signal in Processing empfangen, aber nur einmal soll etwas passieren.

Möglicherweise muss ich dafür nicht nur in Processing, sondern auch in Arduino etwas ändern?

Danke für eure Hilfe!!!


Joghurt

Mach Dir eine Variable, die den Stand vom letzten Durchgang speichert.

Wenn die Variable und der aktuelle Stand voneinander abweichen hat sich grade eben was getan, dann reagier.

Eigentlich ganz einfach. ;)

Go Up