DEMO
KOMPONENTER
MEDVERKANDE
KÄLLKOD
KRETSSCHEMA
50:1 Gearmotor HP
50:1
Gearmotor
US Sensor-HC-SR04
Ultrasonic
Sensor HC-SR04
DRV8835 Motor Driver
DRV8835
Motor Driver
Light Sensor AMS302
Light Sensor
AMS302
ATMEGA 1284
ATMEGA 1284
Övrigt
Övrigt
Sara Alvandi
Rapport &
krestkoppling
Nora Lindgren
Design &
krestkoppling
Hampus Anderstedt
Mjukvara
Hemsida
Johannes Kull
Mjukvara
C#
Henrik Berthilsson
3D-Design &
Kretsschema
Lars & Bertil
Handledare

                KOD FÖR ATMEGA:
                /*
                * projektWalle.c
                *
                * Created: 2023-05-17 17:19:41
                * Author : jo6612ku-s
                */
               
               #define F_CPU 8000000UL
               #include 
               #include 
               #include 
               #include 
               #define ECHO 0b00100000
               #define TRIGGER 0b00001000
               
               volatile double distance = 0;
               int i = 0;
               int bugfix = 0;
               int start = 0;
               int truedist = 0;
               volatile int light = 0;
               
               ISR(INT2_vect){ //vad som sker när ECHO ändras
                   if(start == 0)
                   {
                       TCCR1B |= (1 << CS10); //startar timer
                       start = 1;
                   }
                   else if(start == 1)
                   {
                       distance = TCNT1 * pow(10, -6) * 0.125 * 17150; //räknar ut distans i cm
                       TCCR1B = 0x00;
                       //TCCR1B &= ~(1 << CS10);
                       TCNT1 = 0;
                       start = 0;
                       _delay_ms(50);
                   }
                   
               }
               
               void trigger(){ //skickar en signal på trigger pinnen som varar i 15 mikrosekunder
                   PORTD = 0b00001000;
                   _delay_us(15);
                   PORTD = 0x00;
                 
               }
               
               void m_init(){ //motorerna
                   DDRB = 0x00;
                   PORTA = 0x00;
                   PORTB = 0x00;
                   DDRB = 0b11011000;
                   //PWM pin PINB3
                   TCCR3A |= (1 << WGM32) | (1 << WGM30);
                   TCCR3B |= (1 << CS32) | (0 << CS31) | (1 << CS30);
                   OCR3A = 30;
                   //
                   TCCR0A |= (1 << WGM00) | (1 << WGM01);
                   TCCR0B |= (1 << CS02) | (0 << CS01) | (1 << CS00);
                   OCR0B = 30;
               }
               
               void u_init(){ //ultraljud sensorn
                   DDRD = 0xff;
                   DDRB &= ~(1 << ECHO);
                   PORTD |= 0x00;
                   EIMSK |= (1 << INT2);
                   EICRA |= (1 << ISC20);
                   TCNT1 = 0;
                   sei();
               }
               
               void adc_init(){ //A/D omvandling
                   ADMUX = 0;
                   ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0);
                   ADMUX |= (1 << REFS0) | (0 << MUX0);
                   ADCSRB = 0x00;
                   ADCSRA |= (1 << ADEN);
               }
               
               int main(void)
               {
                   m_init();
                   u_init();
                   adc_init();
                   int foundlight = 0;
                   int searching = 0;
                   int motor = 0;
                   int STOP = 0;
                   while (1)
                   {
                       ADCSRA |= (1 << ADSC);
                       light = ADC;
                       trigger();
                       
                        if(distance <= 20 && distance > 0){ //kollar ifall ett objekt är nära
                            if(motor == 1){
                                TCCR3A &= ~(1 << COM3A1);
                            }
                            else{
                                TCCR0A &= ~(1 << COM0B1);
                            }
                           STOP = 1;
                        }
                        else{
                            STOP = 0;
                            if(motor == 1){
                                TCCR3A |= (1 << COM3A1);
                            }
                            else{
                                TCCR0A |= (1 << COM0B1);
                            }
                        }
                       if(light < 300 && foundlight == 0){ //motorerna ska vara avstängda från början
                           TCCR3A &= ~(1 << COM3A1);
                           TCCR0A &= ~(1 << COM0B1);
                       }
                       
                       if(light > 300 && foundlight == 0 && STOP == 0){ //hittar den ljus ska den starta ena motorn
                           foundlight = 1;
                           motor = 1;
                           TCCR3A |= (1 << COM3A1);
                       }
                       if(light > 300 && STOP == 0){
                           searching = 0;
                       }
                       if(foundlight == 1 && light < 300 && searching == 0 && STOP == 0){ //byt motor ifall ljuset minskat
                           searching = 1;
                           motor *= -1;
                           TCCR3A ^= (1 << COM3A1);
                           TCCR0A ^= (1 << COM0B1);
                       }
                       _delay_ms(250);
                       
                   }
               }
                       
Rapport Image