Porteføljeopgave 1 – Sun Searcher
Robotsystem: Sun Searcher
Gruppe: Mette Tanggaard Ohlsen & Natascha Denise Grønlie
4. Semester Lærings- og Oplevelsesteknologi
Systemets opbygning
Som set på billedet til højre har vi yderst til venstre placeret Arduino med monteret Arduino Motor-Shield. I midten sidder Breadboardet med ledninger forbundet til hhv. to LDR-modstande og Arduinoen. Til højre har vi placeret motoren under vores opstilling for at holde den tæt på ’fundamentet’, og gøre at den sidder mere stabilt. Den er vendt således at vi får en lodret rotationsakse, da vi skal rotere solcellen horisontalt. Over Lego motoren har vi selve gearingen, som er på 1:5. Det første tandhjul (det lille grå) har 8 tænder og det største tandhjul (det store grå) har 40 tænder, de er forbundet med et sort tandhjul med 24 tænder. Oven på det grå tandhjul har vi en skrå plade hvor ’solcellen’ er sat fast. Øverst på pladen har vi placeret to LDR modstande afskærmet med en plade mellem dem. Afskærmningen gør sammen med LDR-modstandende at vi kan finde ud af hvilken retning lyset kommer fra, og således rotere solcellen mod solen.
Hardware
Diagramtegning
Billeder af system med delkomponenter
Problemområder
Under opbygningen af vores robot havde vi problemer med at ledningerne var for ’stive’ hvilket resulterede i at den del af robotten som skulle rotere mod lysets retning havde svært ved at rotere. Vi har ikke skiftet ledningerne, men det lykkedes at give den en større vinkel at rotere indenfor, ved at lade ledningerne hænge frit.
Derudover oplevede vi at vores ene LDR-modstand var mere følsom, hvilket vi forsøgte at løse ved at sætte et threshold på (80) inde i koden. Et andet problem vi løb ind i var gearingen. Vi fandt ud af at gearingen var for lav (1:1.667) og vi satte derfor gearingen op til 1:5.
Systemets opførsel
Robottens opførsel er bygget op af if-, else-statements, der først tjekker om der er lys på sensorerne. Hvis der er lys, tjekker den hvilken sensor der registrerer mest lys og motoren drejer derefter opstilling i den retning. Den stopper når der er ca. lige meget lys på begge sensorer. Vi har måtte opsætte et threshold på 80, da vores sensorer ikke er lige følsomme.
Kode
const int sensorPin = 1; // analog 0, venstre sencor const int sensorPinR = 0; //analog 1, højre sencor const int thressHold = 80; //forskel i sensor følsomhed const int lightLimit = 230; //minimum lysmængde den skal reagere på void setup() { Serial.begin(9600); pinMode(9, OUTPUT); pinMode(12, OUTPUT); } void loop() { int rate = 100; //sæt rate til 100 (millisekunder) int rateLeft = analogRead(sensorPin); // læs input fra venstre sensor int rateRight = analogRead(sensorPinR); // læs input fra højre sensor delay(rate); // vent //check om der er lys på minimum én af sensorne if(rateLeft > lightLimit || rateRight > lightLimit){ //kald funktion til at dreje opstillingen turnDirection(rateLeft, rateRight); //kald funktionen til at dreje } else{ Serial.println("no light"); digitalWrite(9, HIGH); //slå bremsen til analogWrite(3, 0); //sæt hastighed til 0 } } void turnDirection(int leftSens, int rightSens){ int diffLR = leftSens - rightSens; //find forskellen mellem sensor output int diffLRAbs = abs(diffLR); //find den absolutte værdi af forskellen //hvis forskellen er mindre end threshold, stop motoren if(abs(diffLRAbs < thressHold)){ Serial.println("do none"); digitalWrite(9, HIGH); //slå bremsen til analogWrite(3, 0); //sæt hastighed til 0 } else if(leftSens > rightSens){ //drej mod den sensor der har mest lys(venstre) Serial.println("turn Left"); digitalWrite(12, LOW); //Sæt retning digitalWrite(9, LOW); //Slå bremsen fra analogWrite(3, 255); //sæt hastighed } else { //drej mod højre Serial.println("turn Right"); digitalWrite(12, HIGH); //sæt retning digitalWrite(9, LOW); //slå bremsen fra analogWrite(3, 255); //sæt hastighed } }
Vi havde problemer med at den ene sensor var mere følsom, og vores robot blev derfor ved med at dreje over mod den, men vi løste det ved at indsætte et threshold på forholdet mellem sensorerne.
Derudover var der i første omgang forvirring med hvilken vej motoren drejede, men det blev nemt løst ved at bytte om på HIGH og LOW for retningsoutputtet, i de forskellige statements.
Konklusion
Vores robot løser opgaven, da den ved brug af LDR-modstande bestemmer i hvilken retning lyset kommer fra, og vha. en motor, dreje solcellen mod lyset (inden for 180 grader). Logikken kigger også på hvor meget lys der er til stede, så den ikke reagerer hvis der er for mørkt.
Vores robot kunne forbedres ved at gøre brug af blødere ledninger, sat op på en anden måde, så robotten har mere frihed til at dreje over en større vinkel. Den kunne også gøres mere præcis ved en større gearing. Sensorerne kunne sættes bedre fast, så de ikke giver sig når robotten drejer.
I logikken kunne der gøres brug af tid, til at se om solen er oppe, så den ikke om natten drejer mod kunstige lyskilder der måtte passere.
Der kunne også gøres brug af en start position, så den om morgenen selv, drejer sig mod øst inden solen står op.
Derudover kunne der tilføjes yderligere to sensorer og en motor, der drejer den om en vandret akse, så den også kan tage hensyn til hvor højt solen står på himlen.