Zdeněk Krejčí

Zdeněk Krejčí

Stránky na téma programování v C++
Tento program byl původně napsán, pro detekování překážek a měření vzálenosti k nim, pomocí Infračervených LED. Měl být součástí soutěže
INTERNACIONAL ROBOTIC CHALLENGE in Austria(ve Vídni) daný robot se jmenoval LINE FOLOWER(následovač čáry) a mým úkolem bylo naprogramovat oči robota, tedy infračervené senzory usazené na servu takže by fungovali podobně jako radar. Tento radar měl detekovat překážky a posílat o nich data, tedy hlavně zvdálenost...
Nic méně soutěž sice nedopadla díky neschopnému týmu se domluvit ale aspon to přineslo zase o trochu více skušeností v programování...
/*
 * main.c
 *
 *  Created on: 30 Jan 2010
 *      Author: Zdenek Krejci
 */

#include
//*********************
//#define F_CPU 7372800UL
//*********************
//#include
#include
/******************** BAUD PRESCALE *********************/
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
/************************ SERVO *************************/
#define servo_left        1    //marginal time-line of left possition
#define servo_middle     2    //marginal time-line of middle possition
#define servo_right     3    //marginal time-line of right possition
/*********************OTHER VALUES **********************/
#define start_distance         6        //the distance where the sensor starts detecting
#define return_back_value     1         //the return value expecting from USART to turn servo back to middle possition
//#define confirm_value         254        //confirms that uart have got the return value
typedef unsigned int uint8;
/*******************USART*******************************/
//Get char from USART but wait till UDR is empty
unsigned char uart_getc_wait( void )
{
    while ( !(UCSRA & (1<
    return UDR;
}
//Get char if the UDR is empty or continue if its NOT
unsigned char uart_getc( void )
{
    uint8 c = 0;
    if ( (UCSRA & (1<    else{c = 0;}
return c;
}
//Wait untill the UDR is empty and send char
void uart_putc(uint8 data )
{
    while ( !( UCSRA & (1<
    UDR = data;
}
/********************SERVO********************/
void turn(uint8 direction){
    uint8 waiting1 =0;

    uint8 i =0;
    //switch to assign a value by direction
    switch(direction){
    case 1:
        waiting1 = 150;
        break;
    case 2:
        waiting1 = 400;
        break;
    case 3:
        waiting1 = 600;
        break;
    default:
        waiting1 = 150;
        break;
    }
    //the actual servo turning procedure instead including delay which taking too large space on memory
    for(i = 0; i < 40; i++){//repeat 40 times
        uint8 i = 0;
        for(i = 0; i
        for(i = 0; i  <  8000; i++){PORTC = 0x00;}     //leave first pin on L for selected number of cycles
    }

}
/********************GET CM ********************/
uint8 putc_in_cm(uint8 num){
    uint8 cm = 0;
    if(!(num < 168) && !(num >=171)){cm = 10; }
    if(!(num < 155) && !(num >=167)){cm =  9; }
    if(!(num < 146) && !(num >=154)){cm =  8; }
    if(!(num < 129) && !(num >=145)){cm =  7; }
    if(!(num < 109) && !(num >=128)){cm =  6; }
    if(!(num <  80) && !(num >=108)){cm =  5; }
    if(!(num <  53) && !(num >= 79)){cm =  4; }
    if(!(num <  41) && !(num >= 52)){cm =  3; }
    if(num > 172){cm = 11;}//Just ever
    if(num <  42){cm =  1;}//Just ever
    /*
     switch(num){case 169:cm = 10;break;case 161:cm = 9;break;
     case 145:cm =8;break;case 132:cm = 7;break;case 114:cm = 6;break;
     case 91:cm = 5;break;case 63:cm = 4;break;case 49:cm = 3;break;
     default:cm = 0;break;
     }
     */
     return cm;
}
/********************ADC*********************/
uint8 read_adc(void){
    ADCSRA |= 0x10;
    while ((ADCSRA & 0x10)== 0);
    ADCSRA |= 0x10;
    float irational;
    uint8 ad_value = ADCW;
    //Convert AD value to 255s range
    irational =  5.03 / 2045;
    irational = (float) irational * ad_value;
    ad_value =  (float) irational * 100;
    //invert the AD value
    uint8 inverted_value =0;
    inverted_value = 255-ad_value;
    uint8 cm =0;
    cm = putc_in_cm(inverted_value);
    return cm;
}
/******************* OBSTACLE DEFINITION *******************/
uint8 obstacle(){
uint8 distance =0;
uint8 i = 0;
uint8 pass = 0;

    //reading the ADC 100 times to omit from random values
    for(i = 0;i<=100;i++){
        distance = read_adc();
        if((distance <= start_distance)){
            pass++;
        }else{pass=0;}
    }
    if((pass == i)){//&&!(distance > (start_distance+30))
        pass = 0;
        return 1;
    }else{return 0;}
}
/******************* REGISTER INIT *******************/
void init(void){
//port init
PORTC = 0x00;
DDRC  = 0xFF;

//uart init
UCSRA = 0x00;    //0x02; double speed
UCSRB |= (1 << RXEN ) | (1 << TXEN );
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
UBRRH = 0x00;
UBRRL = 0x30;
//AD converter init
ADMUX  |= (1<<
ADCSRA |= (1<<
ADCSRA |= (1<
//ADCSRA |= (1<<<
ACSR = 0x80;
SFIOR = 0x00;    // For High speed mode set pin 4

}
/******************* MAIN *******************/

int main(void)
{
//Init the UART ,ADC ,PORT
init();
//Basic possition
turn(servo_middle);

//keep checking obstacle
while(1){

    if (obstacle()){
        //turn servo right
        turn(servo_right);

        uint8 uart_return_check = 0;

        //keep sending distane value in while
        while(return_back_value != uart_return_check){
            //check for return value
            uart_return_check = uart_getc();
            //send distance value
            uart_putc(read_adc());
        }

        //turn servo back to middle
        turn(servo_middle);

    }
}


return 0;

}//end of main


Name
Email
Comment
Or visit this link or this one