Датчик цвета
- Войдите на сайт для отправки комментариев
Вс, 07/12/2014 - 02:05
Пришед датчик цвета tcs3200, сразу стал подключать и столкнулся с одной проблемой
Не могу заставить его выдавать цвет в RGB, вот код:
int s0 = 6, s1 = 7, s2 = 8, s3 = 9;
int out = 5;
int red = 0, blue = 0, green = 0;
void setup() {
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(out, INPUT);
Serial.begin(9600);
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
}
void loop() {
color();
Serial.print(red, DEC);
Serial.print(" : ");
Serial.print(green, DEC);
Serial.print(" : ");
Serial.println(blue, DEC);
delay(2000);
}
void color() {
// Rotina que le o valor das cores
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
// RED
red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s3, HIGH);
// BLUE
blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
digitalWrite(s2, HIGH);
// GREEN
green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}
Терминал выдает что-то типо: 40 : 22 : 27 (это если подключены светодиоды для освещения)
Без светодиодов тот же цвет будет выглядеть так: 1883 : 3824 : 5554
Как можно это преобразовать в RGB формат?
Попробуйте другой пример, использования датчика.
int s0=3,s1=4,s2=5,s3=6; int out=2; int flag=0; byte counter=0; byte countR=0,countG=0,countB=0; void setup() { Serial.begin(115200); pinMode(s0,OUTPUT); pinMode(s1,OUTPUT); pinMode(s2,OUTPUT); pinMode(s3,OUTPUT); } void TCS() { flag=0; digitalWrite(s1,HIGH); digitalWrite(s0,HIGH); digitalWrite(s2,LOW); digitalWrite(s3,LOW); attachInterrupt(0, ISR_INTO, LOW); timer0_init(); } void ISR_INTO() { counter++; } void timer0_init(void) { TCCR2A=0x00; TCCR2B=0x07; //the clock frequency source 1024 points TCNT2= 100; //10 ms overflow again TIMSK2 = 0x01; //allow interrupt } int i=0; ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function { TCNT2=100; flag++; if(flag==1) { countR=counter; Serial.print("red="); Serial.println(countR,DEC); digitalWrite(s2,HIGH); digitalWrite(s3,HIGH); } else if(flag==2) { countG=counter; Serial.print("green="); Serial.println(countG,DEC); digitalWrite(s2,LOW); digitalWrite(s3,HIGH); } else if(flag==3) { countB=counter; Serial.print("blue="); Serial.println(countB,DEC); Serial.println("\n"); digitalWrite(s2,LOW); digitalWrite(s3,LOW); } else if(flag==4) { flag=0; } counter=0; } void loop() { TCS(); while(1); }Интересно то, что выход out как бы очень важен, его даже надо указывать в коде, но он там не используеться
И это решение не рабочее, я уже его пробовал х)
А еще интереснее то, что для ардуины out это вход. А то что он не используется это вам только кажется attachInterrupt(). Если у вас не Uno или Mega и вы 2-вывод меняете на тот, который вам удобно, естественно, что у вас ничего не работает.