Hey everyone!
Today I will be teaching you about making an Arduino based Colour detection machine. This colour detection machine will display you the colour of the sheet placed within the gap in the box, and the servo motor will point towards that coloured part in the sheet above the box.
Items used in this project
Hardware components
- Arduino Uno
- USB Type A/ B cable (for Arduino Uno)
- Solderless Breadboard Power rail - Mini
- TCS230/ TCS3200 colour sensor
- 16 x 2 LCD display module with I2C interface
- Micro servo motor SG-90
- Male-to-Male jumper wires (x5) - 10cm
- Female-to-Male jumper wires (x12) - 20cm
Other components
- Cardboard box/ 3D printed casing
- Some coloured papers - five different colours
- Scissors
Setup
Your setup must look similar to those in the photos above.
Connections
TCS230/ TCS3200 colour sensor
- S0 - 4
- S1 - 5
- OE - GND (Ground)
- GND - Ground
- VCC - 5V
- OUT - 8
- S2 - 6
- S3 - 7
Servo motor SG-90
- S - D9
- (+) - 5V
- ( - ) - Ground
16 x 2 LCD display
- GND - Ground
- VCC - 5V
- SDA - A4
- SCL - A5
Coding
Before starting this project, it is best to refer to the TCS230/ TCS3200 colour sensor datasheet. You will need the Arduino LiquidCrystal I2C library and Wire library for this project. You can download the .ZIP version of this library from GitHub by following the hyperlink. The Wire library is a built-in library.
To add this .ZIP folder to your Arduino IDE, go to sketch----> include library---->Add .ZIP library.
You will also need to include the 'Servo' library by Michael Margolis in your sketch. If you are new to this library, and need reference to the functions, please feel free to follow the hyperlink in this section.
Create a servo object to control your servo motor. Define each pins belonging to the colour sensor. Set the LCD address for a 16 chars and 2 line display. You can find the LCD address by using the I2C scanner. Create global variables named 'red', 'blue', 'green' and 'pos'.
Within void setup( ), use attach( ) function to attach the servo variable to D9. Initialize the LCD and use pinMode( ) to declare whether each pins are INPUT or OUTPUT. S0, S1, S2, and S3 are OUTPUT while the OUT pin of the colour sensor is INPUT. The output frequency scaling of the colour sensor will be 100%, so according to the datasheet, S0 and S1 must be set HIGH. Set the data rate as 9600 bauds for serial data transmission. Use write( ) function to set the position of your servo motor as 0.
Within void loop( ), set cursor and print according to the following:
- (0,0) - "Colour= "
- (0, 1) - "R= "
- (6, 1) - "G= "
- (12, 1) - "B= "
According to the datasheet, measure the frequencies of red, green and blue by following this:
- Red - S2 LOW and S3 LOW
- Blue - S2 LOW and S3 HIGH
- Clear (No filter) - S2 HIGH and S3 LOW
- Green - S2 HIGH and S3 HIGH
Use digitalWrite( ) function to set S2 and S3 to either HIGH or LOW, and use pulseIn( ) function to measure the frequencies of all three colours. The parameters should be the OUT pin and LOW. You should use print( ) function with 'Serial' as the syntax to print the frequencies on your Serial Monitor.
- Light blue - 18°
- Yellow - 54°
- Blue - 90°
- Green - 126°
- Red - 162°
- None - 0°
Please watch the YouTube video posted at the last section of this post to learn how this project works.
If anyone has any questions with the codes, please feel free to comment below or send me an email at arduinoprojectsbyr@gmail.com.
Final Look
If anyone has any questions, or suggestions, about this project, please feel free to comment below or send me an email at arduinoprojectsbyr@gmail.com.
You may also be interested in my Colour sorting Game with Talking Arduino:
https://arduinoprojectsbyr.blogspot.com/2020/03/64-colour-sorting-game-with-talking.html
Comments
Post a Comment