Использование фоторезистора для обнаружения объектов определенного цвета
Я пытаюсь построить робота, который обнаруживает кубики определенного цвета, а затем подбирает их.
Я планировал использовать камеру и обрабатывать изображение, но мне сказали, что Arduino не поддерживает обработку изображений.
Теперь я подумал, что, возможно, я мог бы использовать фоторезистор, заключенный в лист зеленого светофильтра (чтобы мог проходить только свет определенного цвета). Таким образом, если мой робот сталкивается с кубом нужного мне цвета, фоторезистор должен это обнаружить.
Возможно ли это вообще? Теоретически я знаю, как работают фильтры, но никогда раньше ими не пользовался.
Если нет, есть ли другой способ определить цвет с помощью Arduino?
@Nick Heumann, 👍2
Обсуждение2 ответа
Лучший ответ:
Используйте фотодатчик 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");
}
}
Хорошая теория, но, поскольку вы сталкиваетесь с реальными, а не идеальными условиями, я думаю, вам придется нелегко с этим подходом. Т.е. ваш куб, скорее всего, имеет не тот оттенок зеленого, который пропускает ваш фильтр. А как насчет освещения? У вас есть источник нейтрального белого света? Я рекомендую вам ознакомиться с этим Учебным пособием по распознаванию RGB в Arduino с использованием TCS230. Датчик цвета для начала.
- Бесполезная проводка коробки и код
- Как перезапустить счетчик в программе с помощью кнопки в настройке LDR Tripwire
- Может ли датчик 12 В, быть подключен к выходному сигналу 5 В Arduino Uno
- Измерение скорости автомобиля между двумя точками: какой датчик использовать и как преодолевать расстояние?
- Как лучше всего держать Arduino в водонепроницаемой распределительной коробке и предотвратить перегрев?
- Какие инструменты проектирования проектов доступны?
- Измерение продолжительности пикового уровня освещенности с помощью фоторезистора
- Arduino-проект с датчиком цвета и rgb-светодиодом
Через зеленый фильтр белый, зеленый и желтый выглядят одинаково., @Edgar Bonet
Существуют датчики цвета, такие как TCS230, предлагаемые ниже, но для работы объект должен находиться рядом с датчиком. Они не работают для обнаружения блока на расстоянии более нескольких сантиметров., @Gerben
@Gerben, это зависит от оптики. В сочетании с обычным зеркалом эти датчики могут помочь., @tony gil
@Nick Heumann, не забывайте ставить галочку за правильный ответ всякий раз, когда вы приходите к выводу, что один ответ (наиболее) правильный. Это даст понять, что вы прекратили активный поиск решения, поскольку не опубликовали действительный ответ. Здоровья и добро пожаловать ;), @tony gil