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
**********************
@Jordan Reddick, 👍0
2 ответа
Со страницы проекта (комментарий Мариуса Дэвида) кажется, что некоторые целочисленные типы данных могут быть разными на разных платформах. Если он прав, вы можете работать с 16-битным pulseWidth, тогда как требуется 32 бита.
Попробуйте использовать unsigned long
для переменной pulseWidth
.
Подключите 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
- MAX30100 не работает
- Использование библиотеки емкостных датчиков с мультиплексором 74HC4067
- Проблема с сигналом датчика пульса
- Считывание значений с емкостного сенсорного датчика TTP229 на arduino
- Подключение двух Arduino через I2C, когда контакты I2C A4/A5 уже используются.
- Два датчика расхода, один ESP32, ЖК-дисплей и/или Arduino
- Arduino nano 33 ble vs ble sense. Потребляемая мощность и т.д.
- Проблема прерываний с датчиком потока
Хорошая идея, но не тут-то было. Проблема сохранилась после изменения типа pulseWidth на unsigned long, @Jordan Reddick