はじめに
MaixAmigoは押しボタンスイッチ以外にタッチスクリーンも利用できます。Sipeed社のHPのスペックにはFT6X36という記載があります。
タッチスクリーン
MaixPyにはtouchscreenでタッチスクリーンが使える実装もあるようですが、デフォルトのMaixPyはNS2009のみ対応していてFT6X36は直接利用できないようです。Sipeedのデモ(demo_touchscreen.py)にFT6X36から取得するロジックを追加してみます。
from machine import I2C
import lcd, image
from board import board_info
from fpioa_manager import fm
from Maix import GPIO
import utime
ENTER_KEY = 23
FT6X36_ADDR = 0x38
PIN_23 = 33 # FT6X36 irq
class TouchSensor:
i2c, key = None, None
STATUS_IDLE = -1
STATUS_PRESS = 0
STATUS_MOVE = 1
STATUS_RELEASE = 2
# def irq(GPIO):
# key.disirq()
# key.irq(TouchScreen.irq, GPIO.IRQ_BOTH, GPIO.WAKEUP_NOT_SUPPORT, 7)
def init(i2c_dev=None):
TouchSensor.i2c = i2c_dev
if TouchSensor.i2c == None:
print("FT6X36 init error")
return False
if not (FT6X36_ADDR in TouchSensor.i2c.scan()):
print("FT6X36 not found")
return False
vendorID = TouchSensor.i2c.readfrom_mem(FT6X36_ADDR, 0xA8, 1, mem_size=8)
chipID = TouchSensor.i2c.readfrom_mem(FT6X36_ADDR, 0xA3, 1, mem_size=8)
if (vendorID != b'\x11'):
print("FT6X36 not found")
return False
if (chipID != b'\x06' and chipID != b'\x26' and chipID != b'\x36'):
print("FT6X36 not found")
return False
# init
TouchSensor.i2c.writeto_mem(FT6X36_ADDR, 0x00, 0x00, mem_size=8) # device_mode:
TouchSensor.i2c.writeto_mem(FT6X36_ADDR, 0x80, 22, mem_size=8) # threshhold:
TouchSensor.i2c.writeto_mem(FT6X36_ADDR, 0x88, 0x0E, mem_size=8) # touchrate_active:
# fm.register(PIN_23, fm.fpioa.GPIOHS0)
# key = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_NONE)
# utime.sleep_ms(500)
# key.value()
# key.irq(TouchSensor.irq, GPIO.IRQ_BOTH, GPIO.WAKEUP_NOT_SUPPORT, 7)
def deinit():
key.disirq()
fm.unregister(PIN_23, fm.fpioa.GPIOHS0)
def read():
dat = TouchSensor.i2c.readfrom_mem(FT6X36_ADDR, 0x00, 16, mem_size=8)
status = (dat[3] >> 6) & 0x0F
x = (dat[3] << 8) & 0x0F00 | dat[4]
y = (dat[5] << 8) & 0x0F00 | dat[6]
ret_x = y - 80
ret_y = 280 - x
if ret_y < 0:
ret_y = 0
return status, ret_x, ret_y
lcd.init(freq=20000000)
i2c = I2C(I2C.I2C0, freq=400000, scl=24, sda=27)
TouchSensor.init(i2c)
fm.register(ENTER_KEY, fm.fpioa.GPIO1, force=True)
btn_clear = GPIO(GPIO.GPIO1, GPIO.IN)
lcd.clear()
img = image.Image()
img.draw_rectangle(0, 0, 320, 240, lcd.RED)
status_last = TouchSensor.STATUS_IDLE
x_last = 0
y_last = 0
draw = False
while True:
(status,x,y) = TouchSensor.read()
print(status, x, y)
if draw:
img.draw_line((x_last, y_last, x, y))
if status_last!=status:
if (status==TouchSensor.STATUS_PRESS or status == TouchSensor.STATUS_MOVE):
draw = True
else:
draw = False
status_last = status
lcd.display(img)
x_last = x
y_last = y
if btn_clear.value() == 0:
img.clear()