Использование фоторезистора для обнаружения объектов определенного цвета

Я пытаюсь построить робота, который обнаруживает кубики определенного цвета, а затем подбирает их.

Я планировал использовать камеру и обрабатывать изображение, но мне сказали, что Arduino не поддерживает обработку изображений.

Теперь я подумал, что, возможно, я мог бы использовать фоторезистор, заключенный в лист зеленого светофильтра (чтобы мог проходить только свет определенного цвета). Таким образом, если мой робот сталкивается с кубом нужного мне цвета, фоторезистор должен это обнаружить.

Возможно ли это вообще? Теоретически я знаю, как работают фильтры, но никогда раньше ими не пользовался.

Если нет, есть ли другой способ определить цвет с помощью Arduino?

, 👍2

Обсуждение

Через зеленый фильтр белый, зеленый и желтый выглядят одинаково., @Edgar Bonet

Существуют датчики цвета, такие как TCS230, предлагаемые ниже, но для работы объект должен находиться рядом с датчиком. Они не работают для обнаружения блока на расстоянии более нескольких сантиметров., @Gerben

@Gerben, это зависит от оптики. В сочетании с обычным зеркалом эти датчики могут помочь., @tony gil

@Nick Heumann, не забывайте ставить галочку за правильный ответ всякий раз, когда вы приходите к выводу, что один ответ (наиболее) правильный. Это даст понять, что вы прекратили активный поиск решения, поскольку не опубликовали действительный ответ. Здоровья и добро пожаловать ;), @tony gil


2 ответа


Лучший ответ:

3

Используйте фотодатчик TCS230 и источник света 6500 K для цветокоррекции объектов.

Это подключение поможет вам начать работу

Эта схема, любезно предоставленная Best-Microcontroller-Projects, поможет вам в работе. Прочитайте руководство и не забудьте выполнить калибровку.

//
// Определение цветов с помощью TCS230.
//

// Контакты Arduino uno для управления TCS230
#define TCS320_OE 7
#define TCS320_S0 10
#define TCS320_S1 11
#define TCS320_S2 2
#define TCS320_S3 3
#define TCS320_OUT 4

#define variance 50  // Допустимая ошибка обнаружения 2%.

#define SEL_RED  \
   digitalWrite(TCS320_S2,LOW);digitalWrite(TCS320_S3,LOW)
#define SEL_GREEN \
   digitalWrite(TCS320_S2,HIGH);digitalWrite(TCS320_S3,HIGH)
#define SEL_BLUE \
   digitalWrite(TCS320_S2,LOW);digitalWrite(TCS320_S3,HIGH)
#define SEL_CLEAR \
   digitalWrite(TCS320_S2,HIGH);digitalWrite(TCS320_S3,LOW)

#define TWO_PER \
   digitalWrite(TCS320_S0,LOW);digitalWrite(TCS320_S1,HIGH);

#define debug(a) Serial.println((a));


#define NUMCOL 5

// int RGB[NUMCOL][3]; // Пять цветов с 3 элементами.
// Массив строк NUMCOL len 10. 11 для null.
// имя_символа[NUMCOL][11];

// Типичные значения для делителей 2% (установите дисперсию на 50).
int RGB[NUMCOL][3]={
   {248,647,393},
   {188,261,265},
   {404,710,546},
   {506,493,304},
   {930,1199,837},
};

char colname[NUMCOL][11]={
"red",
"yellow",
"brown",
"blue",
"black",
};

////////////////////////////////////////////////// ///////////////
void setup() {

   pinMode(TCS320_OE,OUTPUT);
   pinMode(TCS320_S0,OUTPUT);
   pinMode(TCS320_S1,OUTPUT);
   pinMode(TCS320_S2,OUTPUT);
   pinMode(TCS320_S3,OUTPUT);
   pinMode(TCS320_OUT,INPUT);

   TWO_PER;

   digitalWrite(TCS320_OE,LOW); // Включено всегда.

   Serial.begin(115200);
   Serial.println("TCS230 color detector");
}

////////////////////////////////////////////////// ///////////////
unsigned long get_TCS230_reading(void) {
  unsigned long val;
  noInterrupts();
  val = pulseIn(TCS320_OUT,HIGH,20000); // 2000us=2 мс 2 Гц мин.
  interrupts();
  return val;
}

static int clr,red,green,blue;

////////////////////////////////////////////////// ///////////////
uint16_t detect(void) {
   unsigned long val;

    SEL_RED;
    red = val = get_TCS230_reading();
    Serial.print("RED: "); Serial.print(val);

    SEL_GREEN;
    green = val = get_TCS230_reading();
    Serial.print(" GREEN: "); Serial.print(val);

    SEL_BLUE;
    blue = val = get_TCS230_reading();
    Serial.print(" BLUE: "); Serial.print(val);

    Serial.print(" \n");
}

////////////////////////////////////////////////// ///////////////
int withinEQ(int c, int xl, int xh) {
   if (c>=xl && c<=xh) return 1;
   return 0;
}

////////////////////////////////////////////////// ///////////////
// Сравните значение со значением и дисперсией.
int compare(int c, int v, int err) {
int xh=v+err, xl=v-err;
   if (withinEQ(c,xl,xh)) return 1;
   return 0;
}

////////////////////////////////////////////////// ///////////////
void loop() {
uint8_t chr,i,fnd;

   if (Serial.available()>0) {

      chr = Serial.read(); // Потреблять.

      // Найти соответствие цвета.
      detect();
      fnd=0;
      for (i=0;i<NUMCOL;i++) {
     if ( compare(red,RGB[i][0],variance) &&
          compare(green,RGB[i][1],variance) &&
          compare(blue,RGB[i][2],variance)
        ) { // Найденный
          Serial.print("Col is :");
          Serial.println(colname[i]);
          fnd=1;
          break;
        }
      }
      if (!fnd) Serial.println("NOT Found");
   }
}
,

2

Хорошая теория, но, поскольку вы сталкиваетесь с реальными, а не идеальными условиями, я думаю, вам придется нелегко с этим подходом. Т.е. ваш куб, скорее всего, имеет не тот оттенок зеленого, который пропускает ваш фильтр. А как насчет освещения? У вас есть источник нейтрального белого света? Я рекомендую вам ознакомиться с этим Учебным пособием по распознаванию RGB в Arduino с использованием TCS230. Датчик цвета для начала.

,