Pocket-sized Drawing Tablet | Arduino

by KIRSCHMANTIMOTHY in Circuits > Arduino

1861 Views, 5 Favorites, 0 Comments

Pocket-sized Drawing Tablet | Arduino

WIN_20200704_15_12_45_Pro.jpg
WIN_20200704_15_05_03_Pro.jpg
WIN_20200704_15_05_09_Pro.jpg
WIN_20200704_15_05_22_Pro.jpg
WIN_20200704_15_05_31_Pro.jpg
WIN_20200704_15_05_50_Pro.jpg

In this instructable I will tech you how to make a pocket-sized Arduino powered drawing tablet at home.

Supplies

All you need is an Arduino Uno of Mega,

and an arduino tft screen.

I powered mine with a nine volt battery.

WIN_20200704_15_06_12_Pro.jpg
WIN_20200704_15_06_16_Pro.jpg
WIN_20200704_15_06_18_Pro.jpg

Simply push your tft screen into place on top of the arduino.

WIN_20200704_15_11_56_Pro.jpg
WIN_20200704_15_12_55_Pro.jpg

Now, plug your arduino into your computer. Open up the arduino ide and copy this code into it then upload:

#include // Core graphics library #include // Hardware-specific library #include

#if defined(__SAM3X8E__) #undef __FlashStringHelper::F(string_literal) #define F(string_literal) string_literal #endif

// When using the BREAKOUT BOARD only, use these 8 data lines to the LCD: // For the Arduino Uno, Duemilanove, Diecimila, etc.: // D0 connects to digital pin 8 (Notice these are // D1 connects to digital pin 9 NOT in order!) // D2 connects to digital pin 2 // D3 connects to digital pin 3 // D4 connects to digital pin 4 // D5 connects to digital pin 5 // D6 connects to digital pin 6 // D7 connects to digital pin 7

// For the Arduino Mega, use digital pins 22 through 29 // (on the 2-row header at the end of the board). // D0 connects to digital pin 22 // D1 connects to digital pin 23 // D2 connects to digital pin 24 // D3 connects to digital pin 25 // D4 connects to digital pin 26 // D5 connects to digital pin 27 // D6 connects to digital pin 28 // D7 connects to digital pin 29

// For the Arduino Due, use digital pins 33 through 40 // (on the 2-row header at the end of the board). // D0 connects to digital pin 33 // D1 connects to digital pin 34 // D2 connects to digital pin 35 // D3 connects to digital pin 36 // D4 connects to digital pin 37 // D5 connects to digital pin 38 // D6 connects to digital pin 39 // D7 connects to digital pin 40 /* #define YP 9 // must be an analog pin, use "An" notation! #define XM 8 // must be an analog pin, use "An" notation! #define YM A2 // can be a digital pin #define XP A3 // can be a digital pin */

#define YP A3 // must be an analog pin, use "An" notation! #define XM A2 // must be an analog pin, use "An" notation! #define YM 9 // can be a digital pin #define XP 8 // can be a digital pin /* #define TS_MINX 50 #define TS_MAXX 920

#define TS_MINY 100 #define TS_MAXY 940 */ //Touch For New ILI9341 TP #define TS_MINX 120 #define TS_MAXX 900

#define TS_MINY 70 #define TS_MAXY 920

// For better pressure precision, we need to know the resistance // between X+ and X- Use any multimeter to read it // For the one we're using, its 300 ohms across the X plate TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

#define LCD_CS A3 #define LCD_CD A2 #define LCD_WR A1 #define LCD_RD A0 // optional #define LCD_RESET A4

// Assign human-readable names to some common 16-bit color values: #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF

Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

#define BOXSIZE 40 #define PENRADIUS 3 int oldcolor, currentcolor;

void setup(void) { Serial.begin(9600); Serial.println(F("Paint!")); tft.reset(); uint16_t identifier = tft.readID(); if(identifier == 0x9325) { Serial.println(F("Found ILI9325 LCD driver")); } else if(identifier == 0x9328) { Serial.println(F("Found ILI9328 LCD driver")); } else if(identifier == 0x4535) { Serial.println(F("Found LGDP4535 LCD driver")); }else if(identifier == 0x7575) { Serial.println(F("Found HX8347G LCD driver")); } else if(identifier == 0x9341) { Serial.println(F("Found ILI9341 LCD driver")); } else if(identifier == 0x8357) { Serial.println(F("Found HX8357D LCD driver")); } else if(identifier==0x0101) { identifier=0x9341; Serial.println(F("Found 0x9341 LCD driver")); }else { Serial.print(F("Unknown LCD driver chip: ")); Serial.println(identifier, HEX); Serial.println(F("If using the Elegoo 2.8\" TFT Arduino shield, the line:")); Serial.println(F(" #define USE_Elegoo_SHIELD_PINOUT")); Serial.println(F("should appear in the library header (Elegoo_TFT.h).")); Serial.println(F("If using the breakout board, it should NOT be #defined!")); Serial.println(F("Also if using the breakout, double-check that all wiring")); Serial.println(F("matches the tutorial.")); identifier=0x9341; }

tft.begin(identifier); tft.setRotation(2);

tft.fillScreen(BLACK);

tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, GREEN); tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, CYAN); tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, BLUE); tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, MAGENTA); // tft.fillRect(BOXSIZE*6, 0, BOXSIZE, BOXSIZE, WHITE); tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); currentcolor = RED; pinMode(13, OUTPUT); }

#define MINPRESSURE 10 #define MAXPRESSURE 1000

void loop() { digitalWrite(13, HIGH); TSPoint p = ts.getPoint(); digitalWrite(13, LOW);

// if sharing pins, you'll need to fix the directions of the touchscreen pins //pinMode(XP, OUTPUT); pinMode(XM, OUTPUT); pinMode(YP, OUTPUT); //pinMode(YM, OUTPUT);

// we have some minimum pressure we consider 'valid' // pressure of 0 means no pressing!

if (p.z > MINPRESSURE && p.z < MAXPRESSURE) { /* Serial.print("X = "); Serial.print(p.x); Serial.print("\tY = "); Serial.print(p.y); Serial.print("\tPressure = "); Serial.println(p.z); */ if (p.y < (TS_MINY-5)) { Serial.println("erase"); // press the bottom of the screen to erase tft.fillRect(0, BOXSIZE, tft.width(), tft.height()-BOXSIZE, BLACK); } // scale from 0->1023 to tft.width p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0); //p.x = tft.width()-map(p.x, TS_MINX, TS_MAXX, tft.width(), 0); p.y = (tft.height()-map(p.y, TS_MINY, TS_MAXY, tft.height(), 0)); //p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0); /* Serial.print("("); Serial.print(p.x); Serial.print(", "); Serial.print(p.y); Serial.println(")"); */ if (p.y < BOXSIZE) { oldcolor = currentcolor;

if (p.x < BOXSIZE) { currentcolor = RED; tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE); } else if (p.x < BOXSIZE*2) { currentcolor = YELLOW; tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, WHITE); } else if (p.x < BOXSIZE*3) { currentcolor = GREEN; tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, WHITE); } else if (p.x < BOXSIZE*4) { currentcolor = CYAN; tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, WHITE); } else if (p.x < BOXSIZE*5) { currentcolor = BLUE; tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, WHITE); } else if (p.x < BOXSIZE*6) { currentcolor = MAGENTA; tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, WHITE); }

if (oldcolor != currentcolor) { if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED); if (oldcolor == YELLOW) tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, YELLOW); if (oldcolor == GREEN) tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, GREEN); if (oldcolor == CYAN) tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, CYAN); if (oldcolor == BLUE) tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, BLUE); if (oldcolor == MAGENTA) tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, MAGENTA); } } if (((p.y-PENRADIUS) > BOXSIZE) && ((p.y+PENRADIUS) < tft.height())) { tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor); } } }


If that uploads correctly, you should have a working drawing tablet! Congratulations!! 😀