Технический форум по робототехнике.
maktep » 14 апр 2007, 19:21
Опять же, почему используете ссопы мне не ясно.
Я использую простую схему ИК светодиод- ИК фотодиод.
Зажигаю ИК светодиод, меряю напр на фотодиоде, выключаю и снова меряю. Если изменения нет, значит и препятствий нет.
Чем больше изменение напр на фотодиоде во время вкл-выкл, тем ближе препятствие. Необходимости в ссоп ваших невижу никакой.
maktep » 14 апр 2007, 19:44
Вот примерный код
Светодиод подсоединен на ножку 0 порта А.
Фотодиод подсоединен на ножку 1 порта А. Через резистор притянут к +5В. Анод его - на землю. Резистор к примеру 100к. Зависит от фотодиода.
Подбираю экспериментально.
- Код: Выделить всё • Развернуть
int level(){
int prev_adc,adc;
PORTA &= ~0x01; //выключаем светодиод, если был вкл.
prev_adc = read_adc(1);
PORTA |= 1; //ключаем светодиод
adc=read_adc(1);
PORTA &= ~0x01; //выключаем светодиод, чтоб не ел энергию.
if (adc>prev_adc) return (adc-prev_adc);
return (prev_adc-adc);
};
Последний раз редактировалось
maktep 14 апр 2007, 20:12, всего редактировалось 1 раз.
maktep » 14 апр 2007, 19:56
Схема включения:
- Вложения
-

avr123.nm.ru » 14 апр 2007, 20:09
Стабильность сомнительна так как АЦП может при неизменном напряжении на входе давать разный результат.
Наверно в 8-ми битном режиме АЦП эта схема будет лучше работать.
maktep » 14 апр 2007, 20:10
По результатам опыта шум ацп порядка 6-7 делений АЦП. А реальный сигнал при подносе руки на уровне 100 единиц АЦП.
Myp » 14 апр 2007, 20:23
ну прально
вторую лампочку в комнате включил и уже фотодиод чёто принимает....
он вобще всегда чтото принимает, только в полной темноте тока нету
[off]и нафига таие картинки гиганские постить
не судьба уменьшать ато в пол экрана пролистывать замучаешься[/off]
Myp » 15 апр 2007, 19:12
maktep писал(а):Схема включения:
а где схема то?
куда потерялась?
MegaBIZON » 15 апр 2007, 20:52
Myp писал(а):maktep писал(а):Схема включения:
а где схема то?
куда потерялась?
Я задел...
Сорри
Опять хотел уже страницу зделать, и того...
Уже исправил

MegaBIZON » 15 апр 2007, 20:53
Myp писал(а):[off]и нафига таие картинки гиганские постить
не судьба уменьшать ато в пол экрана пролистывать замучаешься[/off]
За тем я туда и полез

40inD » 16 апр 2007, 11:20
Самый точный определитель расстояния - УЗ по времени отклика. Лазер не берем.
Myp » 16 апр 2007, 13:33
кстати если вы посмотрите тему где я тсопы мычал то в конце сможете заметить что для поддержки тсопа реально надо 7-8 строк кода
самая трудность это первый раз въехать как он работает
а дальше сплошное удовольствие=)
Виталий » 16 апр 2007, 15:44
В любом случае необходимо ставить фильтр на фотодиод и модулятор на светодиод... иначе огромное количество ошибок, ложных срабатываний, в результате чего робот начинает беситься "по непонятным причинам".
maktep » 16 апр 2007, 16:40
Фильтр - да. Нужен в любом случае.
Этот - конкретизированный. Работает на 2 уровня, задаваемые заранее.
Уровень сигнала него - выдает единичку.
Уровень сигнала ниже него - выдает 0.
Это есть фильтр на 4 импульса (4 измерения АЦП).
Если все 4 подряд значения АЦП равносильны состоянию 1, то состояние переходит в 1.
Если 4 подряд состояния - ноль, то состояние переходит в ноль.
Все, что промежуточное - не изменяет состояния.
Переделывайте, как хотите.
Фильтр писал прямо сейчас, и не проверял - поэтому могут быть небольшие ошибки.
Суть фильтра уже выложил. И Цифра вообще может эффективно заменять аналоговые фильтры.
- Код: Выделить всё • Развернуть
int levels=0;
// 4 значения АЦП идут на фильтр
#define mask 0x0f
//уровень перехода в состояние 1 из нуля
#define level_1 50
//уровень перехода в состояние 0 их 1
#define level_0 45
//они спецально выбраны так, чтобы не было "дерганья" туда и обратно. можно сделать совпадающими
char result_opto;
int filter(){
//смещаем на 1 бит влево для того, чтобы записать новое значение в крайний бит. эта переменная - место где храним значения для обработки.
levels <<= 1;
if (result_opto)
{
//пишем по умолчанию текущее значение оптопары, ибо она
//может попасть в некалиброванный диапазон и
//тогда должна остаться такого же значения.
levels |= 1;
};
if (result_opto)
{
if (level()<=level_0) levels &= ~0x01;
};
if (!result_opto)
{
if (level()>level_1) levels |= 0x01;
};
if (levels&mask==mask)
{
result_opto=1;
};
if (levels&mask==0)
{
result_opto=0;
};
return result_opto;
};
Последний раз редактировалось
maktep 17 апр 2007, 04:45, всего редактировалось 1 раз.
avr123.nm.ru » 16 апр 2007, 18:23
Я советую if писать со скобками {} так как на форуме много начинающих.
Виталий » 16 апр 2007, 18:37
А теперь поднесите ваше устройство к люминисцентной лампе...
Если уж хочется задавать порог, то можно сделать его адаптивным...