Ubuntu Weekly Recipe

第606回オープンソースな多機能測定器Pocket Science LabをUbuntuで使う

Pocket Science Lab(PSLab)はオシロスコープやマルチメーター、ロジックアナライザー、シグナルジェネレーターなど多くの機能を備えた、スマートフォンからも操作できるシングルボードコンピューターです。今回はこのPSLabをUbuntuから操作してみましょう。

オープソースハードウェア「Pocket Science Lab」

Pocket Science Lab(PSLab)の最大の特徴のひとつが「オープンソースハードウェア」を謳っていることです。つまりソフトウェアだけでなくハードウェアファームウェアの仕様やコードも公開されているため、ユーザーが必要に応じて改造・拡張しやすい作りになっているのです。

機能としてはオシロスコープやマルチメーターだけでなく、ロジックアナライザーやシグナルジェネレーター、電源などとして利用できますし、I2C/SPI/UARTの口もあるのでそれらのバスにつながった外部デバイスの制御もできます。Pythonライブラリが公開されているので、USBに接続したシリアルコンソール経由でプログラマブルに操作することも可能です。

さらに「Pocket」の名前のとおり、ハードウェアそのもののサイズはRaspberry Piよりも一回り小さく作られています。ディスプレイと操作はスマートフォンを、電源はUSBケーブルを利用できるため、ハードウェア自体はとても小さくて済むのです。

つまり最低限必要なのはプローブ用のピンヘッダーに接続するケーブル類とAndroidベースのスマートフォンもしくはPCだけです。なお、スマートフォンに接続する場合は、USB-OTGケーブルである必要があります。いわゆるスマートフォンにマウスやUSBメモリーのようなUSBデバイスを接続して動かせるようになるケーブルです。

デスクトップ向けアプリケーションのインストール

PSLabにはAndroid向けのアプリケーションとは別にWindows/Linux向けのデスクトップアプリケーションが用意されています。実体はElectronベースのアプリケーションではあるものの、デバイスとの通信はPythonを用いています。言い方を変えれば、これらが動く環境であればOS・ディストリビューションを問わず動作する見込みです。

ただしAndroid版に比べると、照度計・圧力計・加速度計・角速度計・方位計・温度計・ガスセンサーなどの情報取得機能や、Andorid版程度の使いやすいUIが不足しているという印象です。OTGケーブルが入手できなかったり、Androidに余計なアプリを入れたくなかったり、どうしてもデスクトップLinuxを使いたい場合でない限りは、Android版をおすすめします。

ちなみに各種センサーは、PSLabで直接計測できるわけではなく、Android版は接続したスマートフォンのデバイスから情報を取得しているようです。しかしI2C/SPI/UARTのデータバスを持っているため、自分でセンサー系ICを接続し、Pythonスクリプトを記述すれば、情報を取得することが可能になるはずです。具体的な実装例はPSLabのPythonライブラリを参照してください。

それでは実際に、Ubuntu 18.04 LTSにデスクトップアプリケーション版のPSLabをインストールしましょう。選択肢は次の3つです。

  • 公式が配布する安定版のdebファイルをインストールする
  • 公式が配布する開発版のdebファイルをインストールする
  • GitHubからソースコード一式をインストールする

このうち安定版についてはCI/CDの問題かGitHub LFSの問題かは不明ですが、パッケージファイルをダウンロードできません。よって一番簡単なのは開発版のdebファイルをダウンロード・インストールする方法です。

debファイルはフロントエンドの、つまりはElectronアプリケーションを動かすための依存関係は記述されていますが、バックエンドのPythonライブラリについては記述されていません。よってバックエンド部分は別途自分でインストールしなければなりません。

第589回「M5StickVの開発用にMaixPy IDEをUbuntuで動かす」のように、LXD上でPSLabデスクトップアプリケーションを動かす方法もあります。とりあえずデスクトップアプリケーション専用のコンテナを作ってしまいましょう。LXDを使わない場合は以下のコマンドはスキップしてください。

$ lxc launch ubuntu:18.04 pslab
$ lxc config set pslab raw.idmap 'both 1000 1000'
$ echo -e "uid 1301 1000\ngid 200 1000" | lxc config set pslab raw.idmap -
$ lxc config set pslab environment.DISPLAY ':0'
$ lxc config device add pslab X0 disk path=/tmp/.X11-unix/X0 source=/tmp/.X11-unix/X0
$ lxc config device add pslab gpu gpu
$ lxc exec pslab apt update
$ lxc exec pslab apt full-upgrade
$ lxc exec pslab -- apt install -y x11-apps x11-xserver-utils mesa-utils libasound2
$ lxc restart pslab
$ lxc exec pslab -- sudo -i -u ubuntu

ここから先の手順は、LXDを使う場合はコンテナの中で、使わない場合はホスト上で実行するものとします。

まずはフロントエンドのパッケージをダウンロード・インストールします。

$ wget https://github.com/fossasia/pslab-desktop/raw/install/pslab-desktop-development-linux.deb
$ sudo apt install ./pslab-desktop-development-linux.deb

次にバックエンドを動かすに当たって足りない依存関係およびバックエンドそのものをインストールします。

$ sudo apt install -y python3-numpy python3-serial python3-pip build-essential git
$ git clone https://github.com/fossasia/pslab-python.git
$ (cd pslab-python; make && sudo make install)

バックエンドはPython 3のスクリプトです。そこで上記ではこのスクリプトが利用するNumPy・PySerialと、バックエンドビルド時に利用するであろうpip、ビルドツール一式をインストールしています。NumPyとPySerialはpipからインストールしてもかまいません。

最後の2行はPSLabのバックエンドをクローンし、ビルド・インストールしているだけです。

これでデスクトップアプリケーションであるPSLabを起動する準備が整いました。アプリケーションは次のコマンドで起動できます。

$ /opt/PSLab/pslab

LXDの中にインストールした場合は、ホスト側からだと次のように実行します。

$ lxc exec pslab -- sudo -i -u ubuntu /opt/PSLab/pslab
図1 PSLabの起動画面
画像

LXDの中からホストのUSBデバイスを見えるようにする

前述の手順でPSLabを起動した場合、画面右下に「Device not connected」と表示され、右上のUSBマークもバツ印になっていると思います。

図2 このマークの時はPSLabを認識できていない
画像

これはLXDコンテナを作っただけだと、ホスト上のUSBデバイスが見えないからです。そこでUSBデバイスをコンテナから見えるようにしましょう。

まずはUSBデバイスのIDを調べます。PSLabをホスト上に接続することで、/dev以下に新しいttyXXXなファイルが登場するはずです。一般的なPCなら/dev/ttyACM0ができていることでしょう。このファイル名を元にUSBの情報を取得します。

$ udevadm test-builtin usb_id /sys/class/tty/ttyACM0
calling: test-builtin
Load module index
Parsed configuration file /lib/systemd/network/99-default.link
Created link configuration context.
/sys/devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9:1.0: if_class 2 protocol 0
ID_VENDOR=Microchip_Technology_Inc.
ID_VENDOR_ENC=Microchip\x20Technology\x20Inc.
ID_VENDOR_ID=04d8
ID_MODEL=MCP2200_USB_Serial_Port_Emulator
ID_MODEL_ENC=MCP2200\x20USB\x20Serial\x20Port\x20Emulator
ID_MODEL_ID=00df
ID_REVISION=0101
ID_SERIAL=Microchip_Technology_Inc._MCP2200_USB_Serial_Port_Emulator_0003077351
ID_SERIAL_SHORT=0003077351
ID_TYPE=generic
ID_BUS=usb
ID_USB_INTERFACES=:020201:0a0000:030000:
ID_USB_INTERFACE_NUM=00
ID_USB_DRIVER=cdc_acm
Unload module index
Unloaded link configuration context.

もしくはsudo udevadm monitor -eを実行してからPSLabを接続する方法でもかまいません。このあたりに関しては、第559回「デバイスの認識をモニタリング・コントロールできる『udevadm⁠⁠」を参照してください。

今回必要なのはID_VENDOR_ID/ID_MODEL_ID/ID_SERIAL_SHORTです。この特定のデバイスが接続されたら、/dev/PSLabという/dev/ttyACMxへのシンボリックリンクファイルを作成しましょう。これにより複数のPSLabが接続されたり、既に/dev/ttyACM0が存在する場合も、PSLabのデバイスファイル名を固定できます。シンボリックリンクファイルの作成にはudevのルールを利用します。以下のコマンドをホスト上で実行してください。

$ cat <<EOF | sudo tee -a /etc/udev/rules.d/68-pslab.rules
## For PSLab
ACTION=="add", SUBSYSTEM=="tty", \\
    ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="00df", \\
    ATTRS{serial}=="0003077351", MODE="666", SYMLINK+="ttyPSLab"
EOF

PSLabを接続し直すと、次のようなファイルが作成されているはずです。

$ ls -l /dev/ttyPSLab
lrwxrwxrwx 1 root root 7  2月  8 16:02 /dev/ttyPSLab -> ttyACM0

次にこのファイルをコンテナの中からアクセスできるようにします。

$ lxc config device add pslab ttyPSLab unix-char \
  source=/dev/ttyPSLab path=/dev/ttyACM0 \
  required=false uid=1000 gid=1000
Device ttyPSLab added to pslab

require=falseを指定しておかないと、PSLabが接続されていない状態ではpslabコンテナを起動できません。言い換えると、特定のデバイスが存在しない限りコンテナを起動できるようにするには、この設定を変更してください。

コンテナの中を確認すると、新しいシリアルデバイスが作られているはずです。

$ lxc exec pslab -- ls -l /dev/ttyACM0
crw-rw---- 1 ubuntu ubuntu 166, 0 Feb  6 07:07 /dev/ttyACM0

ちなみにPSLabはデバイスファイルがttyUSBxttyACMxになる前提で作られています。よってこれら以外の名前を付けるとやはり「Device not connected」と表示されるので注意しましょう。

PSLabの使い方

デスクトップアプリケーション版のPSLabの作りはとてもシンプルです。よっていろいろ触ってみればすぐに使い方がわかることでしょう。

PSLabには信号生成機とオシロスコープの両方が備わっているので、PSLab単体でも動作確認可能です。たとえば信号生成器から正弦波を出力し、それをオシロスコープで観測してみましょう。

まずピンの配置を確認します。PSLabのトップ画面の右上のハンバーガーメニューをクリックすると、ボードの全面と背面の画像を確認できます。

図3 ピンを接続するFront Layout
画像
図4 Back Layoutにはより詳しい説明が書いてある
画像

このうちBack Layoutの「Sine Wave 1」「Sine Wave 2」が正弦波を出力できるピンです。Front Layoutだと小さく「SI1」⁠SI2」と書いてあります。オシロスコープの端子は「CH1」⁠CH2」⁠CH3」⁠MIC」です。⁠MIC」はマイクロフォンですが、オシロスコープの端子としても使えます。

とりあえずは「SI1」「CH1」を繋いでみましょう。PSLabのトップ画面から「Wave Generator」を選択します。⁠WAVE1」をクリックして、画面下部のバーで周波数を調整します。最後に「FREQ」ボタンを押して信号生成を開始しておきましょう。

図5 とりあえず500Hzで。PhaseはWave2のみ設定できる模様
画像

ちなみに「DIGITAL」をクリックすると「Square Wave」など矩形波用の端子を操作する画面になります。ただANALOGとDIGITALは共用できないようです。

トップ画面に戻ったら「Oscilloscope」を選んでください。何がしかの波が流れているのが見えるはずです。とりあえず止めたければ「Trigger」にチェックを入れます。

図6 あらきれいな正弦波
画像

これはつまりCH1が「Voltage=0」になったタイミングをトリガーとして止めています。TimeBaseをいじると解像度を変更できます。現在「0.5ms/div」ということは1目盛が0.5msということです。500Hzの正弦波なので、1周期が2msです。目盛と正弦波の位置が期待通りになっていることがわかりますね。

このようにPSLabを使えば安価にオシロスコープを含むさまざまな計測器を実現できます。もちろん値段相応の精度・性能ではありますが、ホビー用途でいろいろ調べてみたいものの、わざわざWindowsを立ち上げたくない人にはうってつけのツールではないでしょうか。

おすすめ記事

記事・ニュース一覧