Прицепил светодиод - прикольно получилось.
Если использовать один цифровой выход, то можно мерить освещенность
(например детектировать линию) в огромном динамическом диапазоне.
Способ:
1. Включаем светодиод анодом на землю, катодом к ноге проца.
2. Настраиваем ногу на выход и подаем единицу в течении короткого времени
(я делал 1 микросекунду)
3. Настраиваем ногу на вход (без подтяжки) и считаем время, за которое
на ноге окажется ноль. У меня это время колебалось от 1 миллисекунды
(на свету) до сотен миллисекунд (в темноте)
Фишки:
1. Можно анод повесить на другую ногу проца, тогда в промежутках между измерениями
"датчиком" можно светить (токоограничительный резистор не забудьте).
Например два таких "датчика", работая поочередно, могут обеспечивать друг-другу подсветку.
Да и вообще красиво
![Smile :)](http://roboforum.ru/images/smilies/smile.gif)
2. Датчик выдает цифру, а не бит - можно программно подстраивать пороги,
реализовать ПИД и т.д.
3. Дешево и резистор не нужен (если не светить)
![Smile :)](http://roboforum.ru/images/smilies/smile.gif)
Для тестов использовал Атмегу88 и безымянный красный светодиод.
Добавлено спустя 36 минут 53 секунды:
Добавлено спустя 6 минут 50 секунд:
- Код: Выделить всё • Развернуть
#include <avr/io.h>
#include "delay.h"
main()
{
unsigned char c;
DDRB = 0x04; // Indicator LED output
while(1)
{
c=0;
PORTC = 0x02; // Turn the sensor LED on for a while
DDRC = 0x0A;
wait_1ms(5);
PORTC = 0x08; // Charge sensor 1 us
DDRC = 0x0A;
wait_1us(1);
DDRC = 0x02; // Start discharge
PORTC = 0x00;
while(PINC&0x08)
{
wait_1us(250);
if(c<255) c++; // Count discharge time
}
if (c<128) PORTB = 0x04; // Threshold = 128
else PORTB = 0x00;
}
}
Тут светодиод был подключен анодом к ноге С1, катодом - к С3.
Последовательно со светодиодом был включен резистор 200 Ом.
К ноге В2 был подключен индикатор.