Tidsstyrd persiennöppnare

Relevanta dokument
LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

Växtviskaren EITF11 Digitala projekt VT15, I12

The Phenomenal Doorbell Bilaga 2. Källkod

1 Bakgrund 4. 2 Kravspecifikation Definitioner Grundläggande krav Användarfall 5

Rapport. Fyra i rad-spel. Rapport Digitala Projekt EITF11 Grupp 9 Emma Rasmusson & Louise Ragnarsson Handledare: Bertil Lindvall

Bilen som inte kan krocka

Digitala Projekt(EITF40) - Larm

Digitala Projekt (EITF11) Hemlarm

EITF40 - RFID-terminal. Joakim Marculescu (dt08jm6), Eric Johansson (dt08ej6)

Källkod. #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define green_diode PD5. #define RS PD4

Digitala Projekt(EITF40) - Larm

Lunds Tekniska Högskola Elektro- och informationsteknik Digitala projekt (EITF11)

Larmcentral. Digitala Projekt. Cecilia Olsson & Erika Björck Handledare: Bertil Lindvall LUNDS TEKNISKA HÖGSKOLA

Projektrapport - Roterande digital LED-klocka

Thunder s Truck projektrapport

DIGITALA PROJEKT (EITF40) Fartmätare

Lunds Tekniska Högskola. I-10 Grupp 11: David Sundström Max Schulz Albert Lundberg Handledare: Bertil Lindvall

EITF11: Bandkanon Grp 05

DIGITALA PROJEKT Väderstation

Pulsmätare med varningsindikatorer

Digitala System Projekt - EITA15 VT *SUPER DUPER KLOCKAN*

Väderstation. Digitala Projekt EITF11 Institutionen för Elektro- och Informationsteknik Lunds Tekniska Högskola

High Core Remote Car X8000 Cool

Pulsmätare Digitala Projekt EITF11

Projektrapport Målgång

EITF11 - Digitala projekt. Hastighetsmätare. Hugo Backmyr Mattias Karlsson

Lunds Tekniska Högskola EITF11 Digitala projekt. Bandspelaren

Rafiki Wa Kupanda. EITF11, Digitala projekt VT18. Linnea Håkansson, Anton Gunneberg, Ruben Schultz

Kla ggvisarskylt. -med en underton av rassel. av Jonathan So nnerup & Gabriel Jo nsson

Feeding Daisy. EITF11 Lunds Tekniska Högskola. Grupp 12: Pontus Akervall Louise Landare Anton Schölin. En automatisk blomvattnare

Effektpedal för elgitarr

EITF11 Digitala Projekt TIC TAC TOE. Lukas Ljungblom & Johan Lyckenvik I-13 Handledare: Bertil Lindvall

PlantPuppy Räddaren för den som inte kan hålla växterna vid liv

JOFEN-Prototypes. Målsökande pansarvagn. Projektarbete i Kursen EITA15. Jonatan Claesson, Olle Jonasson, Felix Rödén, Edvin Rossi & Nils Olén

TEMPERATURMÄTARE MED GRAFRITARE

Digitala Projekt (EITF11) Larmanläggning

DIGITALA PROJEKT - EITF11

Projekt EITA15. Väckarklocka. LTH Ingenjörshögskolan vid Campus Helsingborg Datateknik

Rapportsammanfattning. Optima Sous Vide

Digitala projekt Linjeföljande bil

RAPPORT: DIGITALA PROJEKT

The Intelligent Timer

Digitala Projekt: Digitala Projekt, EITF11 - VT17 Oscar Ahlgren, Patrik Lorentsson och Sten Hellberg Handledare: Bertil Lindvall

Digitala Projekt EITF11 Grupp 9 Projektarbete Hanna Bondesson Marcus Skog. Reaktionsspel EITF11

Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.

Rapport i Digitala Projekt (EDI021)

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

Digitala projekt, EDI021 Rapport Handledare: Bertil Lindvall

Projektrapport - RoboWalter

Department of Information Technology Digitala Projekt Frysboxregulator. 10 december 2007

Temperaturmätare med lagringsfunktion DIGITALA PROJEKT EITF11 GRUPP 14, ERIK ENFORS, LUDWIG ROSENDAL, CARL MIKAEL WIDMAN

EIT. Digitala projekt EITF11. Larmanläggning. Handledare Bertil Lindvall Anna Lindberg I-11 Caroline Vitasp I-11 Eric Eliason I-10

ETSA01 Digitala Projekt (I) VT- 13. Projektarbete AC Handledare Bertil Lindvall

AVR 3 - datorteknik. Avbrott. Digitala system 15 hp. Förberedelser

Pulsmätare. EITF11 Digitala Projekt VT15. Grupp 9: Emma Albertz, Mathilde Hagander & Alexandra Mansner Handledare: Andreas Johansson & Bertil Lindvall

/* * dancing3.c * * Created: :53:20 * Author: digpi10 */ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.

Innehållsförteckning. Figur- och tabellförteckning. Figure 1 Blockschema över hårdvaran...4 Figure 2 Blockschema över programet...

EITF11. WormFight. Axel Eriksson, Felix Geuken Handledare: Bertil Lindvall EITF11

Projektrapport - Feststation

WALL E. WALL EVADER EDI021 DIGITALA PROJEKT

Liftmaestro. Lunds Tekniska Högskola Elektro- och informationsteknik. Olle Gemfors, I13 Dayanand Sagar, I13 Mattias Wendler, I13

Digitala projekt, EITF11 - Rapport Handledare: Bertil Lindvall. Fredrik Nylund (ine12fny) Johan Ekman (ine11jek) Olof Wikman (ine11owi)

LTH. EITF11- Digitalaprojekt. Projektrapport WEB

Snake. Digitala Projekt (EITF11) Fredrik Jansson, I-12 Lunds Tekniska Högskola,

Projektrapport i Digitala projekt EITF11. Institutionen för Elektro- och informationsteknik, Lunds tekniska högskola

Rapport Digitala Projekt EITF Grupp 12 Elin Blomstergren, Victor Sundgren Handledare: Bertil Lindvall. Fyra i rad

LUNDS TEKNISKA HÖGSKOLA. Väderstation. Digitala Projekt, EITF11. Martin Olofsson, I08 & Fredrik Oher, I08 Vt 2012

Avståndsmätare. Digitala System EITA Grupp 7. Abdelsalem Yabrag, Abdulhadi kikar, Fredrik Peterson, Jesper Annefors

Digitala Projekt. Chip Quiz. Projektmedlemmar: Olov Nordenstam och Linus Hägerbrand. Grupp 9

The Secure Light. Digitala Projekt EITF11. Hanna Tinglöf, I-12 Anna Horvath, I-12 Filippa Österlin, I-12. Handledare: Bertil Lindvall

Aml Abbas, Ali Darwish, Ehsanolah Hafezi, Fatima Zahra Doussi Grupp 15

EITF11 - Digitala Projekt

TEMPERATUR OCH VINDMÄTARE MED HÖGTALARFUNKTION

Från idé till skapelse av en äkta RoomBot

Väderstation. EITF11, Digitala projekt RAPPORT. Isabella Bergvik, Emma Sandén & Hanna Åberg

Konstruktion av en radiostyrd legobil. Digitala projekt av Arbon Vata Leonardo Vukmanovic Amid Bhatia

Digitala Projekt (EITF11)

LOOKY LUKE. Caroline Hellström och Ville Orlander Arvola Industriell ekonomi I10. - Att välja en lyckosam väg EITF11 Digitala projekt

TETRIS. LTH, Campus Helsingborg EITA15 Digitala System

Datorprojekt, del 1. Digitala system 15 p

Innehåll. 1 Inledning 3

SIMON SAYS Projekt i EITF11 Digitala Projekt

Väderstation. Datum: Projektarbete vid elektro och informationstekniks institution

Projektrapport i Digitala System

Datorteknik 1 (AVR 1)

Självgående fordon Rapport i kursen digitala projekt, EDI021

Digitala Projekt, EITF40

EDI021 Digitala projekt. Rapport LARMSYSTEM. Utförd av: Niklas Eklund E03 David Olsson E04. Inlämnad:

Digitala Projekt VT13. PING-Pong

Linjeföljare Digitala projekt Johan Engström e02je Henrik Persson e02hp

Digitala projekt VT Myran

Jan Babor och Oscar Ågren Handledare: Bertil Lindvall 5/16/2011

Rörelse- och temperaturkänsligt larmsystem

Rapport Digitala Projekt EITF11 Grupp 4 Axel Sundberg, Jakob Wennerström Gille Handledare: Bertil Lindvall

Guitar Tuner EITF11 Digitala Projekt, Projektrapport Elektro- och informationsteknik

Microprocessor / Microcontroller

Digitalt Projekt: Radiostyrd Bil

PROJEKTTYP: Rapportsammanfattning STUDENTER: Larsson, J. ( ) och Oredsson, J. ( ) DATUM: 26 april, 2015

Department of Information Technology Digitala projekt. SuperKull. Daniel Öhman Alexander Persson

Transkript:

Tidsstyrd persiennöppnare Projektrapport i Digitala Projekt - EITF11, Elektro- och informationsteknik, Lunds Tekniska Högskola Carl Agmén, Tobias Gard och Viktor Kjellin. I- 09 ABSTRACT With the general sleeping- in student in mind this project had the goal set on constructing a timer/alarm and directly remote controlled shade opener, for those hard- to- get- up mornings. Due to a lack of needed pre- knowledge about hardware- software programming and integration, combined with time factors, some of the features, such as the alarm by time and wireless connection, had to be down prioritised in favour of getting a final prototype with the desired main feature; to control a servo motor using a direct or time delayed signal. The project has taught us a lot about the difficulties of planning and building electronic constructions, and will therefore most likely give us a greater respect for people working with this that we will encounter in our future professional careers.

Inledning 3 Teori 3 Kravspecifikation 3 Ursprungliga krav 3 Användargränssnitt 4 Knappval 4 Inkluderade komponenter 4 Kontrollenhet 4 Motorenhet 4 Genomförande 4 Förberedelser 4 Montering och testning 5 Mjukvaruprogrammering 5 Resultat 5 Diskussion 6 Referenser 7 Datablad och manualer 7 Appendix 8 Källkod 8 Källkod kontollenheten 8 Källkod lcd 14 Källkod motorenheten 17 Kopplingschema 19 2

Inledning Den stereotype studenten beskrivs ofta som en nattaktiv varelse som föredrar att spendera dygnets första ljusa timmar i en mjuk säng, i ett mörkt rum. I de fall det ändå hade varit fördelaktigt att istället befinna sig på en mer produktiv ort, är botemedlet mot det där mysigt mörka rummet enkelt; Varde ljus! Målet med kursen Digitala projekt är att konstruera något mer eller mindre användbart med hjälp av mikroprocessorn ATmega16 och övriga erforderliga komponenter. Med bakgrund i föregående stycke satte dessa tre morgontrötta teknologer upp målet att konstruera den revolutionerande timerinställda persiennöppnaren, med total avsaknad av snooze- knapp. Teori Kravspecifikation För att få översikt på vad som behövde göras, och få en bild av grundkonstruktionen sattes ett antal krav för uppbyggnad och funktion hos den färdiga konstruktionen. Ursprungliga krav Konstruktionen består av två separata enheter som tillsammans bildar den slutgiltiga konstruktionen. De båda enheterna kommunicerar trådlöst. De två enheterna är: v En motorenhet som förutom processor består av en servomotor och trådlös mottagare. Motorenheten står för den fysiska öppningen av persiennen. v En kontrollenhet som förutom processor består av huvudkomponenterna en knappsats, display samt en trådlös sändare. Kontrollenheten skickar signaler till servoenheten när det är dags att öppna eller stänga persiennen. Funktionella krav Kontrollenheten ska kunna skicka en trådlös signal till motorn som vrider persiennen i rätt position. Motorn alternativt kontrollenheten ska veta när persiennen är öppen eller stängd så att samma kommando inte ska kunna ges två gånger. Signalen ska kunna skickas på ett bestämt klockslag eller efter en utsatt tid. (Klocka och timer) Persiennen ska manuellt, genom direkttryck, kunna öppnas och stängas med kontrollenheten. 3

Kontrollenheten ska hela tiden veta vad klockan är. (Extern kristall) Alla användarinställningar (alarmtid exempelvis) ska kunna ställas in med knappsatsen och visualiseras i displayen. Det ska gå att ställa in aktuellt klockslag på kontrollenheten. Användargränssnitt I displayen visas om nedräkning/alarm är aktiverat och i så fall när öppning/stängning kommer ske, antingen som klockslag eller nedräkning. Knappval 0-9: Siffror för inmatning av alarmtid. A: På startsida, gå till inställning av alarmtid. Vid inställning av alarmtid, bekräfta alarmtid och gå tillbaka till startmeny. B: Direktstyrning av motor, motsols. C: Markör vänster vid inställning av alarmtid. D: Markör höger vid inställning av alarmtid. E: Nollställning av alarmtid, åter till startsida. F: Direktstyrning av motor, medsols. Inkluderade komponenter Kontrollenhet Mikroprocessor AVR, ATmega16 16x2- raders Alfanumerisk LCD Display, Sharp LM162 Steglös spänningsomvandlare för displaykontrast 16- tangenters knappsats, Grayhill 88BB2-072 16- key Encoder, MM54C922 Sändarkomponent till Single Chip 2.4GHz Transceiver, nrf24l01 Extern kristall, 16 MHz Kondensatorer, 1,5 resp 15 farad Spänningsomvandlare 3,3v Motorenhet Mikroprocessor AVR, ATmega16 Mottagarenhet till Single Chip 2.4GHz Transceiver, nrf24l01 Mini High- Speed Digital Servo, GS- D9257 Genomförande Förberedelser Arbetet med persiennöppnaren inleddes med att göra en grov skiss över vilka komponenter som behövdes och vilka krav som skulle ställas på den färdiga prototypen. Detta resulterade i kravspecifikation och kopplingsschema etcetera som beskrivits ovan. 4

Montering och testning Utefter det framarbetade kopplingsschemat monterades de olika komponenterna på två kretskort genom lödning och trådvirning. Ledningar innehållandes 5V löddes fast på kretskortens kontaktpunkter och komponenter, medan övriga ledningar virades på komponenternas pinnar med ändamålsenligt verktyg. Under arbetets gång förändrades konstruktionen vid några tillfällen vilket gjorde att gruppen fick ytterligare träning i trådvirande. Efter första montering testades de enskilda komponenterna genom debugging i Studio 4 på dator där processorn kopplades in i datorn med hjälp av en AVR JTAGICE mkii. Debuggingen blev förutom återkoppling på om kopplingarna planerats och utförts riktigt, även vägen att gå för att lära sig hur komponenterna skulle styras och i förlängningen hur mjukvaran skulle utformas. Mjukvaruprogrammering Koden som lades in på mikroprocessorn skrevs i olika filer beroende på funktion (main/display/key- pad etc.), allt i Studio 4 på dator. Källkoden i sin helhet finns i appendix 1. Resultat Till följd av diverse motgångar samt större svårigheter än vi förutsett med konstruktionen får den färdiga persiennöppnaren något färre funktioner än planerat. Huvudfunktionen att kunna styra en motor direkt eller med tidsfördröjning är dock fortfarande uppfylld. Konstruktionen består av två enheter där kontrollenheten uppfyller ursprungliga krav, bortsett från att tidsstyrningen endast består av en timer. Alltså kan man inte ställa in ett specifikt klockslag, men väl räkna ut hur lång tid man vill ställa in på egen hand. Motorenheten fungerar enligt de uppsatta kraven, men är för tillfället inte kopplad till en fysisk persienn. Det som är fastställt är att styrningen av själva servomotorn fungerar. Till slut gick vi även ifrån den trådlösa kopplingen mellan enheterna. Den trådlösa sändaren respektive mottagaren monterades initialt, men på grund av tidsbrist ansåg vi att det var viktigare att få en fungerande slutprototyp än att den skulle fungera trådlöst och använde oss istället av en trådbunden SPI- koppling, som är en buss för synkron seriekommunikation bestående av en master- och en slaveenhet likt de trådlösa komponenterna. Därmed blir kommunikationen mellan enheterna i praktiken som den trådlösa, men stabilare och enklare. 5

Diskussion Under kursens gång har vi lärt oss mycket om hur elektronisk apparatur faktiskt fungerar och framförallt komplexiteten som ligger bakom de flesta av våra vardagsprodukter. Största lärdomen gruppen har tagit av kursen är antagligen enkelt uttryckt att det är komplicerat och ligger mycket jobb bakom att framställa elektriska konstruktioner. Även om vi i framtiden inte kommer genomföra liknande projekt på egen hand kommer vi säkerligen besitta en större respekt och förståelse för de personer som vi möter som gör det. 6

Referenser Datablad och manualer Mikroprocessor AVR, ATmega16, http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/processor s/atmega16.pdf 16x2- raders Alfanumerisk LCD Display, Sharp LM162, http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/display/l CD.pdf 16x2- raders Alfanumerisk LCD Display, Sharp LM162, http://www.eit.lth.se/fileadmin/eit/courses/edi021/datablad/periphery /Other/MM54C922.pdf Single Chip 2.4GHz Transceiver, nrf24l01, nrf24l01_product_specification_v2_0.pdf, hämtad från http://www.nordicsemi.com/eng/products/2.4ghz- RF/nRF24L01 Mini High- Speed Digital Servo, GS- D9257, http://www.pololu.com/catalog/product/2140/faqs 7

Appendix Källkod Källkod kontollenheten #include <avr/io.h> #include "lcd.h" #include <avr/interrupt.h> #include <util/delay.h> #define F_CPU 1000000UL char buttonpressed; int hour1, hour2, min1, min2, s1, s2, cursorplace, motorplace, apressed; #define DD_MOSI PINB3 #define DD_SCK PINB5 #define DDR_SPI PORTB #define CSN_LOW() PORTB &= ~ (1<<PB4); #define CSN_HIGH() PORTB = (1<<PB4); ISR(INT0_vect) //Interupt när knapp på tangentbordet trycks ner DDRA = 0x00; PORTD &= ~_BV(PD3); //Skickar Output Enable när INT0 triggas buttonpressed = PINA & 0x0F; if(apressed == 1) if(buttonpressed >= 0 && buttonpressed <= 9) set_time(buttonpressed); if(buttonpressed == 10) confirm_time(); if(buttonpressed == 11) motor_turn(1); if(buttonpressed == 12) cursor_left(); if(buttonpressed == 13) cursor_right(); if(buttonpressed == 14) reset_program(); if(buttonpressed == 15) motor_turn(2); else if(apressed == 0) if(buttonpressed >= 0 && buttonpressed <= 9) if(buttonpressed == 10) set_alarm(); if(buttonpressed == 11) motor_turn(1); if(buttonpressed == 12) if(buttonpressed == 13) 8

9

if(buttonpressed == 14) reset_program(); if(buttonpressed == 15) motor_turn(2); else if(buttonpressed >= 0 && buttonpressed <= 9) if(buttonpressed == 10) if(buttonpressed == 11) motor_turn(1); if(buttonpressed == 12) if(buttonpressed == 13) if(buttonpressed == 14) reset_program(); if(buttonpressed == 15) motor_turn(2); void set_alarm() //Visar "sätt alarm"-menyn disp_alarm(); hour1 = 0; hour2 = 0; min1 = 0; min2 = 0; s1 = 0; s2 = 0; cursorplace = 0; disp_time(hour1, hour2, min1, min2, s1, s2); disp_cursorfirst(); //Sätter markören längs ned till vänster apressed++; void motor_turn(val) //Vrider motorn, 1 motsols, 2 medsols. disp_motorturning(val); if(val == 1 ) SPI_MasterTransmit(0x01); else if(val == 2) SPI_MasterTransmit(0x02); void cursor_left() //Flyttar markören 1 steg åt vänster if(cursorplace == 0) cursorplace--; disp_cursorshift(1); //move cursor left if(cursorplace == 2 cursorplace == 5) cursor_left(); 10

void cursor_right() //Flyttar markören 1 steg åt höger if(cursorplace == 7) cursorplace++; disp_cursorshift(2); //move cursor right if(cursorplace == 2 cursorplace == 5) cursor_right(); void reset_program() //Startar om programmet, nollställer timer osv hour1 = 0; hour2 = 0; min1 = 0; min2 = 0; s1 = 0; s2 = 0; cursorplace = 0; apressed = 0; TCNT1 = 0; disp_welcome(); void show() //Visar inskrivna siffror disp_alarm(); disp_time(hour1, hour2, min1, min2, s1, s2); void confirm_time() //Startar nedräkning disp_alarmset(); disp_time(hour1, hour2, min1, min2, s1, s2); apressed++; startcountdown(); void set_time(int val) //Sätter vald tid på vald plats if(cursorplace == 0) hour1 = val; show(); else if(cursorplace == 1) hour2 = val; show(); else if(cursorplace == 3) if(val >= 6) min1 = 6; min2 = 0; else min1 = val; show(); else if(cursorplace == 4) min2 = val; if(min1 == 6) min2 = 0; show(); 11

else if(cursorplace == 6) if(val >= 6) s1 = 6; s2 = 0; else s1 = val; show(); else if(cursorplace == 7) s2 = val; if(s1 == 6) s2 = 0; show(); cursorplace = 0; void startcountdown() sei(); TCCR1B = (1 << CS10); // Set up timer int i = 0; for (;;) if (TCNT1 >= 49999) TCNT1 = 0; // Reset timer value i++; if(i > 160) s2--; if(s2 == -1) s2 = 9; s1--; if(s1 == -1) s1 = 5; min2--; if(min2 == -1) min2 = 9; min1--; if(min1 == -1) min1 = 5; hour2--; if(hour2 == -1) hour2 = 9; hour1--; if(hour1 == -1) break; disp_alarmset(); disp_time(hour1, hour2, min1, min2, s1, s2); i = 0; disp_timeup(); SPI_MasterTransmit(0x03); void SPI_MasterTransmit(char cdata) CSN_LOW(); //Slaveselect low SPDR = cdata; //Skriver till buffert för att starta SPI while(!(spsr & (1<<SPIF))); //Fortsätter till lyckad sändning CSN_HIGH(); //Slaveselect high 12

void main(void) _delay_ms(50); hour1 = 0; hour2 = 0; min1 = 0; min2 = 0; s1 = 0; s2 = 0; cursorplace = 0; apressed = 0; DDRA = 0xFF; DDRD = 0xFB; GICR = 1<<INT0; MCUCR = 1<<ISC01 1<<ISC00; GIFR = 1<<INTF0; SREG = 0x80; DDR_SPI = (1<<DD_MOSI) (1<<DD_SCK); DDRB = (1<<DDB5) (0<<DDB6) (1<<DDB7) (1<<DDB4); DDRB &=~ (1<<PB6); SPCR = (1<<SPE) (1<<MSTR) (1<<SPR0) (1<<SPR1); ckrate to fck/16 _delay_ms(50); disp_init(); disp_home(); disp_welcome(); CSN_HIGH(); // Enable INT0 // Trigger INT0 on all activity // External Interupt Flag 0 // Global Interupt Set //Config SPI-ports //Enable SPI and set to Master, clo sei(); //start interupts while(1) 13

Källkod lcd #include <avr/io.h> #include "lcd.h" #include <avr/interrupt.h> #define F_CPU 1000000UL #include <util/delay.h> char t1, t2, t3, t4, t5, t6; int t; char d; void write_cmd(char val) _delay_ms(5); PORTA=val; _delay_ms(5); PORTD=0xCB; PORTD=0x8B; void disp_writech(char val) _delay_ms(5); PORTA=val; PORTD=0xEB; PORTD=0x8B; void disp_clear() write_cmd(0x01); //clear display write_cmd(0x38); //function set void disp_init() disp_clear(); _delay_ms(5); write_cmd(0x0f); //display on _delay_ms(5); write_cmd(0x06); //entry mode set; void disp_home() write_cmd(0x03); void disp_welcome() DDRA = 0xFF; disp_clear(); disp_writech('w'); disp_writech('e'); disp_writech('l'); disp_writech('c'); disp_writech('o'); disp_writech('m'); disp_writech('e'); disp_writech('!'); write_cmd(0xc0); //Byter rad 14

disp_writech('a'); disp_writech(':'); disp_writech('s'); disp_writech('a'); disp_writech(' '); disp_writech('b'); disp_writech(':'); disp_writech('c'); disp_writech('c'); disp_writech('w'); disp_writech(' '); disp_writech('f'); disp_writech(':'); disp_writech('c'); disp_writech('w'); void disp_alarm() DDRA = 0xFF; disp_clear(); disp_writech('s'); disp_writech('e'); disp_writech('t'); disp_writech(' '); disp_writech('a'); disp_writech('l'); disp_writech('a'); disp_writech('r'); disp_writech('m'); disp_writech(':'); write_cmd(0xc0); //Byter rad void disp_time(int hour1, int hour2, int min1, int min2, int s1, int s2) DDRA = 0xFF; t1 = 0x30 + hour1; t2 = 0x30 + hour2; t3 = 0x30 + min1; t4 = 0x30 + min2; t5 = 0x30 + s1; t6 = 0x30 + s2; disp_writech(t1); disp_writech(t2); disp_writech(':'); disp_writech(t3); disp_writech(t4); disp_writech(':'); disp_writech(t5); disp_writech(t6); disp_cursorfirst(); void disp_alarmset() DDRA = 0xFF; disp_clear(); disp_writech('t'); disp_writech('i'); disp_writech('m'); disp_writech('e'); disp_writech('r'); disp_writech(' '); disp_writech('s'); disp_writech('e'); 15

disp_writech('t'); disp_writech('!'); write_cmd(0xc0); //Byter rad void disp_cursorfirst() //Sätter markören på första tecknet på undre raden DDRA = 0xFF; write_cmd(0x02); //Cursor home write_cmd(0xc0); //Byter rad void disp_cursorshift(int i) //Flyttar markören, i = 1 vänster, i = 2 höger DDRA = 0xFF; if(i == 1) write_cmd(0x10); //Markör vänster else if(i == 2) write_cmd(0x14); //Markör höger void disp_motorturning(int i) //Skriver ut att motorn vrids DDRA = 0xFF; disp_clear(); disp_writech('m'); disp_writech('o'); disp_writech('t'); disp_writech('o'); disp_writech('r'); disp_writech('n'); disp_writech(' '); disp_writech('v'); disp_writech('r'); disp_writech('i'); disp_writech('d'); disp_writech('s'); disp_writech(':'); disp_cursorfirst(); if(i == 1) disp_writech('m'); disp_writech('o'); disp_writech('t'); disp_writech('s'); disp_writech('o'); disp_writech('l'); disp_writech('s'); else if(i == 2) disp_writech('m'); disp_writech('e'); disp_writech('d'); disp_writech('s'); disp_writech('o'); disp_writech('l'); disp_writech('s'); void disp_timeup() DDRA = 0xFF; disp_clear(); disp_writech('t'); 16

Källkod motorenheten #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/wdt.h> #define F_CPU 1000000UL #define DD_MISO #define DD_MOSI #define DD_SCK #define DDR_SPI #define ECHO #define CW #define CCW PINB6 PINB5 PINB7 PORTB 0x00 0x01 0x02 int tmp = 1500; //Sätter standardvärde för PWM-puls void SPI_SlaveInit(void) DDR_SPI = (1<<DD_MISO); SPCR = (1<<SPE); char SPI_SlaveReceive(void) while(!(spsr & (1<<SPIF))) ; return SPDR; //return dataregister void turn_motor(int steps) if(steps > tmp) for(int i = tmp; i<steps; i++) _delay_ms(5); OCR1A = ICR1 - i; tmp = steps; else if(steps < tmp) for(int i = tmp; i>steps; i--) _delay_ms(5); OCR1A = ICR1 - i; tmp = steps; void clockwise(void) //Sätt clockpuls till ~2 ms turn_motor(700); 17

int counter_clockwise(void) //Sätt clockpuls till ~1 ms turn_motor(2220); e int main(void) _delay_ms(20); DDRB = (1<<PB5) (0<<PB6) (1<<PB7) (1<<PB4); //MOSI, SCK, SS = input pga slav DDRD = 0xFF; TCCR1A =1<<WGM11 1<<COM1A1 1<<COM1A0; TCCR1B =1<<WGM12 1<<WGM13 1<<CS10; ICR1 = 19999; DDR_SPI = (1<<DD_MISO); SPCR =(1<<SPE) (1<<SPR0); _delay_ms(200); ist while(1) char bit; bit = SPI_SlaveReceive(); switch(bit) case 0x01: clockwise(); break; case 0x02: counter_clockwise(); break; case 0x03: //ser till så att servon inte vrider sig åt samma håll som s if(tmp==2220) clockwise(); break; else if (tmp==700) counter_clockwise(); break; else clockwise(); break; 18

Kopplingschema Motorenhet.sch-1 - Mon May 21 11:44:19 2012 Kopplingsschema över motorenheten. Schema.sch-1 - Mon May 21 11:41:46 2012 Kopplingsschema över kontrollenheten. 19