INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 1 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Hilfe bei IR Lichtschranke
12.07.2014, 10:18
Beitrag #41
RE: Hilfe bei IR Lichtschranke
(11.07.2014 09:21)cb_baer schrieb:  Das finde ich gut. Mich würde dann mal interessieren, in welchen Grenzen sich die Ungenauigkeit einer Software-Lösung bewegt.
Ich denke, dass man die je nach Programmierung auch recht klein halten kann.

Gruß, Alex
Nun das Problem ist ganz einfach das weil in dem Fall die zu messende Größe eben nur ein Ereignis ist das eben nur 1,5mS andauert und die abarbeitung eines CPU Befehles 0,0000000625 Sekunden dauert wovon denn schon mehrere Befehle benötigt werden um einen Port abzufragen und dann noch eine Entscheidung zu treffen ob der Eingang nun 1 oder 0 ist um dann bei der 1 eben noch ein Register zu inkrementieren. Und sowas macht man wenn es schnell ablaufen soll in Maschinensprache also in Assembler geschrieben. Aber wir haben hier eine Arduino Umgebung wo noch ein Timerprozess eben der millis() und micros() im Hintergrund läuft was alles auch Rechenzeit beansprucht. Deswegen ist um etwas zu messen ein Hardwareinterface in der Datenerfassung frei von solchen Störeinflüssen wo im Hintergrund ablaufen. Von daher betrachtet ist die Verwendung der Funktion pulseIn() ein Kompromis was die Genauigkeit angeht weil auch hier der Pin nur per Software abgefragt werden kann aber dann wohl schon per darufhin optimiertem Programmcode den man per normal geschriebenem Arduino Code nicht mit der gleichen Geschwindigkeit laufend nachbilden kann.
Noch eine Möglichkeit wäre den Timer1 von der CPU als Impulsmesser zu benutzen doch das ist in der Arduino Umgebung wohl nicht implementiert und ich weiß auch nicht ob gerade dieser Timer nicht von den Hintergrundfunktionen benutzt wird. Wenn man sich selber in C oder Assembler ein komplettes Programm ohne Arduino also mit dem Atmel AVR-Studio schreibt kann man die Verwendung der Timer selber bestimmen.
Aber du kannst da dann ja mal Vergleiche anstellen wenn dein Aufbau perfekt läuft und die Messwerte sich plausibel verhalten. Und ohne freie Gedanken Idea würde auch nie was neues erfunden werden...Wink
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.07.2014, 22:11 (Dieser Beitrag wurde zuletzt bearbeitet: 14.07.2014 22:14 von cb_baer.)
Beitrag #42
RE: Hilfe bei IR Lichtschranke
So ich hab noch einmal angefangen und nun habe ich ein neues Problem.
Immer wenn ich den folgenden Sketch hochlade macht er zwar erst was er soll. Aber nach kürzester Zeit hängt sich der Arduino einfach auf. Ich kann die Lichtschranke ein, maximal 2 mal auslösen aber funktionieren tut das nur kurz. Mein 2. Problem ist dass ich es nicht hinbekomme dass er den Wert der 1. LS vom Wert der 2. LS abzieht. Damit könnte ich ja dann weiterrechnen aber er druckt mir etwas gänzlich anderes aus. Habt Ihr eine Idee warum er mir das Leben so schwer macht? Ich hab es bei den Variablen mit "int" "long" "unsigned int" und "unsigned long" versucht. Abgesehen davon dass er bei "long" auch mal längere Zahlen ausgibt ändert sich da nicht viel.

Und wenn ich den Teil mit der "for" Schleife raus nehme dann meckert er rum dass ihm ein initailzer fehlt. Was auch immer das ist.

Zitat:#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


volatile unsigned int LS1 = 0; //neu auszulesende variable integer als ls1
volatile unsigned int LS2 = 0;



void setup()
{
lcd.begin(16, 2);
Serial.begin(9600);
attachInterrupt(0, Lichtschranke, RISING);
attachInterrupt(1, Lichtschranke1, RISING);
}

void loop()
{
for (int i = 0; i < 1000; i++)
{
delay(1000);
}
}

void Lichtschranke()
{
LS1 = micros();
Serial.print("LS1 ");
Serial.println(LS1 );
lcd.setCursor(0,0);
lcd.print(LS1);

}


void Lichtschranke1()
{
LS2 = micros();
Serial.print("LS2 ");
Serial.println(LS2-LS1 );
lcd.setCursor(3,1);
lcd.print(LS2);

/*
Serial.println("LS 2");
volatile int zei;
zei = micros();

Serial.println(micros());
lcd.setCursor(0,1);
lcd.print(zei);
*/

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.07.2014, 12:05
Beitrag #43
RE: Hilfe bei IR Lichtschranke
Hallo cd_baer,

da LS1 und LS2 die Werte von micros() aufnehmen, müssen die Variablen als long, nicht als int definiert werden.
In die ISR Lichtschranke und Lichtschranke1 sollten auf keinen Fall Anweisungen wie lcd... oder Serial... etc. rein, das ist ein absolutes NoGoExclamation lediglich die notwendigsten Dinge, wie eben das Setzen von LS1 und LS2, gehören dort rein.
Die For-Schleife mit dem delay() ist völlig sinnfrei. Sie behindert eigentlich nur die Auslösung der ISRs.
Grüße Ricardo
PS: Die Sätze hier: http://arduino.cc/de/Reference/AttachInterrupt und hier: http://fluuux.de/2013/04/interrupts-mit-...-benutzen/ sollte man durchaus wörtlich nehmen.

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.08.2014, 22:30
Beitrag #44
RE: Hilfe bei IR Lichtschranke
Hallo Leute,
Meine essung funktioniert mit dem folgenden Code schonmal
Code:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);


volatile int bounceTime  = 1000;   // Switch bouncing time in milliseconds
volatile unsigned long LS1 = 0;
volatile unsigned long LS2 = 0;

float messd = 0;
float dist = 100;  //angabe in mm

const double feet = 3.280839895013;
double distanz_in_feet;
double zeit_teiler;
double fps;


void setup()   {    
  Serial.begin(9600);
  attachInterrupt(0, Lichtschranke, RISING);
  attachInterrupt(1, Lichtschranke1, RISING);
  

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  

  
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("FPS");
  display.setCursor(35,7);
  display.setTextSize(1);
  display.print(" - Messung");
  display.drawFastHLine(0, 16, 128, WHITE);
  display.drawFastHLine(0, 17, 128, WHITE);
  display.display();
  
}

void loop() {
  
  messd = (LS2)-(LS1);
  zeit_teiler = 100000 / messd;
  distanz_in_feet = (dist / 10) / feet;
  fps = distanz_in_feet * zeit_teiler;
  display.setTextColor(WHITE);
  display.fillRect(0, 23, 128, 41, BLACK);   // Blöcke löschen
  display.setTextSize(4);
  display.setCursor(0,26);
  display.print round(fps);                          // FPS Wert
  display.setTextSize(2);
  display.setCursor(70,32);
  display.print(" FPS");
  display.setTextSize(1);                    // kmH Anzeige
  display.setCursor(75,55);
  display.print round((fps)*1.09728);          // kmH Wert
  display.print(" kmh");
  display.display();
  
}

void Lichtschranke(){
  volatile unsigned long last_LS1 = 0;
  LS1 = micros();
      if(LS1 - last_LS1 > bounceTime){
    // Valid state change
  LS1 = LS1;
  }
  Serial.print("LS1  ");
  Serial.println(LS1);

}

void Lichtschranke1(){
  volatile unsigned long last_LS2 = 0;
  LS2 = micros();
       if(LS2 - last_LS2 > bounceTime){
    // Valid state change
  LS2 = LS2;
  }
  Serial.print("LS2222  ");
  Serial.println(LS2);
}

Allerdings habe ich ein Problem bei entprellen des Interruptes. Hat jemand eine Idee warum das ganze nicht funktioniert?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.08.2014, 23:08
Beitrag #45
RE: Hilfe bei IR Lichtschranke
Hallo cd_baer,

in die ISRs Lichtschranke() und Lichtschranke1() sollten auf keinen Fall die lcd.print() - Funktionen stehen.
Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.08.2014, 06:05
Beitrag #46
RE: Hilfe bei IR Lichtschranke
Ja okay, aber ich habe ja nur einen Serial.print mit in die ISRs eingebaut um zu sehen ob die Lichtschranke überhaupt Prellt. Wenn ich mitm Stift an den beiden Lichtschranken vorbei fahre dann prellt erh halt noch ziemlich. Am Prototyp Prellt er nicht so stark weil die Geschwindigkeit des Projektils höher ist aber ich bekomm trotzdem manchmal zwischen2 und 3 Werte. Die Messung ist übrigens schon ziemlich genau. so viel Abweichung ist da gar net mehr dabei. Aber ich würde die Lichtschranken trotzdem gerne entprellen. Ich verspreche mir davon noche in ticken mehr Genauigkeit.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.08.2014, 12:45
Beitrag #47
RE: Hilfe bei IR Lichtschranke
Zitat:Am Prototyp Prellt er nicht so stark weil die Geschwindigkeit des Projektils höher ist aber ich bekomm trotzdem manchmal zwischen2 und 3 Werte.
Klingt für mich wie ein Problem des Aufbaus der LS. Wie sieht so ein Projektil aus? Wenn es eine Kugel ist, sind die 2 bis drei Werte wohl nicht zu verhindern. Ist einfach der Kugelform geschuldet.
Programmtechnisch gibts eigentlich nur die Möglichkeit die bounceTime zu verlängern, oder?
Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.08.2014, 13:24
Beitrag #48
RE: Hilfe bei IR Lichtschranke
Ja das Projektil ist eine Kugel. Dass die Bounce zeit verlängert werden muss habe ich mir schon gedacht. Aber irgentwie funktioniert das in dem Code nicht so richitg wie ich mir das gedacht habe. selbst wenn ich die Zeit auf 5000 stelle bekomm ich immer mehrere Impulse.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Hilfe 433MHz Empfänger OLDARDUINO 12 346 16.11.2016 09:55
Letzter Beitrag: hotsystems
  Hilfe für einen GPS gestützten Quadrocopter TeamQuadro 13 378 02.11.2016 08:14
Letzter Beitrag: Binatone
  Hilfe, ist der bmp280 defekt? reimundko 5 588 12.09.2016 18:49
Letzter Beitrag: ardu_arne
  Bitte un Hilfe 3ddrucker 3 241 18.08.2016 16:24
Letzter Beitrag: Binatone
Star Bitte um hilfe bei Aurel Empfänger & Sender Mischa 3 517 08.06.2016 15:26
Letzter Beitrag: hotsystems
Heart Bitte um Hilfe um auf Display Temperatur auzugeben Mischa 6 505 04.06.2016 20:49
Letzter Beitrag: hotsystems
  Hilfe bei Ironman Helm Sketch Heppo 4 391 31.05.2016 17:18
Letzter Beitrag: Heppo
  Benötige Hilfe zu Schaltbild torsten_156 4 481 07.04.2016 16:09
Letzter Beitrag: Bitklopfer
  Lichtschranke mit IR-LED und Fototransistor C++Developer2000 7 1.436 01.01.2016 13:12
Letzter Beitrag: hotsystems
  Lichtschranke - Speichen Waishon 1 905 16.09.2015 23:03
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste