Общение

russian-robots@conference.jabber.ru - Чат, в котором можно поболтать об электронике, создании роботов и программировании.
Как мне зайти в чат?

 Обсуждение

Не стесняйтесь оставлять комментарии, мне интересно и важно ваше мнение!
  • Wadimka: Подскажу где взять недорого строчники, идете/едите в любую контору которая ...
  • Vladimir: Об этом датчике я тоже знаю, хотелось с чегото начать изучать МК, а не слеп ...
  • Vladimir: Спсиба
  • Евгений: Стоит поставить инфракрасный датчик движения и не городить ничего :) Литера ...
  • Vladimir: Добрый день Евгений. Это мне для дома в кладовку. При входе на двери стоит ...
  • Евгений: Фотобарьер? По подробнее расскажите.
  • Vladimir: Добрый день. Прошу вас помочь в реализации пректа фотобарер на Tiny45, со с ...
  • Евгений: С таким кодом даже http://caxapa.ru/codebook/?search=BLSH ничего не находит ...
  • Инфракрасный дальномер 0…~15 см

    7th Октябрь 2010 | Метки: , ,

    Недавно заинтересовался роботами для Micromouse соревнований и начал собирать такого робота. Почитав англоязычные сайты понял что понадобится компактный дальномер, способный измерять расстояние от 1 до 10-15 см. Решено было делать такой дальномер на фототранзисторе и TSAL6100 – это такой мощный инфракрасный светодиод.

    Как это работает

    Расстояние до отражающего объекта (в моем случае стена лабиринта) измеряется по следующему алгоритму:

    1. Измеряем уровень фоновой засветки фототранзистора, заносим результат в массив:                                         adc_data[0]=read_adc(6);
    2. Включаем ИК светодиод, измеряем уровень засветки фототранзистора, заносим результат в массив:     adc_data[1]=read_adc(6);
    3. Выключаем ИК светодиод
    4. Подсчитываем разницу между измерениями: result = data[1]-data[0];

    Благодаря такому алгоритму фоновая засветка (освещение в помещении) дальномеру почти не страшна (слабо влияет на результат измерения).

    Схема

    Дальномер можно подключить к любому каналу АЦП. Чтобы измерить расстояние, например,  дальномером, который подключен к каналу АЦП №3 нужно передать в функцию distance(); номер канала этого канала.

    unsigned char result;
    result = distance(3);  //в переменной result будет находиться результат измерения

    Конструкция дальномера

    Для  того, чтобы фототранзисторы не подвергались засветки сбоку я надел на них черную термоусадочную трубку.

    Программа

    /*
    Author: Eugene
    Website: http://cdxp.zx6.ru/
    Compiler: Code Vision AVR
    XTAL: 7.3728 MHz
    */
    #include <mega32.h>
    #include <stdio.h>
    #include <delay.h>
     
    #define IR PORTB.3
    #define ADC_VREF_TYPE 0xE0
     
    unsigned char read_adc(unsigned char adc_input)
    {
     ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
     // Delay needed for the stabilization of the ADC input voltage
     delay_us(10);
     // Start the AD conversion
     ADCSRA|=0x40;
     // Wait for the AD conversion to complete
     while ((ADCSRA & 0x10)==0);
     ADCSRA|=0x10;
     return ADCH;
    }
     
    unsigned char distance(unsigned char ch)
    {
     unsigned char adc_data[2];
     adc_data[0]=read_adc(ch);
     IR=1;
     delay_ms(10);
     adc_data[1]=read_adc(ch);
     IR=0;
     if(adc_data[1]>adc_data[0]) //если при включенном IR светодиоде уровень освещенности фототранзистора меньше, то возвращаем 0
     return (adc_data[1]-adc_data[0]);
     else
     return 0;
    }
     
    void main(void)
    {
    DDRB.3=1;
    PORTB.3=0;
     
    DDRD.2=0; //конфигурируем PORTD2 как вход т.к. к этому порту подключена кнопка
    PORTD.2=1;
     
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: Off
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 115200
    UCSRA=0x00;
    UCSRB=0x08;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x03;
     
    ACSR=0x80;
    SFIOR=0x00;
     
    // ADC initialization
    // ADC Clock frequency: 921,600 kHz
    // ADC Voltage Reference: AREF pin
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x83;    
     
     while(1)
     {
     if(!PIND.2)
     {
     delay_us(500);
     putchar(distance(6)); //6 - номер канала АЦП к которому подключен фототранзистор
     while(!PIND.2);
     }
     }
    }

    Для того чтобы проверить как работает дальномер я соединил UART микроконтроллера с компьютером при помощи FT232RL. При нажатии на кнопку происходит рассчет расстояния до отражающего объекта, и результат отправляется в UART.

    После 14 измерений я составил график зависимости значения функции distance();  от расстояния от дальномера до отражающего объекта, вот что получилось:


    По оси X расстояние в сантиметрах

    По оси Y  значение функции distance();

    На этом все, удачи :D

    Понравилась статья? Нажмите на любую из кнопок:

    0
    1. 3rd Апрель 2012 в 14:26

      Надо конечно проверять, но мне кажется большое влияние на измерения будет давать такой параметр как цвет и, возможно, текстура обьекта (припятствия).
      Допустим черная стена в освещенном комнате будет по яркости (фоновая засветка) такаяже как и белая стена в плохо освещенной комнате. А когда мы дадим ИК засветку (для измерения растояния) в случаи с черной стеной разница между фоновой засветкой и отраженным светом от ИК светодиода будет достаточно мала, а в случам с белой стеной явно значительно больше.
      Вот и выходит что результаты измерения могут плавать в разы.

      Thumb up 0 Thumb down 0

      [Ответить]

      Евгений Reply:

      Такой дальномер как раз и используется только там, где надо измерять расстояние до белой стены.

      [Ответить]

    :D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: