Lineare Geschwindigkeitsmessung? (Hallsensor?)

Hallo,
ich arbeite an einem Teilprojekt für die Uni und mache einige Versuche. Unsere Ergebnisse auf dem neuen Prüfstand sind ein wenig verwunderlich und deswegen soll ich jetzt die genauen Geschwindigkeiten messen, ob evtl daher unsere große Streuung kommt. Bin absoluter Neuling und hab fast keine Grundkenntnisse außer dem was ich mir die letzten 2 Tage so gegoogelt hab.

Kurze Beschreibung meines Aufbaus:
Ein Gewicht fällt an einer Linearführung herunter. Interessant ist die Aufprallenergie, also will ich die Geschwindigkeit kurz davor messen.

Meine 1. Idee war 2 oder 3 (um die Beschleunigung im Messabschnitt mit einzurechnen) Magnetstreifen auf dem Gewicht anzubringen und außerhalb fest positioniert einen Hall Sensor. Dann lasse ich über micros() den Counter laufen und speichere die 3 Werte beim passieren ab und rechne über die Zeitdifferenz meine Energie aus.

Meine 2. Idee war einen Magnetstreifen und 2 oder 3 Hall Sensoren zu verwenden. Ist vielleicht dann einfacher abzufragen?

Die Geschwindigkeiten werden im Bereich von 0,5m/s bis 3 m/s liegen. Um möglichst genau zu bleiben sollte ein möglichst kurzer Abstand, ca 2 cm zwischen den Sensoren oder Magnetstreifen liegen. Das würde eine Durchlaufzeit von 6,67ms bis 40ms ergeben. Bei einem Uno mit 16 MHz habe ich ja eine Genauigkeit von 4 Mikrosekunden und wäre somit in einem für meine Tests sehr genauen Bereich.

Jetzt meine Fragen:
Bin ich mit dem Hall Sensor vllt völlig auf dem falschen Weg und hat somit jemand gleich eine bessere Idee oder ist dass eine gute Lösung? Ich weiß gar nicht wie schnell und genau so ein Hallsensor überhaupt funktioniert... Was würdet ihr bevorzugen, Idee 1 oder 2?
Wie kann ich die Zeit des micros() abspeichern/ausspucken lassen wenn der Hallsensor auf HIGH schaltet?
Die Ausgabe erhalte ich dann ja direkt am Laptop auf dem Bildschirm, oder? Display wäre schon super, aber da vor allem Zeit mein limitierender Faktor ist, will ich ungern viel Zeit ins rumprobieren stecken und rechne dann vermutlich lieber alles (Zeitdifferenz, Geschwindigkeit, Energie) in einer Excel aus?

Vielen Dank schonmal im Vorraus!
Gruß Patrick

Hallo Patrick,
ich glaube dass der Hallsensor nicht so gut geeignet ist, mglw kann der Ort nicht "scharf" genug erkannt werden, da das Magnetfeld ja zum Rand hin exponentiell abnimmt.
Ich würde das ganze optisch mit einer Reflexlichtschranke machen. Kannst du auf dem fallenden Gewicht z.B. 2 Streifen Alufolie mit einem definierten Abstand, zB 1 cm anbringen? Dann misst du den Abstand zwischen der ersten fallenden Flanke und der nächsten steigenden Flanke der Reflexlichtschranke. Der Rest ist dann Mathematik.
Gruß
Reinhard

Die Lichtschranken sind wahrscheinlich der besste Weg. Wenn angenommen wird, dass das Gewicht linear beschleunigt, also s = 1/2 at² und v = a*t gelten, können die Lichtschranken auch beliebig weit entfernt angebracht werden. Misst du nur die Geschwindigkeit mit v = s/t, so ist ein Fehler zu erwarten, da die Geschwindigkeit nicht konstant ist. Du errechnest also nur eine mittlere Geschwindigkeit, die maximalgeschwindigkeit ist natürlich größer. Im Rahmen der Messgenauigkeit kann dies aber wahrscheinlich vernachlässigt werden.

Hallo,

ein Hallsensor ist schon was genaues. Kommt nur darauf an was der wie messen soll. Magnetische Positionmessung ist DIE Anwendung schlecht hin für so ein Teil. Nur muß der Magnet und der Hallsensor darauf genau abgestimmt sein. Genau das wird hier für so einen Versuch Overkill sein. Eine Lichtschranke wird laut meiner Meinung ausreichend sein. Nur sollte die nicht eine Seitenfläche mittels Reflexion erfassen. Ich denke es wäre besser, wenn der Lichtstrahl durch das Meßobjekt unterbrochen wird. Auf einer Seite der Sender und auf der anderen Seite der Empfänger. Das Meßobjekt fährt mit dem Körper mitten durch den Lichtstrahl und unterbricht diesen. Das nimmste zur Zeitnahme. Alles andere danach wird ignoriert. Wenn alle Lichtschranken in gleicher Höhe positioniert sind, sind genaue und wiederholbare Meßergebnisse möglich.

Und wegen Display. Wenn es schön aussehen soll meinetwegen. Aber ihr rennt doch eh alle mit Laptops rum. :slight_smile: Ich würde da nicht so ein Aufriss machen. Nachdem alle Lichtschranken im Code "vermessen" wurden, würde ich danach alle erforderlichen Werte auf die serielle ausgeben lassen. Nach den Messungen hat der µC genügend Zeit für die serielle Schnittstelle.

Vielen Dank schonmal für eure hilfreichen Antworten.

erni-berni: Ja Platz um Streifen etc auf dem Gewicht anzubringen wäre genug da.
Ob und wie das Magnetfeld zum Rand hin abnimmt weiß ich auch nicht und hab ich leider noch nirgends gefunden. Wobei ich denke dass das vllt egal wäre? Das Magnetfeld ist dann ja trotzdem konstant "unscharf" und sollte immer zum gleichen Zeitpunkt erkannt werden, oder?

MGOS: Um auch die Beschleunigung mit einzurechnen hätte ich eben 3 Messpunkte im gleichen Abstand genommen. Dann hat man die zumindest, wobei ich auch glaube dass die zu vernachlässigen ist. Aber sicher ist sicher.

Doc_Arduino: Ja auf dem Laptop ausgeben ist mir eh lieber, bedeutet ja auch weniger Arbeit für mich. und am Ende muss ich eh alle Daten digital speichern.
Was meinst du mit Overkill genau? Zu schwierig zu realisieren?
Unterbrechungslichtstrahl wäre auch meine Wahl gewesen, aber da ich nur eine Seite des Prüfstandes unverändert lassen kann und die zweite immer ab und aufbauen muss in der Werkstatt, wird mich das ständige neu positionieren wohl eher nerven und zu Ungenauigkeiten führen. Alle Sensoren auf der Seite die montiert bleibt wär mir lieber.

Mein Betreuer ist von dem Hallsensor wohl etwas mehr angetan, ihr von der Lichtschranke und ich kann mich nicht entscheiden... Wobei ich fast glaube ich probiere es mal mit einem Hallsensor, die kosten mich beim Conrad ja nur ca 2 Euro und wenn die keine konstanten Ergebnisse liefert, steig ich auf die Lichtschranke um.

parick:
Wobei ich fast glaube ich probiere es mal mit einem Hallsensor, die kosten mich beim Conrad ja nur ca 2 Euro und wenn die keine konstanten Ergebnisse liefert, steig ich auf die Lichtschranke um.

Keine Sorge, Hallsensoren liefern konstante Ergebnisse. (voraussetzung: Abstand ist konstant)
z.B. Einspritz- und Zündzeitpunkte bei KFZ-Motoren werden immer über Hall- und Induktive Sensoren bestimmt, und die müssen auch sehr konstant sein. (Abweichung <1° Drehwinkel)

Hallo,

mit "Overkill" meinte ich, dass der Aufbau mit Lichtschranken bestimmt einfacher wäre. Aber wenn Du nur an eine Seite des gesamten Aufbaus heran kommst, würde mich, wenn ich Student wäre, die Sache mit den Hallsensor schon eher reizen als "popplige Lichtschranken". Was meinste? :wink: Du möchtest doch als Student auch sinnvoll beschäftigt sein. :wink: Das Wissen darüber kannste später bestimmt verwenden.
Und wie Gunter schon meint, die Schalthysterese ist in dem Fall egal. Du fährst ja nicht vor und zurück. Es kommt bei Dir nur darauf an das der erste "Schaltimpuls" bei allen positionierten Sensoren an der gleichen Stelle ist. Höhe und Abstand zum Meßobjekt. Dann fährst Du bestimmt vorher noch paar Versuche mit konstanter Geschwindigkeit um zu sehen ob alles paßt und dann kannste den Klotz durch die Kante schießen ... :smiley:

Hatte ein wenig zu tun aber heute mal wieder Zeit mich dem Projekt zu widmen und aus einigen anderen Threads meinen Code zusammenzubasteln. Allerdings wenn ich das richtig verstehe speichert mein "start" nicht das erste sondern das letzte eingefangene Signal und mein "finished" aber das erste Signal.

Habs getestet indem ich den Magneten ca 5 Sekunden an Hallsensor1 gehalten hab und dann raus und nach 2 Sekunden an Hallsensor2 und in der Ausgabe erhalte ich auch diese 2 Sekunden. Kann man jeweils nur das erste Signal speichern?

const int hallPin1 = 9;     
const int hallPin2 = 12;     
const int ledPin =  13;     

int hallState1 = 0;          
int hallState2 = 0;    

unsigned long start, elapsed, finished;

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);    
  // initialize the hall effect sensor pin as an input:
  pinMode(hallPin1, INPUT);     
    // initialize the hall effect sensor pin as an input:
  pinMode(hallPin2, INPUT);  
  
  Serial.begin(9600);  
}

void loop(){
  // read the state of the hall effect sensor:
  hallState1 = digitalRead(hallPin1);
    // read the state of the hall effect sensor:
  hallState2 = digitalRead(hallPin2);
  

  if (hallState1 == LOW) {     // start Stopwatch    
    start=micros();
    // turn LED on:    
    digitalWrite(ledPin, HIGH);  
  } 
  else {
   // do nothing
  digitalWrite(ledPin, LOW); 
  }
  
    if (hallState2 == LOW) {     // stop Stopwatch   
    finished=micros();    
    
    digitalWrite(ledPin, HIGH);   // turn LED on:
    
    elapsed=finished-start;
    Serial.println("Time:");
    Serial.println(elapsed);
    Serial.print("microseconds elapsed");
    Serial.println();
    delay(500);
    
  } 
  else {
   // do nothing
  digitalWrite(ledPin, LOW); }
}

Schönes Wochenende noch

Hallo,

in Deiner Meßfunktion werden 2 Meßwerte gespeichert. start und finished. Diese sind immer vorhanden, brauchst Du ja immer für jede Messung. Was Du damit machst, ist dann Deine Sache.

start=micros();
finished=micros();

Diese werden bei Dir z.Z. am Ende miteinander verrechnet und Du bekommst immer nur die Differenz der beiden angezeigt. Wenn Du die Start und Endzeit sehen möchtest, mußt Du diese nur zusätzlich ausgeben lassen.

Serial.print("Start: "); Serial.print(start);
Serial.print("Ende: "); Serial.print(finished);

Hallo,

mir fällt nochwas auf. Die Variable start wird rot marktiert beim kompilieren. Das bedeutet sie wird von der Arduino IDE schon verwendet. Also Namen ändern.

Desweiteren funktioniert Dein Sketch zwar, aber wenn Du nur den 2. Hallsensor ständig schalten würdest, bekommst Du unsinnige Werte, weil Deine Startzeit veraltet ist.

Hab das mal mit if und while geändert. Die Messung startet erst, wenn der erste Hallsensor sein Low Signal liefert. Egal was vorher der 2. Sensor macht. Dann wird mittels while gewartet bis der 2. Sensor sein Low Signal liefert. Damit ist die Messung beendet. Die LED signalisiert jetzt das eine Messung läuft, nicht mehr das ein einzlner Sensor geschalten hat. Jetzt kannst Du weitere Sensoren mittels while einbauen um vielleicht Zwischenergebnisse von Teilstrecken zu erhalten.

sollte eigentlich funktionieren:

const int HallSens_1 = 9;     
const int HallSens_2 = 12;     
const int ledPin =  13;     

unsigned long time_1, time_2, elapsed;

void setup() {
 
  pinMode(ledPin, OUTPUT);      // initialize the LED pin as an output:
  pinMode(HallSens_1, INPUT);   // initialize the hall effect sensor pin as an input: 
  pinMode(HallSens_2, INPUT);   // initialize the hall effect sensor pin as an input:
  
  Serial.begin(9600);  
}

void loop() {
  
  if (digitalRead(HallSens_1) == LOW)   // start Stopwatch, wenn 1. Hallsensor auf LOW    
    {
     time_1 = micros();                 // 1. Zeitnahme
     digitalWrite(ledPin, HIGH);        // turn LED on "Messung gestartet"
         
     while (digitalRead(HallSens_2) == HIGH) {}  // wenn 2. Hallsensor auf HIGH, warten bis wieder LOW
     time_2 = micros();                          // 2. Zeitnahme
     
     digitalWrite(ledPin, LOW);         // turn LED off "Messung beendet"
     
     // Berechungen und Ausgaben  
     elapsed = time_2 - time_1;        // Differenz bilden
     Serial.print("Start: "); Serial.print(time_1);  Serial.println(" microseconds");
     Serial.print("Ende: ");  Serial.print(time_2);  Serial.println(" microseconds");
     Serial.print("Dauer: "); Serial.print(elapsed); Serial.println(" microseconds");
    }    
    
}  // Ende loop

Wow, perfekt, so genau hab ichs mir vorgestellt. Habs gerade getestet und es läuft wunderbar.

Vielen Dank Doc!