Af: Alexander Nygreen, Miriam Krebs og Sille Pedersen

Produktbeskrivelse

Ikaros er en robot der har til formål at følge solen eller andre lyskilder. Den er bygget ved hjælp af en Lego motor hvor der er bygget en plade der kan vinkles manuelt efter solen for at få det mest optimerede solindfald. På denne plade er der sat to lyssensorer fast med klodser. Disse photoresistorer er forbundet med en Arduino ved hjælp af ledninger. Photoresistorer er adskilt fra hinanden med en skillevæg.

Ikaros fungerer således at der måles på hvilken side, af skillevæggen, der er mest lys og så drejes pladen i den retning.

 

Tanker bag opbygningen

Ved konstruktionen af Ikaros, er der forsøgt at tage højde for motorens kraft og derved gøre konstruktionen så let som muligt. Dertil er der bygget en platform, som stabiliserer konstruktionen både i stilstand og i bevægelse. Top-pladen som bærer på de to photoresistorer (LDR) er anbragt på en stang, som er fastsat til Lego elmotoren.

Figur 1.1 – Ikaros roterende element

Top-pladen er konstrueret således, at den tillader en manuel rotation i y-aksen. Denne rotation er brugt, for at få den bedst mulige indfaldsvinkel af lyset på de to LDR. Den indeholder derudover også en skillevæg som adskiller de to LDR, for at give separate målinger for de to sensorer. Robotten kan derved rotere og placere sig korrekt i forhold til solindfaldet.

Motoren er grundlaget for Ikaros og er derfor placeret nederst på konstruktionen. Der er ikke implementeret gearing, da det med den grundlæggende idé in mente ikke føltes nødvendig.

Idégenereringsprocessen, udfoldede sig som en iterativ proces, da gruppen ikke påbegyndte opgaven med en arbejdstegning, me

n derimod lod fantasien føre an. Dette resulterede i flere forskellige konstruktioner, og førte til Ikaros endelige opbygning.

Komponentliste:

  • Arduino Uno
  • Én Lego elmotor med serienr. 43362
  • To photo resistorer (LDR)
  • To modstande på 10 K Ohm
  • Mange fler-trådsledninger
  • Lego klodser til opbygning af prototype
Figur 1.2 – Ikaros komponenter
Figur 1.3 – Kredsløbstegning af Ikaros
Figur 1.4 – diagramtegning af Ikaros

 

Udfordringer med Ikaros

Der var en del udfordringer med Ikaros i form af at ledningerne bremsede for motoren, som gjorde at gruppen måtte tænke anderledes. Der blev overvejet at bygge en plade der flyttede sig med photoresistorerne hvor Arduinoen og breadboardet kunne være. Denne løsning ville også kunne fjerne muligheden for at ledningerne eventuelt kunne vikle sig rundt om motoren. Løsningen blev dog valgt fra, da det ville kræve mere motorkraft at skulle trække Arduinoen. En anden løsning som gruppen havde overvejet var, at tilføje en ekstern platform på hjul, som skulle holde på arduinoen og som skulle rotere i takt med motoren. Grundet manglende byggeklodser, var det ikke muligt at teste en optimal løsning af dette. Gruppen arbejdede derfor videre med at gøre ledningerne lettere. Der blev brugt blødere ledninger i form af flere-tråds ledninger end de mere stive en-tråds ledninger. Derudover blev breadboardet også udskiftet med et mindre og letter bræt hvor de to modstande og ledningerne blev loddet på.

Figur 2.1 – flertrådet og entrådet ledning
Figur 2.2 – Loddet breadboard

 

 

 

 

 

 

 

Kodebeskrivelse

Figur 3.1 – Flowchart for Ikaros adfærd

Ikaros fungerer vha. et if-else statement til at bestemme om bevægelse er nødvendigt og i så tilfælde hvilken retning, efterfulgt af et while loop der gradvist får den til at accelerere, efterfulgt af et andet while loop der får den til decelerere.

void loop() {
  int driveForce;
  
  sensorValue1 = analogRead(ldrPin1);
  Serial.print("pin 1 = ");
  Serial.println(sensorValue1);
  sensorValue2 = analogRead(ldrPin2);
  Serial.print("pin 2 = ");
  Serial.println(sensorValue2);

kode 3.1 – starten på loop

I starten af loopet bliver der instantieret en lokal variable kaldet “driveForce”, som senere i koden bliver brugt til at huske hvor meget kraft motoren kører med, på et givent tidspunkt. Der bliver derefter målt værdier for begge sensorer (bliver også printet til serial monitorer for debugging).

if(sensorValue1 > sensorValue2 + THRESHOLD ){
    //stay left
    digitalWrite(dirPin, HIGH);
    digitalWrite(brakePin, LOW);   
  } else if(sensorValue1 + THRESHOLD < sensorValue2){
    //stay right
    digitalWrite(dirPin, LOW);
    digitalWrite(brakePin, LOW);
  }

Kode 3.2 – kode til at bestemme hvilken retning der skal drejes

Her vurderer koden hvorvidt en sensors måling er højere end en anden, og sætter motorens retning derefter samtidigt med at bremsen bliver deaktiveret. En threshold er tilføjet for at forhindre, at nær identiske værdier på de 2 sensorer får den til at rotere konstant frem og tilbage.

  while (sensorValue1 + THRESHOLD < sensorValue2 || sensorValue2 + THRESHOLD < sensorValue1){
    if (driveForce < MAXFORCE){
      driveForce = driveForce + INCREMENT;
    }
    analogWrite(pwmPin, driveForce);
    sensorValue1 = analogRead(ldrPin1);
    sensorValue2 = analogRead(ldrPin2);
  }

  //brake
  while (driveForce > 0){
    driveForce = driveForce - INCREMENT;
    analogWrite(pwmPin, driveForce);
  }
  digitalWrite(brakePin, HIGH);
  delay (100);
}

Kode 3.3 – Acceleration og decelerations kode

Ovenstående kode får gradvist Ikaros til at dreje hurtigere, i den retning tidligere indikeret, op til en max hastighed (gemt i konstanten MAXFORCE). Er Ikaros ved MAXFORCE hastigheden vil den blive ved den hastighed. Derefter bliver nye værdier for begge sensorer aflæst og hvis en sensor stadigvæk er noterbart højere end den anden, vil loopet starte forfra. Hvis det ikke er tilfældet vil et nyt while loop starte der gradvist får motoren til at miste fart. Når dette loop er overstået vil bremsen blive genaktiveret og efter 100 millisekunder starter koden forfra.

Måden koden er struktureret på nuværende tidspunkt, kan resultere i at Ikaros “overskyder” sit mål under lange rotationer (da det så vil tage lang tid at decelerere, og den først begynder decelerations proceduren når den er næsten ved målet). Dette modvirkes dog af at Ikaros af sig selv vil korrigere sin position modsat retning, men vil stadig give en ikke optimal bevægelse. Dette er et valg taget for at reducere slid på motoren, såvel som baseret på observationer tidligere i udviklingsprocessen hvor motoren blot blev sat direkte til enten MAXFORCE eller 0, da dette resulterede i en “hakkende” bevægelse. Nb. MAXFORCE er markant lavere (150) end motorens fulde ydeevne (255) da vi ville have den til at bevæge sig hurtigt, men også begrænse hvor meget den kunne overskyde sit mål samt spare energi.

 

Refleksion

Ud fra en kontrolleret test vikler ledningerne sig ikke om motoren da LDR 1 og LDR 2 er programmeret og vinklet således at Ikaros enten vil følge LDR 1 eller LDR 2 og dreje højre eller venstre om. Når solen står op igen vil den modsatte LDR få Ikaros til at dreje tilbage mod sit startpunkt i modsatte retning af før. Pga. solens indfaldsvinkel formodes det den aldrig vil rotere over 180 grader (illustreret via figur x.y), hvormed ledningerne ikke kan blive snoet om motoren.

Figur 4.1 – Illustration af forestillet bevægelse af solen

En måde at undgå at få ledningerne til at vikle sig om elmotoren ville være at bruge en stepper motor. Med en stepper motor vil motoren vide hvor mange grader den har drejet modsat den nuværende motor. Det vil sige at motoren kunne have et startpunkt ved 0 grader ved solopgang og gå til 180 grader ved solnedgang. Ikaros vil derefter nemmere kunne kodes til at gå tilbage til de 0 grader som er startpunktet.

I gruppens iver efter at lave en let prototype for at udnytte energien bedst muligt, er prototypen endt med at blive for let. En test af prototypen udendørs viste at vinden kunne vælte den hvilket ikke var så hensigtsmæssigt. Det ville kunne løses med en tungere platform som prototypen kunne stå på.

Ikaros drejer sig for at stå i den mest effektive retning i forhold til solen, men på grund af den tid det tager at decelerere bliver det punkt den stopper lidt forskudt i forhold til målet.

Platformen som prototypen står på giver nogle problemer i forhold til at ledninger kan hænge fast i den. Det ville være mere optimeret at have mere glat platform.

 

Konklusion

Video 5.1 – Ikaros i funktion

Som nævnt i ovenstående tekst, er Ikaros bygget således, at den opfylder opgavekravene. Dermed sagt følger den solens bevægelser, ved hjælp af to photoresistorer. Top-pladen tillader en manuel rotation, således at den kan vinkles på 45 grader.  Grundet konstruktionen af Ikaros, føltes det ikke nødvendigt at implementere gearing fordi motoren i sig selv var tilpas præcis, hvilket heller ikke viste sig som et problem ved senere test.

Når solen går ned og dernæst står op igen, antager gruppen at det første solindfald vil falde på LDR 1, som vil rotere top-pladen i den rigtige retning og dermed forhindrer en 360 graders rotation. Dette er en antagelse omend det er blevet testet i ikke repræsentativ kontekst (se video 5.1).

Udbyttet for gruppens læring har været bred i forbindelse med at processen har været én stor problemløsning. Blandt andet har gruppen opnået en dybere praktisk forståelse for robotbygning og dets udfordringer. Dernæst var der ikke blevet overvejet vind og vejr i konstruktionen, hvilket resulterede i at Ikaros var ustabil udendørs.  

Et andet tiltag til senere projekter kunne være, at forberede og tegne en arbejdstegning inden påbegyndelse af konstruktionen.

Alt i alt har projektet været meget lærerigt og alle gruppemedlemmer har haft opgaver at kunne gå i gang med. Det har derfor ikke føltes langtrukket og der har altid været mulighed for en retfærdig arbejdsfordeling.

Leave a Reply