CraftDuino v2.0
  • - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!

Практическое программирование 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.arduino.cc/playground/Learning/LEDSensor
http://www.fischtisch.de/index.php/Main/Lab
http://habrahabr.ru/blogs/arduino/55470/
дополнительное чтение:
ДиХальт — Устройство и работа портов ввода-вывода МК

читать далее: 8. Общение с Arduino — программирование работы с COM-портом.

По теме:
Arduino, термины, начало работы
КМБ для начинающих ардуинщиков
Состав стартера (точка входа для начинающих ардуинщиков)
  • 0
  • 19 августа 2009, 12:08
  • admin

Комментарии (2)

RSS свернуть / развернуть
+
0
ссылка на видео битая
avatar

prefer211

  • 18 апреля 2012, 21:14

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