USARE UN SENSORE DI PROSSIMITÀ AD INFRAROSSI
Il GP2D12 è un sensore di prossimità ad infrarossi di tipo analogico utilizzato tipicamente per il rilevamento di ostacoli. Il sensore è costituito da un LED ad infrarossi la cui luce (invisibile all’occhio umano) viene riflessa dagli ostacoli e captata da un fotodiodo contenuto nel sensore stesso. La tensione di uscita del fotodiodo è proporzionale alla quantità di luce infrarossa captata quindi sarà tanto maggiore quanto più il sensore si trova vicino all’ostacolo. La tensione analogica in uscita dal sensore può essere inviata all’ingresso analogico di un PIC16F877 che lo converte in un valore numerico che può essere utilizzato dal microcontrollore per determinare la vicinanza dell’ostacolo. Il sensore viene connesso alla porta RA0 del micro ed alimentato a 5V. Il listato 1 riporta un frammento del sorgente C per la gestione del sensore, mentre la figura 1 mostra la risposta del GP2D12 in funzione della distanza dall’ostacolo.
uint8_t distance = 0xff; void init_pins(void) { /* Set up the various pins in/out */ set_tris_a(0b00100000); /* Pin A5 is input. Rest is not used. */ set_tris_b(0b00000000); /* Port B is not used. */ set_tris_c(0b10000000); /* C6 is output. C7 is input. Rest is not used. */ set_tris_d(0b00000000); /* Port D is not used. */ set_tris_e(0b00000000); /* Port E is not used. */ } /* init_pins */ void init(void) { init_pins(); } /* init */ void main(void) { char c; init(); printf(“ADC Demo\r\n\r\n”); for ( ; ; ) printf(“press key to get ADC value: “); for ( ; ; ) { if (kbhit()) break; c = getc(); printf(“\r\n”); monitor_ir_distance_sensor(); display_ir_distance(); } } } void display_ir_distance(void) { printf(“distance = %u cm\r\n”, distance); } /* IR sensor implementation * get_ir_distance * Determine distance in cm based in the * A/D value and the calibration table. * Parameters: * ir_reading (IN) - A/D value for the IR * sensor */ uint8_t get_ir_distance(uint8_t ir_reading) { int i; for (i = 0; i < NUM_IR_CALIB_DATA; i++) { if (ir_calib_data[i] < ir_reading) { return IR_DISTANCE_BASE + i * IR_DISTANCE_STEP; } } return IR_DISTANCE_BASE + (i - 1) * IR_DISTANCE_STEP; } void monitor_ir_distance_sensor(void) { uint16_t value; setup_adc_ports(A_ANALOG); setup_adc(ADC_CLOCK_DIV_8); set_adc_channel(DISTANCE_ANCH); delay_us(ADC_DELAY); value = Read_ADC(); setup_adc(ADC_OFF); value >>= 2; distance = get_ir_distance(value); }

Potrebbe essere utile per lo sviluppo di progetti tipo http://it.emcelettronica.com/progetto-di-un-pulsiossimetro-con-dspic dove la tecnologia infrarossa ne fa da padrone.