LoginSignup
0
0

More than 5 years have passed since last update.

mrubyでタッチパネル

Last updated at Posted at 2019-04-19

mrubyで小型の液晶で良く採用されているXPT2046というタッチパネルのコントローラーからデータを拾ってみました。

スクリーンショット(2019-04-19 23.35.20).png

データ量が少ないので、mruby-bsdgpioで1ビット単位での処理になります。

CS = 163
DCLK = 164
DOUT = 166
DIN = 165
PENIRQN = 130

XPOS = (0x80 | 0x50)
YPOS = (0x80 | 0x10)

def getxy(g)
  g.set(DCLK, 0)
  g.set(CS, 0)
  g.set(DIN, 0)
  x = 0
  y = 0
  trans = 8 * 5
  trans.times do | n |
    if n <= 7 && (XPOS & (1 << (7 - n))) != 0
      g.set(DIN, 1)
    elsif n >= 16 && n <= 23 && (YPOS & (1 << (23 - n))) != 0
      g.set(DIN, 1)
    else
      g.set(DIN, 0)
    end
    g.set(DCLK, 1)
    bit = g.get(DOUT)
    g.set(DCLK, 0)
    if n >= 8 && n <= 19
      x = x | (bit << (19 - n))
    end
    if n >= 24 && n <= 35
      y = y | (bit << (35 - n))
    end
  end
  g.set(CS, 1)

  return [x, y]
end

g = BsdGpio.new(0)

g.setflags(PENIRQN, BsdGpio::INPUT)
g.setflags(CS, BsdGpio::OUTPUT)
g.setflags(DCLK, BsdGpio::OUTPUT)
g.setflags(DIN, BsdGpio::OUTPUT)
g.setflags(DOUT, BsdGpio::INPUT)

g.set(CS, 1)

while 1 do
  if g.get(PENIRQN) == 0
    p "TOUCH"
    p getxy(g)
    sleep(1)
  end
end

この処理はSPIと同じでSPIドライバーがあればそれでも処理できるのですが、今回試したAllwinner A10のSPIドライバーが無かったのでGPIOのBitbangでの処理しました。

12ビットなので0-4096ですが、自分の手元にあった2.8インチのモジュールではx,yとも300-1600くらいの値のようです。

このチップはへんなアクセスをすると、ハングアップしてしまい、電源を切っても復帰せず結構手間がかかりました。

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