Измеритель цвета на одном фоторезисторе

Публикация 27.04.2017

Поговорим о фоторезисторе освещенности с необычной стороны - со стороны замера цвета. Фоторезисторы изменяют свое сопротивление в зависимости от освещенности, но они напрямую нам не говорят какой цвет видят.

Фоторезисторы

В наличии оказались фоторезисторы GL5528. Они не отличаются какой-то особенной точностью. Обычно их применяют для определения светло/темно и не более того.
Разброс показаний в одной партии может отличаться в 2 раза при одинаковой освещенности. По тому для каждого случая придется подбирать свои настройки.

Фоторезистор устройство

Сопротивление фоторезистора изменяется в зависимости от уровня освещения. Когда темно, сопротивление резистора увеличивается до 10 МОм. С увеличением уровня освещенности сопротивление падает. Характеристика нелинейная, а имеет логарифмический характер. Фоторезисторы не воспринимают весь диапазон световых волн. В большинстве случаев они чувствительны к синему и красному цветам. Для наших целей лучше подобрать фоторезистор воспринимающий весь спектр - это увеличит точность измерений.

Измеритель цвета на одном фоторезисторе

Фоторезисторы не чувствительны к полярности и по тому их можно подключать "в любую сторону". Самый простой вариант подключения к Arduino - это считывание аналогового уровня питания через два резистора.

Схема подключения фоторезистора к Arduino

На Arduino Uno/Leonardo аналоговые входы это A0-A4. Можно использовать любой для считывания.

Подключение фоторезистора к Arduino

При понижении сопротивления фоторезистора сопротивление фоторезистора и понижающего резистора уменьшается от 600 кОм до 10 кОм. Ток, проходящий через оба резистора, увеличивается, что приводит к повышению напряжения на резистора с постоянным сопротивлением 10 кОм.

Таблица зависимости напряжения питания от сопротивления фоторезистора

В таблице указаны приблизительные значения напряжения на основании уровня освещенности при подключении напряжения питания 5 В и 10 кОм понижающего резистора.

Теперь вернемся к вопросу распознавания цвета. Принцип в том, что мы размещаем фоторезистор в темном боксе напротив цветной измеряемой поверхности. Для освещения объекта мы используем RGB светодиод. Он поочередно зажигает Красный, Синий, Зеленый светодиод. При каждом включении мы делаем соответствующий замер освещенности т.е. отражательной способности нашего объекта для выбранного цвета. RGB диоды излучают чистый спектр и они идеально подходят для нашей задачи.

RGB датчик цвета

Напишем простую программу, которая будет в цикле проводить измерения трех цветов. Индикацию считанного цвета будем выводить этими же диодами.
Программа поочередно зажигает отдельные диоды, сохраняет для каждого цвета показания датчика освещенности. Результат измерения трех цветов даст нам цвет, который отражает измеряемая поверхность. После измерений диоды гаснут на мгновение и зажигаются в распознанном цвете.
A0 - R диод
A1 - G диод
A2 - B диод
A3 - фоторезистор

int R = 0;
int G = 0;
int B = 0;

// Калибровка цветов
// Белый цвет
int Rwhite = 323;
int Gwhite = 367;
int Bwhite = 361;
// Черный цвет
int RBlack = 670;
int GBlack = 672;
int BBlack = 651;

void setup() {
  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  read();
  write();
  delay(500);
}

void read() {
  digitalWrite(A0, HIGH);
  digitalWrite(A1, LOW);
  digitalWrite(A2, LOW);
  R = analogRead(A3);
  Serial.print(" R:");
  Serial.print(R);
  delay(10);
  
  digitalWrite(A0, LOW);
  digitalWrite(A1, HIGH);
  G = analogRead(A3);
  Serial.print(" G:");
  Serial.print(G);
  delay(10);
  
  digitalWrite(A1, LOW);
  digitalWrite(A2, HIGH);
  B = analogRead(A3);
  Serial.print(" G:");
  Serial.println(B);
  delay(10);

  digitalWrite(A2, LOW);
}

void write() {
  digitalWrite(A0, ((R - Rwhite) / (RBlack - Rwhite)) * 255);
  digitalWrite(A1, ((G - Gwhite) / (GBlack - Gwhite)) * 255);
  digitalWrite(A2, ((B - Bwhite) / (BBlack - Bwhite)) * 255);
}
* комментарии публикуются после модерации
Нет комментариев