United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

DesignSpark Pmod HAT AdapterでJSTK2モジュールを利用してみた

「Pmod」という拡張ボード用の標準規格をご存じだろうか?もともとはFPGAボードやPICマイコンボードの試作開発用途としてDigilent社によって開発され、現在では豊富なラインナップが提供されている。

Pmod1_68231ab6cb570dd6e0c899f9616ee3065d64219f.png


近年組込み開発のプロトタイプにおいてもRaspberry Piを利用していることから、昨年ついにDesignSparkブランドとコラボし、PmodをRaspberry Piで利用可能にするDesignSpark Pmod HAT (144-8419) (以下Pmod HATと呼ぶ)が発売された。今回はそのPmod HATにてJSTK2(ジョイスティック2)というモジュールの利用方法について紹介しよう。

%5B0%5DMain_Header_a152f96dacfba16233350524d6a881f7671ab26b.jpg

はじめに

まずPmodについて、詳しくはこちらの記事にて紹介されているので是非参考にしてほしい。

上記の記事は非常に簡単にしか紹介されていない。もし実際にRaspberry PiでのPmodの利用を検討する方はこちらのサイトからほしい情報を探してみてほしい。

本記事では上記の記事やサイトを参考にするだけでは利用できない(対応していない)モジュールの利用方法について紹介する。今回はその代表としてJSTK2を扱うことにした。

インターネットやDesignSparkでPmod HATの利用方法について検索を行うとこちらの記事を見つけることができるはずだ。ここでは基本的な利用方法について紹介されており、お持ちのモジュールがこちらにあれば、この方法で簡単に利用できる。

しかし、実はPmod HATで利用しやすいように提供されているライブラリは上記の記事で紹介されている以下の6つのモジュールのみに限られている。

  • Pmod AD1
  • Pmod HB3
  • Pmod ISNS20
  • Pmod MIC3
  • Pmod OLEDrgb
  • Pmod TC1

そう、つまりArduinoなどでこれまで利用していた様々なモジュールすべてをRaspberry Piで利用できるというわけではないのだ。JSTK2も同じようにライブラリは提供されていない。

本記事ではTC1という熱電対センサPmodモジュール(温度を計測できるPmodモジュール)のサンプルプログラムを解析しJSTK2の制御に応用してみた。記事の最後に、今回利用、編集したファイルについては添付しておくので参考にしてほしい。

注意!以降はDesignSparkのライブラリが既に導入された後とする。導入できていない人はこちらの記事を参考にして導入しよう。

1. Pmod TC1の動作を確認する

まず、JSKT2を動作させるためにTC1の動作を確認していく。

Raspberry Pi 3 BにPmod HATを載せ、そこにTC1モジュールを接続した。

%5B1.1%5DTC1-demo__66ac7613d55e8212333cdfd77a0859b22760deb1.jpg
Pmod HATのJBA端子へTC1モジュールを接続する様子

Pmod HATには接続端子が3つ存在しているが、実は各モジュールで利用できる端子は決まっていることに注意しなければいけない。例えば、TC1はJBA(JBの上がA、下がJBのBである)に接続しないといけない。これらは通信に必要な信号数などによって利用する端子、端子の数(JBA, JBB両方を利用するモジュールもある)は変わるためだ。

最初に紹介したPmod HATの記事においてライブラリをインストールしたのであれば、以下のPythonプログラムで簡単に温度の値を読み取ることができる。

# -*- coding: utf-8 -*-
# Copyright (c) 2017 RS Components Ltd
# SPDX-License-Identifier: MIT License

"""
Print the celsius reading out.
"""

from DesignSpark.Pmod.HAT import createPmod
import time

if __name__ == '__main__':
    
    therm = createPmod('TC1','JBA')
    time.sleep(0.1)
    
    try:
        while True:
            cel = therm.readCelcius()
            print(cel)
            #intn = therm.readInternal()
            #print(intn)
            time.sleep(0.8)
    except KeyboardInterrupt:
        pass
    finally:
        therm.cleanup()

これをPmodTest.pyとして保存し、次のように実行した。

%5B2%5DHow_to_run_TC1_882cffa38cdcf23a0fcdc19f3d048bca5af98bed.png


サンプルを参考にTC1モジュールから温度を繰り返し取得することができた。このサンプルの解析を行い、TC1以外のモジュール、ここではJSTK2への応用について検討してみたい。

2. ライブラリについての解析

利用しているライブラリ「DesignSpark.Pmod.HAT」について解析し、JKST2が利用できないか調べてみた。まず、インストールされているライブラリのディレクトリについて確認を行う。以下のようにPythonをコマンドラインから実行し、ライブラリが存在するディレクトリの位置を確認する。

%5B7%5DDirectly_82bfbf34665b91e18fc28823e06f70ab1470bfb5.png

このディレクトリには以下のような各ドライバの役割を果たすであろうプログラムと、その管理を行うであろうプログラムが存在していることが分かった。lsコマンドでどのようなファイルが存在しているかを確認する。

%5B8%5DFiles_59edfdb05e37aba89faf8ec15df2f1cfda91a6e4.png

モジュールが利用できるかどうかを判断するライブラリのプログラムは上の図のHAT.pyであることが分かった。このプログラムは指定されたモジュールのドライバが存在するかを判断し、存在する場合はそのドライバのプログラム(TC1の場合はTC1.py)を呼び出す役割を果たす。

よって、ここでJSTK2を利用するためには以下を行う必要がある。おそらく他のモジュールも同様のはずだ。

  • HAT.pyの必要な個所について拡張を行う
  • JSTK2.pyを作成する
  • プログラムの作成

 

2.1. HAT.pyの拡張

ルート権限にてHAT.pyをvimなどのエディタで開き、編集を行う。変更が必要なのは以下の3箇所である。

1. importの追加(HAT.py 17行目あたり)

from __future__ import absolute_import 
from DesignSpark.Pmod import TC1 
from DesignSpark.Pmod import AD1 
from DesignSpark.Pmod import MIC3 
from DesignSpark.Pmod import HB3 
from DesignSpark.Pmod import ISNS20 
from DesignSpark.Pmod import OLEDrgb 
from DesignSpark.Pmod import Error 
#add for Extention 
from DesignSpark.Pmod import JSTK2 

2. Dict(利用可能なモジュールの確認のための辞書の役割を果たしている)への追加(HAT.py 66行目あたり) 

moduleDict = { 
    'TC1': TC1, 
    'AD1': AD1, 
    'MIC3': MIC3, 
    'HB3': HB3, 
    'ISNS20': ISNS20, 
    'OLEDrgb': OLEDrgb, 
    'JSTK2': JSTK2 
    } 

3. モジュール名とドライバプログラムとの対応付け(HAT.py 179行目あたり) 

        ## All qualifiers passed 
        port.setUseModule(moduleName) 
 
        if moduleName == 'HB3': 
            return HB3.PmodHB3(port) 
 
        if moduleName == 'AD1': 
            return AD1.PmodAD1(port) 
 
        if moduleName == 'ISNS20': 
            return ISNS20.PmodISNS20(port) 
 
        if moduleName == 'MIC3': 
            return MIC3.PmodMIC3(port) 
 
        if moduleName == 'TC1': 
            return TC1.PmodTC1(port) 
 
        if moduleName == 'OLEDrgb': 
            return OLEDrgb.PmodOLEDrgb(port) 
 
        if moduleName == 'JSTK2': 
            return JSTK2.PmodJSTK2(port) 

 

2.2. JSTK2.pyの作成

TC1.pyを参考に”JSTK2.py”を作成する。まず、”TC1.py”を同じライブラリのディレクトリにコピーし、ファイル名を”JSTK2.py”とする。実はJKST2.モジュールはTC1と同様にSPIを利用するものであるため、TC1のライブラリを少し編集するのみで利用可能となる。もしSPI以外の(UART、I2C)モジュールを自身で追加したい場合は、そのほかのライブラリを参考にしてくれればよい。

しかし、このままでは各ピンから得られる値をどのように解釈すればよいのかわからない。そのため、Arduinoなどで利用されているライブラリを参考にする必要がある。Hackster.ioに様々なサンプルが公開されているため、今回は以下の記事を参考にした。

Using the Pmod JSTK2 with Arduino Uno

上記の記事中の“Pmod JSTK2 and Arduino Uno Code”を参考に今回のJSTK2.pyに関数を作成する。

まず、TC1.pyをコピーして作成したJSTK2.pyの__init__関数にてピンの対応を修正する。その際にはJSTK2モジュールのパッケージを参考にする。

%5B5%5DJSTK2_Package_6bef5b1a6e45de4ea42960fed2852db155bd06b0.jpg

PmodJSTK2モジュールのパッケージ裏のピンアサイン

これから次のような対応付けとなる。

self.cs = self.port.pin1
self.mosi = self.port.pin2
self.miso = self.port.pin3
self.sclk = self.port.pin4


また、先程紹介したArduino Unoのソースコードから、以下のような関数をJSTK2.pyへ追加した。

    def readXandY(self):
        resp = self.spi.xfer2([0x00, 0x00, 0x00, 0x00, 0x00])
            
	    X = resp[0]
            X |= resp[1] << 8
            Y = resp[2]
            Y |= resp[3] << 8

	    Fb = resp[4] #FunctionButton

	    return X, Y, Fb


これにより、JSTK2のスティックのX軸およびY軸の値と各ファンクションボタンの状態を読み出せるようになったはずだ。

これでライブラリ側の拡張は以上だ。

2.3. プログラムの作成

次にライブラリを利用するプログラム本体をつくる。今回は非常に簡単なサンプルを作成した。本記事の末尾にプログラムが添付されているので必要な人は参照してほしい。作成したプログラムのソースコードは以下だ。

from DesignSpark.Pmod.HAT import createPmod
import time

if __name__ == '__main__':
    
    jstk = createPmod('JSTK2','JBA')
    time.sleep(0.1)
    
    try:
        while True:
	    x,y,bt = jstk.readXandY()  
	    print "X: %d, Y: %d, Bt: %d" % (x, y, bt)	     

            time.sleep(0.5)
    except KeyboardInterrupt:
        pass
    finally:
        jstk.cleanup()


今回ライブラリにて新たに作成した関数readXandY()を利用してX軸、Y軸、ボタンの状態を取得している。それぞれの値はx, y, btという変数に格納される。また、連続で読み出すと動作が不安定になるため、0.5秒毎に値を取得している。

3. 動作の確認

実際に次のようにJBAへとJSTK2モジュールを接続する。ただし、この場合ジャンパを利用して延長し、操作しやすいように工夫している。

%5B6%5DJSTK2-mounted_192c501f74f0ce9c1c43da3cd368aefd7a121355.jpg

PmodHATにJSTK2を接続している様子

 

ここまでうまく行けば次のようにX軸、Y軸、トリガボタンの状態が取得できるはずだ。

では、2.3.のプログラムを適当なディレクトリでJSTK2Test.pyというファイル名で作成し、動作を確かめてみよう。

%5B9%5D_XandY1_cf5ced49985afb3fb72da9956aec0d9e9147f809.png

X軸とY軸の値を取得している様子

%5B10%5DBt_a4b80526664b65983f6a6ff79f8d832dce2843f1.png

ボタン(Bt)の値が変化する様子

ボタンはスティック中央を押すと1.トリガは2.同時だと3を示す。図のBtにて取得している値が確認できる。以上でJSTK2を無事にRaspberry Piでも利用できるようになった。

最後に

このJSTK2を利用すればRaspberry Pi 3B以降標準搭載されているWiFiやBluetooth機能を利用して遠隔でのドローンなどのコントロールやゲームカーソルの操作などに便利に使うことができるだろう。

実は今回検証したのはMaker Faire Tokyo 2018のデモのためである。デモではpi-topとこのJSTK2を搭載したRaspberry Piが遠隔で通信を行い、pi-top側を操作するコントローラを作成した。そうしたデモなどのプロトタイピングにも適しているだろう。

今年ラズパイコンテストにて賞品として配布されたモジュールはPmod HATにて標準では対応していないものが多かったと聞いているので、こちらの記事がそうしたモジュールを利用するのに少しでも役立ってほしいと考えている。

添付ファイルについて

添付している圧縮ファイルには

  • HAT.py
  • JSTK2.py
  • JSTK2Test.py

が含まれている。これらをRaspberry Piにおいてダウンロードし、HAT.pyとJSTK2.pyはPythonのライブラリへ、JSTK2Test.pyは任意の場所において実行すればよい。

ダウンロード

Hi, Everyone. I was master of University of Electro-communication, and bachelor of University of Hiroshima city. Now, I often work at Deloitte Tohmatsu Cyber. Also, I always check and translate some articles here. My major is about LoRa/LoRaWAN, IoT, CAN(Controller Area Network), these Security, etc. Please contact me, don't hesitate. My region: information science, radio, network, iot, iiot, security, lora, lorawan, 802.11ah, etc.