Automatic self parking smart car
Block Diagram
Circuit Diagram
Main.h
#ifndef MAIN_H | |
#define MAIN_H | |
#include "includes.h" | |
#define PARKING_DEPTH 0.16 /* in Meters */ | |
#define ITERATIONS 250 | |
#define PARKING_DISTANCE 40 /* in Centimeters */ | |
struct App { | |
volatile char AutoPark :1; | |
volatile char Moni :1; | |
volatile char Door :1; | |
volatile char Alco :1; | |
volatile char DispDoor :1; | |
volatile char DispAlco :1; | |
volatile char Back :1; | |
volatile char Front :1; | |
volatile char Obstacle :1; | |
volatile char FrontObstacle :1; | |
volatile char Parked :1; | |
}; | |
//DEFINE FUNCTION PROTOTYPE | |
static void Init (void); | |
static void inittest (void); | |
static void DispTitle (void); | |
static void CheckAlco (void); | |
static void ChkDoor (void); | |
static void EXTINTinit (void); | |
static void Tmr2Init (void); | |
static int8u AutoPark (void); | |
static void ParkVehicle (void); | |
static void Unpark (void); | |
#endif |
#ifndef _APP_H | |
#define _APP_H | |
/************* LCD CONFIGURATION ****************/ | |
#define LCD_DDR DDRC | |
#define LCD_DATA_PORT PORTC | |
#define LCD_ENABLE_PIN PC3 | |
#define LCD_REGISTER_SELECT_PIN PC2 | |
#define DISPLAY_INIT 1 | |
#define LCD_NSCRL 1 | |
#define FLOAT_T0_STRING 1 | |
#define DECIMAL_PRECISION 100 | |
/******** LCD CONFIGURATION ENDS ****************/ | |
/******** BUZZER: CONFIGURATION ****************/ | |
#define BUZ_DDR DDRC | |
#define BUZ_PORT PORTC | |
#define BUZ_PIN PC1 | |
#define OFF_TIME 100 | |
/******** BUZZER CONFIGURATION ENDS ************/ | |
/********* LED: CONFIGURATION ******************/ | |
#define LED_DDR DDRC | |
#define LED_PORT PORTC | |
#define LED_PIN PC0 | |
#define OFF_TIME 100 | |
/******** LED CONFIGURATION ENDS *************/ | |
/******** MOTOR CONFIGURATION *************/ | |
#define MOT_PORT PORTA | |
#define MOT_DDR DDRA | |
#define M1_AN PA3 | |
#define M1_CA PA4 | |
#define M2_AN PA5 | |
#define M2_CA PA6 | |
/******** MOTOR CONFIGURATION ENDS *********/ | |
/***** SERVO MOTOR CONFIGURATION *********/ | |
#define SERVO_DDR DDRD | |
#define SERVO_PORT PORTD | |
#define SERVO1 PD5 | |
/***** SERVO MOTOR CONFIGURATION END *****/ | |
/******* ALCOHOL SENSOR CONFIG *********/ | |
#define ALSENS_DDR DDRD | |
#define ALSENS_PORT PORTD | |
#define ALSENS_PPIN PIND | |
#define ALSENS_PIN PD2 | |
/************************************/ | |
/******* DOOR SENSOR CONFIG *********/ | |
#define DOOR_SENS_PORT PORTD | |
#define DOOR_SENS_DDR DDRD | |
#define DOOR_SENS_PPIN PIND | |
#define DOOR_SENS_PIN PD7 | |
/************************************/ | |
/******* ULTRASONIC SENSOR PIN DEFINITION *******/ | |
#define ULTSEN_DDR DDRA | |
#define ULTSEN_PORT PORTA | |
#define ULTSEN_PIN PINA | |
#define TRIG_PIN PA1 | |
#define ECHO_PIN PA0 | |
/*****************************************/ | |
/******* IR SENSOR PIN DEFINITION ******/ | |
#define IR_SENS_DDR DDRD | |
#define IR_SENS_PORT PORTD | |
#define IR_SENS_PPIN PIND | |
#define IR_SENS1_PIN PD4 | |
#define IR_SENS2_PIN PD6 | |
#define IR_SENSORS_2 | |
/**************************************/ | |
/*********** EXTERNAL INTERRUPT PINS *************/ | |
#define INTDDR DDRD | |
#define INTPORT PORTD | |
#define INTPIN PIND | |
#define INT1_PIN PD3 | |
/**********************************************/ | |
#endif |
Code
#include"main.h" | |
static struct App Flags; | |
int main(void) { | |
Init(); | |
while (TRUE) { | |
if (Flags.Moni) { | |
CheckAlco(); | |
ChkDoor(); | |
MeasDist(0xcc); | |
Flags.Moni = FALSE; | |
} | |
if (Flags.AutoPark) { | |
beep(1,150); | |
if (Flags.Parked) | |
Unpark(); | |
else | |
AutoPark(); | |
Flags.AutoPark = FALSE; | |
} | |
sleep_cpu(); | |
} | |
return 0; | |
} | |
static void Init(void) { | |
buzinit(); | |
ledinit(); | |
beep(2,100); | |
lcdinit(); | |
IRSensInit(); | |
AlcoSensInit(); | |
DoorSensInit(); | |
MotInit(); | |
servoinit(); | |
ultinit(); | |
Tmr2Init(); | |
EXTINTinit(); | |
inittest(); | |
DispTitle(); | |
sei(); | |
sleep_enable(); | |
sleep_cpu(); | |
} | |
static void DispTitle(void) { | |
lcdclr(); | |
lcdws("Auto Parking Veh"); | |
lcdr2(); | |
lcdws("Distance:"); | |
} | |
static int8u AutoPark(void){ | |
int8u ParkDist = 0; | |
int16u Count = 0; | |
Flags.Parked = FALSE; | |
lcdclrr(1); | |
lcdws("Find'g Par Space"); | |
Front(); | |
lcdclrr(0); | |
while (++Count < ITERATIONS) { | |
if (MeasDist(0x80) > PARKING_DEPTH) { | |
if(++ParkDist > PARKING_DISTANCE) { | |
ParkVehicle(); | |
Flags.Parked = TRUE; | |
return 1; | |
} | |
dlyms(100); | |
} else | |
ParkDist = 0; | |
lcdwint(0x88, ParkDist); | |
lcdwint(0x8c,Count); | |
} | |
lcdclrr(1); | |
lcdws("No Parking Dist"); | |
MotStop(); | |
beep(3,150); | |
dlyms(1000); | |
DispTitle(); | |
} | |
static void ParkVehicle(void) { | |
int8u i; | |
lcdclr(); | |
lcdws(" Distance Found"); | |
beep(2,150); | |
Front(); | |
dlyms(4000); | |
MotStop(); | |
lcdr2(); | |
lcdws(" Parking."); | |
Flags.Back = TRUE; | |
Strt2Left(); | |
Back(); | |
i = 0; | |
while (i < 100) { | |
if (!Flags.Obstacle) { | |
Back(); | |
i++; | |
} else | |
MotStop(); | |
dlyms(55); | |
} | |
Left2Strt(); | |
Strt2Right(); | |
i = 0; | |
while (i < 100) { | |
if (!Flags.Obstacle) { | |
Back(); | |
i++; | |
} else | |
MotStop(); | |
dlyms(55); | |
} | |
MotStop(); | |
Right2Strt(); | |
Mot1Aclk(); | |
dlyms(750); | |
MotStop(); | |
lcdclr(); | |
lcdws("*****Parked*****"); | |
Flags.Back = FALSE; | |
beep(3,150); | |
dlyms(2000); | |
DispTitle(); | |
} | |
static void Unpark(void) { | |
int8u i; | |
lcdclr(); | |
lcdws(" Unparking"); | |
Back(); | |
dlyms(750); | |
MotStop(); | |
Strt2Right(); | |
Flags.Front = TRUE; | |
i = 0; | |
while (i < 100) { | |
if (!Flags.FrontObstacle) { | |
Front(); | |
i++; | |
} else | |
MotStop(); | |
dlyms(47); | |
} | |
Right2Strt(); | |
Strt2Left(); | |
i = 0; | |
while (i < 100) { | |
if (!Flags.FrontObstacle) { | |
Front(); | |
i++; | |
} else | |
MotStop(); | |
dlyms(40); | |
} | |
Left2Strt(); | |
dlyms(2000); | |
MotStop(); | |
lcdclr(); | |
lcdws("****UNPARKED****"); | |
Flags.Parked = FALSE; | |
Flags.Front = FALSE; | |
beep(3,150); | |
dlyms(2000); | |
DispTitle(); | |
} | |
static void inittest(void) { | |
lcdclr(); | |
lcdws("Chk Alcol:"); | |
if (ReadAlco()) { | |
lcdws(" NOT OK"); | |
while (ReadAlco()) { | |
beep(1,100); | |
dlyms(2000); | |
} | |
} else { | |
lcdws(" OK"); | |
dlyms(1000); | |
} | |
lcdclr(); | |
lcdws("Chk Doors:"); | |
if (DoorRead()) { | |
lcdws(" NOT OK"); | |
while (DoorRead()) { | |
beep(1,100); | |
dlyms(2000); | |
} | |
} else { | |
lcdws(" OK"); | |
dlyms(1000); | |
} | |
} | |
static void Tmr2Init(void) { | |
TCNT2 = 0; | |
TIMSK |= _BV(TOIE2); /* ENABLE OVERFLOW INTERRUPT */ | |
TCCR2 |= _BV(CS22) | _BV(CS21) | _BV(CS20); /* PRESCALAR BY 1024 */ | |
} | |
/* overflows at every 32msec */ | |
ISR(TIMER2_OVF_vect) { | |
static int8u i, j, k, l; | |
TCNT2 = 0; | |
if (++i >= 156) i = 0; | |
switch(i) { | |
case 0: case 6: ledon(); break; | |
case 3: case 9: ledoff(); break; | |
} | |
if (!Flags.Moni && ++j >= 31) { | |
Flags.Moni = TRUE; | |
j = 0; | |
} | |
if (Flags.Alco || Flags.Door) { | |
if (++k >= 94) | |
k = 0; | |
switch (k) { | |
case 0: case 6: buzon(); break; | |
case 3: case 9: buzoff(); break; | |
} | |
} | |
if (Flags.Back) { | |
if (BackIRRead()) | |
Flags.Obstacle = TRUE; | |
else | |
Flags.Obstacle = FALSE; | |
if (++l >= 31) | |
l = 0; | |
switch (l) { | |
case 0: case 6: buzon(); break; | |
case 3: case 9: buzoff(); break; | |
} | |
} | |
if (Flags.Front) { | |
if (FrntIRRead()) | |
Flags.FrontObstacle = TRUE; | |
else | |
Flags.FrontObstacle = FALSE; | |
} | |
} | |
static void EXTINTinit(void) { | |
INTDDR &= ~_BV(INT1_PIN); | |
INTPORT |= _BV(INT1_PIN); | |
GICR |= _BV(INT1); //ENABLE EXTERNAL INTERRUPT | |
MCUCR |= _BV(ISC11); //FALLING EDGE INTERRUPT | |
} | |
ISR(INT1_vect) { | |
Flags.AutoPark = TRUE; | |
GICR |= _BV(INT1); | |
} | |
static void CheckAlco(void) { | |
if (ReadAlco()) { | |
if (!Flags.DispAlco) { | |
Flags.DispAlco = TRUE; | |
lcdclrr(1); | |
lcdws("Alcohol Consumed"); | |
Flags.Alco = TRUE; | |
} | |
}else { | |
if (Flags.DispAlco) { | |
Flags.Alco = FALSE; | |
Flags.DispAlco = FALSE; | |
buzoff(); | |
DispTitle(); | |
} | |
} | |
} | |
static void ChkDoor(void) { | |
if (DoorRead()) { | |
if (!Flags.DispDoor) { | |
Flags.DispDoor = TRUE; | |
lcdclrr(1); | |
lcdws("Door Opened"); | |
Flags.Door = TRUE; | |
} | |
}else { | |
if (Flags.DispDoor) { | |
Flags.Door = FALSE; | |
Flags.DispDoor = FALSE; | |
buzoff(); | |
DispTitle(); | |
} | |
} | |
} |
Comments
Post a Comment