Rapport Oblig 2 1510

 Rapport for Oblig 2 Fag: INF1510 Bruksorientert design Oppgåvetekst: Etch-­‐a-­‐Sketch Bruk to potentiometere til å tegne i Processing; det ene potentiometeret skal styre x-­‐aksen og det andre skal styre y-­‐aksen. Du trenger også en knapp for å aktivere og deaktivere tegning, samt noe for å gjennkjenne bevegelse, slik at man kan riste for å resette tegneflaten. Skriven av Kine Gjerstad Eide Brukarnamn: kinegei Utstyr I denne oppgåva vart dette utstyret nytta: -­‐ To potensiometer -­‐ Ein knapp -­‐ Ein tiltsentor -­‐ Ein motstander på 10K -­‐ 12 ledninger -­‐ Ei arduinobrikke -­‐
-­‐
-­‐
Eit arduino brett Ein usb kabel Ein Mac Programvarer: -­‐ Arduino -­‐ Processing -­‐ Word (omgjort til PDF før levering) Beskriving Eg starta med å lage eit lite spel liknande det som vart vist under fellesøvinga den xx.xx. Forskjellane var at det blei satt inne bilete av ei bille, denne tissa på maur som kom klvyande over skjermen. Billa vart styrt av to potensiometer, eit for vertikal beveging og ei for horisontal beveging. Dette programmet vart så omgjort slik at potensiometera styrte ei linje som vart tenga opp frå punktet der linja nett var og til der potensiometera styrte den. Dette skapa eit inntrykk av at ein teiknar på skjermen. Det var nokre utfordringer knytt til dette då eg valde å skrive programmet litt ”dummy-­‐proof”, altså at ein Ecth -­‐ a -­‐ sketch: Foto: thetanooki.com skal kunne få resultat sjølv om nokre deler av programmet ikkje fungerar. Dette Deretter kobla eg til ein knapp som aktiverer og deaktiverer teikninga. Knappen vart kobla til ved å nytte eit oppsett i boka ’Arduino project book, dette vart endra og tilpassa prosjektet, slik at den berre las inn verdiar to gongar i sekundet. Dette fordi å hindre at teikninga blir aktivert og deaktivert fleir gonger enn det som blir trykka inn. Det neste som skjedde var at ein tilt sensor blei kobla til oppsettet. Denne registrerer beveging i brettet, noko som igjen er programmert til å setje opp ny bakgrunn. Den nye bakgrunnen legg seg på toppen av alt som er teikna hittil og ein får dermed inntrykk av at ein startar på nytt og at det gamle er viska bort. Utfordringer Det var nokre utfordringer knytt til valet av måte å sende informasjon frå arduino til processing. Dette fordi eg valde å skrive programmet litt ”dummy-­‐proof”, altså at ein skal kunne få resultat sjølv om nokre deler av programmet ikkje fungerar. Arduino sender informasjon frå dei to potensiometera anna kvar gong, informasjonen som blir sendt starta med anten ’x’ eller ’y’ etterfulgt av ein talverdi. Når så processing får inn informasjon sjekkar den fyst kva bokstar som er komen Hakkete kantar. for deretter nytte tallverdien til den tilhøyrande x eller y aksa. Denne vekselsvise utsendinga av informasjon gjorde at det som var teikna i skjerm bilete blei taggete, eller så ut som trappetrinn til å begynne med. Løysinga på dette vart å setje inn ein ekstra ’if-­‐test’, samt å lagre den inkomande versjonen på ein litt annan måte slik at dei to verdiane vart sendt til skjerm samstundes. Sending av informasjon frå knapp og tilt-­‐sensor skjedde for øvrig på omlag same måte som ved potensiometera, her også ved å setje inn ein bokstav, ’k’ for knappen og ’t’ for tilt-­‐sensoren, for deretter å tolke annakvar innlesing frå knappen som av og som på, medan det for tilt-­‐sensoren gjaldt at bakgrunnen vart sett inn på nytt ved kvar innlesing. Ekstra Etter å ha fått til det grunnleggjande tenkte eg litt vidare og forsøkte å innkorporere nokre av designprinsippa. Ein ”Etch-­‐a-­‐Sketch” er stort sett eit leketøy for born, noko som gjor at det vart naturleg å legje til litt fleir fargar. Vidare vart det og lagt til ein funksjon der ein kan velgje kva farge ein vil nytte. Dette ved å setje inn fem ruter i forskjellige fargar i toppen av skjermbilete som gjer at ein kan skifte farge ved å styre teikneprikken over ruta med fargen ein ynskjer. Resultat Bornevenleg design Resultatet av oppgåva er ein elektrisk utgåve av ”Etch-­‐a-­‐Sketch”, det ein har fem fargeval. Ein teiknar ved å styre to potensiometer og ein kan nullstille eller viske ut teikninga ved å riste på arduinobrettet. Sjølve teikneområde er på skjermen og det er satt inn fargar som gjer at det skal vikre meir tiltrekjande for born som tross alt, så vidt eg veit er hovudmålgruppa for dette verktøyet. Film Film av det ferdige resultatet er å finne på denne nettstaden: http://pacelg.com/kines/etch-­‐a-­‐sketch/ Processing kode import java.util.*; import processing.serial.*; Serial minport; int x; int y; int knapp = 0; int oldx; int oldy; int h; int v; int screenH = 750; int screenW = 800; int r = 50; int g = 70; int b = 190; int xycounter = 0; void setup(){ background(255, 80, 40); size(screenW,screenH); minport = new Serial(this, Serial.list()[0], 9600); } void draw(){ String fraArduino = null; noStroke(); fill(0,191,255); rect(0,0, screenW/5,80); fill(138,43,226); rect((screenW/5),0,screenW/5,80); fill(255, 20, 147); rect((screenW/5)*2,0,screenW/5,80); fill(124, 252, 0); rect((screenW/5)*3,0,screenW/5,80); fill(225,225,0); rect((screenW/5)*4,0,screenW/5,80); if(minport.available()>0){ fraArduino = minport.readStringUntil('\n'); } if(fraArduino != null){ fraArduino = fraArduino.trim(); int temp = -­‐1; try{ //println(fraArduino); if(fraArduino.charAt(0) == 'v'){ temp = parseInt(fraArduino.substring(1)); y = (int)map(temp, 0, 1023, 0, screenH); xycounter ++; } else if(fraArduino.charAt(0) == 'h'){ temp = parseInt(fraArduino.substring(1)); x = (int)map(temp, 0, 1023, 0, screenW); xycounter ++; } else if(fraArduino.charAt(0) == 'k' && knapp == 0){ knapp = 1; print("0: "+knapp); } else if(fraArduino.charAt(0) == 'k' && knapp == 1){ knapp = 0; print("1: "+knapp); } else if(fraArduino.charAt(0) == 't'){ background(255, 80 ,40); //bakgrunnmet(2); } }catch(Exception e){ }//minport.clear(); } if(knapp == 0){ if(y<80 && x<screenW/5){ r = 0; g = 191; b = 255; }if(y<80 && x>screenW/5 && x<(screenW/5)*2){ r = 138; g = 43; b = 226; }if(y<80 && x>(screenW/5)*2 && x<(screenW/5)*3){ r = 255; g = 20; b = 147; }if(y<80 && x>(screenW/5)*3 && x<(screenW/5)*4){ r = 124; g = 252; b = 0; } if (y<80 && x>(screenW/5)*4){ r = 225; g = 225; b = 0; } if(xycounter >= 2){ stroke(r, g, b); //fill(r,g,b); strokeWeight(2); line(oldx, oldy, x, y); oldx = x; oldy = y; xycounter =0; } //ellipse( x, y, 5,5); // rect(x, y, 5, 5); } else if(knapp == 1){ oldx = x; oldy = y; } } Arduino kode int const hv = A0; int hvverdi; int const on = A1; int onverdi; int skyt = 0; int i = 0; int knapp = 0; int const tilt = 11; int earlystate = 0; int prevstate = 0; void setup(){ Serial.begin(9600); } void loop(){ delay(17); knapp = digitalRead(2); if(knapp == HIGH){ Serial.println('k'); delay(500); } if(i==0){ hvverdi = analogRead(hv); Serial.print("h"); Serial.println(hvverdi); i = 1; } else if(i == 1){ onverdi = analogRead(on); Serial.print("v"); Serial.println(onverdi); i = 0; } earlystate = digitalRead(tilt); if(earlystate != prevstate){ Serial.println("t"); prevstate = earlystate; delay(500); } }