Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Martin Ayotte 2015-12-04 11:13:31 -05:00
commit c9d796cdf1
8 changed files with 355 additions and 1 deletions

View File

@ -9,7 +9,7 @@ Use of these files is at your own risk.
##Summary:
This repo contains, the "Hardware" files to support STM32 based boards on Arduino version 1.5.x to the latest version (currently 1.6.3) including [LeafLabs Maple, and Maple mini](http://www.leaflabs.com/about-maple/), and other generic STM32F103 boards
This repo contains, the "Hardware" files to support STM32 based boards on Arduino version 1.6.4 and 1.6.5 including [LeafLabs Maple, and Maple mini](http://www.leaflabs.com/about-maple/), and other generic STM32F103 boards
***PRIMARY SUPPORT FORUM: http://www.stm32duino.com/***

View File

@ -0,0 +1,78 @@
Description
---
A simple **XPT2046** Touch Screen library for STM32 micro-controllers.
* The first example sketch (**TouchTest.ino**) checks if the touch screen has been pressed and prints the X,Y coordinates on the Serial port 1.
* The second example sketch (**TouchButtons.ino**) creates some virtual buttons defined by the user.
Copyright (c) 03 December 2015 by **Vassilis Serasidis**
Home: http://www.serasidis.gr , https://github.com/Serasidis
The library is written for STM32duino (http://stm32duino.com)
```
//Create 4*2=8 virtual buttons
#define LINES 2 //Divide the touch screen into 2 lines
#define COLUMNS 4 //Divide the touch screen into 4 columns
```
Screenshot of the Serial port 1 (TouchButtons.ino)
```
-------------------------------------------------
XPT2046 touch screen buttons
Copyright (c) 02 Dec 2015 by Vassilis Serasidis
Home: http://www.serasidis.gr
-------------------------------------------------
Button: 1
X: 1097
Y: 800
Button: 2
X: 3455
Y: 617
Button: 3
X: 684
Y: 1483
Button: 4
X: 3412
Y: 1198
Button: 5
X: 860
Y: 2395
Button: 6
X: 3353
Y: 2355
```
PIN Connections between XPT2046 and STM32F103
----
| XPT2046 | STM32F103 |
|:------:|:-----:|
|T_DO|PA6|
|T_DIN|PA7|
|T_CS|PA3|
|T_CLK|PA5|
Selecting the SPI port number and Chip Select pin
----
Can be used other SPI port than the default SPI1 port. Just select the SPI port you want by replacing the following line into the sketch:
```
SPIClass mySPI(1); //Create an SPI instance on SPI1 port.
//SPIClass mySPI(2); //Create an SPI instance on SPI2 port.
```
The Chip select pin can be defined by the user also.
```
#define CS_PIN PA3 // The pin PA3 has been chosen as Chip Select pin.
```

View File

@ -0,0 +1,60 @@
/**
* XPT2046 touch screen buttons.
*
* It divides the touch screen into COLUMNS * LINES areas (4*2=8 buttons) and creates virtual buttons.
* if the touch screen area is pressed and prints on Serial Port 1 the X,Y coordinates.
*
* Copyright (c) 02 Dec 2015 by Vassilis Serasidis
* Home: http://www.serasidis.gr
* email: avrsite@yahoo.gr
*
* The sketch example has been created for using it with STM32Duino (http://www.stm32duino.com)
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "XPT2046_touch.h"
#include <SPI.h>;
#define CS_PIN PA3 // Chip Select pin
#define LINES 2
#define COLUMNS 4
SPIClass mySPI(1); //Create an SPI instance on SPI1 port.
XPT2046_touch ts(CS_PIN, mySPI); // Chip Select pin, SPI port
uint16_t xy[2];
void setup() {
Serial1.begin(9600);
Serial1.println("-------------------------------------------------");
Serial1.println("XPT2046 touch screen buttons");
Serial1.println("Copyright (c) 02 Dec 2015 by Vassilis Serasidis");
Serial1.println("Home: http://www.serasidis.gr");
Serial1.println("-------------------------------------------------");
ts.begin(); //Begin TouchScreen.
ts.setButtonsNumber(COLUMNS, LINES); //Divide the Touch screen area into 4 columns and 2 lines and make them act as buttons.
}
void loop() {
if(ts.read_XY(xy)){ //If the touch screen is preesed, read the X,Y coordinates and print them on Serial port.
uint8_t buttonNumber = ts.getButtonNumber();
if(buttonNumber > 0){
Serial1.print("Button: ");
Serial1.println(buttonNumber);
Serial1.print("X: ");
Serial1.println(xy[0]); //Print X value
Serial1.print("Y: ");
Serial1.println(xy[1]); //Print Y value
Serial1.println();
}
delay(500);
}
}

View File

@ -0,0 +1,51 @@
/**
* XPT2046 Touch Screen Controller example.
*
* It checks if the touch screen area is pressed and prints on Serial Port 1 the X,Y coordinates.
*
* Copyright (c) 02 Dec 2015 by Vassilis Serasidis
* Home: http://www.serasidis.gr
* email: avrsite@yahoo.gr
*
* The sketch example has been created for using it with STM32Duino (http://www.stm32duino.com)
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "XPT2046_touch.h"
#include <SPI.h>;
#define CS_PIN PA3 // Chip Select pin
SPIClass mySPI(1); //Create an SPI instance on SPI1 port.
XPT2046_touch ts(CS_PIN, mySPI); // Chip Select pin, SPI port
uint16_t xy[2];
void setup() {
Serial1.begin(9600);
Serial1.println("-------------------------------------------------");
Serial1.println("XPT2046 example sketch");
Serial1.println("Copyright (c) 02 Dec 2015 by Vassilis Serasidis");
Serial1.println("Home: http://www.serasidis.gr");
Serial1.println("-------------------------------------------------");
ts.begin(); //Begin TouchScreen.
}
void loop() {
if(ts.read_XY(xy)){ //If the touch screen is preesed, read the X,Y coordinates and print them on Serial port.
Serial1.print("X: ");
Serial1.println(xy[0]); //Print X value
Serial1.print("Y: ");
Serial1.println(xy[1]); //Print Y value
Serial1.println();
delay(500);
}
}

View File

@ -0,0 +1,27 @@
#######################################
# Syntax Coloring Map For XPT2046_touch
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
XPT2046_touch KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
begin KEYWORD2
setButtonsNumber KEYWORD2
getButtonNumber KEYWORD2
read_XY KEYWORD2
#######################################
# Instances (KEYWORD2)
#######################################
#######################################
# Constants (LITERAL1)
#######################################

View File

@ -0,0 +1,8 @@
name=Serasidis_XPT2046_touch
version=1.0
author=Vasillis Serasidis.
email=avrsite@yahoo.gr
sentence=A simple XPT2046 Touch screen driver
paragraph=A simple XPT2046 Touch screen driver
url=http://wwww.serasidis.gr
architectures=STM32F1

View File

@ -0,0 +1,88 @@
/**
*
*
*/
#include "Arduino.h"
#include "XPT2046_touch.h"
/****************************************************************************/
XPT2046_touch::XPT2046_touch(uint8_t _cs_pin, SPIClass _spiChan) : cs_pin(_cs_pin), my_SPI(_spiChan){
}
/****************************************************************************/
void XPT2046_touch::begin(){
pinMode(cs_pin, OUTPUT);
digitalWrite(cs_pin, HIGH);
my_SPI.begin();
}
/****************************************************************************/
boolean XPT2046_touch::read_XY(uint16_t *xy){
int z1, z2, tmpH, tmpL;
digitalWrite(cs_pin, LOW);
//Check if touch screen is pressed.
SPI.transfer(B10110011); // Z1
delay(10);
tmpH = (my_SPI.transfer(0) << 5);
tmpL = (my_SPI.transfer(0) >> 3);
z1 = tmpH | tmpL;
SPI.transfer(B11000011); // Z2
delay(10);
tmpH = (my_SPI.transfer(0) << 5);
tmpL = (my_SPI.transfer(0) >> 3);
z2 = tmpH | tmpL;
if((z2 - z1) < Z_THRESHOLD){ //If the touch screen is pressed, read the X,Y coordinates from XPT2046.
my_SPI.transfer(B11010011); // X
delay(10);
tmpH = (my_SPI.transfer(0) << 5);
tmpL = (my_SPI.transfer(0) >> 3);
xy[0] = tmpH | tmpL;
my_SPI.transfer(B10010011); // Y
delay(10);
tmpH = (my_SPI.transfer(0) << 5);
tmpL = (my_SPI.transfer(0) >> 3);
xy[1] = tmpH | tmpL;
digitalWrite(cs_pin, HIGH);
return true;
}
digitalWrite(cs_pin, HIGH);
return false;
}
/****************************************************************************/
void XPT2046_touch::setButtonsNumber(byte columnButtons, byte rowButtons ){
_rowButtons = rowButtons;
_columnButtons = columnButtons;
}
/****************************************************************************/
uint8_t XPT2046_touch::getButtonNumber(){
uint16_t xy[2];
uint8_t tmp, buttonNum;
int div;
if(read_XY(xy)){
div = (X_MAX + X_MIN) / (_columnButtons + 1);
buttonNum = ((xy[1] / div));
div = (Y_MAX + Y_MIN) / _rowButtons;
tmp = ((xy[0] / div));
return ((buttonNum * _rowButtons) + tmp + 1); //Return the button number.
}
return 0; //Touch screen is not pressed.
}
/****************************************************************************/

View File

@ -0,0 +1,42 @@
/**
*
*
*
*
*/
#ifndef XPT2046_touch_h
#define XPT2046_touch_h
#include <Arduino.h>
#include <SPI.h>
#define Z_THRESHOLD 3000
// Pre-defined touch screen calibration for using the 2.4" ILI9341 LCD
#define X_MIN 830
#define X_MAX 3800
#define Y_MIN 550
#define Y_MAX 3550
/**
*
*/
class XPT2046_touch{
private:
uint8_t cs_pin;
SPIClass my_SPI;
uint8_t _rowButtons = 1;
uint8_t _columnButtons = 1;
public:
XPT2046_touch(uint8_t _cs_pin, SPIClass _spiChan); //Contructor.
void begin();
void setButtonsNumber(byte rowButtons, byte columnButtons);
uint8_t getButtonNumber();
boolean read_XY(uint16_t *xy);
};
#endif