В этой инструкции мы подключим датчик цвета TCS230 к платформе Arduino. Чтобы продемонстрировать возможности датчика цвета, мы построим детекторную систему, способную определить цвет на предмете перед датчиком и отобразить его на TFT-дисплее. В этом проекте мы будем использовать датчик TCS230, а отображать цвет — на дисплее ST7735 1,44 дюйма.
Для реализации проекта из этой статьи нам потребуются следующие компоненты:
- Arduino Uno R3
- Датчик цвета TCS230 (TCS3200)
- Цветной TFT-дисплей 1.44′ (128×128px) SPI
- Макетная плата на 400 точек
- Набор макетных проводов “папа-папа”
Как обычно, эти компоненты можно купить, пройдя по соответствующим представленным в списке ссылкам.
Краткий обзор модуля
Датчик TCS230 — программируемый преобразователь «свет-частота» для цвета, который совмещает конфигурируемые кремниевые фотодиоды и преобразователь «ток-частота» на одной монолитной интегральной схеме КМОП.
Модуль датчика цвета состоит из самого датчика цвета и четырёх инфракрасных светодиодов, которые используются для освещения любого объекта, расположенного перед датчиком, чтобы обеспечить точность результатов измерения и их независимость от окружающего освещения. Датчик состоит из набора фотодиодов с цветовыми фильтрами для красного, синего и зелёного цветов и с просветляющим фильтром поверх них.
Чтобы определить цвет, датчик считывает данные с набора фотодиодов, расположенных в виде матрицы 8 × 8, которая включает 16 фотодиодов с фильтрами синего, 16 — с фильтрами зелёного, 16 — с фильтрами красного и 16 фотодиодов без фильтров. Четыре типа (цветов) фотодиодов чередуются друг с другом, чтобы минимизировать влияние неравномерности интенсивности падающего излучения. Все 16 фотодиодов для одного цвета включены параллельно, а выбор используемого во время работы фотодиода производится посредством штырьков.
На выходе датчика цвета TCS230 — прямоугольный сигнал с 50 %‑м коэффициентом заполнения, чья частота пропорциональна интенсивности света на выбранном световом фильтре.
Схема подключения
Подключите датчик TCS230 и TFT-дисплей к плате Arduino, как показано на схеме. Ниже показано, как соединить выводы датчика цвета и TFT-дисплея с платой Arduino.
Подключение дисплея ST7735 (ST7735S) к Arduino:
- LED – 3.3V
- SCK – D13
- SDA – D11
- DC – D9
- CS – D10
- Reset – D8
- GND – GND
- VCC – 5V
Подключение датчика цвета TCS230 к Arduino:
- VCC – 5V
- GND – GND
- OUT – D5
- S2 – D2
- S3 – D3
- OE – D4
Некоторые модели модуля TCS230 имеют отдельный контакт для питания светодиодов (LED), при его наличии вам необходимо подключить его к выводу 5V (5В) платы Arduino. Перепроверьте схему ещё раз, чтобы удостовериться, что всё подключено правильно, перед тем как двигаться дальше.
Подключение в Arduino IDE
Чтобы было проще писать код для этого проекта, нам понадобятся четыре библиотеки, две из которых нужны для работы с датчиком цвета и считывания данных, а две другие — для работы с TFT-дисплеем.
Необходимые библиотеки следующие:
Библиотеки можно скачать по соответствующим ссылкам в списке. После установки библиотек, мы можем приступить к написанию кода для проекта.
Первое, что мы делаем, это включаем библиотеки, которые собираемся использовать. В нашем случае это библиотеки, упомянутые выше.
1 2 3 4 5 6 7 8 9 10 |
////////////////////////////////////////////// // Arduino Color Sensor // // with ST7735 TFT LCD // // https://voltiq.ru/ // ///////////////////////////////////////////// #include "MD_TCS230.h" #include "FreqCount.h" #include "Adafruit_ST7735.h> #include "Adafruit_GFX.h" |
Далее мы определяем контакты платы Arduino, к которым будут подключены контакты CS, DC и RST с нашего дисплея.
1 2 3 |
#define cs 10 #define dc 9 #define rst 8 |
Далее мы определяем идентификаторы цветов, сопоставляя их с шестнадцатеричными значениями, а также определяем контакты общего назначения для ввода-вывода GPIO платы Arduino, к которым будут подключены выводы с датчика цвета.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Color definitions #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define GREY 0xC618 // Pin definitions #define S2_OUT 2 #define S3_OUT 3 #define OE_OUT 4 // LOW = ENABLED |
Далее мы создаём три переменные для красного (R — red), зелёного (G — green) и синего (B — blue) цветов. В этих переменных будет содержаться полученное от датчика цвета числовое значение, соответствующее каждому из трёх цветов.
1 2 3 |
int R = 0; int G = 0; int B = 0; |
Далее мы создаём экземпляр библиотеки для датчика цвета TCS230 и экземпляр библиотеки для дисплея ST7735, указывая необходимые контакты.
1 2 3 |
MD_TCS230 CS(S2_OUT, S3_OUT, OE_OUT); int state = 0; Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst); |
Выполнив всю предварительную работу, мы переходим к функции void setup(), в которой проводим первоначальную настройку дисплея и выводим на него приветственный текст. Следом мы устанавливаем связь с датчиком цвета и начинаем считывать его данные.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
void setup() { Serial.begin(57600); tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab drawBlackScreen(); tft.setCursor(20,30); tft.setTextColor(RED); tft.setTextSize(2); tft.print("Color"); tft.setCursor(20,60); tft.setTextColor(GREEN); tft.setTextSize(2); tft.print("Sensor"); tft.setCursor(20,90); tft.setTextColor(BLUE); tft.setTextSize(2); tft.print("Tutorial"); delay(3000); drawBlackScreen(); tft.setCursor(10,30); tft.setTextColor(WHITE); tft.setTextSize(2); tft.print("SET BLACK"); delay(5000); CS.begin(); CS.read(); } |
Далее переходим к функции void loop(). Первое, что мы делаем в этой функции, это калибровку датчика цвета, подставляя ему чёрный и белый цвета. Если наше устройство распознало эти цвета, значит датчик откалиброван и способен распознать остальные, промежуточные цвета.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
void loop() { if(state ==0) { if (CS.available()) { sensorData sd; CS.getRaw(&sd); CS.setDarkCal(&sd); Serial.println("Black Calibration Set"); state++; drawBlackScreen(); tft.setCursor(10,30); tft.setTextColor(WHITE); tft.setTextSize(2); tft.print("SET WHITE"); delay(5000); CS.read(); } } |
После завершения калибровки переменные состояния получают значение больше нуля и начинается выполнение программы. С этого момента модуль может считать любой цвет, который ему будет предоставлен.
Полный программный код для этого проекта представлен далее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
////////////////////////////////////////////// // Arduino Color Sensor Tutorial // // with ST7735 TFT LCD // // https://voltiq.ru // ///////////////////////////////////////////// #include "MD_TCS230.h" #include "FreqCount.h" #include "Adafruit_ST7735.h" #include "Adafruit_GFX.h" #define cs 10 #define dc 9 #define rst 8 // Color definitions #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define GREY 0xC618 // Pin definitions #define S2_OUT 2 #define S3_OUT 3 #define OE_OUT 4 // LOW = ENABLED int R = 0; int G = 0; int B = 0; MD_TCS230 CS(S2_OUT, S3_OUT, OE_OUT); int state = 0; Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst); void setup() { Serial.begin(57600); tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab drawBlackScreen(); tft.setCursor(20,30); tft.setTextColor(RED); tft.setTextSize(2); tft.print("Color"); tft.setCursor(20,60); tft.setTextColor(GREEN); tft.setTextSize(2); tft.print("Sensor"); tft.setCursor(20,90); tft.setTextColor(BLUE); tft.setTextSize(2); tft.print("Tutorial"); delay(3000); drawBlackScreen(); tft.setCursor(10,30); tft.setTextColor(WHITE); tft.setTextSize(2); tft.print("SET BLACK"); delay(5000); CS.begin(); CS.read(); } void loop() { if(state ==0) { if (CS.available()) { sensorData sd; CS.getRaw(&sd); CS.setDarkCal(&sd); Serial.println("Black Calibration Set"); state++; drawBlackScreen(); tft.setCursor(10,30); tft.setTextColor(WHITE); tft.setTextSize(2); tft.print("SET WHITE"); delay(5000); CS.read(); } } else if(state == 1) { if (CS.available()) { sensorData sd; CS.getRaw(&sd); CS.setWhiteCal(&sd); Serial.println("White Calibration Set"); drawBlackScreen(); tft.setCursor(35,30); tft.setTextColor(WHITE); tft.setTextSize(2); tft.print("COLOR"); tft.drawRect(30,70,70,60,WHITE); state++; } }else { readSensor(); } } void drawBlackScreen() { tft.fillScreen(BLACK); //Draw white frame tft.drawRect(0,0,127,159,WHITE); tft.drawRect(1,1,127,159,WHITE); } uint16_t convertRGB24toRGB565(uint8_t r, uint8_t g, uint8_t b) { return ((r / 8) << 11) | ((g / 4) << 5) | (b / 8); } void readSensor() { static bool waiting = false; if (!waiting) { CS.read(); waiting = true; } else { if (CS.available()) { colorData rgb; CS.getRGB(&rgb); Serial.print("RGB ["); Serial.print(rgb.value[TCS230_RGB_R]); Serial.print(","); Serial.print(rgb.value[TCS230_RGB_G]); Serial.print(","); Serial.print(rgb.value[TCS230_RGB_B]); Serial.println("]"); R = rgb.value[TCS230_RGB_R]; G = rgb.value[TCS230_RGB_G]; B = rgb.value[TCS230_RGB_B]; int color = convertRGB24toRGB565(R,G,B); //Convertion to 16bit color for the display delay(100); tft.fillRect(31,71,68,58,color); waiting = false; } } } |
Проверьте ещё раз соединения для уверенности, что всё верно, затем загрузите код в плату Arduino и поместите любой цветной материал перед датчиком цвета. Не забудьте сначала откалибровать датчик с помощью чёрного и белого цветов перед тем, как начинать распознавать другие цвета. На нижеприведённом рисунке устройство распознаёт жёлтый цвет.
На этом наша инструкция заканчивается. Цветосортировка имеет несколько применений в реальной жизни, и мы уверены, что это очень полезно, когда это можно сделать с таким недорогим решением, как платформа Arduino. А какие задачи вы решили с помощью этого датчика? Пишите свои идеи и проекты в комментариях! Удачной компиляции!
2 комментария. Оставить новый
Не компилируется код. Не знаю, с чем связано..
Здравствуйте! Какую ошибку выдает программа во время компиляции?