Image of eBits Academy network illustration

Varningssystem vid omkörning

  • February 22, 2022
  • |
  • Bogdan Vanghelie

Det är irriterande att cykla och plötsligt upptäcka en annan cyklist som vill köra om utan att signalera. Man kanske inte ser personen och riskerar att stöta ihop. Detta projekt försöker hjälpa genom att bygga ett varningssystem med en ultraljudssensor för att upptäcka cyklister som närmar sig från sidan för att köra om, och en vibrationsmotor som vibrerar för att varna om omkörningen. Detta är en experimentell närhetsindikator, inte tillförlitlig trafiksäkerhetsutrustning. Den kan missa cyklister eller reagera på andra föremål; fortsätt att uppmärksamma trafiken och använd den inte för att kompensera för nedsatt hörsel.

 

  • Komponenter som behövs
  • Guide
  • Hårdvara
  • Kopplingsschema
  • Det 3D-utskrivna höljet
  • Kod
  • Ställ in variabler
  • Inställningsfasen
  • Huvudfunktion
  • Video av enheten i drift
  • Komponenter som behövs 

    Du behöver följande komponenter till projektet. Varje komponent har en länk till köp på vår webbplats:


    Arduino Nano

    1

    Vibrationsmotor

    1

    HC SR04 ultraljudssensor

    1

    Hona-till-hane Dupont-kablar

    7

    Mini USB-kabel

    1

    LiPo 18650-batterihållare och laddare

    1

    LiPo 18650-batteri 

    1

    3D-utskrivet hölje

    1

    Litet kopplingsdäck med 170 anslutningspunkter

    1



    Filerna till det 3D-utskrivna höljet finns i artikeln.

    Guide

    Förutsättningar


    Du behöver installera Arduino IDE via denna länk, så att du kan programmera din Arduino Nano.


    Du kan installera denna version:

    Efter installation behöver programmet ställas in för det Arduino-kort vi använder i projektet.

    Gå till fliken Tools i Arduino IDE:

    Byt kortet till Arduino Nano enligt bilden:

    När kortet ansluts till datorn hittar och väljer programmet automatiskt kommunikationsporten som används.


    Hårdvara


    Kopplingsschema

    För att strömförsörja mikrokontrollerkortet kan du använda en 18650-batterihållare/laddare från vår webbplats. Observera att du behöver skaffa ett 18650-batteri själv. 

    Du behöver löda två stift på batterihållaren enligt bilden nedan:

    Det 3D-utskrivna höljet


    Det 3D-utskrivna höljet 

    Det 3D-utskrivna locket


    Hämta mesh-filerna för utskrift av höljet via denna länk.


    Locket kan fästas med 4 M4*0.7-skruvar som är minst 6mm och högst 10mm långa, eller med vävtejp för enklare öppning. För montering på cykelns sadelstolpe rekommenderas vävtejp eller mycket stark dubbelhäftande tejp.



    Kod


    Sensorn behöver ställas in i koden. För att göra det enklare går jag igenom koden del för del och tar också med hela koden i slutet.


    Ställ in variabler


    Variabler lagrar information som tal eller ord. Här använder vi dem för att enkelt flytta information i koden och ge Arduino-stiften namn så att de blir lättare att använda.

    En variabel måste deklareras inom ett scope där den är synlig och ha ett giltigt värde innan den läses, exempelvis i en jämförelse. Placeringen av deklaration och initiering spelar därför roll.

    När en variabel skapas anger du typen. Typerna kan skilja sig mellan programmeringsspråk, men här betyder ”int” integer och anger att variabeln är ett heltal. 

    Const betyder konstant: Vi vill inte att variabelns värde ska ändras.


    Därefter definierar vi ljudets hastighet och skapar två variabler utan startvärden. 

    De används för att beräkna avståndet med ultraljudssensorn.

    Ultraljudssensorn använder något som liknar ekolokalisering, och vi använder tiden det tar för vågen att träffa föremålet och komma tillbaka. 


    Inställningsfasen


    Ett nytt projekt i Arduino IDE innehåller som standard funktionerna setup och loop.


    I setup startar vi seriell kommunikation så att avståndet kan skrivas ut i terminalen. Det används för test när enheten är ansluten till datorn vi programmerar från. Därefter ställs ultraljudssensorns relevanta stift in som input eller output.

    Huvudfunktion


    Som huvudfunktion använder vi den förgenererade loop-funktionen som upprepar koden inuti funktionen.

    I loop läser vi av sensorn och gör beräkningar för att fortlöpande kontrollera om någon är på väg att köra om. 


    Först tar vi en mätning genom att be ultraljudssensorn skicka en puls och registrera när den kommer tillbaka med denna kod:

    Avståndet beräknas med en ekvation utifrån vågens restid till föremålet och tillbaka. Vi multiplicerar den uppmätta tiden med ljudets hastighet, cirka 343 m/s nära rumstemperatur. Med tiden i mikrosekunder ger cirka 0.0343 cm/µs avståndet i centimeter. Slutligen delar vi med 2 för att bara få avståndet från sensorn till föremålet. 


    Avstånd = (Varaktighet * Ljudhastighet) / 2


    I koden skriver vi så här:


    För att skriva ut i terminalen använder vi denna kod:


    Nu kommer delen där vi bedömer om någon är på väg att köra om:

    Vi tar mätningar, och om något inom 2 meter snabbt ändrar avstånd till sensorn tolkar vi det som en cyklist som vill köra om. Du kan justera villkoret i if-satsen för att anpassa sensorn till dina behov.


    Då aktiveras vibrationsmotorn via en lämplig drivkrets eller en modul med inbyggd drivkrets. En lös motor får inte drivas direkt från GPIO; använd lämpligt skydd för induktiva laster. Koden styr pulskvoten genom att skriva ett värde (PWM) på 255 till vibrationsmotorn. 

    Här ville jag ha maximalt värde för test, men du kan ändra det efter behov. 

    Här är hela koden:

    const int trigPin = 9;
    const int echoPin = 8;
    const int pwmPin = 5;
    int x=0;
    int y=0;
    #define Speed_of_Sound 0.034
    long duration;
    float distance;
    
    void setup()
    {
      Serial.begin(115200);
      pinMode(trigPin, OUTPUT);
      pinMode(echoPin, INPUT);
      pinMode(pwmPin, OUTPUT);
    }
    
    void loop() 
    {
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      
      duration = pulseIn(echoPin, HIGH);
      
      distance = duration * Speed_of_Sound/2;
      
      Serial.print("The distance is: ");
      Serial.println(distance);
    
      x=distance;
      if(y-x>=90&&x<200)
      {
        Serial.print("Someone comes");
        digitalWrite(pwmPin,HIGH);
        delay(1000);
        digitalWrite(pwmPin,LOW);
      }
      else
        if(x<200)
           y=x;
      
      delay(1000);
    }

     

    Hela koden finns via denna länk.



    När du har skrivit eller kopierat koden till Arduino IDE laddar du upp den till mikrokontrollerkortet genom att klicka på uppladdningsknappen som ser ut så här:

    Video av enheten i drift

    Lämna en kommentar

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