Hilfe für mein Projekt

Hallo zusammen,

ich bin neu hier im forum und ich hoffe ihr könnt mir helfen.
Ich habe einen Arduino Uno und kenne mich mit Programmierung nicht so richtig aus.

Nun zu meinem Projekt: Zeitmessung über eine PC Software.
Ich möchte mit Hilfe zwei evtl. drei Lichtschranken die positive und negative Flanke auswerten
und die Impulse über einen Optokoppler weiterschalten. Der Optokoppler soll zwei Kontakte durch einen
positiven und negeativen Ipuls kurzschließen, das ganze wird dann über eine Software am PC ausgewertet. Die Lichtschranken sollgen gegeneinander verriegelt sein.

Zum testen habe ich das ganze über einen Taster (Pin2), LED und Optokoppler (Pin13) aufgebaut. Also der Optokoppler schaltet meine LED ein und aus.
Also im Prinzip soll der Ablauf so aussehen:
Wenn ich den Taster drücke (und auch gedrückt halte) soll die LED "kurz" aufleuchten und wieder ausgehen, sobald ich den Taster loslasse
soll die LED wieder "kurz" aufleuchten und wieder ausgehen.

Danke schonmal im Voraus.

Du möchtest einen endlichen Automaten bauen.

Nein, ist eine Zeitmessung für Tranpolin, bzw. Zeit wie lange man beim Sprung in der Luft ist. Bei jedem Impuls wird die Zeit gestartet bzw. gestoppt.

Du möchtest einen endlichen Automaten bauen.
ZeitMessAutomat

Danke schon mal für den Tip!

Hallo ,

ich weiss noch nicht genau was Du willst. Am Anfang redest Du von mehreren Lichtschranken , einer PC Messung und sorry was Wirres von Impulsen die was kurzschliessen sollen.

Im letzen Post scheibst Du was von einem Trampolin und Zeit messen während man in der Luft ist, da kann man was mit anfangen.

Ih fasse das Letzte mal zusammen.
Zeitmessung starten wenn das Trampolin verlassen wird

Zeitmessung beenden wenn das Trampolin wieder belastet wird und Messwert aktualisieren

Also eine AUS Flanke und eine EIN Flanke wenn man so will.

Jetzt ist die einfachste Variante das mit einem Hilfsflag zu machen, allerdings steht das Flankensignal dann nur für einen Umlauf des UNO an. Eine LED kann man also nicht damit ansteuern, weil der Impuls zu kurz ist und man nichts sieht. Den musste man dann wieder verlängern. Aber um die Zeit dazwischen zu messen reicht das. Um das zu machen brauchst DU die funktion millis() die liefert dir die ms seit start des UNO. Wenn man zu einem beliebigen Zeitpunkt den aktuellen Wert in eine Variable speichert kann man zu einem beliebigen späteren Zeitpunkt mittels der Differenz die Zeit dazwischen bestimmen.

wenn Du nun aus den Informationen

  1. Lichtschranke ist frei, vorhin war sie noch belegt
  2. Lichschranke ist belegt , eben war sie noch frei

eine If , Else if Konstruktion baust hast du fast gewonnen.

In der IDE unter Beispiele findest Du mehrere Beispiele wie man die Funktion verwendet. Blink without delay sie Dri besonders ans Herz gelegt.

Heinz

Also die Zeitmessung und Auswertung macht eine Software, die auf dem Pc installiert ist. Unter dem Trampolin werden zwei oder nach Bedarf drei Lichtschranken montiert. Über ein Schnittstellen Kabel werden die Signale von den Lichtschranken ausgewertet, es sind nur zwei Kontakte an der Schnittstelle, beim Kurzschließen dieser Kontakte wird die Zeit gestartet/gestoppt. Kurzschließen soll nur ein kurzer Impuls sein, das möchte ich über einen optokoppler schalten. Die positive Flanke soll die Zeit stoppen und die negative weiter laufen lassen. Und zum testen wollte ich auf einem Breadboard, wie oben beschrieben, über drei Taster und einer led. Hoffe man kann das nachvollziehen.

Hi

Mir ist noch nicht ganz klar, welche Rolle der Arduino hier übernehmen soll.
Wenn die Auswertung eh auf einem PC mit zig tausendfacher Rechenleistung statt findet, fällt mir nicht ein, wozu der Arduino gut sein soll/gut sein kann.

Auch ist mir noch nicht klar, was die drei Taster und die LED im Testaufbau darstellen sollen.

MfG

Hallo

wie soll denn die Schnittstelle zum PC aussehen, die Datenübertragung hat eine endliche Zeit, geht das schnell genug ohne die Messung zu verfälschen.

ich würde die Zeizmessung mit dem UNO machen und dann die Werte seriell übertragen.

aber noch mal zu Deiner Vorstellung :

eine oder mehrere Lichtschranken werden parallel geschaltet. Wenn eine der Lichtschranken belegt ist soll das ein Impuls geben ( 0,5-1 s) . Wenn alle Lichtschranken wieder frei sind soll ein Iimpuls auf einen zweiten Ausgang ausgeegeben werden (0,5-1s)

mit den beiden Signalen willst Du je einen Optokoppler ansteuern.

Heinz

Pau_laner:
Also die Zeitmessung und Auswertung macht eine Software, die auf dem Pc installiert ist. Unter dem Trampolin werden zwei oder nach Bedarf drei Lichtschranken montiert. Über ein Schnittstellen Kabel werden die Signale von den Lichtschranken ausgewertet, es sind nur zwei Kontakte an der Schnittstelle, beim Kurzschließen dieser Kontakte wird die Zeit gestartet/gestoppt. Kurzschließen soll nur ein kurzer Impuls sein, das möchte ich über einen optokoppler schalten. Die positive Flanke soll die Zeit stoppen und die negative weiter laufen lassen. Und zum testen wollte ich auf einem Breadboard, wie oben beschrieben, über drei Taster und einer led. Hoffe man kann das nachvollziehen.

Was hindert dich daran, das so zu bauen?

Eine Stoppuhr hast du schon aus meiner Wühlkiste bekommen...
Und hier ist noch eine zweite:

class StoppUhr: public Printable
{
  private:
  unsigned long startzeit;
  unsigned long abgelaufenezeit; 
  bool isrunning;

  public:
  void reset()
  {
    isrunning = false;
    startzeit = 0;
    abgelaufenezeit = 0;
  }
  
  StoppUhr()
  {
    reset();
  }
  
  void start()
  {
    if(!isrunning)
    {
      isrunning = true;
      startzeit = millis();
    }
  }
  
  void halt()
  {
    if(isrunning)
    {
      isrunning = false;
      abgelaufenezeit += millis()-startzeit;
    }  
  }
 
  virtual size_t printTo(Print &printer) const
  {
    return printer.print(isrunning?millis()-startzeit+abgelaufenezeit:abgelaufenezeit);
  }
} stoppuhr;


void uhrSteuerung()
{
  switch(Serial.read())
  {
    case 'r':stoppuhr.reset();break;
    case 's':stoppuhr.start();break;
    case 'h':stoppuhr.halt(); break;
  }
}

int bufferSize = 0; // merker fuer FiFo groesse

void serielleAusgabe()
{
  if(bufferSize == Serial.availableForWrite()) // nur schreiben, wenn Buffer ganz leer
  {
    Serial.println(stoppuhr);
  }
} 

void setup() 
{
  Serial.begin(9600);
  bufferSize = Serial.availableForWrite();
}

void loop()  
{
  uhrSteuerung();
  serielleAusgabe();
}

Aber ich befürchte, dass dir diese auch nicht weiter hilft...

Dann musst du halt noch ein bisschen *****, bis dir einer genau das schreibt, was du brauchst.
Und dann wirst du feststellen, dass bei der Umstellung von Taster auf Optisch, sich die Anforderungen noch mal ändern, und du wieder mit leeren Händen da stehst.

Und bis dahin wirst du vermutlich alle Helfer verprellt haben....

Besser wäre natürlich, wenn du dein eigenes Köpfchen anstrengen würdest. Dann würdest du wenigstens etwas programmieren lernen.

Ich habe einen Arduino Uno und kenne mich mit Programmierung nicht so richtig aus.

Das könntest du aber lernen....

Es ist nur die Frage ob du das willst.....

wird über RS232 angeschlossen. Ich hab mir gedacht 3 Optokoppler als ein Eingang für UNO und 3 als Ausgang für die Schnittstelle, ich denke es reicht ein Impuls von 100 msec. Danke für Tipps, ich werde es dann mit einer If , Else if Konstruktion ausprobieren, wenn ich das hin bekomme dann reicht das:

Wenn ich den Taster drücke (und auch gedrückt halte) soll die LED "kurz" aufleuchten und wieder ausgehen, sobald ich den Taster loslasse
soll die LED wieder "kurz" aufleuchten und wieder ausgehen. <<

Habe das jetzt ausprobiert und funktioniert soweit mit einem Taster und einer Led, wie sieht es dann mit mit Verriegelung aus? Habt ihr eine Idee?

const int buttonPin = 2;
const int ledPin = 13;

int buttonState = 0;
int lastButtonState = 0;

void setup() {

pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);

}

void loop() {

buttonState = digitalRead(buttonPin);

if (buttonState != lastButtonState) {

if (buttonState == HIGH)
{

digitalWrite(ledPin, HIGH);
delay(50);
digitalWrite(ledPin, LOW);

}

else if (buttonState == LOW)
{

digitalWrite(ledPin, HIGH);
delay(50);
digitalWrite(ledPin, LOW);

}

}

lastButtonState = buttonState;

}

Welche Verriegelung!?

Hi

Was soll denn jetzt gegen einander verriegelt werden :o

Mit dem delay() wirst Du nicht glücklich, Du willst eine State-Maschine bauen statt der delay()-Krücken.
(dazu in der IDE das Beispiel blink_without_delay ansehen)

Unterm Strich merkst Du Dir hier, wann Du die LED angeschaltet hast und prüfst in jedem Durchlauf, ob die 50ms bereits um sind - zum Ausschalten.

MfG

okay, ich schau es mir an.

Es soll ja eine der drei Lichtschranken die Zeit starten/stoppen (kommt drauf an wo man auf dem Trampolin landet), und die müssen gegeneinander verriegelt sein, sodass sie die Zeit nicht verfälschen wenn es flackern sollte, daher die Verriegelung. Im oberen Sketch ist nur der Test mit einem Taster.

Wenn Du den Impuls etwas länger machst als die max Zeit sein kann die zwischen 2 Lichtschranken auftreten kann ist es doch gut.

z.B

die erste Lichtschranke wird belegt, der zugehörige Impuls zur pos Flanke wird gestartet.Wenn der Impuls gerade zu ende ist wird die zweite Lichtschranke belegt. Solange die erste nicht wieder frei geworden ist passiert ja nichts. Falls doch hätte es ja auch eine neg Flanke gegeben und es gäbe einen neue pos Impuls. Damit Falschmessung. Um das zu vermeiden muss der Impuls doch nur lang genug sein.

Ansonsten fällt mit jetzt nicht ein was man da noch verriegeln könnte, letzlich sind die Lichtschranken ja miteinander verodert.

Wenn der UNO nichts anderes zu tun hat kannst Du das mit dem delay meiner meinung nach drin lassen. Du must Dir nur darüber im klaren sein das bei einem delay das Ding Pause macht und sonst nix mehr passiert. Er warter einfach innerhalb des delay bis die Zeit um ist. Du kannst also während einer delay zeit keine negative Flanke erkennen.