element14 presents | AirborneSurfer's VCP Profile | Project Videos
In a previous project, we looked at how to attach a TFT LCD screen to a Raspberry Pi to build a small-form-factor project. But what if your project doesn't need quite as much horsepower? What if you just need to display shapes and colors on a screen with no operating system and nearly instant boot times? This is where a TFT LCD screen on Arduino comes in handy. In this video, we'll look at how to set up a TFT LCD screen on Arduino with the RA8875 breakout board from Adafruit then walk through how to display various shapes and colors in the sketch.
PARTS/TOOLS:
https://www.newark.com/mcm/21-18938/breadboard-with-binding-posts630/dp/79X3923
https://www.newark.com/arduino/a000066/dev-board-atmega328-arduino-uno/dp/78T1601
https://www.newark.com/mcm/21-18938/breadboard-with-binding-posts630/dp/79X3923
https://www.newark.com/adafruit/759/wire-gauge-28awg/dp/88W2571
https://www.newark.com/midas/mct050tc12w800480lml/display-lcd-tft-5-800x480-landscape/dp/01AC6905
https://www.newark.com/adafruit-industries/1590/ra8875-driver-board-for-40-pin/dp/28Y4849
RESOURCES:
Adafruit RA8875 Arduino Library
THE CIRCUIT:
It's a fairly simple wiring job here using the hardware SPI interface on the Arduino. CLK, MISO, and MOSI connect to 13, 12, 11 respectively. CS, RST, and INT are defaulted to 10, 9, and 3, but can be reassigned in the sketch. Of course, the display is not illustrated, but it is connected to the 40-pin ribbon connector on the left.
THE SKETCH:
This is just the "buildtest" example from the RA8875 library, but you can follow along in the video to see what parts control what functions (and vice versa)
/****************************************************************** This is an example for the Adafruit RA8875 Driver board for TFT displays ---------------> http://www.adafruit.com/products/1590 The RA8875 is a TFT driver for up to 800x480 dotclock'd displays It is tested to work with displays in the Adafruit shop. Other displays may need timing adjustments and are not guanteed to work. Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! Written by Limor Fried/Ladyada for Adafruit Industries. BSD license, check license.txt for more information. All text above must be included in any redistribution. ******************************************************************/ #include #include "Adafruit_GFX.h" #include "Adafruit_RA8875.h" // Library only supports hardware SPI at this time // Connect SCLK to UNO Digital #13 (Hardware SPI clock) // Connect MISO to UNO Digital #12 (Hardware SPI MISO) // Connect MOSI to UNO Digital #11 (Hardware SPI MOSI) #define RA8875_INT 3 #define RA8875_CS 10 #define RA8875_RESET 9 Adafruit_RA8875 tft = Adafruit_RA8875(RA8875_CS, RA8875_RESET); uint16_t tx, ty; void setup() { Serial.begin(9600); Serial.println("RA8875 start"); /* Initialize the display using 'RA8875_480x80', 'RA8875_480x128', 'RA8875_480x272' or 'RA8875_800x480' */ if (!tft.begin(RA8875_480x272)) { Serial.println("RA8875 Not Found!"); while (1); } Serial.println("Found RA8875"); tft.displayOn(true); tft.GPIOX(true); // Enable TFT - display enable tied to GPIOX tft.PWM1config(true, RA8875_PWM_CLK_DIV1024); // PWM output for backlight tft.PWM1out(255); // With hardware accelleration this is instant tft.fillScreen(RA8875_WHITE); // Play with PWM for (uint8_t i=255; i!=0; i-=5 ) { tft.PWM1out(i); delay(10); } for (uint8_t i=0; i!=255; i+=5 ) { tft.PWM1out(i); delay(10); } tft.PWM1out(255); tft.fillScreen(RA8875_RED); delay(500); tft.fillScreen(RA8875_YELLOW); delay(500); tft.fillScreen(RA8875_GREEN); delay(500); tft.fillScreen(RA8875_CYAN); delay(500); tft.fillScreen(RA8875_MAGENTA); delay(500); tft.fillScreen(RA8875_BLACK); // Try some GFX acceleration! tft.drawCircle(100, 100, 50, RA8875_BLACK); tft.fillCircle(100, 100, 49, RA8875_GREEN); tft.fillRect(11, 11, 398, 198, RA8875_BLUE); tft.drawRect(10, 10, 400, 200, RA8875_GREEN); tft.fillRoundRect(200, 10, 200, 100, 10, RA8875_RED); tft.drawPixel(10,10,RA8875_BLACK); tft.drawPixel(11,11,RA8875_BLACK); tft.drawLine(10, 10, 200, 100, RA8875_RED); tft.drawTriangle(200, 15, 250, 100, 150, 125, RA8875_BLACK); tft.fillTriangle(200, 16, 249, 99, 151, 124, RA8875_YELLOW); tft.drawEllipse(300, 100, 100, 40, RA8875_BLACK); tft.fillEllipse(300, 100, 98, 38, RA8875_GREEN); // Argument 5 (curvePart) is a 2-bit value to control each corner (select 0, 1, 2, or 3) tft.drawCurve(50, 100, 80, 40, 2, RA8875_BLACK); tft.fillCurve(50, 100, 78, 38, 2, RA8875_WHITE); pinMode(RA8875_INT, INPUT); digitalWrite(RA8875_INT, HIGH); tft.touchEnable(true); Serial.print("Status: "); Serial.println(tft.readStatus(), HEX); Serial.println("Waiting for touch events ..."); } void loop() { float xScale = 1024.0F/tft.width(); float yScale = 1024.0F/tft.height(); /* Wait around for touch events */ if (! digitalRead(RA8875_INT)) { if (tft.touched()) { Serial.print("Touch: "); tft.touchRead(&tx, &ty); Serial.print(tx); Serial.print(", "); Serial.println(ty); /* Draw a circle */ tft.fillCircle((uint16_t)(tx/xScale), (uint16_t)(ty/yScale), 4, RA8875_WHITE); } } }