TCS230 Малая длина импульса с Arduino

Мы с сыном пытаемся подключить датчик цвета TCS230 к Arduino Nano, используя руководство на TopTechBoy.com (http://www.toptechboy.com/arduino/lesson-15-super-cool-arduino-color-sensor-project/) в качестве руководства.

Кажется, все работает, за исключением того, что преобразование изpulsIn в RGB, используемое в TopTechBoy, предполагает максимальное количество импульсов 102 400. Вместо этого я получаю показания пульса с максимальным значением 2000.

Наша проводка

S0 — заземление
С1 – 5В OE – нет соединения (пробовано заземление)
Земля - Земля
S2 – D8
S3 – D7
ВЫХОД - D4
ВКК - 5В

Наш код:

int S2 = 8;
int S3 = 7;
int OUT = 4;

void setup() {

Serial.begin(9600);
pinMode (S2, OUTPUT);
pinMode (S3, OUTPUT);
pinMode (OUT, INPUT);

}

void loop() {
  // поместите сюда свой основной код для многократного запуска:
  int red , green, blue; 

  red = getRed(); 
  Serial.print("Red : "); Serial.println(red); 
  Serial.println("**********************");
  Serial.println();

  blue = getBlue(); 
  Serial.print("Blue : "); Serial.println(blue); 
  Serial.println("**********************");
  Serial.println();

  green = getGreen(); 
  Serial.print("Green : "); Serial.println(green); 
  Serial.println("**********************");
  Serial.println();

  delay(3000);

}


int getRed(void){ return getColor(0, 0, 19000, 24000); }


int getGreen(void){return getColor(1, 1, 13600, 19200);}


int getBlue(void){return getColor (0, 1, 16400, 21600);}


int getColor(int s2Value, int s3Value , int typicalPulseWidth, int maxPulseWidth){

  long divideForScale = typicalPulseWidth / 255 ;

  digitalWrite(S2, s2Value); 
  digitalWrite(S3, s3Value);

  unsigned int pulseWidth = pulseIn(OUT,LOW);

  Serial.print("Pulse Width : "); Serial.println(pulseWidth);

  unsigned int rColor = pulseWidth / divideForScale ; //401.5686274509804
  Serial.print("Response Color - Inverted : "); Serial.println(rColor);

  rColor = 255 - rColor ; 
  Serial.print("Response Color - Final : "); Serial.println(rColor);

  delay(500);

  return rColor ; 

}

Импульсы кажутся правильными, но выходят за пределы шкалы. Красные предметы производят короткие красные импульсы и так далее.

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

http://www.unihedron.com/projects/darksky/tcs230-e33.pdf

Уменьшение максимально возможного количества импульсов в секунду со 100 400 до примерно 20 000 дало нам немного больше различий между значениями RGB, но результат все равно не похож на ожидаемый цвет.

Может ли кто-нибудь подсказать, почему количество импульсов TCS230 намного меньше, чем ожидает код TTB, и что я могу сделать, чтобы исправить количество импульсов или шкалу? С уважением.

Результат измерения синего RFID-брелока: разделитьForScale: 74 Ширина импульса: 673 Цвет ответа — инвертированный: 9 Цвет ответа – окончательный: 246 Красный: 246 **********************

divideForScale : 64
Pulse Width : 376
Response Color - Inverted : 5
Respponse Color - Final : 250
Blue : 250
**********************

divideForScale : 53
Pulse Width : 737
Response Color - Inverted : 13
Respponse Color - Final : 242
Green : 242
**********************

, 👍0


2 ответа


0

Со страницы проекта (комментарий Мариуса Дэвида) кажется, что некоторые целочисленные типы данных могут быть разными на разных платформах. Если он прав, вы можете работать с 16-битным pulseWidth, тогда как требуется 32 бита.

Попробуйте использовать unsigned long для переменной pulseWidth.

,

Хорошая идея, но не тут-то было. Проблема сохранилась после изменения типа pulseWidth на unsigned long, @Jordan Reddick


1

Подключите S0 к 5 В, чтобы получить 100% МАСШТАБИРОВАНИЕ ВЫХОДНОЙ ЧАСТОТЫ.

В настоящее время при S0 LOW и S1 HIGH вы получаете 2% МАСШТАБИРОВАНИЕ ВЫХОДНОЙ ЧАСТОТЫ. Что объясняет 50-кратное увеличение значений до низких значений, которые вы получаете (100% / 2% = 50).

,

Я пробовал увеличивать разрешение, но ширина импульса уменьшается по мере увеличения разрешения. S0 - Low и S1 - High для разрешения 2% обеспечивают самые длинные импульсы., @Jordan Reddick

Я не очень понимаю, но тот факт, что вы пробовали разные комбинации S0, S1, означает, что это не решение. Может, кто-то другой знает. Удачи., @Gerben

Показания от pulseIn были около 30 - 50, когда S0 и S1 были установлены на High. Возможно, разрешение - не совсем верное слово, но более высокая выходная частота, похоже, требует более короткой частоты импульсов. Показания 2000 от pulseIn при 2% - самый длинный импульс, который нам удалось получить от устройства., @Jordan Reddick