touch driver
This commit is contained in:
parent
7b09c302df
commit
960588f527
@ -1,2 +1,4 @@
|
|||||||
|
0.2.0
|
||||||
|
- add AD7843 touch panel driver
|
||||||
0.1.0
|
0.1.0
|
||||||
- extract library from Doton project
|
- extract library from Doton project
|
@ -1,5 +1,6 @@
|
|||||||
import RPi.GPIO
|
import RPi.GPIO
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
sys.path.append("../../")
|
sys.path.append("../../")
|
||||||
from gfxlcd.driver.ili9325.gpio import GPIO as ILIGPIO
|
from gfxlcd.driver.ili9325.gpio import GPIO as ILIGPIO
|
||||||
from gfxlcd.driver.ili9325.ili9325 import ILI9325
|
from gfxlcd.driver.ili9325.ili9325 import ILI9325
|
||||||
@ -7,18 +8,25 @@ from gfxlcd.driver.ad7843.ad7853 import AD7843
|
|||||||
RPi.GPIO.setmode(RPi.GPIO.BCM)
|
RPi.GPIO.setmode(RPi.GPIO.BCM)
|
||||||
|
|
||||||
|
|
||||||
# lcd_tft = ILI9325(240, 320, ILIGPIO())
|
lcd_tft = ILI9325(240, 320, ILIGPIO())
|
||||||
# lcd_tft.init()
|
lcd_tft.init()
|
||||||
|
|
||||||
|
|
||||||
touch = AD7843(240, 320)
|
def callback(position):
|
||||||
|
print('(x,y)', position)
|
||||||
|
|
||||||
|
touch = AD7843(240, 320, 26, callback)
|
||||||
|
|
||||||
|
touch.init()
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
ret = touch.get_position()
|
time.sleep(0.05)
|
||||||
if ret:
|
# ret = touch.get_position()
|
||||||
# s.draw_pixel(ret[0], ret[1])
|
# if ret:
|
||||||
print(ret[0], ret[1])
|
# print(ret[0], ret[1])
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
touch.close()
|
touch.close()
|
||||||
|
# RPi.GPIO.cleanup()
|
||||||
|
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import spidev # pylint: disable=I0011,F0401
|
import spidev # pylint: disable=I0011,F0401
|
||||||
|
import RPi.GPIO
|
||||||
|
|
||||||
|
|
||||||
class AD7843(object):
|
class AD7843(object):
|
||||||
"""AD7843 class"""
|
"""AD7843 class"""
|
||||||
def __init__(self, width, height, spi=0):
|
def __init__(self, width, height, int_pin=None, callback=None, spi=0):
|
||||||
self.width = width
|
self.width = width
|
||||||
self.height = height
|
self.height = height
|
||||||
self.spi = spidev.SpiDev()
|
self.spi = spidev.SpiDev()
|
||||||
@ -16,6 +17,17 @@ class AD7843(object):
|
|||||||
'ratio_x': 14.35,
|
'ratio_x': 14.35,
|
||||||
'ratio_y': 10.59
|
'ratio_y': 10.59
|
||||||
}
|
}
|
||||||
|
self.int_pin = int_pin
|
||||||
|
self.callback = callback
|
||||||
|
self.bouncetime = 500
|
||||||
|
|
||||||
|
def init(self):
|
||||||
|
"""some init functions"""
|
||||||
|
if self.int_pin:
|
||||||
|
RPi.GPIO.setup(self.int_pin, RPi.GPIO.IN)
|
||||||
|
RPi.GPIO.add_event_detect(
|
||||||
|
self.int_pin, RPi.GPIO.BOTH, callback=self._interrupt, bouncetime=self.bouncetime
|
||||||
|
)
|
||||||
|
|
||||||
def get_x(self, value):
|
def get_x(self, value):
|
||||||
"""correct value to x"""
|
"""correct value to x"""
|
||||||
@ -25,26 +37,29 @@ class AD7843(object):
|
|||||||
"""correct value to y"""
|
"""correct value to y"""
|
||||||
return self.height - int((value - self.correction['y']) / self.correction['ratio_y'])
|
return self.height - int((value - self.correction['y']) / self.correction['ratio_y'])
|
||||||
|
|
||||||
|
def _interrupt(self, channel):
|
||||||
|
"""call users callback"""
|
||||||
|
self.callback(self.get_position())
|
||||||
|
|
||||||
def get_position(self):
|
def get_position(self):
|
||||||
"""get touch coords"""
|
"""get touch coords"""
|
||||||
buffer = []
|
buffer = []
|
||||||
while len(buffer) < 20:
|
while len(buffer) < 20:
|
||||||
self.spi.xfer2([0xd0])
|
self.spi.xfer2([0xd0])
|
||||||
rx = self.spi.readbytes(2)
|
recvx = self.spi.readbytes(2)
|
||||||
self.spi.xfer2([0x90])
|
self.spi.xfer2([0x90])
|
||||||
ry = self.spi.readbytes(2)
|
recvy = self.spi.readbytes(2)
|
||||||
|
|
||||||
tc_rx = rx[0] << 5
|
tc_rx = recvx[0] << 5
|
||||||
tc_rx |= rx[1] >> 3
|
tc_rx |= recvx[1] >> 3
|
||||||
|
|
||||||
tc_ry = ry[0] << 5
|
tc_ry = recvy[0] << 5
|
||||||
tc_ry |= ry[1] >> 3
|
tc_ry |= recvy[1] >> 3
|
||||||
|
|
||||||
x = self.get_x(tc_rx)
|
pos_x = self.get_x(tc_rx)
|
||||||
y = self.get_y(tc_ry)
|
pos_y = self.get_y(tc_ry)
|
||||||
if x < 0 or x > self.width or y < 0 or y > self.height:
|
if 0 <= pos_x <= self.width and 0 <= pos_y <= self.height:
|
||||||
return None
|
buffer.append((pos_x, pos_y))
|
||||||
buffer.append((x, y))
|
|
||||||
|
|
||||||
return self._calculate_avr(buffer)
|
return self._calculate_avr(buffer)
|
||||||
|
|
||||||
@ -59,6 +74,8 @@ class AD7843(object):
|
|||||||
return int(sum_x / len(points)), int(sum_y / len(points))
|
return int(sum_x / len(points)), int(sum_y / len(points))
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
"""vlose action"""
|
"""close action"""
|
||||||
|
if self.int_pin:
|
||||||
|
RPi.GPIO.remove_event_detect(self.int_pin)
|
||||||
self.spi.close()
|
self.spi.close()
|
||||||
|
|
||||||
|
48
readme.md
48
readme.md
@ -9,13 +9,18 @@ Supported:
|
|||||||
- ssd1306 via SPI
|
- ssd1306 via SPI
|
||||||
- nju6450 via GPIO
|
- nju6450 via GPIO
|
||||||
|
|
||||||
|
And for touch panels:
|
||||||
|
|
||||||
|
- ad7843 via SPI, uses irq or not
|
||||||
|
|
||||||
|
|
||||||
On NJU and SSD uses buffer to keep current content as help for page operations.
|
On NJU and SSD uses buffer to keep current content as help for page operations.
|
||||||
|
|
||||||
Wiring is below
|
Wiring is below
|
||||||
|
|
||||||
Demos are in demos directory
|
Demos are in demos directory
|
||||||
|
|
||||||
Initialization
|
LCD initialization
|
||||||
===
|
===
|
||||||
## SSD1306
|
## SSD1306
|
||||||
### SPI
|
### SPI
|
||||||
@ -125,6 +130,47 @@ lcd.threshold = 255 - for images a threshold between black and white (on monochr
|
|||||||
lcd.transparency_color = [110, 57] #110 - color(s) that are skipped during drawing an image
|
lcd.transparency_color = [110, 57] #110 - color(s) that are skipped during drawing an image
|
||||||
|
|
||||||
|
|
||||||
|
## Touch panels
|
||||||
|
===
|
||||||
|
|
||||||
|
## AD7843
|
||||||
|
|
||||||
|
Constructor:
|
||||||
|
|
||||||
|
AD7843(width, height, (T_INT), (callback))
|
||||||
|
|
||||||
|
Can be used with T_INT
|
||||||
|
|
||||||
|
def callback(position):
|
||||||
|
print('(x,y)', position)
|
||||||
|
|
||||||
|
touch = AD7843(240, 320, 26, callback)
|
||||||
|
touch.init()
|
||||||
|
|
||||||
|
or without:
|
||||||
|
|
||||||
|
touch = AD7843(240, 320)
|
||||||
|
touch.init()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
time.sleep(0.05)
|
||||||
|
ret = touch.get_position()
|
||||||
|
if ret:
|
||||||
|
print(ret[0], ret[1])
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
touch.close()
|
||||||
|
|
||||||
|
There is no automatic calibration. It must be done manually.
|
||||||
|
|
||||||
|
self.correction = {
|
||||||
|
'x': 364,
|
||||||
|
'y': 430,
|
||||||
|
'ratio_x': 14.35,
|
||||||
|
'ratio_y': 10.59
|
||||||
|
}
|
||||||
|
|
||||||
Wiring
|
Wiring
|
||||||
===
|
===
|
||||||
|
|
||||||
|
2
setup.py
2
setup.py
@ -13,7 +13,7 @@ def read(*paths):
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='gfxlcd',
|
name='gfxlcd',
|
||||||
version='0.1.2',
|
version='0.2.0',
|
||||||
description='gfxlcd is a handler for grpahical lcds: ILI9328, SSD1306, NJU6450 @ Raspberry Pi.',
|
description='gfxlcd is a handler for grpahical lcds: ILI9328, SSD1306, NJU6450 @ Raspberry Pi.',
|
||||||
keywords=['gfxlcd', 'raspberry pi' ,'ili9328' ,'ssd1306', 'nju6450', 'lcd', 'graphical lcd'],
|
keywords=['gfxlcd', 'raspberry pi' ,'ili9328' ,'ssd1306', 'nju6450', 'lcd', 'graphical lcd'],
|
||||||
long_description=(read('readme.md')),
|
long_description=(read('readme.md')),
|
||||||
|
Loading…
Reference in New Issue
Block a user