Практическое программирование Arduino/CraftDuino — Сенсор на светодиоде


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 — Сенсор на светодиоде”»

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение