INA226 を arduino nano で

もう1月も終わりですね。なんだか速く月日が経つような気がします。

さて、今日は 先日作った INA226 の電流電圧センサーを I2C で arduino nano クローンにて計測してみました。

前回の調査で見つけた、ポーランドのサイトにいいチュートリアルがありました。

Korneliusz Jarzębskiのサイト
Dwukierunkowy cyfrowy czujnik prądu/mocy INA226

github
Arduino-INA226
https://github.com/jarzebski/Arduino-INA226

このGitHub のsimple のソースにライブラリを配置し、

./INA226_simple
├── INA226.cpp
├── INA226.h
└── INA226_simple.ino

INA226.cpp の記述を以下に変更。25mR のシャント抵抗の設定をします。

#include "INA226.h"
::
void setup() 
{
::
  // Calibrate INA226. Rshunt = 0.025 ohm, Max excepted current = 4A
  ina.calibrate(0.025, 1);
::

配線は以下のようにしました。ちょっとわかりにくいですが、Arduino の A5(SCL) と A4(SDA) をつないで、GND と 3.3V を VSS に入れます。あとは、負荷を電流計測にハイサイド側に付ける感じです。

arduino_ina226

シリアル通信を開くと、以下のようになっています。

Initialize INA226
-----------------------------------------------
Mode:                  Shunt and Bus, Continuous
Samples average:       1 sample
Bus conversion time:   1.100ms
Shunt conversion time: 1.100ms
Max possible current:  3.28 A
Max current:           3.28 A
Max shunt voltage:     0.08 V
Max power:             117.96 W
-----------------------------------------------
Bus voltage:   4.67875 V
Bus power:     0.01250 W
Shunt voltage: 0.00007 V
Shunt current: 0.00300 A

Bus voltage:   4.68125 V
Bus power:     0.01250 W
Shunt voltage: 0.00007 V
Shunt current: 0.00300 A

Bus voltage:   4.67750 V
Bus power:     0.01250 W
Shunt voltage: 0.00007 V
Shunt current: 0.00300 A

PC からのUSB 電圧は4.67V 程度のようです。3mA で12.5mW ということがわかりました。ちゃんと計測できているようですね。

arduino だと装備からLCDなどに出す用途で使えそうですね。データをどこかに飛ばすものであれば、ESP8266 が良さそうです。

 

IC 回路の電圧は3.3V でも5V でもOKです。LEDの負荷を arduino の 3.3V から取って計測してみると以下のようになりました。

Initialize INA226
-----------------------------------------------
Mode:                  Shunt and Bus, Continuous
Samples average:       1 sample
Bus conversion time:   1.100ms
Shunt conversion time: 1.100ms
Max possible current:  3.28 A
Max current:           3.28 A
Max shunt voltage:     0.08 V
Max power:             117.96 W
-----------------------------------------------
Bus voltage:   3.26875 V
Bus power:     0.00500 W
Shunt voltage: 0.00004 V
Shunt current: 0.00150 A

Bus voltage:   3.27000 V
Bus power:     0.00500 W
Shunt voltage: 0.00004 V
Shunt current: 0.00150 A

Bus voltage:   3.26875 V
Bus power:     0.00500 W
Shunt voltage: 0.00004 V
Shunt current: 0.00160 A

 

ちょっとコードを追加して、レジスターの値を取ってみました。

Initialize INA226
-----------------------------------------------
Mode:                  Shunt and Bus, Continuous
Samples average:       1 sample
Bus conversion time:   1.100ms
Shunt conversion time: 1.100ms
Max possible current:  3.28 A
Max current:           3.28 A
Max shunt voltage:     0.08 V
Max power:             117.96 W
-----------------------------------------------
INA226_REG_CONFIG          (0x00):16679 ---
INA226_REG_SHUNTVOLTAGE    (0x01):30 ---
INA226_REG_BUSVOLTAGE      (0x02):3749 ---
INA226_REG_POWER           (0x03):5 ---
INA226_REG_CURRENT         (0x04):30 ---
INA226_REG_CALIBRATION     (0x05):2048 ---
-----------------------------------------------
Bus voltage:   4.68250 V
Bus power:     0.01250 W
Shunt voltage: 0.00007 V
Shunt current: 0.00300 A

レジスター値は10進です。アベレージの回数とかも定数があるので便利ですね。

精度は、0.1mA  のようですね。PCB のあまり部分で作ったモジュールでも結構遊べました。あと、小さなパーツの半田付けの練習にもなりました。

 

▼参考サイト

http://denshi-kousaku.fan.coocan.jp/report030.html

 

▼まとめ

・ライブラリ便利!

・INA226 モジュールを使って、arduino で i2c にて電流電圧を簡単に取れる

・精度は、シャント抵抗次第で、0.025R だと0.1mA(100μA) の精度になるようです

・GND はIC回路と共通で測定で、電圧を測定する場合は、IC の VBUS 8pin に計測電圧をかける

・LSB とは一般的には、最下位ビットのことで、least significant bit の頭文字。

・これの分解能力は16ビットなので、0.025R だと電流は0.1mA で電圧は 1.25mV

・とりあえず、十分な精度です。

1us Lチカ

2016年 謹賀新年、あけましておめでとうございます。おせち料理も31日と1日で食べつくしてしまいました。

さて、今年最初のブログですね。0.000001秒のLチカをロジックアナライザーでモニタリングして光らせてみました。

あと、オレンジパイで、8本のGPIO を使って安価なロジックアナライザーで採取できるかも確認してみました。

 

サンプルプログラムを採取したデータが以下です。8本分は取れていますが、速すぎるところは取りこぼしているようです。

1

矢印は500ns で光っている部分で採取に失敗し、取りこぼす事がありました。このあたりが2Mhz の限界なんですね。今のファームウェアとソフトウェアだとこれが限界のようです。

2

複数のLED は、blink ファンクションにて光らせていますが、呼び出しと初期化の処理で250us 程度使っているようです。

3

usleep 関数を使っても思ったより、処理に時間がかかるようです。1us を指定して光らせているんですが、実際は69us 光っています。nanosleep を使っても66us は使われてしまうようで、1us を光らせる為にwhile で調整してみました。

4

サンプルのプログラムは以下です。

/*
 *  +-----+-----+----------+------+---+--OrangePiPC--+---+------+---------+-----+--+
 *  | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 *  +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 *  |     |     |     3.3v |      |   |  1 || 2  |   |      | 5v       |     |     |
 *  |   2 |  -1 |    SDA.0 |      |   |  3 || 4  |   |      | 5V       |     |     |
 *  |   3 |  -1 |    SCL.0 |      |   |  5 || 6  |   |      | 0v       |     |     |
 *  |   4 |   6 | IO6 PA06 |  OUT | 0 |  7 || 8  |   |      | TxD3     |     |     |
 *  |     |     |       0v |      |   |  9 || 10 |   |      | RxD3     |     |     |
 *  |  17 |  -1 |     RxD2 |      |   | 11 || 12 | 0 | OUT  | IO1 PD14 | 1   | 18  |
 *  |  27 |  -1 |     TxD2 |      |   | 13 || 14 |   |      | 0v       |     |     |
 *  |  22 |  -1 |     CTS2 |      |   | 15 || 16 | 0 | OUT  | IO4 PC04 | 4   | 23  |
 *  |     |     |     3.3v |      |   | 17 || 18 | 0 | OUT  | IO5 PC07 | 5   | 24  |
 *  |  10 |  -1 |     MOSI |      |   | 19 || 20 |   |      | 0v       |     |     |
 *  |   9 |  -1 |     MISO |      |   | 21 || 22 |   |      | RTS2     |     |     |
 *  |  11 |  -1 |     SCLK |      |   | 23 || 24 |   |      | SPI-CE0  |     |     |
 *  |     |     |       0v |      |   | 25 || 26 |   |      | CE1      |     |     |
 *  |   0 |  -1 |    SDA.1 |      |   | 27 || 28 |   |      | SCL.1    |     |     |
 *  |   5 |   7 |  IO7 PA7 |  OUT | 0 | 29 || 30 |   |      | 0v       |     |     |
 *  |   6 |   8 |  IO8 PA8 |  OUT | 0 | 31 || 32 | 0 | OUT  | IO9 PG08 | 9   | 12  |
 *  |  13 |  10 | IO10 PA9 |  OUT | 0 | 33 || 34 |   |      | 0v       |     |     |
 *  |  19 |  12 | IO12PA10 |  OUT | 0 | 35 || 36 | 0 | OUT  | IO13PG09 | 13  | 16  |
 *  |  26 |  14 | IO14PA20 | ALT3 | 0 | 37 || 38 | 0 | OUT  | IO15PG06 | 15  | 20  |
 *  |     |     |       0v |      |   | 39 || 40 | 0 | OUT  | IO16PG07 | 16  | 21  |
 *  +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 *  | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 *  +-----+-----+----------+------+---+--OrangePIPC--+------+----------+-----+-----+
 *         ^^^^ Pin NO                                                   ^^^^ Pin NO
 * 1us LED blink.
 * building ex) gcc -lwiringPi -lpthread -I/usr/local/include -L/usr/local/lib -levent -o 2016blinkall 2016blinkall.c
 * 
 *
*/
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <stdio.h>
#include <wiringPi.h>

#define MSEC 1
#define USEC 33
#define NANOSEC 1000

int blink2(int led, int delay);

int main (void)
{
  int led;
  int i = 0;

  while (i < 3)
  {
    blink2(16, 1000);
      blink2(15, 1000); //Next blink 250 us
      blink2(13, 1000);
      blink2(9, 1000);
      blink2(5, 1000);
      blink2(4, 1000);
      blink2(1, 1000);
      blink2(6, 1000);

    i++;
  }

  delay (MSEC);
  return 0;
}

int blink2(int led, int delay){
    // unsigned int usecs;
    // usecs = delay;
    // sec = delay;
    led = led;
    int i = 0;

    // nano sec
    struct timespec nano;
    nano.tv_sec = 0;
    nano.tv_nsec = delay;

    wiringPiSetup () ;
    pinMode (led, OUTPUT) ;

    digitalWrite (led, HIGH) ;
    nanosleep(&nano, NULL); // 66us
    // usleep (usecs) ; // 66us
    // delay (delay);
    digitalWrite (led,  LOW) ;
    usleep (1);

    digitalWrite (led, HIGH) ;

    // 1us
    while (i < 100)
    {
        i++;
    }
    digitalWrite (led,  LOW) ;
    usleep (1); // 66us

    digitalWrite (led, HIGH) ;
    // 500 ns
    digitalWrite (led,  LOW) ;
}

GPIO の8本を同時に処理させるにはどうしたらいいんでしょうかね。マルチスレッド処理ですかね?シフトレジスタに投げて、一括処理とかですかね?

 

前ちょっと触ったイベント処理のlibevent とかを使うとどのくらいの精度になるんでしょうかね。いろいろ疑問がわいてきます。

E-ink を表示するためにはまだまだ超えないといけない山がたくさんあるようです。

なんとか、春までには表示したいんですが。こつこつとやっていきます。

Sigrok の Pulsview 0.3.0 動きました

とりあえず、なんとか動かしたいのでソースをコードも見ましたが、特に問題となりそうな部分もなく、ちょっと場を離れてから、brew版のをサイド入れてみることに。とりあえず、動作させることができました。

なんとか、今年中に出来たのですっきり。

 

0.3.0-git-5d73886 では、以下のようにトリガーが設定できて楽になりました。Runを押せばトリガーがでるまで、stop して採取されます。サンプル数を設定しておけば、採取されて停止します。ロジックアナライザーとしては基本機能だと思いますが、手持ちのハードでなんとか動いてよかったです。

7

拡大すると、500ns とか取れています。1us 単位くらいまでは見れそうということがわかりました。

8

サンプルレートは、2MHz 以上あげるとどうしても採取後にクルクル回って、操作を受け付けないスタック状態のような感じになります。コマンドライン版でドライバを指定してみると、以下のようです。

$ sigrok-cli --show --driver fx2lafw
Driver functions:
    Logic analyzer
Scan options:
    conn
sr: fx2lafw: Failed to get manufacturer string descriptor: LIBUSB_ERROR_OTHER.
sr: fx2lafw: Failed to get manufacturer string descriptor: LIBUSB_ERROR_OTHER.
sr: fx2lafw: Failed to get manufacturer string descriptor: LIBUSB_ERROR_OTHER.
sr: fx2lafw: Failed to get manufacturer string descriptor: LIBUSB_ERROR_OTHER.
sr: fx2lafw: Failed to get manufacturer string descriptor: LIBUSB_ERROR_OTHER.
sr: fx2lafw: Failed to get manufacturer string descriptor: LIBUSB_ERROR_OTHER.
fx2lafw:conn=28.2 - Saleae Logic with 8 channels: 0 1 2 3 4 5 6 7
Supported configuration options:
    continuous: 
    limit_samples: 0 (current)
    conn: 28.2 (current)
    samplerate - supported samplerates:
      20 kHz
      25 kHz
      50 kHz
      100 kHz
      200 kHz
      250 kHz
      500 kHz
      1 MHz
      2 MHz
      3 MHz
      4 MHz
      6 MHz
      8 MHz
      12 MHz
      16 MHz
      24 MHz
    Supported triggers: 0 1 r f e 
    captureratio: 0 (current)

ここに出ているサンプリング周波数は採取できるはずなんですが、なぜか2MHz までしかとれません。

まぁ、最初の一台ですし、これで勉強させてもらって、物足りなければまた考えることにします。

 

automator でシェルスクリプトを実行するものを作り、アイコンをつけて、app 化します。

6

python の環境変数を一度 unset して消去して、python3.4 とか3.x のをセットしてアプリをバックグランドで呼び出します。

unset PYTHONPATH
export PYTHONPATH="/usr/local/lib/python3.4/site-packages/:$PYTHONPATH"

/usr/local/Cellar/pulseview/HEAD/bin/pulseview >/dev/null 2>&1 &

 

配布用にするには、ライブラリのパスを全部書き換えないといけないので、やめました。このあたりのスキルは、もう少し勉強しないと嵌りそうです。

5

brew 版のインストールは、wiki に書いてあるとおりで以下のようです。

https://sigrok.org/wiki/Mac_OS_X

$ brew tap rene-dev/sigrok

$ brew install python3

$ brew install –HEAD libserialport

$ brew install –HEAD –with-libserialport libsigrok

$ brew install –HEAD libsigrokdecode

$ brew install –HEAD –with-libserialport sigrok-cli

$ brew install –HEAD pulseview

ポイントとしては、マニュアルビルドしてソースから入れたものは一度、綺麗に消して、brew docter で問題をクリアにしてからやることと、以下の libsigrokdecode が2つ出てくるのでbrew のを無効にすることくらいです。

$ brew install –HEAD libsigrokdecode

Error: Formulae found in multiple taps:

* homebrew/science/libsigrokdecode

* rene-dev/sigrok/libsigrokdecode

 

$ brew untap homebrew/science

$ brew tap –repair

$ brew update

 

あと、ファームウェアの格納場所は、デフォルトで

/usr/local/share/sigrok-firmware

になるので、ここにディレクトリを作成し、最新のファームウェアを入れておきます。これで最初のデバイスを見つけてファームがなくエラーになるのを迂回できます。エラーでも、落ちはしませんが。前回落ちたのは別の原因で、QT 関連のライブラリのパスが書き換わっていないのが原因でした。ltool で見ると、/usr 配下となっていました。そのほかの原因もあったとは思いますが、ライブラリの依存関係でおそらくは、brew 版のを見に行っていたのかもしれません。まぁ、詳細は不明です。

 

ということで、とりあえずは動いてよかったです。トリガーもかけられるようになったし、インターフェイスは少しよくなった感じ。ボタンの配置とか。

 

▼まとめ

・EZ-USB FX2LP CY7C68013A で、sigrok の pulsview は動作

・このハードは実質6ドルくらいなので、ロジックアナライザーとして最初の一台で遊ぶには十分

・0.3.0-git-f3697d3 は動作した

・トリガーがかけられるようになった

・少しインターフェイスがよくなった

・2Mhz サンプリングまでは出来ることを確認

・1チャンネル採取で500ns は採取できた。1us くらいが精度か?

・8チャンネル同時採取はまだやっていない

・ファームウェア格納場所は、/usr/local/share/sigrok-firmware

・brew 版で HEAD で入れているので、時期によっては動作しない場合もあるかも

・配布用に、ライブラリを書き換えるのはどうすれば楽になるのか?要研究

sigrok Pulsview を osx でビルドに挑戦

PulseView の 0.3.0-git-f3697d3 をビルドしてみました。

結論から言えば、今のところ起動してすぐ落ちます。(涙)

1

無理やり、メニューから開いてみるとポートのオープンでこけているような感じです。about は見れました。

2

デバイスにもコネクトし、スキャンすれば出てきます。

3

しかし、OK を押すと最初のダイアログ表示が出て、OK を押すと、SIGABRT で落ちます。

Process:         pulseview-bin [95174]
Path:            /Applications/PulseView.app/Contents/MacOS/./pulseview-bin
Identifier:      com.yourcompany.pulseview
Version:         0.3.0-git-5d73886 (???)
Code Type:       X86-64 (Native)
Parent Process:  sh [95171]
Responsible:     sh [95171]
User ID:         501

Date/Time:       2015-12-30 03:51:25.054 +0900
OS Version:      Mac OS X 10.9.5 (13F34)
Report Version:  11
Anonymous UUID:  C9AF270A-FCB7-7966-372A-2DF968A13DBE


Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000

Application Specific Information:
abort() called

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib            0x00007fff8f96d866 __pthread_kill + 10
1   libsystem_pthread.dylib           0x00007fff8bb5535c pthread_kill + 92
2   libsystem_c.dylib                 0x00007fff85eefb1a abort + 125
3   libglib-2.0.0.dylib               0x00000001022cae07 g_assertion_message + 387
4   libglib-2.0.0.dylib               0x00000001022cae65 g_assertion_message_expr + 94
5   libglib-2.0.0.dylib               0x00000001022e43a8 g_variant_type_info_check + 379
6   libglib-2.0.0.dylib               0x00000001022e41fe g_variant_type_info_get_type_string + 16
7   libglib-2.0.0.dylib               0x00000001022d7b7c g_variant_get_type + 22
8   pulseview-bin                     0x000000010112d4af pv::prop::Int::get_widget(QWidget*, bool) + 159 (int.cpp:72)
9   pulseview-bin                     0x000000010111733f pv::binding::Binding::add_properties_to_form(QFormLayout*, bool) const + 95 (binding.cpp:55)
10  pulseview-bin                     0x000000010111742d pv::binding::Binding::get_property_form(QWidget*, bool) const + 109 (binding.cpp:71)
11  pulseview-bin                     0x0000000101129599 pv::popups::DeviceOptions::DeviceOptions(std::__1::shared_ptr<sigrok::Device>, QWidget*) + 185 (qglobal.h:2436)
12  pulseview-bin                     0x000000010112f96b pv::toolbars::MainBar::update_device_config_widgets() + 171 (memory:4447)
13  pulseview-bin                     0x000000010112f82b pv::toolbars::MainBar::update_device_list() + 475 (list:565)
14  pulseview-bin                     0x00000001010eac9a pv::MainWindow::select_init_device() + 1594 (mainwindow.cpp:589)
15  pulseview-bin                     0x00000001010e759e pv::MainWindow::MainWindow(pv::DeviceManager&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, QWidget*) + 606 (mainwindow.cpp:128)
16  pulseview-bin                     0x00000001010e2880 main + 848 (main.cpp:163)
17  libdyld.dylib                     0x00007fff89c435fd start + 1

うーん、なんでしょうかね。

 

とりあえず、いつかまた再チャレンジするときに備えて、ビルド手順を載せておきます。

▼環境

osx 10.9.5

qt-opensource-mac-4.8.7

$ xcode-select -v

xcode-select version 2333.

$ xcode-select -p

/Applications/Xcode.app/Contents/Developer

$ xcode-select -print-path

/Applications/Xcode.app/Contents/Developer

$ xcodebuild -version

Xcode 6.2

Build version 6C131e

$ cmake –version

cmake version 3.4.1

$ clang -v

Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)

Target: x86_64-apple-darwin13.4.0

Thread model: posix

こんな感じの環境です。ビルド手順は、基本以下のとおりです。cmake するオプションは少し買えました。

https://sigrok.org/wiki/Mac_OS_X

前準備として、Qtの4系最終の4.8.7 を入れておきます。

あと、ports で以下を入れておきます。

$ sudo port selfupdate

$ sudo port install boost libusb libzip libftdi0

$ sudo port install autoconf automake cmake glib2 python33 libtool pkgconfig

環境変数を反映しておきます。

$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/

libserialport

$ git clone git://sigrok.org/libserialport

$ cd libserialport

$ ./autogen.sh

$ ./configure

$ make

$ sudo make install

以下に入りました。

    HOPE:libserialport junkhack$ sudo make install
      CC       serialport.lo
      CC       macosx.lo
      CCLD     libserialport.la
     /usr/local/bin/gmkdir -p '/usr/local/lib'
     /bin/sh ./libtool --silent  --mode=install /usr/local/bin/ginstall -c   libserialport.la '/usr/local/lib'
     /usr/local/bin/gmkdir -p '/usr/local/include'
     /usr/local/bin/ginstall -c -m 644 libserialport.h '/usr/local/include'
     /usr/local/bin/gmkdir -p '/usr/local/lib/pkgconfig'
     /usr/local/bin/ginstall -c -m 644 libserialport.pc '/usr/local/lib/pkgconfig'

次、libsigrok です。

libsigrok

$ git clone git://sigrok.org/libsigrok

$ cd libsigrok

$ ./autogen.sh

$ ./configure

$ make

$ sudo make install

以下に入りました。

    HOPE:libsigrok junkhack$ sudo make install
     /usr/local/bin/gmkdir -p '/usr/local/lib'
     /bin/sh ./libtool --silent  --mode=install /usr/local/bin/ginstall -c   libsigrok.la bindings/cxx/libsigrokcxx.la '/usr/local/lib'
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: /usr/local/lib/libsigrok.a(fallback.o) has no symbols
     /usr/local/bin/gmkdir -p '/usr/local/include/libsigrokcxx'
     /usr/local/bin/ginstall -c -m 644 bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp '/usr/local/include/libsigrokcxx'
     /usr/local/bin/gmkdir -p '/usr/local/include/libsigrok'
     /usr/local/bin/ginstall -c -m 644 include/libsigrok/libsigrok.h include/libsigrok/proto.h '/usr/local/include/libsigrok'
     /usr/local/bin/gmkdir -p '/usr/local/include/libsigrokcxx'
     /usr/local/bin/ginstall -c -m 644 bindings/cxx/include/libsigrokcxx/enums.hpp '/usr/local/include/libsigrokcxx'
     /usr/local/bin/gmkdir -p '/usr/local/include/libsigrok'
     /usr/local/bin/ginstall -c -m 644 include/libsigrok/version.h '/usr/local/include/libsigrok'
     /usr/local/bin/gmkdir -p '/usr/local/lib/pkgconfig'
     /usr/local/bin/ginstall -c -m 644 libsigrok.pc bindings/cxx/libsigrokcxx.pc '/usr/local/lib/pkgconfig'
    HOPE:libsigrok junkhack$ 

次、コマンドライン版のです。

sigrok-cli

$ git clone git://sigrok.org/sigrok-cli

$ cd sigrok-cli

$ ./autogen.sh

$ ./configure

$ make

$ sudo make install

以下に入りました。

    HOPE:sigrok-cli junkhack$ sudo make install
     /usr/local/bin/gmkdir -p '/usr/local/bin'
      /usr/local/bin/ginstall -c sigrok-cli '/usr/local/bin'
     /usr/local/bin/gmkdir -p '/usr/local/share/man/man1'
     /usr/local/bin/ginstall -c -m 644 doc/sigrok-cli.1 '/usr/local/share/man/man1'
    HOPE:sigrok-cli junkhack$ 

次が、問題のやつです。

PulseView

$ git clone git://sigrok.org/pulseview

$ cd pulseview

$ cmake -DENABLE_TESTS=n -DDISABLE_WERROR=y .

$ make

$ sudo make install

cmake でテストをn にするか、警告を無視するかをチェックし、進みます。何か、未定義の変数や宣言などがあるようです。直すのが面倒だったので、とりあえず。

以下に入りました。

    HOPE:pulseview junkhack$ sudo make install
    Password:
    [ 54%] Built target pulseview
    [100%] Built target pulseview-test
    Install the project...
    -- Install configuration: "RelWithDebInfo"
    -- Installing: /usr/local/bin/pulseview
    -- Installing: /usr/local/share/man/man1/pulseview.1
    HOPE:pulseview junkhack$ 

で、いきなり実行するも、以下のように。

$ ll /usr/local/bin/pulseview

-rwxr-xr-x  1 root  admin  1913672 12 30 00:57 /usr/local/bin/pulseview

$ /usr/local/bin/pulseview

Failed to import the site module

Your PYTHONPATH points to a site-packages dir for Python 2.x but you are running Python 3.x!

     PYTHONPATH is currently: "/usr/local/lib/python2.7/site-packages"

     You should `unset PYTHONPATH` to fix this.

otool でライブラリのパスを見ると、以下のようです。

$ otool -L /usr/local/bin/pulseview
/usr/local/bin/pulseview:
    /opt/local/lib/libboost_filesystem-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
    /opt/local/lib/libboost_system-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
    /opt/local/lib/libboost_thread-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
    QtSvg.framework/Versions/4/QtSvg (compatibility version 4.8.0, current version 4.8.7)
    QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.7)
    QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.7)
    /usr/local/lib/libsigrokcxx.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    /usr/local/lib/libsigrok.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    /usr/local/lib/libglibmm-2.4.1.dylib (compatibility version 5.0.0, current version 5.0.0)
    /opt/local/lib/libgobject-2.0.0.dylib (compatibility version 4601.0.0, current version 4601.2.0)
    /usr/local/lib/libsigc-2.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/local/lib/libsigrokdecode.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    /opt/local/lib/libglib-2.0.0.dylib (compatibility version 4601.0.0, current version 4601.2.0)
    /opt/local/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.4.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

うーん、Python3.x でということですが、ありません。あと、以下の3つはどこ探してもありませんでしたが、、、

QtSvg.framework

QtGui.framework

QtCore.framework

ちなみに、Qt5.5 でビルドしたときは、以下のようでした。

    ----- qt5.5
    HOPE:MacOS junkhack$ otool -L pulseview 
    pulseview:
        /opt/local/lib/libboost_filesystem-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
        /opt/local/lib/libboost_system-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
        /opt/local/lib/libboost_thread-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
        /opt/local/lib/libboost_unit_test_framework-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
        @rpath/QtSvg.framework/Versions/5/QtSvg (compatibility version 5.5.0, current version 5.5.1)
        /usr/local/lib/libsigrokcxx.2.dylib (compatibility version 3.0.0, current version 3.0.0)
        /usr/local/lib/libsigrok.2.dylib (compatibility version 3.0.0, current version 3.0.0)
        /usr/local/lib/libglibmm-2.4.1.dylib (compatibility version 5.0.0, current version 5.0.0)
        /opt/local/lib/libgobject-2.0.0.dylib (compatibility version 4601.0.0, current version 4601.2.0)
        /usr/local/lib/libsigc-2.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
        /usr/local/lib/libsigrokdecode.2.dylib (compatibility version 3.0.0, current version 3.0.0)
        /opt/local/lib/libglib-2.0.0.dylib (compatibility version 4601.0.0, current version 4601.2.0)
        /opt/local/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.4.0)
        @rpath/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.5.0, current version 5.5.1)
        @rpath/QtGui.framework/Versions/5/QtGui (compatibility version 5.5.0, current version 5.5.1)
        @rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.5.0, current version 5.5.1)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    HOPE:MacOS junkhack$ 

これは探せばありました。なんで、Qt4 だとないんでしょうか?何か入れ忘れたのですかね。ちなみに、0.2.0 のELIAS さんのビルドしたものは、以下のようです。

$ otool -L pulseview-bin 
pulseview-bin:
    @executable_path/../Frameworks/libboost_filesystem-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/../Frameworks/libboost_system-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/../Frameworks/QtSvg.framework/Versions/4/QtSvg (compatibility version 4.8.0, current version 4.8.6)
    @executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.6)
    @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.6)
    @executable_path/../Frameworks/libsigrokxx.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    @executable_path/../Frameworks/libsigrok.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    @executable_path/../Frameworks/libglibmm-2.4.1.dylib (compatibility version 5.0.0, current version 5.0.0)
    @executable_path/../Frameworks/libgobject-2.0.0.dylib (compatibility version 4201.0.0, current version 4201.0.0)
    @executable_path/../Frameworks/libglib-2.0.0.dylib (compatibility version 4201.0.0, current version 4201.0.0)
    @executable_path/../Frameworks/libintl.8.dylib (compatibility version 10.0.0, current version 10.2.0)
    @executable_path/../Frameworks/libsigc-2.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
    @executable_path/../Frameworks/libsigrokdecode.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    @executable_path/../Frameworks/Python.framework/Versions/3.4/Python (compatibility version 3.4.0, current version 3.4.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

Frameworks は、これを拝借します。

アプリケーション直下にコピーして上書きしてきます。

$ cd /Applications/PulseView.app/Contents

$ pwd
/Applications/PulseView.app/Contents

cp -p /opt/local/lib/libboost_filesystem-mt.dylib ./Frameworks
cp -p /opt/local/lib/libboost_system-mt.dylib ./Frameworks
cp -p /opt/local/lib/libboost_thread-mt.dylib ./Frameworks

cp -p /usr/local/lib/libsigrokcxx.2.dylib ./Frameworks
cp -p /usr/local/lib/libsigrok.2.dylib ./Frameworks
cp -p /usr/local/lib/libglibmm-2.4.1.dylib ./Frameworks
cp -p /opt/local/lib/libgobject-2.0.0.dylib ./Frameworks
cp -p /usr/local/lib/libsigc-2.0.0.dylib ./Frameworks
cp -p /usr/local/lib/libsigrokdecode.2.dylib ./Frameworks
cp -p /opt/local/lib/libglib-2.0.0.dylib ./Frameworks
cp -p /opt/local/lib/libintl.8.dylib ./Frameworks

Qt で作ったのをosx でライブラリにリンクするツールとか、そういうのはないのでしょうかね。

バイナリのライブラリは以下のコマンドで、書き換えられます。

install_name_tool -change 変更したいディレクトリ そこに新しく書き込みたいディレクトリ オブジェクトファイルの名前

パスを切り出して、テキストファイルで編集し、

HOPE:MacOS junkhack$ otool -L ./pulseview | cut -f 1 -d ' ' | cut -f 2
./pulseview:
/opt/local/lib/libboost_filesystem-mt.dylib
/opt/local/lib/libboost_system-mt.dylib
/opt/local/lib/libboost_thread-mt.dylib
QtSvg.framework/Versions/4/QtSvg
QtGui.framework/Versions/4/QtGui
QtCore.framework/Versions/4/QtCore
/usr/local/lib/libsigrokcxx.2.dylib
/usr/local/lib/libsigrok.2.dylib
/usr/local/lib/libglibmm-2.4.1.dylib
/opt/local/lib/libgobject-2.0.0.dylib
/usr/local/lib/libsigc-2.0.0.dylib
/usr/local/lib/libsigrokdecode.2.dylib
/opt/local/lib/libglib-2.0.0.dylib
/opt/local/lib/libintl.8.dylib
/usr/lib/libc++.1.dylib
/usr/lib/libSystem.B.dylib
HOPE:MacOS junkhack$ 

以下のようなコマンドを作りました。

cd MacOS/
cp pulseview pulseview_bup487

install_name_tool -change /opt/local/lib/libboost_filesystem-mt.dylib @executable_path/../Frameworks/libboost_filesystem-mt.dylib ./pulseview
install_name_tool -change /opt/local/lib/libboost_system-mt.dylib @executable_path/../Frameworks/libboost_system-mt.dylib ./pulseview
install_name_tool -change /opt/local/lib/libboost_thread-mt.dylib @executable_path/../Frameworks/libboost_thread-mt.dylib ./pulseview
install_name_tool -change QtSvg.framework/Versions/4/QtSvg @executable_path/../Frameworks/QtSvg.framework/Versions/4/QtSvg ./pulseview
install_name_tool -change QtGui.framework/Versions/4/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui ./pulseview
install_name_tool -change QtCore.framework/Versions/4/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore ./pulseview
install_name_tool -change /usr/local/lib/libsigrokcxx.2.dylib @executable_path/../Frameworks/libsigrokcxx.2.dylib ./pulseview
install_name_tool -change /usr/local/lib/libsigrok.2.dylib @executable_path/../Frameworks/libsigrok.2.dylib ./pulseview
install_name_tool -change /usr/local/lib/libglibmm-2.4.1.dylib @executable_path/../Frameworks/libglibmm-2.4.1.dylib ./pulseview
install_name_tool -change /opt/local/lib/libgobject-2.0.0.dylib @executable_path/../Frameworks/libgobject-2.0.0.dylib ./pulseview
install_name_tool -change /usr/local/lib/libsigc-2.0.0.dylib @executable_path/../Frameworks/libsigc-2.0.0.dylib ./pulseview
install_name_tool -change /usr/local/lib/libsigrokdecode.2.dylib @executable_path/../Frameworks/libsigrokdecode.2.dylib ./pulseview
install_name_tool -change /opt/local/lib/libglib-2.0.0.dylib @executable_path/../Frameworks/libglib-2.0.0.dylib ./pulseview
install_name_tool -change /opt/local/lib/libintl.8.dylib @executable_path/../Frameworks/libintl.8.dylib ./pulseview

パスを書き換えました。以下のようになっているはずです。

$ otool -L pulseview-bin 
pulseview-bin:
    @executable_path/../Frameworks/libboost_filesystem-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/../Frameworks/libboost_system-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/../Frameworks/libboost_thread-mt.dylib (compatibility version 0.0.0, current version 0.0.0)
    @executable_path/../Frameworks/QtSvg.framework/Versions/4/QtSvg (compatibility version 4.8.0, current version 4.8.7)
    @executable_path/../Frameworks/QtGui.framework/Versions/4/QtGui (compatibility version 4.8.0, current version 4.8.7)
    @executable_path/../Frameworks/QtCore.framework/Versions/4/QtCore (compatibility version 4.8.0, current version 4.8.7)
    @executable_path/../Frameworks/libsigrokcxx.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    @executable_path/../Frameworks/libsigrok.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    @executable_path/../Frameworks/libglibmm-2.4.1.dylib (compatibility version 5.0.0, current version 5.0.0)
    @executable_path/../Frameworks/libgobject-2.0.0.dylib (compatibility version 4601.0.0, current version 4601.2.0)
    @executable_path/../Frameworks/libsigc-2.0.0.dylib (compatibility version 1.0.0, current version 1.0.0)
    @executable_path/../Frameworks/libsigrokdecode.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    @executable_path/../Frameworks/libglib-2.0.0.dylib (compatibility version 4601.0.0, current version 4601.2.0)
    @executable_path/../Frameworks/libintl.8.dylib (compatibility version 10.0.0, current version 10.4.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

先輩が作ったのは、MacOS 配下に2つあって、以下のようです。

$ ll
total 1936
-rwxr-xr-x@ 1 junkhack  admin     187 11  3  2014 pulseview
-rwxr-xr-x@ 1 junkhack  admin  983748 11  3  2014 pulseview-bin

ビルドしたものを pulseview-bin に書き換えました。bin が付いていないのは、bash のバイナリファイルのようです。

HOPE:MacOS junkhack$ hexdump -C pulseview
00000000  23 21 2f 62 69 6e 2f 73  68 0a 0a 44 49 52 3d 22  |#!/bin/sh..DIR="|
00000010  24 28 64 69 72 6e 61 6d  65 20 22 24 30 22 29 22  |$(dirname "$0")"|
00000020  0a 63 64 20 22 24 44 49  52 22 0a 0a 65 78 70 6f  |.cd "$DIR"..expo|
00000030  72 74 20 50 59 54 48 4f  4e 48 4f 4d 45 3d 22 2e  |rt PYTHONHOME=".|
00000040  2e 2f 46 72 61 6d 65 77  6f 72 6b 73 2f 50 79 74  |./Frameworks/Pyt|
00000050  68 6f 6e 2e 66 72 61 6d  65 77 6f 72 6b 2f 56 65  |hon.framework/Ve|
00000060  72 73 69 6f 6e 73 2f 33  2e 34 2f 22 0a 65 78 70  |rsions/3.4/".exp|
00000070  6f 72 74 20 53 49 47 52  4f 4b 44 45 43 4f 44 45  |ort SIGROKDECODE|
00000080  5f 44 49 52 3d 22 2e 2e  2f 73 68 61 72 65 2f 6c  |_DIR="../share/l|
00000090  69 62 73 69 67 72 6f 6b  64 65 63 6f 64 65 2f 64  |ibsigrokdecode/d|
000000a0  65 63 6f 64 65 72 73 2f  22 0a 0a 2e 2f 70 75 6c  |ecoders/".../pul|
000000b0  73 65 76 69 65 77 2d 62  69 6e 0a                 |seview-bin.|
000000bb
HOPE:MacOS junkhack$ 

こういう感じで起動してるんですね。なるほどです。Frameworks 以下のPython から呼び出しているんですね。pulsview を拝借し、ビルドしたものは、pulseview-bin にファイル名を変更しておきます。

バージョンをInfo.plist に加えておきます。

$ cat Info.plist 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
    <key>NSPrincipalClass</key>
    <string>NSApplication</string>
    <key>CFBundleIconFile</key>
    <string>sigrok.icns</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleGetInfoString</key>
    <string>PulseView is a Qt based logic analyzer GUI for sigrok.</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleExecutable</key>
    <string>pulseview</string>
    <key>CFBundleIdentifier</key>
    <string>com.yourcompany.pulseview</string>
    <key>CFBundleShortVersionString</key>
    <string>0.3.0-git-5d73886</string>
</dict>
</plist>

さて、これでいいはずですが、、、、結果は冒頭に書いたとおりです。ちなみに、Qt5.5 でも似たような感じでした。

git リポジトリを見ると、この24時間くらいでそこそこ手が入っているようです。

pulseview.git / summary

http://sigrok.org/gitweb/?p=pulseview.git;a=summary

あと、オフィシャルのwiki にもビルドするのに必要な要件などがまとまっているようです。

sigrok wiki : Building

https://sigrok.org/wiki/Building#Building_from_source

▼まとめ

・PulseView の 0.3.0-git-f3697d3 では、だめだった

・デバイスのオープンでこけているようです

・libglib-2.0.0.dylib から こけている感じ。

・ライブラリのコピーが悪いのかも

・0.2.0 のソースで試してだめなら、Qt4 のライブラリの入れ方などが悪いのかも。

・Qt で osx の実行ファイルを作るユーティリティーとかないかなぁ

・クリーンインストールしたosx でやってみたいが、その環境がない

・Qt4 の QtGui とか QtCore とかの Framework はどこにあるのでしょうか?

・ソースに手をつける以前の問題で疲れ果てた

 

参考

Qt for OS X – Deployment

http://doc.qt.io/qt-5/osx-deployment.html

 

Building OSX App Bundle

http://stackoverflow.com/questions/1596945/building-osx-app-bundle


sigrok bugzilla

http://sigrok.org/bugzilla/describecomponents.cgi?product=PulseView

FX2LP でsigrok のロジックアナライザー

年末で、何かとイベントごとがあってなかなかブログを更新できずにいました。

Aliexpress からもどんどんお品が届いて、ロジックアナライザーとして使うボードも到着しました。テストがてら、OrangePi PC の GPIO につないだLED のタイミングを計測してみること。

配線は、とりあえず1チャンネルでテスト。全部で8チャンネルいけます。

logic2

ちょっとわかりにくいですが、PB0 ~ PB7 までの端子が sigrok でいう0から7 までに対応しています。とりあえず今回はPB0 の端子につないで1チャンネルの表示をしてみました。

PulseView1

全体のテスト配線は以下のような感じです。

 

logic

osx だと sigrok のソフトウェアの中にファームウェアがあります。最新のファームウェアは、以下にビルド済みのものがあります。

fx2lafw (pre-built firmware files の項を参照)
http://sigrok.org/wiki/Fx2lafw

つい先月にリリースされている0.1.3 を使いました。

sigrok-firmware-fx2lafw-bin-0.1.3.tar.gz

http://sigrok.org/download/binary/sigrok-firmware-fx2lafw/

ほどよく、配置。*.fw がファームウェアです。

HOPE:sigrok-firmware junkhack$ pwd
/Applications/PulseView.app/Contents/share/sigrok-firmware
HOPE:sigrok-firmware junkhack$ ll
total 1088
-rw-r--r--@ 1 junkhack  admin  45268 11  3  2014 asix-sigma-100.fw
-rw-r--r--@ 1 junkhack  admin  45396 11  3  2014 asix-sigma-200.fw
-rw-r--r--@ 1 junkhack  admin  45396 11  3  2014 asix-sigma-50.fw
-rw-r--r--@ 1 junkhack  admin  45360 11  3  2014 asix-sigma-50sync.fw
-rw-r--r--@ 1 junkhack  admin   8120 11 27 09:09 fx2lafw-braintechnology-usb-lps.fw
-rw-r--r--@ 1 junkhack  admin   8120 11 27 09:09 fx2lafw-cwav-usbeeax.fw
-rw-r--r--@ 1 junkhack  admin   8120 11 27 09:09 fx2lafw-cwav-usbeedx.fw
-rw-r--r--@ 1 junkhack  admin   8120 11 27 09:09 fx2lafw-cwav-usbeesx.fw
-rw-r--r--@ 1 junkhack  admin   8120 11 27 09:09 fx2lafw-cypress-fx2.fw
-rw-r--r--@ 1 junkhack  admin   8120 11 27 09:09 fx2lafw-saleae-logic.fw
-rw-r--r--@ 1 junkhack  admin   8120 11 27 09:09 fx2lafw-sigrok-fx2-16ch.fw
-rw-r--r--@ 1 junkhack  admin   8120 11 27 09:09 fx2lafw-sigrok-fx2-8ch.fw
-rw-r--r--@ 1 junkhack  admin  81808 11  3  2014 sysclk-lwla1034-extneg.rbf
-rw-r--r--@ 1 junkhack  admin  81808 11  3  2014 sysclk-lwla1034-extpos.rbf
-rw-r--r--@ 1 junkhack  admin  81460 11  3  2014 sysclk-lwla1034-int.rbf
-rw-r--r--@ 1 junkhack  admin  48521 11  3  2014 sysclk-lwla1034-off.rbf
HOPE:sigrok-firmware junkhack$ 

sigrok の PluseView を開きます。

現在、手元でビルドしていないので、ELIAS さんのビルドしたものです。