Image of eBits Academy robotics illustration

Bli nästa Usain Bolt | Sprinttracker |

  • September 21, 2022
  • |
  • Jesper Nielsen

Vill du bli nästa Usain Bolt? Ta en titt! Detta projekt mäter hur snabbt du kan springa 50, 100, 150 ... eller 500 meter. Allt du behöver är en ESP TTGO, ultraljudssensor och ett par knappar från komponentmegakitet — aktuellt utbud; kontrollera kompatibilitet. Tabellen nedan ger också ett inköpsförslag som täcker behoven för detta projekt och många framtida projekt!

  • Specifikationer
  • Bygg kretsen på ett kopplingsdäck
  • Programmera ESP32 TTGO
  • 3D-utskrivet hölje
  • Genomförande
  • Specifikationer

    För att bygga projektet behöver du komponenterna nedan. Alla finns här på eBits.dk.

     

    Du behöver följande delar från komponentmegakitet — aktuellt utbud; kontrollera kompatibilitet-kitet:

    Antal Komponent
    1 Aktiv summer med fast frekvens
    3 Knappar
    3 10 kΩ motstånd
    12 Dupont-kablar

      

    Bygg kretsen på ett kopplingsdäck

    Bygg kretsen på kopplingsdäcket med följande anslutningar till TTGO. Om du följer tabellen nedan behöver du inte ändra koden längre ned på sidan eller via följande länk: 

    HC-SR04 VCC

    TTGO 5V

    HC-SR04 GND

    TTGO GND

    HC-SR04 TRIG

    TTGO 32

    HC-SR04 ECHO

    TTGO 33 via lämplig 5V→3.3V nivåomvandlare eller spänningsdelare (aldrig direkt 5V)

    Summer +

    TTGO 17

    Summer -

    TTGO GND

    Startknapp

    TTGO 25

    Uppknapp

    TTGO 26

    Nedknapp

    TTGO 27

    Bilden nedan visar uppkopplingen på kopplingsdäcket. Originaldiagrammet visar inte nödvändigtvis nivåanpassning: HC-SR04 ECHO kan vara 5V och måste sänkas till en säker 3.3V-nivå före ESP32 GPIO33. 

    Bilden nedan visar samma uppkoppling, men med ett batteri — aktuellt utbud; kontrollera kompatibilitet och en laddningskrets tillagda så att enheten kan bli bärbar. Denna koppling ansluts direkt till baksidan av TTGO som stöder direkt anslutning av ett batteri — aktuellt utbud; kontrollera kompatibilitet. Själva laddningskretsen tar emot USB-C med 5V 2A. Batteriet på bilderna är ett 1800 mAh-batteri — aktuellt utbud; kontrollera kompatibilitet som bör ge en rimlig drifttid. Kontrollera batteriets polaritet, skydd och laddningsspecifikationer. Anslut inte två laddningsutgångar till samma cell utan en godkänd laddningstopologi; kontrollera TTGO-kortets inbyggda laddare innan du använder en extra laddningsmodul.

    Bilden nedan visar uppkopplingen på kopplingsdäcket. Originaldiagrammet visar inte nödvändigtvis nivåanpassning: HC-SR04 ECHO kan vara 5V och måste sänkas till en säker 3.3V-nivå före ESP32 GPIO33. 

    Programmera TTGO T-Display

    Kodavsnittet nedan visar biblioteken som används i projektet, främst för att komma åt skärmen på TTGO. Mapparna kan laddas ned via denna länk: TFT_eSPI.h & Free_Fonts.h. 
    Lägg dem i libraries-mappen under Dokument -> Arduino -> libraries.

    #include "Free_Fonts.h" // Include the header file attached to this sketch
    #include "SPI.h"
    #include "TFT_eSPI.h"
    
    //Based on TTGO
    #define button1 26 
    #define button2 27 
    #define start_run 25
    #define TRIG 32
    #define ECHO 33
    #define A0 17   
    Kodavsnittet nedan är huvudloopen som låter dig välja avståndet som ska mätas och kontrollerar om start_run har tryckts in.

    void loop() {
      tft.setTextDatum(MC_DATUM);
      tft.setTextColor(TFT_WHITE, TFT_BLACK);
    
      if(digitalRead(start_run) == HIGH){
      if(timesDisplayed == false){
      PrepareForRun();
      }else{
        timesDisplayed = false;
        DisplayStartMenu(distance);
        delay(1000);
      }
    }
      if(digitalRead(button2) == HIGH){
      if(distance > 50){
      distance-=50;
      UpdateDistance(distance);
      delay(200);
      }
    }
    if(digitalRead(button1) == HIGH){
      if(distance < 500){
      distance+=50;
      UpdateDistance(distance);
      delay(200);
      }
    }   
    }

    För att uppdatera skärmen när avståndsknapparna trycks in anropas följande funktion, som uppdaterar skärmen.

    void UpdateDistance(int _distance){
      tft.fillScreen(TFT_BLACK);
      String text = itoa(_distance, buf, 10);
      text += "m";
      tft.setFreeFont(FF2);
      tft.drawString("Distance: "+ text, 120, 40, GFXFF);  
    }

    När start_run-knappen trycks in anropas följande funktion, som visar en nedräkning på skärmen och spelar upp en hörbar nedräkning med pip. När nedräkningen är klar ger summern en längre ton som signalerar att tidtagningen har startat.

    void PrepareForRun(){
      int countdown = distance/5;
      digitalWrite(A0, HIGH);
        delay(200);
        digitalWrite(A0, LOW);
        delay(200);
        digitalWrite(A0, HIGH);
        delay(200);
        digitalWrite(A0, LOW);
        delay(200);
      for(int a = 0; a < distance/5; a++){
        --countdown; 
        String text = itoa(countdown, buf, 10);
        tft.fillScreen(TFT_BLACK);
        tft.setFreeFont(FF2);
        tft.drawString("Go to start: "+ text, 120, 40, GFXFF);
       delay(1000);
      }
      for(int b = 3; b > 0; b--){
        String text = itoa(b, buf, 10);
        tft.fillScreen(TFT_BLACK);
        tft.setFreeFont(FF2);
        tft.drawString("Time: "+ text, 120, 40, GFXFF);
        digitalWrite(A0, HIGH);
        delay(500);
        digitalWrite(A0, LOW);
        delay(500);
      }
      digitalWrite(A0, HIGH);
      delay(2000);
      tft.fillScreen(TFT_BLACK);
        tft.setFreeFont(FF2);
        tft.drawString("RUN!", 120, 40, GFXFF);
      digitalWrite(A0, LOW);
      MeasureRunTime();
      }

    När du springer förbi ultraljudssensorn avslutas MeasureRunTime(), och tiden skickas till DisplayTimes(double timer).

    void MeasureRunTime(){
      timeMeasuring = true;
      runTimeStart = millis();
      while(MeasureDistance() > 100){
        delay(10);
      }
      runTimeMs = millis() - runTimeStart;
      double timer = (double)runTimeMs/1000;
      Serial.print("Time: ");
      Serial.println((double)runTimeMs/1000);
      timeMeasuring = false;
      DisplayTimes(timer);
    }

    Här är funktionen som anropas i while-loopen tills den avbryts.

    float MeasureDistance(){
      digitalWrite(TRIG, LOW);
      delayMicroseconds(2);
      digitalWrite(TRIG, HIGH);
      delayMicroseconds(5);
      digitalWrite(TRIG, LOW);
    
      float t = pulseIn(ECHO, HIGH);
      float distance = t*0.017015;
      Serial.print("Distance: ");
      Serial.println(distance);
      return distance;
    }

    Kodavsnittet nedan är ännu en funktion för att uppdatera skärmen, nu med den senaste löptiden.

    void DisplayTimes(int time_number){
      String text = itoa(time_number, buf, 10);
      tft.fillScreen(TFT_BLACK);
        tft.setFreeFont(FF2);
        tft.drawString("Time: "+ text +" s", 120, 40, GFXFF);
      }

    Hela projektet finns på eBits GitHub

    3D-utskrivet hölje

    Bilderna nedan visar höljets design och den tänkta placeringen av modulerna inuti. Om du inte har en 3D-skrivare hemma finns många utskriftstjänster på nätet som erbjuder detta till ett förmånligt pris. 
    Designen nedan finns här

     

     

    Genomförande

    Här visas anslutningarna och inkopplingen av laddningskretsen, knappar, TTGO och HC-SR04 på det 3D-utskrivna höljets lock. En liten klick snabblim längs kanterna kan fästa knapparna. Resten kan monteras med skruvar.

     

    Här visas den färdiga, fullt fungerande sprinttrackern. USB-C-laddningsporten sitter längst ned och en strömbrytare är monterad överst. Höljet är ganska litet och lätt att ta med sig.

    Lämna en kommentar

    Observera att kommentarer måste godkännas innan de publiceras.