LoginSignup
0
0

More than 3 years have passed since last update.

MaixAmigo でタッチスクリーンを使う

Last updated at Posted at 2020-10-18

はじめに

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()

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0