0. Начало
1. Цифровой ввод — кнопка
2. Аналоговый вывод — Fading
3. Аналоговый ввод – потенциометр
4. Аналоговый ввод – осциллограф
5. Генерация звука – пьезоизлучатель
6. Фоторезистор
7. Сенсор на светодиоде
Мы уже умеем определять уровень освещённости с помощью фоторезистора, но, оказывается, в этом нам может помочь и наш старый знакомый — светодиод.
Идея по двойному использованию светодиода такова:
если приложить к светодиоду обратное напряжение,
т.е. к катоду подключить – плюс (HIGH), а к аноду – минус (LOW))
на принципиальной схеме: pin 2 -> 1, а pin 3 -> 0
то тем самым мы зарядим собственную паразитную емкость ножек микроконтроллера и светодиода.
Чтобы не путаться с катодом и анодом у светодиода – нужно просто запомнить, что у светодиода ножка катода расположена со стороны плоского спила корпуса (так же ножка катода – короче)
Схема включения:
Если теперь переключить pin 2 на вход и отключить внутренний подтягивающий резистор,
чтобы этого добиться – нужно для порта, сконфигурированного, как ВХОД
командойpinMode(port,INPUT);выполнить команду
digitalWrite(port,LOW); // отключаем подтягивающий резистори наоборот — команда
digitalWrite(port, HIGH); // подключаем подтягивающий резистор— подключит подтягивающий резистор
то паразитная ёмкость будет разряжаться обратным током светодиода, который зависит от его освещенности. Через некоторое время нога переключится в логический 0.
Вот это время разряда, зависящее от освещённости светодиода мы и должны измерить 😉
Паразитная ёмкость, разумеется, мала, но и обратный ток светодиода тоже —
поэтому время разряда можно успешно измерить 🙂
Соберём эту простую схему:
Код скетча:
// // Фотосенсор на светодиоде // // Пример исползования светодиода в качестве фотодатчика // Схема подключения: // // + digital2 // | // < // > 100 ohm resistor // < // | // | // ----- // / \ LED, maybe a 5mm, clear plastic is good // ----- // | // | // + digital3 // // мы будем подавать положительное напряжение на digital2 и // низкое напряжение в digital3. Т.о. на светодиод будет подано обратное напряжение. // Разумеется, светодиод светиться не будет, но будет заряжаться паразитная ёмкость // соединения светодиода и ног микроконтроллера Arduino. // // Потом мы отключаем выход с digital2 и считаем // за какой промежуток времени заряд разрядится через светодиод. // Причём скорость разряда зависит от освещённости светодиода. // Чем ярче свет, тем быстрее паразитная ёмкость будет разряжаться на Digital3. // // Т.о. сразу виден недостаток идеи - в темноте время разряда может быть довольно большим. // // #define LED_N_SIDE 2 #define LED_P_SIDE 3 void setup() { Serial.begin(9600); } void loop() { unsigned int j; // обеспечиваем обратное включение светодиода, заряжая паразитную ёмкость // ног микроконтроллера и светодиода pinMode(LED_N_SIDE,OUTPUT); pinMode(LED_P_SIDE,OUTPUT); digitalWrite(LED_N_SIDE,HIGH); digitalWrite(LED_P_SIDE,LOW); // изолируем pin 2 от светодиода pinMode(LED_N_SIDE,INPUT); digitalWrite(LED_N_SIDE,LOW); // отключаем втроенный в МК подтягивающий резистор // считаем сколько требуется времени на разряд до логического нуля for ( j = 0; j < 100000; j++) { if ( digitalRead(LED_N_SIDE)==0) break; } Serial.println(j, DEC); // Выводим значение счетчика в COM-порт delay(100); // Пауза, чтобы не переполнять буфер COM-порта }
Т.о. получаем данные о времени разряда в виде данных на COM-порт:
Достоинством метода является то, что никто не мешает использовать тот же самый светодиод по своему прямому назначению 🙂
Для этого после строчки
Serial.println(j, DEC);
добавим код:
// а теперь зажгём светодиод :) digitalWrite(LED_P_SIDE,HIGH); digitalWrite(LED_N_SIDE,LOW); pinMode(LED_P_SIDE,OUTPUT); pinMode(LED_N_SIDE,OUTPUT);
так же можно изменить кусок считывая времени разряда на:
j=0; while(digitalRead(LED_N_SIDE)!=0) j++;
Т.о. получим:
#define LED_N_SIDE 2 #define LED_P_SIDE 3 void setup() { Serial.begin(9600); } void loop() { unsigned int j; // обеспечиваем обратное включение светодиода, заряжая паразитную ёмкость // ног микроконтроллера и светодиода pinMode(LED_N_SIDE,OUTPUT); pinMode(LED_P_SIDE,OUTPUT); digitalWrite(LED_N_SIDE,HIGH); digitalWrite(LED_P_SIDE,LOW); // изолируем pin 2 от светодиода pinMode(LED_N_SIDE,INPUT); digitalWrite(LED_N_SIDE,LOW); // отключаем втроенный в МК подтягивающий резистор // считаем сколько требуется времени на разряд до логического нуля j=0; while(digitalRead(LED_N_SIDE)!=0) j++; Serial.println(j, DEC); // Выводим значение счетчика в COM-порт // а теперь зажгём светодиод :) digitalWrite(LED_P_SIDE,HIGH); digitalWrite(LED_N_SIDE,LOW); pinMode(LED_P_SIDE,OUTPUT); pinMode(LED_N_SIDE,OUTPUT); delay(50); // Пауза, чтобы не переполнять буфер COM-порта }
Есть заметка про использование обычного светодиода в качестве датчика и на робофоруме
, а применять можно, например, как тачскрин 🙂
http://www.youtube.com/watch?v=7kzIHMpOt20
Ссылки
http://www.arduino.cc/playground/Learning/LEDSensor
http://www.fischtisch.de/index.php/Main/Lab
http://habrahabr.ru/blogs/arduino/55470/
дополнительное чтение:
ДиХальт - Устройство и работа портов ввода-вывода МК
читать далее: 8. Общение с Arduino — программирование работы с COM-портом.
По теме
Arduino, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)
0 комментариев на «“Практическое программирование Arduino/CraftDuino — Сенсор на светодиоде”»
ссылка на видео битая