Navne på gruppemedlemmerne

Yrsa Damgaard Larsen, Velfærdsteknologi

Camilla Panduro Nielsen, Velfærdsteknologi

 

Systemets udseende

 IMG_3263
Figur 1 – Robotten

På billedet, Figur 1, ses systemet der består af en strømforsyning der leverer en spænding på 9V til at drive motoren. Motoren er placeret under breadboardet, som vist på Figur 2, der i opstillingen fungerer som solpanel. På breadboardet er opsat en spændingsdeler i hver ende. Spændingsdeler kredsløbet består af en almindelig modstand på 10 kΩ samt en lysfølsom modstand på 20 -100 kΩ. Hver af de to spændingsdelere bliver forsynet med en inputspænding på 5V fra Arduino motor shield, som selv forsynes fra en spændingskilde.
Desuden er der to kontakter i systemet, som sammen med pull-down modstande på 10kΩ  hver sørger for at afbryde motorens kørsel når kontakterne lukkes.

 

 IMG_3262
Figur 2 – Robotten med DC motoren synlig

 

Fra hver af kredsløbene føres en spænding ud til en indgang på motor shieldet, således, at inputtet er et billede af den lysfølsommes modstand i øjeblikket, hvilket så kan bruges til at regulere solpanelets placering.

 

Hvorfor er systemet/robotten opbygget som den er ift. at løse opgaven?

Vi ønsker at kunne regulere solpanelets bevægelse efter lysindfaldet, således at panelet, i takt med solens vandring over himlen, hele tiden vender mod solen og dermed får et vinkelret lysindfald på solpanelet. Den lysfølsomme modstand har et range på 20kΩ til 100kΩ. Modstanden vil altså være lille når der er meget lys, og stor når der ikke er ret meget lys. For at få et udtryk for modstandens størrelse, og dermed lysindfaldet i sensoren, skal vi have konverteret modstanden i sensoren til en spænding. Ved at koble modstanden op som en spændingsdeler med en fast modstand, vil spændingen mellem de to modstande være relativ til den spænding den lysfølsomme modstand har, netop på det tidspunkt, hvor spændingen måles.

Sp
Her ses en spændingsdeler illustreret. Hvis der kun var en modstand i kredsløbet (fx vores lysfølsomme modstand), vil spændingsfaldet over modstanden altid være lig indgangsspændingen, uafhængigt at modstandens størrelse. Kobles derimod to modstande i serieforbindelse, vil spændingsfaldet over disse ændres relativt til modstandenes størrelse.
I det kredsløb der her er sat op, har vi sat den lysfølsomme modstand i serieforbindelse med en konstant modstand på 10kΩ. På denne måde vil det samlede spændingsfald over modstandene stadigvæk være lig inputspændingen, mens spændingsfaldet over den lysfølsomme modstand vil ændres afhængig af dennes modstand, som ændres relativt til lyspåvirkningen. Da de lysfølsomme modstande kan antage værdier mellem 20kΩ og 100kΩ, kan spændingsfaldet over den lysfølsomme modstand ifølge spændingsdelerformlen udregnes således:

F1

 

 

Man kan altså bruge spændingen i den node der er mellem modstandene som et analogt input til Arduino Motor Shield, og herudfra regulere solpanelet.

Solpanelet bevæges når der opstår en spændingsforskel mellem den lysfølsomme modstand i den ene side af panelet og den i den anden side af panelet, der er større end 35 bitværdier, valget af dette samt betydningen af dette for anordningen vil blive beskrevet nærmere senere i rapporten.

 

 G1  G2
Figur 3 – Robottens gearing set fra siden Figur 4 – Robottens gearing set ovenfra

 

Da det ønskes at solpanelet er i stand til at bevæge sig meget langsomt, har det været nødvendigt at tilføje en gearing til systemet. Gearingen består af 6 tandhjul som er forbundet som vist på Figur 3 og 4 herover. Gearingen består af et lille tandhjul på 8 tænder der drives direkte af motoren, dette indvirker på et stort tandhjul på 40 tænder. Gearingen mellem disse to tandhjul er lig:

F2

Akslen der drives af dette 40 tænders tandhjul, driver samtidig endnu et lille tandhjul på 8 tænder. Dette betyder at når det store tandhjul har drejet en omgang vil det lille tandhjul ligeledes have drejet en enkelt omgang. Det andet lille tandhjul indvirker ligeledes på et 40 tænders tandhjul, hvilket igen giver en gearing på 0,2. Vi har nu fire tandhjul der har en samlet gearing på:

0,2*0,2=0,04

Akslen på det andet store tandhjul, driver et mellem tandhjul på 24 tænder, som igen driver det sidste store tandhjul på 40 tænder, som driver akslen solpanelet roterer omkring. Forholdet mellem de sidste to tandhjul er:

24/40=0,6

Vi har altså tre sæt tandhjul der indvirker på hinanden med gearingsforhold på henholdsvis 0,2, 0,2 og 0,6. For at få den samlede gearing ganges disse forhold sammen således at vi får en samlet gearing for hele systemet på:

0,2*0,2*0,6=0,024

Dette betyder at når det drivende tandhjul har drejet en enkelt omgang, vil det drevne tandhjul blot have drejet 2,4% af en hel omgang. Drejer motoren fx med en vinkelhastighed på 10 radianer pr sekund, vil udgangstandhjulet (og dermed solpanelet) dreje med en vinkelhastighed på 10 * 0,024 = 0,24 radianer pr sekund.

Motoren er placeret bag ved solpanelet, i en afstand så det passer med gearingen.

 

Hvordan er robottens hardware sammensat?

Følgende komponenter er brugt til at bygge robotten:

  • Et breadboard
  • Ledninger
  • To lysfølsomme modstande (LDR) med en range på 20kΩ til 100kΩ. Modstanden falder jo kraftigere lyset er og stiger jo svagere det er.
  • Fire 10 kΩ modstande
  • To kontakter
  • En Arduino Uno.
  • Et Arduino Motor Shield, som kræver en ekstern spændingskilde på 5V til 12V.[1] Vi valgte en forsyningsspænding på 9V, som også forsyner Arduinoboradet. Arduino Motor Shieldet kan styre to motorer. Vi valgte at koble motoren til indgang A, og dermed er har nedenstående pins som udgangspunkt koblet til følgende funktioner:
    D12: motoren drejer i en retning, når denne pin sættes til HIGH.
    D9: motoren drejer i modsatte retning, når denne pin sættes til HIGH og D12 sættet til LOW.
    D3: PWM – her kan motorens rotationshastighed styres. Ved Puls With Modulation kan man regulere, hvor stor en del af tiden signalet er tændt og hvor stor en del det er slukket. Den andel af tiden signalet er tændt kaldes en Duty Cycle. Når man kalder funktionen AnalogWrite() arbejder Motor Shieldet i et range mellem 0 og 225, hvor 225 betyder at signalet er tændt i 100% af tiden og har altså en Duty Cycle på 100%, og 0 betyder at signalet har en Duty Cycle på 05.[2] På den måde kan man ændre på den andel af tiden signalet er tændt og dermed på, hvor hurtigt motoren kører.
  • En DC motor.
  • En legoanordning hvor motorendriver en gearing, som får en plade med breadboardet til at dreje rundt. Se Figur 7.

 

På nedenstående figurer (Figur 5A og 5B) ses et billede og et diagram over kredsløbets opbygning.

 Solcelle sketch_bb  Solcelle sketch_schem
Figur 5A – Billede af kredsløbets opbygning Figur 5B – Diagram over kredsløbets opbygning. Arduino Unoen er ikke medtaget i diagrammet. Motor Shieldet er sat oven på Arduino Unoen.

På nedenstående Figur 6 og 7 kan legodelen af robotten ses:

 Delkomponenter  Robottens legokomponenter
Figur 6 – Prototype 1 Figur 7 – Prototype 2

 

Robottens fysiske udformning har udviklet sig under hele forløbet. De første udfordringer opstod, da vi første gang forsøgte at få robotten til at køre, fordi motoren straks hoppede ud af legoanordningen. Det viste sig nemlig, at motoren havde svært ved at få gearingen til at køre rundt, ved den hastighed den som udgangspunkt var sat til. Vi fandt ud af, at hvis vi skruede op for motorhastigheden – altså for PWM – og desuden fastmonterede motoren i legoanordningen, kunne den godt trække gearingen.

 

Efter den første udgave af robotten fungerede, besluttede vi, at vi ønskede at breadboardet og dermed solpanelet kun skulle køre i en bane med en vinkel på . På den måde kan man sørge for, at robotten ikke utilsigtet kører længere end solens forventede bane. For at implementere det indsatte vi to kontakter placeret i en vinkel på  til hinanden nær det tandhjul der får selve oslpanelet til at køre rundt. Kontakterne sørger for at motoren står stille, når de lukkes. Dermed bruger motoren heller ikke unødvendig strøm på at forsøge at køre længere end ønsket.

 

Samtidig med monteringen af de to kontakter blev det besluttet at prøve at lave en lavere gearing for at få panelet til at køre mere jævnt, dette blev gjort ved at skifte de tre tandhjul ud med seks, som beskrevet i forgående afsnit. På figur …. Ses den første prototype med en gearing med tre tandhjul, mens den anden prototype ses på figur … hvor den nye gearing er blevet implementeret sammen med de to kontakter der begrænser systemets bevægelse.

 

Hvordan er robottens opførsel implementeret?

Overordnet fungerer robotten således, at jo kraftigere lyset er på LDR’en des lavere bliver modstanden og des mindre er spændingsfaldet over modstanden også. I koden sammenlignes spændingsfaldet over de to lysfølsomme modstande, og hvis forskellen på de to spændingsfald er større end en bestemt følsomhedsmargin, sættes motoren til at dreje enten den ene eller den anden vej med en bestemt hastighed. Hvis forskellen på spændingsfaldene er mindre end følsomhedsmarginen, hvilket indikerer at boardet står nogenlunde vinkelret på solen, sættes motorens hastighed til 0, og boardet forbliver i samme position.

Hvis en af kontakterne lukkes, indikerende at solpanelet har kørt  i den ene eller den anden retning, sættes motorens hastighed til 0, og solpanelet kører ikke rundt længere. Hvis spændingen over den modstand, der sidder i den modsatte side af breadboardet ift. den kontakt der er lukket, bliver mere end værdien af følsomhedsmarginen større end spændingen over modstanden i samme side som kontakten, vil motoren begynde at køre i retning mod den modsatte modstand igen.

 

De eksakte værdier af følsomhedsmarginen og motorhastigheden er fundet ved at vi har prøvet at ændre henholdsvis følsomhedsmarginen og hastigheden hver for sig indtil robotten opførte sig, som vi ønskede. Vi endte med en følsomhedsmargin på 35 bitværdier og en hastighed på 60.

Arduino Unoens AD-konverter har en opløsning på 10 bit, og det betyder at en outputværdi på 0 svarer til en spænding på 0V, og en outputværdi på 1023 svarer til en spænding på 5V. Dermed kan vi regne ud, hvad en outputværdi på 35 svarer til:

F3

Det betyder altså at motoren sættes i gang, hvis forskellen i spændingsfaldene over de to lysfølsomme modstande er større end 0,17V.
En hastighed – eller PWM – på 60 betyder at signalet er tændt F4 af tiden.

På Figur 8 ses et flowdiagram over kodens opbygning. Koden ses i Figur 9, og beskrivelsen af denne kan ses nedenfor.

 

 Flow diagram over koden
Figur 8 – Flowdiagram over kodens opbygning

int directionA = 12;
int directionB = 9;
int motorAspeed = 3;
int switch1 = 2;
int switch2 = 4;

int LDR1 = A5;
int LDR2 = A4;
int val1 = 0;
int val2 = 0;

void setup()
{
pinMode(directionA, OUTPUT);
pinMode(directionB, OUTPUT);
pinMode(motorAspeed, OUTPUT);
pinMode(switch1, INPUT);
pinMode(switch2, INPUT);
pinMode(LDR1, INPUT);
pinMode(LDR2, INPUT);
}

void loop()
{
  val1 = analogRead(LDR1);
  val2 = analogRead(LDR2);
  int S1 = digitalRead(switch1); 
  int S2 = digitalRead(switch2); 
  

  if (S1 == HIGH || S2 == HIGH){ 
    analogWrite(motorAspeed, 0);

    if ((val1-val2)>35 && S1 == HIGH){
    digitalWrite(directionA, HIGH);
    digitalWrite(directionB, LOW);
    analogWrite(motorAspeed, 60);  
    }

    if ((val2-val1)>35 && S2 == HIGH){
      digitalWrite(directionA, LOW);
      digitalWrite(directionB, HIGH);
      analogWrite(motorAspeed, 60);      
    }
    }
  else {
  if (abs(val1-val2)<=35) { 
    analogWrite(motorAspeed, 0);
  } 
else {
  if ((val1-val2)>35){ 
    digitalWrite(directionA, HIGH);
    digitalWrite(directionB, LOW);
    analogWrite(motorAspeed, 60);
    } 
else { 
      digitalWrite(directionA, LOW);
      digitalWrite(directionB, HIGH);
      analogWrite(motorAspeed, 60);
      }
    }
  }
}

Figur 9 – Koden

Første del af koden består i at initialisere de pins og værdier, der skal bruges gennem programmet.
De første tre pins der initialiseres er digitale pins, hvis funktioner er beskrevet tidligere. De følgende to er til de to kontakter der er initialiseret til digital pin 2 og 4.

De lysfølsomme modstande er analoge, og vi sætter dem derfor til hver sin analoge port som input til Arduino Unoen.
Desuden erklæres to variable, som senere skal bruges til at gemme bitværdier for spændingen i. De initialiseres begge til 0.

Herefter kommer en setup funktion, som indeholder alle de ting i koden, der kun skal ske én gang. Det er her, vi definerer om de erklærede pins er inputs eller outputs. Til dette bruges funktionen pinMode(). De tre pins, som skal kommunikere med motoren, sættes som output fra Arduino Unoen. De to pins der modtager information fra modstandene sættes som input, sammen med de to pins der læser fra kontakterne.

Loopet er den del af programmet, som udføres igen og igen indtil programmet afbrydes manuelt – med mindre andet er angivet.
Funktionen analogRead() læser den analoge spænding fra de lysfølsomme modstande, og Arduino Unoens AD-konverter omdanner denne værdi til en bitværdi. Det gøres for begge input-pins, og værdierne gemmes ned i de to variable, der blev erklæret tidligere.

Nu benyttes en if/else statement til at finde ud af hvorvidt en af kontakterne er aktiveret. Hvis enten swich1 eller swich2 er aktiveret sættes motorhastigheden lig 0, således at motoren stopper. Aktiveres kontakterne betyder det nemlig at solpanelet er på vej til at bevæge sig uden for det range vi ønsker den skal arbejde i. Efter hastigheden er blevet sat til 0, benyttes endnu to if statements. Den første tjekker om spændingsforskellen mellem den venstre og den højre modstand er større end 35 bit, samtidig med at den højre kontakt er aktiveret. Dette betyder nemlig at lyskilden har flyttet sig inden for solpanelets bevægelses range, således at solpanelet skal bevæges til venstre. Den følgende if statement gør det samme bare i den modsatte side, når den venstre kontakt aktiveres.

Hvis disse to if statement ikke bliver true, betyder det at ingen af kontakterne er aktiveret. Solpanelet befinder sig altså inden for sit bevægeområde og den skal derfor bevæge sig efter lyset. Dette styres af den efterfølgende kode der står efter den første else statement.

Endnu en if/else statement sættes op, og her undersøges det, om den absolutte værdi af forskellen i spændingsfaldene er større end følsomhedsmarginen. Hvis den er det, bruges funktionen digitalWrite(), som giver motorhastigheden 0 som output til pin D3. Dermed stå motoren stille, hvis forskellen mellem de to variable er mindre end følsomhedsmarginen.
Hvis dette ikke er tilfældet gennemløber programmet endnu en if/else statement. Her undersøges det om val1 er større end val2 med en værdi der er større end følsomhedsmarginen. Hvis det er tilfældet, bruges igen funktionen digitalWrite til henholdsvis at sætte motorretning A aktiv og motorretning B inaktiv med en motorhastighed på 60, og motoren kører den ene vej. Hvis det modsatte er tilfældet, sker netop det modsatte, altså at motorretning A sættes inaktiv og motorretning B sættes aktiv med en motorhastighed på 60. Dermed kører motoren altså den anden vej.

Som tidligere beskrevet er følsomhedsmarginen og motorhastigheden blevet bestemt ved at forsøge med forskellige værdier, indtil de mest passende blev fundet. Det har dog været lidt problematisk at få motoren til at stå stille. Ved at søge på nettet, fandt vi frem til et eksempel, hvor Arduino Motor Shieldet blev brugt til at styre en DC motor, og her stod der, at motoren kunne bremses ved at sætte både motorretning A og B til enten LOW eller HIGH samtidig, men dette virkede ikke. I stedet satte vi motorhastigheden til 0, hvilket jo betyder, at signalet til motoren er tændt 0% af tiden, hvilket bevirker i at motoren slet ikke kører rundt.

Konklusion

I forbindelse med opgaven, er der blevet bygget en robot, der er i stand til at registrere og efterfølgende reagere på lyspåvirkning udefra således, at robottens ’solpanel’ hele tiden står vinkelret på lysindfaldet. Ud fra opstillede forsøg er konklusionen, at robotten opfylder kravene på en tilfredsstillende måde. I forhold til robottens bevægelse, var denne i starten lidt ujævn grundet en for høj gearing, i forhold til den motor der var blevet udleveret. For at løse dette blev der lavet en lavere gearing vha. nogle flere tandhjul med mindre forhold. Dette gjorde det muligt at drive solpanelet langsommere rundt. Dog blev det nødvendigt at skrue en anelse op for motorens hastighed da den ellers ikke kunne trække de mange tandhjul rundt.

Derudover blev det valgt at montere en kontakt på hver side af anordningen, for at begrænse motorens bevægelse til et område på plus minus 90 grader fra udgangspositionen. Dette er skånsomt for motoren så man ikke risikerer at motoren prøver at dreje solpanelet hen i en position der konstruktionsmæssigt ikke er mulig, og som ikke vil være hensigtsmæssig i forhold til den viden man har om solens placering.

Video

[1] https://www.arduino.cc/en/Main/ArduinoMotorShieldR3, set d. 21.03.16

[2] https://www.arduino.cc/en/Tutorial/PWM, set d. 21.03.16

Leave a Reply