Usare un sensore di prossimità ad infrarossi

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.

Figura 1. Risposta del sensore in funzione della distanza dall’ostacolo

Figura 1. Risposta del sensore 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);
}

Una risposta

  1. Maurizio Di Paolo Emilio Maurizio 30 maggio 2016

Scrivi un commento