Arduino Spielerreien: Part1 Chronilauf

Dieses Thema im Forum "Allgemeines & Sonstiges" wurde erstellt von Black-Jack, 21. Juni 2018.

  1. Black-Jack

    Black-Jack Erfahrener Benutzer

  2. Jetzt anmelden Die Community freut sich auf dich! Exklusive Features und Content warten.

  3. Hallo Gemeinde,
    Ich wollte eigentlich das ganze erst präsentieren wenn ich fertig bin aber momentan stosse ich auf Schwierigkeiten die ich so nicht erwartet habe. Wenn jemand Ahnung von Arduino hat und mir 1-5 Dinge dazu sagen kann wär das Hilfreich.

    Ich habe vor den Lauf Chroni von @BrittLiv nach zu bauen.
    https://www.instructables.com/id/Measure-the-speed-of-Nerf-darts/

    1. Problem der Arduino den ich bestellt habe ist mit einem festen ic (Atmega328) ausgestattet nicht so wie in den meisten anderen Fällen mit einem austauschbaren. Ich nehme an das ist egal und ich kann trotzdem die Atmegas damit programmieren.

    2. Problem die Treiber (SAA1064) für die 7 Segment Anzeige sind nicht mehr erhältlich.
    Als Ersatz, in der Hoffnung es funktioniert hab ich mir jetzt einen TM1637 bestellt, der müsste Treiber und Anzeige in einem Stück vereinen.
     
    Zuletzt bearbeitet: 22. Juni 2018
  4. Dominik

    Dominik Erfahrener Benutzer

    Punkt 1 ist unklar, da scheinen Worte zu fehlen.

    Bei Punkt zwei musst du dafür sorgen, dass die Eingänge und benötigten Signale identisch sind. Da die Kommunikation vom Arduino aber über I2C-Bus erfolgt sollte das aber kein Problem sein.
     
  5. Black-Jack

    Black-Jack Erfahrener Benutzer

    Texterkennung kann Texte unleserlich machen.

    Was ich meinte ist das der "Standard" arduino Uno einen Ic (daraus hat mein Telefon ein ich gemacht) hat den man austauschen kann. Bei meiner Version ist der Chip fest verlötet, was mich erst Mal irritiert hat. Mit der Segment Anzeige hab ich vermutlich ein allinone Teil, muss aber den Code anpassen, weil es dann die i2c Schnittstelle nutzt. Richtig? In Brittlivs Anleitung ist es ja zweiteilig Treiber und Anzeige.

    Fortschritte:
    Die Bauteile sind bestellt, was ich blöderweise vergessen habe sind Batterie Halter und Platinen Platte.
    Und ein paar Schalter, denn ich plane das ganze um eine Ammo counter zu erweitern.
    nichts desto trotz denke ich das ich wenn ich aus dem Urlaub nächste Woche zurück bin mit dem Programmieren und testen loslegen kann.

    Fragen zum Schaltplan:
    Links im Bild hab ich etwas Markiert, ich vermute das ist der 16 mhz taktgeber, aber im Schaltplan hat der 3 verbindungen, in real hat er nur 2. das überfragt mich. Etwas weiter rechts sind 2 Pins am IC verbunden und mit einem kurzen stück dran, das nicht weiterführt.
    Was ist das ?
     

    Anhänge:

    Zuletzt bearbeitet: 25. Juni 2018
    Void gefällt das.
  6. Black-Jack

    Black-Jack Erfahrener Benutzer

    Es geht weiter, da ich gerade im Ausland bin und und vermutlich jetzt erst die nötigen teile kommen, betreibe ich schon etwas Codeanpassungen.
    Viel Respekt vor @BrittLiv und ihrer Arbeit, leider hat sich beim Arduino einiges geändert, bzw sind manche teile in der Form nicht mehr zu bekommen.
    Deshalb ein Coderework von mir, angepasst an ein Tm1637 Display.

    In Problem habe ich noch in Zeile 139 da in der aktuellen Bounce2.h so nicht vorgesehen ist. Aber dem Problem nehm ich mich morgen an.
    Spoiler: 

    #include "TM1637Display.h"
    #include "Bounce2.h"

    //byte diaplayAddr = 0x70 >> 1; // Address of the I2C control
    //int digitBytes[16]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113}; // 0 1 2 3 4 5 6 7 8 9, decimal point = +128

    #define CLK A5 //can be any digital pin
    #define DIO A4 //can be any digital pin
    TM1637Display display(CLK, DIO);

    //light barrier
    int LSFrontPin = A0; //light barrier at the front of the barrel
    int LSBackPin = A1; //light barrier at the back of the barrel
    int TriggerPin = 11;

    float meanVal = 0;
    float meanCount = 0;

    //Datenverarbeitung
    int LSFrontVal = 0;
    int LSBackVal = 0;
    int BaseLineFront = 0;
    int BaseLineBack = 0;

    //threshold, to recognise a dart
    int TriggerFront = 0;
    int TriggerBack = 0;

    //measuring the speed
    int measuringBack = 0;
    float length = 0.173; //m
    int loopTime = 100; //time of the measuring point in micro seconds
    unsigned long measureLoops = 0;
    unsigned long heartBeat = 0;

    float TempBaseLineFront = 0;
    float TempBaseLineBack = 0;

    Bounce Taster = Bounce(TriggerPin, 10);

    void setup(){
    Serial.begin(9600);
    //Wire.begin(); // start up I2C bus
    delay(500);
    // createDisplay();
    pinMode(LSFrontPin, INPUT);
    pinMode(LSBackPin, INPUT);
    pinMode(TriggerPin, INPUT);
    delay(1000);
    //create a base line
    for (int ii=0; ii<100; ii++){
    TempBaseLineFront = TempBaseLineFront + analogRead(LSFrontPin);
    TempBaseLineBack = TempBaseLineBack + analogRead(LSBackPin);
    delay(10);
    }
    BaseLineFront = (int)(TempBaseLineFront / 100);
    TriggerFront = (int)(0.8*BaseLineFront);
    BaseLineBack = (int)(TempBaseLineBack / 100);
    TriggerBack = (int)(0.8*BaseLineBack);

    //Show that the initialisation is done: blink three times with the base line values
    writeNumber(TriggerFront, 500);
    delay(200);

    writeNumber(TriggerBack, 500);
    delay(200);
    // writeNumber(888, 500);
    // delay(200);
    // writeNumber(888, 500);
    // delay(200);
    // writeNumber(888, 500);
    // delay(200);
    measuringBack = 1; //start measuring and wait for the darts
    }



    void writeNumber(int number, int waitTime){
    // creat number and show it for waitTime ms
    int digit1 = number/100;
    int digit2 = (number - (digit1*100)) / 10;
    int digit3 = number - digit1*100 - digit2*10;
    Serial.println(number);
    Serial.print("digit1: "); Serial.println(digit1);
    Serial.print("digit2: "); Serial.println(digit2);
    Serial.print("digit3: "); Serial.println(digit3);
    display.showNumberDec(number);

    delay(waitTime);
    display.showNumberDec(number);
    }

    void heartBeatBeat(){
    display.setBrightness(0); //lets the decimal point Increase Brightness
    uint8_t segto; int value = 1244;
    segto = 0x80 | display.encodeDigit((value / 100)%10);
    display.setSegments(&segto, 1, 1); //Schaltet die Doppelpunke ein.
    display.setBrightness(1);
    display.setBrightness(2);
    display.setBrightness(3);
    display.setBrightness(4);
    display.setBrightness(5);
    display.setBrightness(6);
    display.setBrightness(7);
    display.setSegments(&segto, 0, 0); //Richtig?

    display.showNumberDec(1,false,1,0); //1000
    display.showNumberDec(2,false,1,1); //0200
    display.showNumberDec(3,false,1,2); //0030
    display.showNumberDec(4,false,1,3); //0004

    for (int i=0; i < 999; i++){
    display.showNumberDec(i);
    delay(20);
    }


    }


    void loop(){
    //Hearbeat interval
    if (millis() > (heartBeat + 5000)){
    heartBeat = millis();
    heartBeatBeat();
    }
    //read the push button
    Taster.update();
    int TasterStatus = Taster.read();
    unsigned long duration = Taster.duration();
    if ((TasterStatus == HIGH) && (duration < 2000)){
    writeNumber((int)(meanVal*10/meanCount), 1000);
    }
    else if (TasterStatus == HIGH){
    Serial.println("reset");
    writeNumber(0, 500); delay(200);
    writeNumber(0, 500); delay(200);
    writeNumber(0, 500); delay(200);
    meanVal = 0;
    meanCount = 0;
    delay(500);
    }
    //delayMicroseconds(loopTime);
    //if (digitalRead(TriggerPin) == HIGH) { Serial.println("Trigger!"); }
    if (measuringBack == 1){
    //Pfeil wurde noch nicht detektiert
    LSBackVal = analogRead(LSBackPin);
    if (LSBackVal < TriggerBack) { measuringBack = 0; measureLoops = micros(); Serial.print("Start Trigger :"); Serial.println(TriggerBack); Serial.println(LSBackVal); }
    }
    else
    {
    //dart was detected, but didn't arrive in the front
    LSFrontVal = analogRead(LSFrontPin);
    if (LSFrontVal < TriggerFront){
    unsigned long stopTime=micros();
    float deltaTus = (float)(stopTime-measureLoops);
    deltaTus = deltaTus / 1.0e6;
    float mSpeed = length / deltaTus;
    measuringBack = 1;

    Serial.println(measureLoops);
    Serial.println(stopTime);
    Serial.println(deltaTus);
    Serial.println(mSpeed);

    meanCount = meanCount + 1;
    meanVal = meanVal + mSpeed;

    Serial.println(meanVal);
    Serial.println(meanCount);

    writeNumber((int)(mSpeed*10), 500);
    delay(200);
    }
    }
    //#Reset after 1 s
    if ((measuringBack == 0) && (micros() > (measureLoops + 1000000)))
    {
    measuringBack = 1;
    }
    }

     
    Dominik, Balthazar2026 und Moggih gefällt das.
  7. Dominik

    Dominik Erfahrener Benutzer

    Aus welchem Grund hast du einzelne Codezeilen auskommentiert? Sind das die Zeilen die einen bestimmten Typ Display ansprechen?
     
  8. Black-Jack

    Black-Jack Erfahrener Benutzer

    Die obersten 3 Male hab ich die alte Display Ansteuerung auskommentiert, beim Rest sind es von @BrittLiv auskommentierte Dinge.
     
    Zuletzt bearbeitet: 27. Juni 2018
  9. Black-Jack

    Black-Jack Erfahrener Benutzer

    soo Lange zeit passierte hier nichts, jetzt bin ich aber wieder in Stück weiter.
    nachdem ich Quasi mit dem code noch mal bei 0 anfing ging es dieses mal besser, da ich vorher Sachen auskommentiert habe die wichtig waren.
    Der Code den BrittLiv geschrieben hat ist bis auf die Ausgabe unberührt und liefert realistische Ergebnisse. Mangels Heißkleber um die Fototransistoren einzukleben, erfolgt der große Test im zusammengebauten Rohr in kürze.
    2 Testungen auf dem Schreibtisch ergaben 127 (12,7) und 134 (13,4) m/s
    Spoiler: 

    #include "TM1637Display.h"

    //#include "Wire.h" // I2C control
    #include "Bounce2.h"

    #define CLK A5 //can be any digital pin
    #define DIO A4 //can be any digital pin
    TM1637Display display(CLK, DIO);
    uint8_t data[] = {0x0, 0x0, 0x0, 0x0};



    //byte diaplayAddr = 0x70 >> 1; // Address of the I2C control
    int digitBytes[16]={63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113}; // 0 1 2 3 4 5 6 7 8 9, decimal point = +128

    //light barrier
    int LSFrontPin = A0; //light barrier at the front of the barrel
    int LSBackPin = A1; //light barrier at the back of the barrel
    int TriggerPin = 11;

    float meanVal = 0;
    float meanCount = 0;

    //Datenverarbeitung
    int LSFrontVal = 0;
    int LSBackVal = 0;
    int BaseLineFront = 0;
    int BaseLineBack = 0;

    //threshold, to recognise a dart
    int TriggerFront = 0;
    int TriggerBack = 0;

    //measuring the speed
    int measuringBack = 0;
    float length = 0.169; //m
    int loopTime = 100; //time of the measuring point in micro seconds
    unsigned long measureLoops = 0;
    unsigned long heartBeat = 0;

    float TempBaseLineFront = 0;
    float TempBaseLineBack = 0;

    Bounce Taster = Bounce();

    void setup(){
    Serial.begin(9600);
    // Wire.begin(); // start up I2C bus
    delay(500);
    //createDisplay();
    pinMode(LSFrontPin, INPUT);
    pinMode(LSBackPin, INPUT);
    pinMode(TriggerPin, INPUT);

    // Setup the button
    pinMode( TriggerPin ,INPUT);
    // Activate internal pull-up (optional)
    digitalWrite( TriggerPin ,HIGH);
    // After setting up the button, setup the object
    Taster .attach( TriggerPin );
    Taster .interval(5);
    delay(1000);
    //create a base line
    for (int ii=0; ii<100; ii++){
    TempBaseLineFront = TempBaseLineFront + analogRead(LSFrontPin);
    TempBaseLineBack = TempBaseLineBack + analogRead(LSBackPin);
    delay(10);
    }
    BaseLineFront = (int)(TempBaseLineFront / 100);
    TriggerFront = (int)(0.8*BaseLineFront);
    BaseLineBack = (int)(TempBaseLineBack / 100);
    TriggerBack = (int)(0.8*BaseLineBack);

    //Show that the initialisation is done: blink three times with the base line values
    writeNumber(TriggerFront, 500);
    delay(200);

    writeNumber(TriggerBack, 500);
    delay(200);
    // writeNumber(888, 500);
    // delay(200);
    // writeNumber(888, 500);
    // delay(200);
    // writeNumber(888, 500);
    // delay(200);
    measuringBack = 1; //start measuring and wait for the darts
    }

    /*void createDisplay(){
    Wire.beginTransmission(display);
    Wire.write(B00000000); // entgegen
    // Subadressing: B00000001 = Digit 1, Subadressing: B00000010 = Digit 2, Subadressing: B00000011 = Digit 3, Subadressing: B00000100 = Digit 4
    Wire.write(B00110111); // control byte (dynamic modus on, 9 mA)
    Wire.endTransmission();

    Wire.beginTransmission(display);
    Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
    Wire.write(digitBytes[0]); // digit 1 (RHS)
    Wire.write(digitBytes[1]); // digit 2
    Wire.write(digitBytes[2]); // digit 3
    Wire.endTransmission();


    Wire.beginTransmission(display);
    Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
    Wire.write(digitBytes[9]); // digit 1 (RHS)
    Wire.write(digitBytes[0] + 128); // digit 2 + Dezimal point
    Wire.write(digitBytes[1]); // digit 3
    Wire.endTransmission();
    } */

    void writeNumber(int number, int waitTime){
    // creat number and show it for waitTime ms
    int digit1 = number/100;
    int digit2 = (number - (digit1*100)) / 10;
    int digit3 = number - digit1*100 - digit2*10;
    Serial.println(number);
    Serial.print("digit1: "); Serial.println(digit1);
    Serial.print("digit2: "); Serial.println(digit2);
    Serial.print("digit3: "); Serial.println(digit3);
    /* Wire.beginTransmission(display);
    Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
    Wire.write(digitBytes[digit3]); // digit 1 (RHS)
    Wire.write(digitBytes[digit2] + 128); // digit 2 + decimal point
    Wire.write(digitBytes[digit1]); // digit 3
    Wire.endTransmission();
    delay(waitTime);
    Wire.beginTransmission(display);
    Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
    Wire.write(0); // digit 1 (RHS)
    Wire.write(0); // digit 2 + decimal point
    Wire.write(0); // digit 3
    Wire.endTransmission(); */
    display.showNumberDec(number);

    delay(waitTime);
    display.showNumberDec(number);
    }

    void heartBeatBeat(){
    //lets the decimal point blink
    /* Wire.beginTransmission(display);
    Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
    Wire.write(0); // digit 1 (RHS)
    Wire.write(128); // digit 2 + decimal point
    Wire.write(0); // digit 3
    Wire.endTransmission();
    delay(100);
    Wire.beginTransmission(display);
    Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
    Wire.write(0); // digit 1 (RHS)
    Wire.write(0); // digit 2 + decimal point
    Wire.write(0); // digit 3
    Wire.endTransmission(); */
    display.setBrightness(2);

    display.showNumberDec(1,false,1,0); //1000
    delay(100);
    display.setSegments(data);
    display.showNumberDec(2,false,1,1); //0200
    delay(100);
    display.setSegments(data);
    display.showNumberDec(3,false,1,2); //0030
    delay(100);
    display.setSegments(data);
    display.showNumberDec(4,false,1,3); //0004
    delay(100);
    display.setSegments(data);

    /*for (int i=0; i < 12; i++){
    display.showNumberDec(i);
    delay(50);
    }*/

    //uint8_t segto; int value = 1244; segto = 0x80 | display.encodeDigit((value / 100)%10); display.setSegments(&segto, 1, 1);
    //delay(500);
    //display.setSegments(data);
    }


    void loop(){
    //Hearbeat interval
    if (millis() > (heartBeat + 5000)){
    heartBeat = millis();
    heartBeatBeat();
    }
    //read the push button
    Taster.update();
    int TasterStatus = Taster.read();
    unsigned long duration = Taster.duration();
    if ((TasterStatus == HIGH) && (duration < 2000)){
    writeNumber((int)(meanVal*10/meanCount), 1000);
    }
    else if (TasterStatus == HIGH){
    Serial.println("reset");
    writeNumber(0, 500); delay(200);
    writeNumber(0, 500); delay(200);
    writeNumber(0, 500); delay(200);
    meanVal = 0;
    meanCount = 0;
    delay(500);
    }
    //delayMicroseconds(loopTime);
    //if (digitalRead(TriggerPin) == HIGH) { Serial.println("Trigger!"); }
    if (measuringBack == 1){
    //Pfeil wurde noch nicht detektiert
    LSBackVal = analogRead(LSBackPin);
    if (LSBackVal < TriggerBack) { measuringBack = 0; measureLoops = micros(); Serial.print("Start Trigger :"); Serial.println(TriggerBack); Serial.println(LSBackVal); }
    }
    else
    {
    //dart was detected, but didn't arrive in the front
    LSFrontVal = analogRead(LSFrontPin);
    if (LSFrontVal < TriggerFront){
    unsigned long stopTime=micros();
    float deltaTus = (float)(stopTime-measureLoops);
    deltaTus = deltaTus / 1.0e6;
    float mSpeed = length / deltaTus;
    measuringBack = 1;

    Serial.println(measureLoops);
    Serial.println(stopTime);
    Serial.println(deltaTus);
    Serial.println(mSpeed);

    meanCount = meanCount + 1;
    meanVal = meanVal + mSpeed;

    Serial.println(meanVal);
    Serial.println(meanCount);

    writeNumber((int)(mSpeed*10), 500);
    delay(200);
    }
    }
    //#Reset after 1 s
    if ((measuringBack == 0) && (micros() > (measureLoops + 1000000)))
    {
    measuringBack = 1;
    }
    }

     
    Zuletzt bearbeitet: 26. September 2018
  10. DerLuchs

    DerLuchs Erfahrener Benutzer

    Klingt irgendwie nach Zahlendreher oder wofür steht die 134 in Deinem Beitrag?
     
    Chris83 gefällt das.
  11. Black-Jack

    Black-Jack Erfahrener Benutzer

    Ich hab nicht richtig aufgepasst beim Tippen. Heißklebepistole ist wieder im Haus, Tests folgen.
     
  12. Black-Jack

    Black-Jack Erfahrener Benutzer


    erster test des Prototypen. hab das Display falsch herum :-/ eingebaut.
     

    Anhänge:

    HealterSkelter, medusa, Dominik und 7 anderen gefällt das.
  13. Black-Jack

    Black-Jack Erfahrener Benutzer

    so neues Display, jetzt auch in weiss, blau und grün vorhanden.
    zum code erweitern bin ich leider nicht gekommen, weil ich ein kabel versehentlich gezogen hab und dann die schaltung neu stecken musste.


    Ein Tag später:

    Was jetzt noch zu tun ist bevor ich es auf den Chip spiele und zusammenlöte:
    -Punkte bei den Kommastellen aktivieren
    -den Fehler finden warum es noch nicht vom Countermodus zurück geht
    -
     
    Zuletzt bearbeitet: 19. Oktober 2018
    TK99699, ImMortis, Moggih und 2 anderen gefällt das.

Diese Seite empfehlen