Tonight I did a successful interface to a 1.8" TFT display to the Baby-O using the Arduino code provided from the ladyada.net website. http://www.ladyada.net/products/18tftbreakout/
I used a modified version of the Pololu method for programming Orangatangs using the Arduino Environment https://www.pololu.com/docs/0J17 and a modified version of the ladyada Arduino sketch.
I also used the Baby-O serial Tx/Rx pins, PD0/PD1 wired to the Pololu USB AVR Programmer Tx/Rx pins to send text back to my laptop at the end of the main graphic examples for debug info. The serial port was already setup in the Arduino sketch, so I decided to put it to use (9600/8/N/1). (Note: The USB AVR Programmer sets up 2 COM ports. One is used for programming, the other is a TTL port which uses the Tx/Rx pins.)
The sketch code is posted below. I had to use the “File–>Upload Using Programmer” menu option to get the USB AVR Programmer to work. There is another sketch which shows you how to rotate graphics and text on the display. There is a slight learning curve for the display, but you should be able to figure out what is happening from the sketch code and experimentation.
Keep Having Fun.
Charlie D
// Setup for Pololu BabyO328P
// Serial from BabyO has to be wired to the Pololu USB Programmer
// On the Arduino, PDO/PD1 is wired to the ATMEGA16U PD3(Tx)/PD2(Rx)
// Serial Pins 328P Rx/Tx = 30/31 PD0/PD1 (BabyO Header 8/9)
// Wire BabyO 8/9 to Pololu USB Programmer Tx/Rx on header
// Note: Tx(9) gets wired to Rx and Rx(8) to Tx as a NULL MODEM
// Grounds should be connected as well
// You can use any (4 or) 5 pins
// The BabyO uses PD5 and PB3 for Motor Control so I wanted to avoid these
// Since we can use any pins, I decided on PB1, PB2, PB4, PB5
// Arduino 328P BabyO
#define sclk 9 // for BabyO328 use pin 09 Mapped to PB1 (Header 04)
#define mosi 10 // for BabyO328 use pin 10 Mapped to PB2 (Header 05)
#define cs 12 // for BabyO328 use pin 12 Mapped to PB4 (Header 06)
#define dc 13 // for BabyO328 use pin 13 Mapped to PB5 (Header 07)
#define rst 8 // for BabyO328 use pin 08 Mapped to PB0 (Header 03)
// 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
#include <ST7735.h>
// Not sure how the SPI.h is used in the Option 1 (slow method)
// Need to study how SPI is emulated for any pins
#include <SPI.h>
// Option 1: use any pins but a little slower
ST7735 tft = ST7735(cs, dc, mosi, sclk, rst);
// Option 2: must use the hardware SPI pins
// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
// an output. This is much faster - also required if you want
// to use the microSD card (see the image drawing example)
//ST7735 tft = ST7735(cs, dc, rst);
float p = 3.1415926;
void fillpixelbypixel(uint16_t color) {
for (uint8_t x=0; x < tft.width(); x++) {
for (uint8_t y=0; y < tft.height(); y++) {
tft.drawPixel(x, y, color);
}
}
delay(100);
}
void setup(void) {
Serial.begin(9600);
Serial.print("Hello! ");
tft.initR(); // initialize a ST7735R chip
Serial.print("Init Start. ");
tft.writecommand(ST7735_DISPON);
uint16_t time = millis();
tft.fillScreen(BLACK);
time = millis() - time;
Serial.print("Init Complete. ");
Serial.print("Run Time: ");
Serial.println(time, DEC);
delay(500);
//
tft.fillScreen(BLACK);
testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", WHITE);
delay(1000);
// time = millis() - time;
Serial.print("End DrawText Display. ");
// tft print function!
tftPrintTest();
delay(4000);
Serial.print("End PrintTest. ");
//a single pixel
tft.drawPixel(tft.width()/2, tft.height()/2, GREEN);
delay(500);
Serial.print("End DrawPixel. ");
// line draw test
testlines(YELLOW);
delay(500);
Serial.print("End testlines Yellow. ");
// optimized lines
testfastlines(RED, BLUE);
delay(500);
Serial.print("End testFastLines Red Blue. ");
testdrawrects(GREEN);
delay(500);
Serial.print("End testDrawRects Green. ");
testfillrects(YELLOW, MAGENTA);
delay(500);
Serial.print("End testFillRects Yellow Magenta. ");
tft.fillScreen(BLACK);
testfillcircles(10, BLUE);
testdrawcircles(10, WHITE);
Serial.print("End testCircles. ");
testroundrects();
delay(500);
Serial.print("End testRoundRects. ");
testtriangles();
delay(500);
Serial.print("End testTriangles. ");
mediabuttons();
delay(500);
Serial.print("End mediaButtons. ");
Serial.print("Done. ");
delay(1000);
}
void loop() {
tft.writecommand(ST7735_INVON);
delay(500);
tft.writecommand(ST7735_INVOFF);
delay(500);
}
void testlines(uint16_t color) {
tft.fillScreen(BLACK);
for (uint16_t x=0; x < tft.width(); x+=6) {
tft.drawLine(0, 0, x, tft.height()-1, color);
}
for (uint16_t y=0; y < tft.height(); y+=6) {
tft.drawLine(0, 0, tft.width()-1, y, color);
}
tft.fillScreen(BLACK);
for (uint16_t x=0; x < tft.width(); x+=6) {
tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color);
}
for (uint16_t y=0; y < tft.height(); y+=6) {
tft.drawLine(tft.width()-1, 0, 0, y, color);
}
tft.fillScreen(BLACK);
for (uint16_t x=0; x < tft.width(); x+=6) {
tft.drawLine(0, tft.height()-1, x, 0, color);
}
for (uint16_t y=0; y < tft.height(); y+=6) {
tft.drawLine(0, tft.height()-1, tft.width()-1, y, color);
}
tft.fillScreen(BLACK);
for (uint16_t x=0; x < tft.width(); x+=6) {
tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color);
}
for (uint16_t y=0; y < tft.height(); y+=6) {
tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color);
}
}
void testdrawtext(char *text, uint16_t color) {
tft.drawString(0, 0, text, color);
}
void testfastlines(uint16_t color1, uint16_t color2) {
tft.fillScreen(BLACK);
for (uint16_t y=0; y < tft.height(); y+=5) {
tft.drawHorizontalLine(0, y, tft.width(), color1);
}
for (uint16_t x=0; x < tft.width(); x+=5) {
tft.drawVerticalLine(x, 0, tft.height(), color2);
}
}
void testdrawrects(uint16_t color) {
tft.fillScreen(BLACK);
for (uint16_t x=0; x < tft.width(); x+=6) {
tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color);
}
}
void testfillrects(uint16_t color1, uint16_t color2) {
tft.fillScreen(BLACK);
for (uint16_t x=tft.width()-1; x > 6; x-=6) {
tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1);
tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2);
}
}
void testfillcircles(uint8_t radius, uint16_t color) {
for (uint8_t x=radius; x < tft.width(); x+=radius*2) {
for (uint8_t y=radius; y < tft.height(); y+=radius*2) {
tft.fillCircle(x, y, radius, color);
}
}
}
void testdrawcircles(uint8_t radius, uint16_t color) {
for (uint8_t x=0; x < tft.width()+radius; x+=radius*2) {
for (uint8_t y=0; y < tft.height()+radius; y+=radius*2) {
tft.drawCircle(x, y, radius, color);
}
}
}
void testtriangles() {
tft.fillScreen(BLACK);
int color = 0xF800;
int t;
int w = 63;
int x = 159;
int y = 0;
int z = 127;
for(t = 0 ; t <= 15; t+=1) {
tft.drawTriangle(w, y, y, x, z, x, color);
x-=4;
y+=4;
z-=4;
color+=100;
}
}
void testroundrects() {
tft.fillScreen(BLACK);
int color = 100;
int i;
int t;
for(t = 0 ; t <= 4; t+=1) {
int x = 0;
int y = 0;
int w = 127;
int h = 159;
for(i = 0 ; i <= 24; i+=1) {
tft.drawRoundRect(x, y, w, h, 5, color);
x+=2;
y+=3;
w-=4;
h-=6;
color+=1100;
}
color+=100;
}
}
void tftPrintTest() {
tft.fillScreen(BLACK);
tft.setCursor(0, 30);
tft.setTextColor(RED);
tft.setTextSize(1);
tft.println("Hello World!");
tft.setTextColor(YELLOW);
tft.setTextSize(2);
tft.println("Hello World!");
tft.setTextColor(GREEN);
tft.setTextSize(3);
tft.println("Hello World!");
tft.setTextColor(BLUE);
tft.setTextSize(4);
tft.print(1234.567);
delay(1500);
tft.goHome(); // go to 0, 0
tft.fillScreen(BLACK);
tft.setTextColor(WHITE);
tft.setTextSize(0);
tft.println("Hello World!");
tft.setTextSize(1);
tft.setTextColor(GREEN);
tft.print(p, 6);
tft.println(" Want pi?");
tft.println(" ");
tft.print(8675309, HEX); // print 8,675,309 out in HEX!
tft.println(" Print HEX!");
tft.println(" ");
tft.setTextColor(WHITE);
tft.println("Sketch has been");
tft.println("running for: ");
tft.setTextColor(MAGENTA);
tft.print(millis() / 1000);
tft.setTextColor(WHITE);
tft.print(" seconds.");
}
void mediabuttons() {
// play
tft.fillScreen(BLACK);
tft.fillRoundRect(25, 10, 78, 60, 8, WHITE);
tft.fillTriangle(42, 20, 42, 60, 90, 40, RED);
delay(500);
// pause
tft.fillRoundRect(25, 90, 78, 60, 8, WHITE);
tft.fillRoundRect(39, 98, 20, 45, 5, GREEN);
tft.fillRoundRect(69, 98, 20, 45, 5, GREEN);
delay(500);
// play color
tft.fillTriangle(42, 20, 42, 60, 90, 40, BLUE);
delay(50);
// pause color
tft.fillRoundRect(39, 98, 20, 45, 5, RED);
tft.fillRoundRect(69, 98, 20, 45, 5, RED);
// play color
tft.fillTriangle(42, 20, 42, 60, 90, 40, GREEN);
}