iskra neo+ tcs3200

Тема в разделе "Arduino & Shields", создана пользователем Saigla, 2 дек 2015.

  1. Saigla

    Saigla Нуб

    Здравствуйте!
    Я столкнулся вот с такой проблемой:
    Хочу подключить к 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);
    }

    [​IMG] [​IMG] [​IMG]
     
  2. Saigla

    Saigla Нуб

    Я пробовал на 3 iskra neo и все одно и тоже
     
  3. ИгорьК

    ИгорьК НЕ Модератор

    Попробуйте повторить вот этот пример. И именно с тем подключением ног, как там показано.
     
  4. Saigla

    Saigla Нуб

    Пробовал, ошибку выдает:
    exit status 1
    'TCCR2A' was not declared in this scope
     
  5. ИгорьК

    ИгорьК НЕ Модератор

    Ах, вот в чем дело. Это проблема обращения к отсутствующему в Леонардо таймеру.
    Если Вы только начинающий, то, надеюсь, тов. acos может обратить внимание на эту тему и помочь.
    Проще говоря, Нео (Леонардо) - это не Уно. Плата у Вас нормальная, но имеет определенные особенности. Большей частью разницы нет, но вот сейчас Вы с ней столкнулись.
    Еще предложу уже в Вашем сектче поменять используемые ноги и вновь попробовать.

    В частности, возможно проблема здесь: const int out = 10; Поменяйте в первую очередь эту ногу на что-то другое.
     
    Последнее редактирование: 3 дек 2015
  6. Saigla

    Saigla Нуб

    Хорошо попробую
     
  7. acos

    acos Официальный гик Администратор

    В леонардо второго таймера нет, но есть четвертый. Вообще, напрямую с регистрами работать необязательно. Здесь просто нужно вызывать прерывание каждые 10 мс. Эту задачу проще всего сделать с библиотекой Timer1 http://playground.arduino.cc/Code/Timer1\
    Но если хочется напрямую с регистрами поковырятся - добро пожаловать в даташит на Atmega32u4)
    Еще на леонардо Int0 на 3 ноге, а не на второй как в Uno. Можно и не менять подключение, тогда нужно использовать Int1 (т. е. attachInterrupt(1, ISR_INTO, CHANGE); вместо attachInterrupt(0, ISR_INTO, CHANGE);)
     
  8. ИгорьК

    ИгорьК НЕ Модератор

    В скетче ТС прерываний нет, а есть единственная функция, которая может оказаться нерабочей: pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH); где out = 10 нога.
     
  9. Saigla

    Saigla Нуб

    Поменял 10 ногу на 6 изменений нету
    Просто проблема в том что при таком подключении как сейчас у меня на ардуинке лампочки светятся, а на искре нет
     
  10. Saigla

    Saigla Нуб

  11. Saigla

    Saigla Нуб

    я думаю там пример другой версии датчика т.к. у меня на месте порта vcc порт vdd
     
  12. acos

    acos Официальный гик Администратор

    Аа. Я подумал речь про другой скетч.
    С разбегу не понятно, но соглашусь - нужно попробовать ногу из диапазона 2,3,5,7,11,13.
    Я наблюдал на ногах в леонардо, на которых есть аналоговые входы, большую задержку на переключение в режиме OUT. Связано было с слишком долгой посторонней работой DigitalWrite(). Но тут режим Input, а не Output, поэтому вроде не то. Но попробуйте на всякий случай.