Здравствуйте! Я столкнулся вот с такой проблемой: Хочу подключить к iskre neo датчик tcs3200, но как не пробовал он не работает. На arduino UNO все ок... Код программы: Код (C++): const int s0 = 8; const int s1 = 9; const int s2 = 12; const int s3 = 11; const int out = 10; // LED pins connected to Arduino int redLed = 2; int greenLed = 3; int blueLed = 4; // Variables int red = 0; int green = 0; int blue = 0; void setup() { Serial.begin(9600); pinMode(s0, OUTPUT); pinMode(s1, OUTPUT); pinMode(s2, OUTPUT); pinMode(s3, OUTPUT); pinMode(out, INPUT); pinMode(redLed, OUTPUT); pinMode(greenLed, OUTPUT); pinMode(blueLed, OUTPUT); digitalWrite(s0, HIGH); digitalWrite(s1, HIGH); } void loop() { color(); Serial.print("R Intensity:"); Serial.print(red, DEC); Serial.print(" G Intensity: "); Serial.print(green, DEC); Serial.print(" B Intensity : "); Serial.print(blue, DEC); //Serial.println(); if (red < blue && red < green && red < 20) { Serial.println(" - (Red Color)"); digitalWrite(redLed, HIGH); // Turn RED LED ON digitalWrite(greenLed, LOW); digitalWrite(blueLed, LOW); } else if (blue < red && blue < green) { Serial.println(" - (Blue Color)"); digitalWrite(redLed, LOW); digitalWrite(greenLed, LOW); digitalWrite(blueLed, HIGH); // Turn BLUE LED ON } else if (green < red && green < blue) { Serial.println(" - (Green Color)"); digitalWrite(redLed, LOW); digitalWrite(greenLed, HIGH); // Turn GREEN LED ON digitalWrite(blueLed, LOW); } else{ Serial.println(); } delay(300); digitalWrite(redLed, LOW); digitalWrite(greenLed, LOW); digitalWrite(blueLed, LOW); } void color() { digitalWrite(s2, LOW); digitalWrite(s3, LOW); //count OUT, pRed, RED red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH); digitalWrite(s3, HIGH); //count OUT, pBLUE, BLUE blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH); digitalWrite(s2, HIGH); //count OUT, pGreen, GREEN green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH); }
Ах, вот в чем дело. Это проблема обращения к отсутствующему в Леонардо таймеру. Если Вы только начинающий, то, надеюсь, тов. acos может обратить внимание на эту тему и помочь. Проще говоря, Нео (Леонардо) - это не Уно. Плата у Вас нормальная, но имеет определенные особенности. Большей частью разницы нет, но вот сейчас Вы с ней столкнулись. Еще предложу уже в Вашем сектче поменять используемые ноги и вновь попробовать. В частности, возможно проблема здесь: const int out = 10; Поменяйте в первую очередь эту ногу на что-то другое.
В леонардо второго таймера нет, но есть четвертый. Вообще, напрямую с регистрами работать необязательно. Здесь просто нужно вызывать прерывание каждые 10 мс. Эту задачу проще всего сделать с библиотекой Timer1 http://playground.arduino.cc/Code/Timer1\ Но если хочется напрямую с регистрами поковырятся - добро пожаловать в даташит на Atmega32u4) Еще на леонардо Int0 на 3 ноге, а не на второй как в Uno. Можно и не менять подключение, тогда нужно использовать Int1 (т. е. attachInterrupt(1, ISR_INTO, CHANGE); вместо attachInterrupt(0, ISR_INTO, CHANGE)
В скетче ТС прерываний нет, а есть единственная функция, которая может оказаться нерабочей: pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH); где out = 10 нога.
Поменял 10 ногу на 6 изменений нету Просто проблема в том что при таком подключении как сейчас у меня на ардуинке лампочки светятся, а на искре нет
а пример который на этом сайте даже на uno не работает http://www.dfrobot.com/wiki/index.php/TCS3200_Color_Sensor_(SKU:SEN0101)
Аа. Я подумал речь про другой скетч. С разбегу не понятно, но соглашусь - нужно попробовать ногу из диапазона 2,3,5,7,11,13. Я наблюдал на ногах в леонардо, на которых есть аналоговые входы, большую задержку на переключение в режиме OUT. Связано было с слишком долгой посторонней работой DigitalWrite(). Но тут режим Input, а не Output, поэтому вроде не то. Но попробуйте на всякий случай.