2013/06/26

Leap Motion on Arch Linux

Leap MotionをArch Linuxで利用する方法です。
Ubuntu向けに提供されているLeap Developer Kitを用います。

※本記事は、2013/06/26現在の情報です。変わらないと思いますが、念のため。
  • 執筆時において、Leap Motionは評価ボードとして一部開発者にのみ配布。また、開発者のみがLeap Developer Kit(ドライバ含)を入手可能。
  • Leap Developer Kit: 0.8.0 5300 Linux (執筆時最新版)
  • OS環境: Arch Linux 64bit (執筆時最新状態) + gnome 3
尚、Leap Developer Kitは、GUIとしてQtを使っているようなので、
Qt環境が必要でしょう...たぶん。(私はインストール済みなので。)

ちなみに...ドライバの動作環境のことに関連して、
同梱のREADMEには次のようなことが書かれています:
Q. How to install on another Linux distro such as CentOS?
A. At this time we are only supporting recent versions of Ubuntu. However, if
you'd like to port the package to another distro you probably have
sufficient tools at your disposal. To view the Debian package, unpack it
with the 'ar' and 'tar' commands and take a look. The 'alien' package
converter mentioned above may also come in handy.
ふむふむ...。ということではじめましょう。

まずは、Leap Developer Kit (Ubuntu向け)をダウンロードします。
(2013/06/26 現在、開発者アカウントでログインしないとダウンロードできません。)

次に、ダウンロードしたアーカイブを展開します。
$ tar zxvf Leap_Developer_Kit_0.8.0_5300_Linux.tar.gz 
$ cd Leap_Developer_Kit_0.8.0_5300_Linux/
$ ls
Examples  Leap-0.8.0-x64.deb  Leap-0.8.0-x86.deb  LeapSDK  README.txt

このように、抽出されたファイルはExamples、LeapSDK、ドライバ(debパッケージ)から構成されます。

このdebパッケージをさらに展開します。
本来であれば、debhelperが使えるはずなのですが、パッケージのコンフリクトで使えなかったため...。
また、alienを使って変換してもいいのですが、単純に展開するだけで良さそうだったので。

$ dpkg -x Leap-0.8.0-x64.deb Leap-0.8.0-x64/
$ cd Leap-0.8.0-x64/
$ ls -lR
.:
合計 8
drwxr-xr-x 3 xxxxxx xxxxxx 4096  6月 11 08:58 lib
drwxr-xr-x 5 xxxxxx xxxxxx 4096  6月 11 08:58 usr

./lib:
合計 4
drwxr-xr-x 3 xxxxxx xxxxxx 4096  6月 11 08:58 udev

./lib/udev:
合計 4
drwxr-xr-x 2 xxxxxx xxxxxx 4096  6月 11 08:58 rules.d

./lib/udev/rules.d:
合計 4
-rw-r--r-- 1 xxxxxx xxxxxx 390  6月  4 11:21 25-com-leapmotion-leap.rules

./usr:
合計 12
drwxr-xr-x 2 xxxxxx xxxxxx 4096  6月 11 08:58 bin
drwxr-xr-x 3 xxxxxx xxxxxx 4096  6月 11 08:58 lib
drwxr-xr-x 3 xxxxxx xxxxxx 4096  6月 11 08:58 share

./usr/bin:
合計 15720
-rwxr-xr-x 1 xxxxxx xxxxxx 2952848  6月 11 08:48 LeapControlPanel
-rwxr-xr-x 1 xxxxxx xxxxxx 2837968  6月 11 08:49 Recalibrate
-rwxr-xr-x 1 xxxxxx xxxxxx 2536248  6月 11 08:48 ScreenLocator
-rwxr-xr-x 1 xxxxxx xxxxxx 2833160  6月 11 08:49 Visualizer
-rwxr-xr-x 1 xxxxxx xxxxxx 4928312  6月 11 08:49 leapd

./usr/lib:
合計 4
drwxr-xr-x 2 xxxxxx xxxxxx 4096  6月 11 08:58 Leap

./usr/lib/Leap:
合計 54300
-rw-r--r-- 1 xxxxxx xxxxxx  2718432  6月 11 08:47 libLeap.so
-rw-r--r-- 1 xxxxxx xxxxxx  3038016  6月 11 08:58 libQtCore.so.4
-rw-r--r-- 1 xxxxxx xxxxxx   523792  6月 11 08:58 libQtDBus.so.4
-rw-r--r-- 1 xxxxxx xxxxxx 11352400  6月 11 08:58 libQtGui.so.4
-rw-r--r-- 1 xxxxxx xxxxxx  3431872  6月 11 08:58 libQtNetwork.so.4
-rw-r--r-- 1 xxxxxx xxxxxx  1042600  6月 11 08:58 libQtOpenGL.so.4
-rw-r--r-- 1 xxxxxx xxxxxx  2631072  6月 11 08:58 libQtScript.so.4
-rw-r--r-- 1 xxxxxx xxxxxx 26316256  6月 11 08:58 libQtWebKit.so.4
-rw-r--r-- 1 xxxxxx xxxxxx  4460008  6月 11 08:58 libQtXmlPatterns.so.4
-rw-r--r-- 1 xxxxxx xxxxxx    73768  6月 11 08:58 libusb-1.0.so.0

./usr/share:
合計 4
drwxr-xr-x 3 xxxxxx xxxxxx 4096  6月 11 08:58 Leap

./usr/share/Leap:
合計 196
drwxr-xr-x 2 xxxxxx xxxxxx  4096  6月 11 08:58 PreferencePane
-rw-r--r-- 1 xxxxxx xxxxxx 50901  6月  4 11:21 app0.dat
-rw-r--r-- 1 xxxxxx xxxxxx 76876  6月  4 11:21 app1.dat
-rw-r--r-- 1 xxxxxx xxxxxx 65515  6月  4 11:21 app2.dat

./usr/share/Leap/PreferencePane:
合計 0
debパッケージの中身(パッケージの定義ファイル等を除く一連のファイル)は、以上のような構造になっていました。

大まかに書くと...
  • usrディレクトリ: バイナリとライブラリ類
  • libディレクトリ: udevのルールファイル
となっています。

では、以上のファイルをシステムにコピーします。
$ sudo cp -ir usr/* /usr/local/
$ sudo cp -ir lib/* /lib/

次に、"plugdev"というグループを作成し、自分のアカウント(xxxx)を"plugdev"グループに所属させます。
$ sudo groupadd plugdev
$ sudo usermod -aG plugdev xxxx
$ exec su -l xxxx

これで完了です。

あとは、Leap Motionを接続し、プログラムを起動するだけです。
$ LeapControlPanel
...これで...動作するはずなのですが、
通知領域のアイコンが黒色のまま、色が変わらない...(汗;)。

うーむ...。現行バージョンでは leapdがデーモンになっていますので、これを実行すると...。
$ leapd
[00:46:49] [Info] WebSocket server started
[00:46:54] [Info] Leap Motion Controller detected: xxxxxxxxxx
[00:46:55] [Info] Processing initialized
動いてるようですね。
ですので、leapdを実行したままの状態で LeapControlPanel を起動してみると...。
$ LeapControlPanel

うまくいきました( ´∀`)b!

また、Visualizerなどもコンソールから起動できます。
$ Visualizer
Leap MotionのVisualizerを起動したところ
以上です♪

p.s.

Arch LinuxのAURに"leap"が登録されていました。
もちろん現時点ではまだ、SDKを誰でもダウンロードできるわけではありませんので、アーカイブの展開を楽にしてくれる程度ですが。
でも、あとちょうど1ヶ月もすると、Leap Motionが一般発売されますね。
どんな世界が待っているのか、楽しみです!

2013/06/23

Arch Linuxからhpのプリンタに直接/ネットワーク接続する (HPLIP)

Arch LinuxなどのLinux環境から、hpのインクジェットプリンタ(複合機)に接続するという話です。直接USB接続したり、ネットワーク接続することができます。

今回接続するhpプリンタは、HP Photosmart 5510 B111a という製品で、
プリンタというか複合機ですが、安いのにタッチパネル&無線LAN搭載(Web管理可能)という代物です。これを家のLAN内に無線LAN接続してあります。
ちなみに、このプリンタはGoogle Cloud Printに対応しているため、普段から印刷するときはクラウド経由で印刷していたりしますが、今回は直接接続して印刷する方法です。
それにしてもhpのプリンタは、音が煩く仕事も力まかせ感があります.....安いけれど。家で使い比べていますが、静音性も丁寧さについては国内メーカーの方が格段に上です。

さて、hpではLinux向けプリンタドライバを オープンソースプロジェクトとして
"HP Linux Imaging and Printing (HPLIP)"という名称で公開しています。
http://h10018.www1.hp.com/wwsolutions/linux/products/printing_imaging/index.html (プリンタ以外にもイメージング/印刷全般ですね。)

Arch Linuxでは、pacmanのextraリポジトリに、この"HPLIP"が含まれています。
https://www.archlinux.org/packages/extra/x86_64/hplip/

従って、pacmanで"hplip"をインストールするだけで使えます。
またGUIの為に"qt4"と"python2-pyqt"を併せてインストールします。
$ sudo pacman -Syu hplip qt4 python2-pyqt

次に、自分のユーザアカウントを"lp"グループに追加して、一旦ログアウトします。
$ sudo usermod -aG lp xxxx
$ logout

その後、"cups"を再起動してから、"hp-setup"を実行します。
$ sudo systemctl restart cups
$ sudo hp-setup

"HP Device Manager"が起動しますので、プリンタと接続する方法を選びます。
USB接続、ネットワーク接続、シリアル接続など...。

今回はLAN接続したプリンタなので、"Network/Ethernet/Wireless ..."を選びます。
さらに...本来はこのまま"Next"しても良いはずですが、プリンタを固定IPアドレスにしてあるので、"Manual Discovery"にチェックを入れ、IPアドレスを入力します (portはそのまま)。 自動よりもこの方が安定するようです。

次に、このようにプリンタ一覧が表示されます。プリンタを選択して"Next"します。

すると、このような画面が表示されます。"Add Printer"をクリックすれば完了です。

CUPSに正しく認識されていれば、このように、
Gnomeの設定画面のプリンタ一覧などにもプリンタが表示されるはずです。
テストページを印刷してみて正しく印刷できるか試してみても良いでしょう。

尚、hp-setupが起動しない場合は...python3で実行されているかもしれません。次のようにpython2で実行してください:
$ python2 /usr/bin/hp-setup
(Arch LinuxではPython3とPython2が共存しているため、このような問題が起きます。
面倒くさければ、python2をデフォルトにしてしまうことをおすすめしますw)


また、hpプリンタの管理は "hp-toolbox" から行えます。
$ sudo hp-toolbox
hp-toolboxを実行したところ。プリンタのインク状態や設定などが行える。



ちなみに...他のLinux(UbuntuやFedora)でhpプリンタを扱いたい場合も同様です。
apt-getやyumから、HPLIPをインストールするだけです。
もしくは、hplipのサイトからパッケージを直接ダウンロードすることもできます。
http://hplipopensource.com/hplip-web/install_wizard/index.html

2013/06/19

Arch LinuxにおけるNaClプログラム(C++)の開発環境構築とビルド

Arch Linux上で NaCl(Native Client)の開発環境を構築する際には、
基本的には簡単ですが、Pythonの複数環境の共存など落とし穴があります。
自分用のメモを兼ねて、手順を書いておきます。
(本記事は、2013/06/19 現在において最新状態のArch Linux 64bit版を基にしています。)


まずは、pacmanでmultilibリポジトリを扱うよう設定をします。
具体的には、 /etc/pacman.conf に、[multilib]というセクションがあるので、
そのコメントアウトを解除します。

$ sudo vi /etc/pacman.conf
~~~~
[multilib]
Include = /etc/pacman.d/mirrorlist
~~~~
$ sudo pacman -Syy

さらに、pacmanで、gcc-multilibをインストールします。
$ sudo pacman -Syu gcc-multilib

次に、Python環境について、python2がデフォルトとなるように対策をします。
(※ Arch Linuxには、Python2とPython3の環境が共存している場合がありますが、
今回を含めて殆どはPython2を使うので、PATHに追加することで変更しておきます。いつでも戻せます。)

$ mkdir ~/bin/
$ ln -s /usr/bin/python2 ~/bin/python
$ vi ~/.bashrc
PATH=export PATH=/home/xxxxxx/bin:$PATH
(xxxxxxは、自分のユーザ名。)

あとは、通常どおりにNaCl SDKをダウンロードしてアーカイブを展開します。
(参照: https://developers.google.com/native-client/sdk/download)
$ cd ~
$ wget http://storage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk/nacl_sdk.zip
$ unzip nacl_sdk.zip
$ rm nacl_sdk.zip
$ cd nacl_sdk/

さらに、naclsdkでPepperAPIを取得して、設定を行います。
$ ./naclsdk update
$ ./naclsdk list
Bundles:
 I: installed
 *: update available

  I  sdk_tools (stable)
     vs_addin (dev)
     pepper_23 (post_stable)
     pepper_24 (post_stable)
     pepper_25 (post_stable)
     pepper_26 (post_stable)
  I  pepper_27 (stable)
     pepper_28 (beta)
     pepper_canary (canary)

All installed bundles are up-to-date.
$ vi ~/.bashrc
~~~~
export NACL_SDK_ROOT='/opt/nacl_sdk/pepper_27'
(pepper_27は、インストールされたPepperAPIのバージョンとする。)

最後に、サンプルがビルドでき、デーモンも実行できることを確認します。
$ cd pepper_27/examples/
$ make
~~~~
make[1]: ディレクトリ `/home/xxxxxx/nacl_sdk/pepper_27/examples/websocket' に入ります
  CXX newlib/Debug/websocket_x86_32.o
  LINK newlib/Debug/websocket_x86_32.nexe
  CXX newlib/Debug/websocket_x86_64.o
  LINK newlib/Debug/websocket_x86_64.nexe
  CXX _newlib/Debug/websocket_arm.o
  LINK newlib/Debug/websocket_arm.nexe
  CREATE_NMF newlib/Debug/websocket.nmf
make[1]: ディレクトリ `/opt/nacl_sdk/pepper_27/examples/websocket' から出ます
Done building targets.

$ python ../tools/httpd.py

Serving /opt/nacl_sdk/pepper_27/examples on http://localhost:5103/...
尚、ChromeやChromiumにおいて、Webストア以外のローカル上などのNative Clientを動作させるには、
chrome://flags" から、"ネイティブ クライアント"の項目を許可することが必要です。念のため。



2013/06/16

【組み込みOS自作入門】 1章&2章まで進んだ

"12ステップで作る組込みOS自作入門"という書籍で学びながら、組み込みOSを自作してみています。マイコンは、書籍のとおり H8/3069Fです。

組み込みOS自作本で勉強をはじめるという宣言のあと・・・
学業や、Webサービス開発のほうが忙しかったり、
Fedora→Arch Linuxに乗り換えたり、Raspberry PiやArduinoに手を出したり...としているうちに、めちゃくちゃ時間があいてしまいましたが(汗;)・・・

つい先日から少しずつ触りはじめ...今日やっと...まともに進めることができました。
ただいま勉強中のソースコードはGitHubで公開していますww
ソースコードをKL-01ライセンスにしてくださった本の筆者 kozosさん に感謝!
https://github.com/mugifly/study-my12os
コメントと、ちょっとしたメモも英語(Broken english(笑))で書きながら...。
(もう少し...まともな英語をかけるようになりたいものです><;)

さて...まずは、1章。


1章では、Linux上にセルフコンパイル環境とクロスコンパイル環境を構築して、
Hello, worldを表示する簡易的な”ブートローダ”や、ライブラリを作成しました。
文字を出力するための標準ライブラリを自作するというのも新鮮でした。
https://github.com/mugifly/study-my12os/tree/st1

ちなみに、クロスコンパイル環境ですが、Arch Linux (64bit)で問題なく構築できました。
https://github.com/mugifly/study-my12os/wiki/BuildEnvironment
  • binutils-2.23
  • gcc-4.8.1
PCとボードとの接続には、USBシリアル変換ケーブル "BSUSRC06"を使いました。

ボードへの書き込みは、h8write、kz_h8writeの両方で成功しています。
また、端末エミュレータには、Minicomを利用しています。

尚、ビルドと書き込みの手順は、
https://github.com/mugifly/study-my12os/wiki
にメモしておきました。

次に、2章(ブートローダの作成)です。


前章で作成したライブラリ(lib.c)におなじみの機能を追加していきます。

  • memset - メモリへのバイト書き込み
  • memcpy - メモリのコピー
  • memcmp - メモリの比較
  • strlen - 文字列の長さ取得
  • strcpy - 文字列のコピー
  • strcmp - 文字列の比較
  • strncmp - 文字列の比較 (長さ指定)

また、この章では、"SCI (シリアルコントローラ)"の話がでてきました。
要点だけ、メモしておきたいと思います。

  • H8/3069Fに搭載されたSCIは3つあり、すべてCPUに内蔵されている。
  • H8/3069Fのシリアルコネクタは、SCI1(0xffffb8)に接続されている。
    (即ち、SCI1を制御すれば、シリアル通信ができる。)
  • SCI1のレジスタマッピング: (H8/1069Fのマニュアル 13.1.4節に詳細記載)
    • SMR: 0xffffb8 - シリアルモードレジスタ
      (bitは以下の通り。今回は全bitが0となる。)
      • bit0,1 - クロックセレクト (0,0ならば、クロックそのまま)
      • bit3 -  ストップビット長 (0=1bit, 1=2bit)
      • bit4 - パリティの種類 (0=偶数, 1=奇数)
      • bit5 - パリティの有効 (0=無効, 1=有効)
      • bit6 - データ長 (0=8bit, 1=7bit)
      • bit7 - モード (0=調歩同期式, 1=クロック同期式)
    • BRR: 0xffffb9 - ビットレートレジスタ (ボーレート設定)
      あまり高速にするとうまくいかないので、9600bps。
    • SCR: 0xffffba - シリアルコントロールレジスタ (送受信の有効/無効)
      • bit0,1 - クロックイネーブル
      • bit4 - 受信イネーブル (1=送信)
      • bit5 - 送信イネーブル (1=送信)
      • bit6 - 受信割り込みイネーブル (1=割込可能)
      • bit7 - 送信割り込みイネーブル (1=割込可能)
    • TDR: 0xffffbb - トランスミットデータレジスタ (送信する1文字)
    • SSR: 0xffffbc - シリアルステータスレジスタ (送信完了/受信完了)
      • bit6 - 受信ステータス (1=受信完了)
      • bit7 - 送信ステータス (1=送信完了)
    • RDR: 0xffffbd - 受信した1文字を読み出す
  • SCI1を準備する際には・・・
    1. SCI1のSCRにすべて0を書き込むことで一旦無効化。
    2. SCI1のSMRへ通信設定を行う。
    3. 再びSCRを書き換えて有効にする。
  • SCI1で1文字送信する際には・・・
    • SCI1のSSRの送信ステータスが1であることを確認。
    • SCI1のTDRに送信したい1文字を書き込む。
    • SCI1のSSRの送信ステータスを0にする (送信依頼できる)
    • 送信完了すると・・・SCI1のSSRの送信ステータスが1になる。
  • serial.c
    • struct h8_3069f_sci として、SCIのレジスタを操作するための構造体を定義。
    • regs[] として、3つ全てのSCIのための構造体配列を生成。
  • lib.c
    • putc関数では、シリアル通信の仕様に基づいて、改行コードを '\n' → '\r'(0x0d)に変換する。これを"端末変換"という。
      端末変換された文字列は、SERIAL_DEFAULT_DEVICE(SCI1)宛に出力される。
    • 書籍では、端末変換をしない生の入出力を"シリアル"。端末変換をする入出力を"コンソール"という。
さらに、"スタートアップ"の説明もでてきました。
  • startup.s(アセンブリ)の _start からプログラム実行が開始される。
    ここではスタックポインタの設定が行われ、main関数にジャンプする。
    このような処理を"スタートアップ"という。(startup または crt(C RunTime) と呼ばれる。)
  • _startから実行が開始されるのは、CPUにより割り込みのおかげ。
  • H8は "ベクタ割込み方式"である。
    • 割込みハンドラを配置するアドレスを特定アドレス("割込みベクタ")に記述しておく方式。
    • H8の割込みベクタは、メモリ上の0x000000〜0x0000ffに、割込みの種類別に存在する。
    • 起動時(リセット時)には、"リセットベクタ"という割込みが発生する。
      H8では、割込みベクタの0番目がリセットベクタである。
      vector.cのvectors[]で、実際に割込みベクタを定義している。その0番目にstartを指定している。
    • 割込みが発生すると、CPUはこの割込みベクタを参照して、割込みハンドラの配置場所を知る。そして、割込みハンドラに処理がジャンプする。
  • "リンカスクリプト"(ld.scr)では、リンク時に関数や変数をどのアドレス上に配置するかを指定できる。
    ここで、vector.oが先頭に配置されるよう指定されている。
    即ち、vectors[]が0x000000〜0x0000ffに配置されることになる。
この章の追記はライブラリの機能追加くらいだったので、少なめでした。
こちらも無事動作しました。

次は3章です(^^)/♪ 続く...。なるべく早く続きに取り掛かりたい><