Kim Dinh Le & Osman Bilal Khassouk

Figur 1: Kredsløb med H-bro

Dio, er blevet bygget under porteføljeopgavet 1 i kurset: Hardware og Robotteknologi

Intentionen med Dio er at roterer i en 180 graders rotation for at finde den optimale lysstyrke som solcellen kan opfange. Vi har gjort forsøg på at bygge kredsløbet på en let forståeligt måde, ved brug af H-bro, spændingsregulatorer og LDR-sensorer.

Gearing

Figur 2: Eksempel på hvordan gearing ville se ud

Havde vi mulighed for at arbejde med gearing ville vores eneste formål ved brugen af det, være at formindske rotationshastigheden. Hvis der blev arbejdet med lego gear, ville det nok lige noget i følge figur XX. Gearsystemet ville består af 4 drevne tandhjul. Hvor det første som er komblet til DC-motoren have tandhjul på 12, det næste 36, og 2 vil have 36, 3 har 8 og 4 vil have 24 tænder.
Forholdet mellem tandhjul 1 og 2 vil have et forhold på 3:1. Det vil betyde at tandhjul 1 skal dreje 3 omgange før tandhjul 2 når at dreje en enkelt omgang. Tandhjul 3 vil være akselmonteret til tandhjul 2 og det vil betyde at den har samme forhold. Tandhjul 3 har 8 tænder og tandhjul 4 har 24 tænder, så det vil ogsåhave forholdet 3:1. Dermed kan vi regne det samlet gearingsforhold ved at gange dem sammen.

Altså vil forholdet på gearingsystemet være 9:1 hvilket vil betyde at tandhjul 1 skal dreje 9 omgange før at tandhjul 4 har drejet 1 omgang.

Dermed kan vi også regne ud på hvor lang tid det vil tage for at pladen har drejet 180 grader, hvis vores DC-motor maksimale hastighed har en rotation per minut på 28.

Det vil betyde at det vil tage pladen rundt regnet ca. 10 sekunder at have drejet 180 grader.

H-bro

Figur 3: Figuren viser diagram af H Broen
(Figuren kan være lidt udtydelig, da det brugte software ikke var fleksibel )

For at opbygge vores H-bro har vi gjort brug af 2 NPN Transistor, 2 PNP Transistor, DC Motor, Arduino Uno samt 2 1k ohm resistore.
Resistorene er tilføjet mellem transistornes gate, så enhver ladning der måtte være på porten, drænes gennem modstanden.

NPN-transistorer bruges til at forbinde motoren til jorden (batteriets negative terminal).
PNP-transistorer gør det omvendte, de bruges til at forbinde motoren til jorden (batteriets negative terminal).

Arduinoen er opsæt til at når den ene port som bruges bliver sat til værdien LOW, vil den anden være HIGH. På den måde vil vi være i stand til at bestemme hvilken retning vi lader strømmen køre gennem vores DC Motor, dette gør at motoren er i stand til at dreje begge veje. Havde vi gjort det muligt at sætte begge porte til HIGH skaber vi et kredsløb hvor, der to strømspor direkte fra power til ground, som laver en kortslutning af strømforsyning og kan sprænge transistorer.

Spændingsregulator

Batteriet som bruges til kredsløbet køre med en spænding på 9V, som benyttes ved H-Broen samt DC-Motoren, problemet opstår dog når tilslutningen til arduinoen finder sted. Her er det nødvendigt at en spændingsregulator(LM7805) bliver tilkoblet for at bibeholde en 5V tilkobling til vores Arduino, da dette er arduinoens spædingsgrænse.

Spændingsregulatoren gør forsøg på at beholde en 5V spænding selvom resistore kommer ind i spil.

Figur 4: 5V Spændingsregulator til Arduino

Dio’s svaghed finder, er lavet i Tinkercad, da der ikke har været mulighed for at mødes op pågrund af Corona krisen, og der blev udgivet en defekt Lego motor.

Modstande

Modstande for lysdioderne er udregnet efter spændingsfaldene på de enkelte lysdioder.
Den røde lysdiode har en spændingsfald på 2,0 V og strømstyrke på 25 mA, derfor ved ohms lov kan man udregne formodstanden.

Figur 5: Beregning af formodstand ved brug af Ohms lov

Til LDR-modstandende er der blevet brugt to resistorer på 1k Ω. Da en arduino måler forskellen i volt, er det svært at få en måling på modstanden. Derfor er der blevet anvendt en LDR-modstand, som er en variabel modstand, der bliver større desto mindre lys der er, og mindre modstand desto mere lys der er.
Arduino har svært ved at måle modstand da det anvender et “Analog to Digital Converter (ADC)”, hvilket betyder at det er desginet til at måle volt, så derfor bruger vi en LDR-sensor og den variende modstand for at kunne konvertere det til volt som arduinoen kan læse. Derfor bliver der også anvendt en spændingsdeler, dette bliver anvendt som referencepunkt, og dermed kan vi måle volt forandringerne.

For at kunne beregne værdien (Vout), målt af LDR-modstande bruger vi ohms lov.

Her har vi Vin til at være 5V, og R1 som er vores LDR-modstand, der har en minimum modstand på 388 Ω og en max modstand på 1,65k Ω. Derfor er der blevet valgt til R2 en modstand på 1k Ω, da det har omkring den samme værdi som vores LDR-modstand. derved kan vi så udregne den maksimale Vout og minimale ved at bruge følge udregning

Derfra vil det betyde at Vout ved den maskimale modstand være 1,88V og Vout ved den minimale modstand være 3,6V.

Kode

Figur 6: Opsætning af Variabler og de anvendte komponenter

Først skrives de variabler som bliver brugt til at roterer DC-motoren. Derudover er der også LDR-value som starter med at være 0.

Koden er blevet sat op sådan så det har 3 forskellige statements. For en mere visuelt forklaring så se videon. Den første statement som er starten af simulationen, hvilket tjekker om differencen mellem LDR sensoren er mindre en 50 vil den lyse gult.

Hvis der så kommer en rotation i en af retninger vil den lyse grøn som indikerer at den er ved at justerer til den mest optimale lysstyrke.
Bliver den rød er det en indikation på at det den maksimale værdi hvilket er sat til 650 i begge sider af LDR’en.

Koden er skrevet op i funktioner som kører i et loop konstant så den altid vil have mulighed for at finde den bedste placering.

Der er blevet tilføjet et for-loop for at garantere en blød opstart samt en nedbremsning.

Problemer under opbyggning af kredsløbet

Der opstod problemer tidligt i projektet, da der blev brugt tid på at konstruere en robot med de materialer vi havde nået at indsamle. Tid blev spildt på at teste med en DC-motor som var ikke fungerede, hvilket vi senere fandt ud af. Dette samt manglende dele, da de indsamlede dele ikke var nok til at opbygge den planlagte robot. Dette resulterede i at opbyggelsen af Dio var nød til at udføres på Tinkercad.

Covid-19 Udfordringer

Der var besværligheder med møde mellem hinanden har været en faktor i vores udvikling af projektet.d. Afstanden mellem hinanden samt regeringens opfordring til at minimere kontakt mellem folk besværliggjorde møder med gruppen.

Flowchart – Dio’s Funktioner

Figur 6: Flowchart på logikken af Dio

Man kan se at alle Dios funktioner er baseret på værdierne der modtages fra LDR-Sensorne.

Konklusion

Kredsløbets funktioner og sammensætning burde fungere på en fysisk version, og kravene er opfyldt så godt som muligt i den virtuelle version. Vi var begrænset til at benytte Tinkercad til udførelse af projektet og kan derfor ikke teste Dio i de naturlige omgivelser, derfor kan der ikke bekræftes for at det ville virke i en fysisk tilstand.

Video & TinkerCAD

https://www.tinkercad.com/things/dlukXmLsBTM-copy-of-alien-cell/editel?sharecode=9y2xQyUs4iDr2yTGZYoF_vtXYGjgBKNiarXhxk-SFsc=&fbclid=IwAR2EccanHlTE_AlUhySzRE_MNdT246wu_xBugEuovOUM__a1eedY6jio-mI

Source Code

#define mot1 6
#define mot2 5

int sensor1Pin = A0;
int sensor1Value = 0;

int sensor2Pin = A1;
int sensor2Value = 0;


int maxRotation = 5;
int sunMax = 650;
int sunTreshold = 50;

bool softStart = true;
bool softStopEast;
bool softStopWest;


void setup()
{
  pinMode(mot1, OUTPUT);
  pinMode(mot2, OUTPUT);
  
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  
  digitalWrite(mot1, LOW);
  digitalWrite(mot2, LOW);
  Serial.begin(9600);

}

void rotateEast(){
  
   analogWrite(mot2, 0);

   digitalWrite(2, HIGH);
   digitalWrite(3, LOW);
   digitalWrite(4, LOW);
  
  if(softStart == true){
   for(int i=0; i<255; i++){
	analogWrite(mot1, i);
    delay(5);
  	}
    softStart = false;
    softStopEast = true;
  }
}

void rotateWest(){
  
    analogWrite(mot1, 0);
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
  
  if(softStart == true){
   for(int i=0; i<255; i++){
	analogWrite(mot2, i);
    delay(5);
  	}
    softStart = false;
    softStopWest = true;
  }
}

void standby(){
  
  if(softStopEast == true){
    for(int i=255; i>0; i--){
	analogWrite(mot1, i);
    delay(5);
  	}
    analogWrite(mot1, 0);
    softStopEast = false;
  }
    
   if(softStopWest == true){
    for(int i=255; i>0; i--){
	analogWrite(mot2, i);
    delay(5);
  	}
     analogWrite(mot2, 0);
     softStopWest = false;
   }

    digitalWrite(3, HIGH);
    digitalWrite(2, LOW);
    digitalWrite(4, LOW);
  
    softStart = true;

}

void stopLooking(){
    analogWrite(mot2, 0);
    analogWrite(mot1, 0);
    digitalWrite(4, HIGH);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
  

}

void loop()
{
  delay(500);
  sensor1Value = analogRead(sensor1Pin);
  Serial.println(sensor1Value);
  
  sensor2Value = analogRead(sensor2Pin);
  Serial.println(sensor2Value);
  
  //Rotate east if sensor value 1 is greater than sensor value 2
  if(sensor1Value > sensor2Value && sensor1Value < sunMax && abs(sensor1Value - sensor2Value) > sunTreshold){
    rotateEast(); 
  }
  
  // Rotate west if sensor value 2 is greater than sensor value 1 
  else if(sensor2Value > sensor1Value && sensor2Value < sunMax && abs(sensor1Value - sensor2Value) > sunTreshold){
    rotateWest();
  }
  
  // Stop rotate if the difference is less than 50
  if (abs(sensor1Value - sensor2Value) < sunTreshold && sensor1Value < sunMax && sensor2Value < sunMax){
    standby();
  }
  
  // Stop rotate if the maximum value has reached on both sides
  if(sensor1Value > sunMax && sensor2Value > sunMax){
    stopLooking();
  }
  

  
}

Leave a Reply