Orange Pi 3 multimedia

OrangePi3(armbian)のサウンドドライバもまだのようですね。
現時点ではOrangePi3のオーディオジャックから音を出すことはできませんがLan内にpluseaudio serverがあれば音声を送ることで再生が可能です。

当サイトではmoode audio(raspbian base)をpluseaudio serverにしてOrangePi3の音を出しています。

OrangePi3 Sound

$ uname -a
Linux orangepi3 5.1.12-sunxi64 #5.89.190620 SMP Thu Jun 20 23:59:56 CEST 2019 aarch64 GNU/Linux

sound cardは見えていません。

$ cat /proc/asound/cards
--- no soundcards ---

pulseaudioのインストール

# apt install pulseaudio

インストールしたらclient.confを作成
~/.config/pulse/client.conf

autospawn = no
daemon-binary = /bin/true
default-server = 192.168.0.111 # pluseaudio server address

当サイトの環境ではこれでmoode audioのpluseaudioから音声再生が可能です。

pluseaudio server

RaspberryPi3(raspbian desktop)はpluseaudioはインストールされていますがデフォルトでは有効になっていません。RaspberryPi3で簡単な実験をしてみたいと思います。

インストールされている主なpluseaudio関連パッケージ
追加でpavucontrolをインストールしています。

以下のファイルを作成します。
~/.config/pulse/client.conf

autospawn = no
daemon-binary = /bin/true

~/.config/pulse/default.pa (自ネットワーク帯で)

.include /etc/pulse/default.pa
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24 auth-anonymous=1
set-default-source alsa_output.platform-soc_sound.analog-stereo.monitor
set-default-sink alsa_output.platform-soc_sound.analog-stereo

当方のRaspberryPi3にはhdmi-vgaアダプタがあります。

$ cat /proc/asound/cards
 0 [ALSA           ]: bcm2835_alsa - bcm2835 ALSA
                      bcm2835 ALSA
 1 [vc4hdmi        ]: vc4-hdmi - vc4-hdmi
                      vc4-hdmi

音声出力をhdmiからbcm2835 ALSAに切り替えます。

$ amixer cset numid=3 1

pluseaudioスタート

$ pulseaudio --start

pavucontrolにはRaspberryPi3のデバイスが見えてきます。
音量は最初100%になってるので充分小さくしておきます。
OrangePi3のclient.conf default-serverはRaspberryPi3のアドレスに変更

RaspberryPi3からsshでOrangePi3にログイン
OrangePi3から適当な音楽ファイルを実行するとRaspberryPi3のスピーカーから再生します。
pavucontrolを起動しておかないとpluseaudioにアクセスが無いとすぐkillしてしまいます。
bcm2835 ALSAでもちゃんとしたアンプ、スピーカーを繋いでいればかなりまともな音がするはずです。
(ちゃんとしていないアンプ、スピーカーなので音質の良否は確認できていません)

参考 arch linux PulseAudio PulseAudio/サンプル

OrangePi3 mp4

動画再生(音楽再生)はやはりmpv mplayerですね。

# apt install mpv mplayer

その他 youtube-dl

smtube

youtube視聴はsmtube
smtubeはOrangePi3からもコンパイル可能です。(以前の記事

ソースをダウンロードします。

ライブラリのインストール

# apt install qt5-default libqt5webkit5-dev qtscript5-dev qttools5-dev-tools libqtwebkit-dev

ダウンロードしたソースを展開、コンパイル実行(5分位)

# cd smtube-19.6.0
# make install clean

/usr/local/bin/smtubeを実行するには以下をインストールします。

# apt install libqt5webkit5 libqt5script5

smtube起動

$ smtube &


playerはmplayer mpv+youtube-dlが使えます。smtubeからsmplayerの使い方はわかりません。
(ごちゃごちゃしてるのキライ)
最近になってmplayerから再生できなかったのですがsmtubeのバージョンを上げたら普通に再生できるようになりました。以前からそうですね。
smtube関連サイト側の問題(?)


dwmには3つの表示モードがあります。表示モードはタグナンバー(9)とタイトルバーの間にある記号で判別できます。
タイル型 []= mode+t
フロート ><> mode+f
最大化 [数値] mode+m 数値=開いているアプリケーション
mode = windows key(設定次第)


見え方はplayerや元画像サイズによって違います。
また直前のモードによっても変わってきます。
どのモードからもmode+マウス(LまたはRクリック)でサイズ変更、移動は可能
9個あるタグはモード変更によって全て影響します。


最大化(mode+m)にすると大きい画像は縮小して小さい画像はウインドウサイズに合わせて拡大します。
モードは直前のモードとトグルします。
mode+space mode記号クリック
デフォルトのタイル型フロート型のトグルにするには
mode+ft
少し慣れてくると殆どの動画ファイルを簡単な操作で好みのスタイル、サイズで表示できます。

当サイトのメイン環境はRaspberryPi3なのでOrangePi3のcpuパワー、高速なネットワーク、usb3.0経由のストレージはメリットが大きいです。

Orange Pi 3 TigerVNC + uim anthy

いままではTightVNCを導入していたのですがTightVNCには欠点があって一部特定のQTアプリケーション下ではキーボードマッピングが滅茶苦茶になってしまいます。

またやはりQTアプリケーションではscim-anthyからの日本語入力ができません。
環境変数など試してみたのですがうまいこといきませんでした。
こちらもuim-anthyに変更してみたいと思います。

TigerVNC

TigerVNCはTightVNCからforkしていますがQT関連は改善されているようです。
TigerVNCのインストール

# apt install tigervnc-standalone-server tigervnc-common

ターミナルを開いてsshでログインvcnserverを起動します。
-localhost noを指定しないとRaspberryPi3から接続できません。
https://qiita.com/Tats_U_/items/c170f61a5e03ae045128

$ vncserver -localhost no

おそらく最初の起動でパスワードを聞かれると思いますが設定されない場合は手動で設定します。(当サイトではtightvncの~/.vnc/passwdが使えました)

$ vncpasswd

設定ファイル vnc.conf

tigervncをインストールすると設定ファイル/etc/vnc.confが作成されます。
ユーザーの設定ファイルは~/.vnc/vnc.confが有効になりますが/etc/vnc.confをそのままコピーするとエラーになるので必要な項目のみ記載します。
書式はtightvncと同じでlocalhost noを追加します。
~/.vnc/vnc.conf

$geometry     = "850x528";
$depth        = 24;
$desktopName  = "Orange Pi 3";
$localhost    = "no";

vncserverの起動、終了

sshでログインしてのvncserverの起動、終了は以下のコマンド

$ vncserver :1
$ vncserver -kill :1


:1 は省略可

キーバインド xmodmap

tightvncと比べるとtigervncはxmodmapの値も変わってきます。
mod4 Super_L (0x85),Super_R (0x86)が割り当てられています。
各キーの値も変わっているのでxbindkeysを設定している場合は再設定が必要です。

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

clipboard

tightvncのホスト〜クライアント間のコピー、ペーストはautocutselを実行しておくことで可能でしたがtigervncではvncconfigを実行します。
vncconfigの実態はtigervncconfigですね。tigervncをインストールすると盛れなく付いてきます。

$ vncconfig nowin=1 &


vncconfigを実行するとclipboardのウインドウが現れますがこのウインドウが開いている時だけがコピー、ペーストが可能になります。ホスト〜クライアント間のコピー、ペーストは常に使うので起動時からバックグラウンドで実行するほうが使いやすいです。
helpを見るとparameters nowinを1にすると良いようです。ダイアログは出ずにvncconfigを実行します。日本語のコピペはダメです。
これをxstartupに加えておきます。

フォントサイズの変更

tigervncのフォントサイズはtightvncで設定した値よりも1.5ポイントほど大きく表示するようです。
xtermは~/.Xresources、メニュー関係はlxappearanceで変更
その他アプリケーションで変更
必要であればdwmもフォントサイズを変更して再コンパイル

uim-anthy

uim-anthyのインストール

# apt install uim uim-anthy

~/.cshrc (scimから変更)

setenv  LANG   ja_JP.UTF-8
setenv  XMODIFIERS @im=uim
setenv  GTK_IM_MODULE uim
setenv  QT_IM_MODULE uim

~/.vnc/xstartup に追加

uim-xim &
uim-toolbar-gtk &

TigerVNC + uim anthyのxstartup

~/.vnc/xstartup

#!/bin/csh
xrdb $HOME/.Xresources
xsetroot -solid gray3
vncconfig nowin=1 &
xbindkeys &
xterm -e ranger &
dwm &
uim-xim &
uim-toolbar-gtk &

デフォルトは半角/全角 or Shift+Spaceで漢字入力

vncserverの起動

debianではsystemdのサポートは無いようです。必要であれば作成するしか無いのですが面倒なのでtightvncの時と同様crontabの設定で起動しています。(当サイトはこれで充分)

$ crontab -e
@reboot sudo -u pi /usr/bin/vncserver

clientから接続
clientのRaspberryPi3にはtigervnc-viewerをインストールしています。

# apt install tigervnc-viewer


vncviewer hostnameを実行すると簡単なパスワードダイアログが出現します。

通常は上記のダイアログからパスワードで認証しますが-passwdオプションを指定することでパスワードレスで認証することができます。
vncserver(OrangePi3)の~/.vnc/passwdファイルをclient(RaspberryPi3)の適当なディレクトリ(~/.vnc)にコピーします。ファイル名はわかりやすい名前(opi3)に変更します。
ディレクトリはchmod 600,ファイルはchmod 400にしておくといいでしょう。
下記のコマンドを実行します。

$ vncviewer -passwd /home/pi/.vnc/opi3 orangepi3:1


デスクトップアイコンなどに仕込んでおくといいと思います。
パスワードを打つことも無くいきなりvncserverに接続が可能になります。
このためにtigervncにしたという噺もあります。

QTアプリのキーマッピング、日本語入力もOKです。

Orange Pi 3 sun50i-h6-orangepi-3.dtb

Armbian_5.88.190601_Orangepi3_xxx_5.1.5.img以降(この版までOK)新規インストールまたはアップグレードすると起動できなくなっていました。

この問題に対してarmbianフォーラムに回避策が報告されています。

原因はkernel 5.1.6以降のsun50i-h6-orangepi-3.dtbのようですね。
現在armbianのdownload listには5.1.5ベースの起動可能なバージョンは無くなっています。フォーラムの最後の方にkrachlatteさんが5.1.5ベースのdtbファイルを提供しています。

カードの作成

現時点の最新のimgでカードを作成してみます。
最新のimgとkrachlatteさんのdtbファイルをダウンロード
imgを展開

$ 7za x Armbian_5.89.190616_Orangepi3_Debian_stretch_dev_5.1.7.7z

カードに書き込み

# dd if=Armbian_5.89.190616_Orangepi3_Debian_stretch_dev_5.1.7.img of=/dev/sda bs=1M

RaspberryPi3からは書き込んだカードが見えています。
sun50i-h6-orangepi-3.dtbをコピー

# cp sun50i-h6-orangepi-3.dtb /media/aaab2277-5123-44ef-b7f3-5df6be089105/boot/dtb-5.1.7-sunxi64/allwinner


ダウンロードしたsun50i-h6-orangepi-3.dtbと差替え

確認しやすいように/etc/network/interfacesに固定IPを振っておきます。
/etc/network/interfaces

auto eth0
iface eth0 inet static
  address         192.168.0.114
  netmask         255.255.255.0
  gateway         192.168.0.1
  dns-nameservers 192.168.0.1

カードを挿し替えて起動

RaspberryPI3からsshでログイン

$ ssh root@192.168.0.114


無事起動できました。

またアップグレードがあると起動できなくなってしまいます。解決するまでは保留にしておきます。

# apt-mark hold linux-dtb-dev-sunxi64

次回からは通常通りupdateできます。(またなにがあるかわかりませんが)

# apt update && apt -y upgrade

開発バージョンとしてはやむを得ないところですがやはりドライバの開発はむずかしいものと想像しています。

# wlan0もデフォルトでデバイスが生えています。

Orange Pi 3 bluetooth シリアル通信

前回のWiFi設定の記事はあたかもサクッと設定したような内容になっていますが現実はなかなかそうは行きませんね。
使い慣れたnetworkingやdhcpcd5をインストールdhcpcd.confから設定したりと試しましたが繋がっても思ったような挙動になりません。NetworkManagerにしてからは記事の通り比較的スムーズに行きましたが当サイトのOrangePi3(ヘッドレス)はすでに稼働しており繋がらないnetworkになった時最低限の状況確認やshutdownが実行できるようもうひとつの通信手段としてbluetoothのシリアル通信を設定していました。

環境

Raspberry Pi 3(2019-04-08)raspbianデスクトップ
Orange Pi 3 armbian(debian stretch)
Raspberry Pi 3からOrange Pi 3へbluetoothシリアル接続するものとします。

Orange Pi 3 bluetooth

OrangePi3にはAP6256(WIFI+BT)が載っているのですが現時点ではまだ動作していないようです。またbluetoothに関しての有効な情報も得ることができませんでした。
bluetooth deviceは手持ちのbluetoothドングルを使用してみました。
ARM(64bit)用のドライバはまだまだ開発途上なのでraspbianなどで正常に認識してもOrangePi3で使えるとは限らないと思います。

$ hciconfig
bluetooth deviceらしきものが表示されていますが稼働していません。
hci1: BD Addressなどなし


hci0: チップはCSR8510 A10
こちらは正常に認識、接続可能

ペアリング

OrangePi3にbluetoothをインストールします。

# apt install bluetooth bluez-firmware

インストールするとサービスは起動しているはずです。

Raspberry Piには独自のpi-bluetoothがインストールされていて大抵の機器はbluetoothマネージャーからペアリング可能ですがOrangePi3とのペアリングについては少し勝手が違うようです。(以下の方法でペアリングできました)

RaspberryPi3から2つターミナルを開いて1つはOrangePi3にssh接続します。
rootから実行したほうが作業しやすいと思います。

左のターミナルがRaspberryPi3 右がOrangePi3
要領としてはbluetoothctlを実行してお互いに相手のBD deviceを認識したらpairを実行します。pairはどちらから実行しても構いません。
Time outやコマンドの実効でエラーが発生したらbluetoothctlをexitで抜けて最初からやり直します。
画像は1回目失敗した例です。Time outで[del] deviceになっています。

OrangePi3にはsshでログインしておきます。

$ sudo -i
# systemctl restart bluetooth
# bluetoothctl -a
[NEW] Controller 00:1A:7D:DA:71:13 orangepi3 [default]
Agent registered

bluetoothctl -aを実行すると自身のBT IDを表示してbluetoothctlのコマンド待ちになります。
RaspberryPi3はbluetoothctl -a実効後bluetoothマネージャーからMake Discoverable,Add Device…でダイアログを開くと必要なコマンドを実行します。(コマンドラインからでも可)
OrangePi3から実行します。

[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on

scan onを実行すると1分位でRaspberryPi3を発見します。
RaspberryPi3側もOrangePi3を自動で探し出しますがもし発見していない場合は同様にscan onを実行します。
[NEW] Controller 00:1A:7D:DA:71:13 orangepi3 [default]
[NEW] Device B8:27:EB:24:C9:19 pi3
双方で自身のIDと相手のIDが見つかればpairが実行可能です。
discoverable: noになったら discoverable onを実行しておきます。

[bluetooth]# pair B8:27:EB:24:C9:19


画像はOrangePi3からpairを実行した例です。(RaspberryPi3のIDを指定)
通信を開始 OrangePi3側にはPairing succsessfulが確認できます。
exitで抜けてPairing完了


RaspberryPi3のダイアログからpairを実行するとエラーになります。コマンドラインから実行する必要があります。

シリアル通信

bluetoothによるシリアル通信を行うためRFCOMMを利用します。

OrangePi3の設定


Sap driver関連にエラーがありますが回避方法は以下にあります。もう1箇所エラーが残りますがこちらはbluezのバグのようです。(気にしなくてOK)
またsdptoolを起動できるようオプションを指定(–compat)
raspberry piも同様でどちらのエラーも特に修正を加えなくても接続には問題ないはずです。

https://www.raspberrypi.org/forums/viewtopic.php?t=131999
/lib/systemd/system/bluetooth.service

ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=sap --compat

https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/1499858

シリアル接続に関してはデフォルト設定(bluetooth.service)で接続は可能(でした)
channelはデフォルトの1になります。

設定を変更したら

# systemctl daemon-reload
# systemctl restart bluetooth

rfcommの起動
rfcommの待受は/etc/rc.localに設定しました。
/etc/rc.local

rfcomm watch 0 1 agetty rfcomm0 115200 orangepi3 -a root &

exit 0
# systemctl daemon-reload
# systemctl restart rc.local

RaspberryPi3の設定

RaspberryPi3から接続するには/dev/rfcomm0を介して通信するのですがこちらも/etc/rc.localから起動します。
/etc/rc.local

rfcomm bind 0 00:1A:7D:DA:71:13

exit 0

rc.local restart

# systemctl daemon-reload
# systemctl restart rc.local

シリアルコンソール

TTY terminal applicationにはscreen picocom ce tioを使ってみました。

# apt install screen picocom cu tio
$ screen /dev/rfcomm0 115200     #End Ctl-a k y/n
$ picocom -b 115200 /dev/rfcomm0 #End Ctl-ax
$ cu -s 115200 -l /dev/rfcomm0   #End ~.
$ tio -b 115200 /dev/rfcomm0     #End Ctrl-t q

いずれも同じように使うことができますがこの中でシリアル接続として一番使いやすかったのはtioでした。
rfcommは調子のいい時はすぐ繋がるのですがなにかの関係で接続まで時間がかかることがあります。
tioは接続が切れた時やTimeoutの際はretryを接続するまで繰り返します。

RaspberryPi3からOrangePi3へ接続してみる

$ tio -b 115200 /dev/rfcomm0


サクッと繋がりました。
シリアル接続はいろいろ制限があります。topなど特殊なコマンドは実行できません。
通常のコマンドは実行可能です。
但しviやnanoなどではファイルの編集は不可です。(ed editorは可だが使いにくい)
あくまで状況確認、正常終了、再起動(設定ファイルのコピー)と考えたほうがいいです。

tioはターミナルからexitすると再度接続を繰り返します。終了するにはCtrl-t q


接続したまま再起動すると接続できるまでretryを繰り返します。

設定が正しくて繋がりにくい要因として上記のとおり接続まで時間がかかる(60秒位の時もある)
また接続する側(RaspberryPi3)のrfcommの状態に起因することが多いと思います。


画像はRaspberryPi3のrfcomm
起動時はclean
接続時はconnexted
正常終了はclose
clean,closeは(再)接続可能です。これ以外のメッセージでは失敗することがあります。
一旦releaseして再bindすることでcleanになります。
稀にRaspberryPi3の再起動が必要なときもある。

TTY terminal applicationは使い方を誤るとすぐ固まります。固まったときは接続する側でkill -9 idしてやればcloseで再接続できます。
bluetoothによるシリアル接続は若干癖がありますが動作自体はかなり信頼性は高いと思っています。
ネットワークの監視、実験用途にはいいですね。

Orange Pi 3 WiFiの設定

当サイトの環境では取り敢えず有線LANがあれば間に合うのですがやはりWiFiも気になります。

WiFiを使うヒントはarmbianフォーラムに載っていますね。
https://forum.armbian.com/topic/9368-orangepi-3-h6-allwiner-chip/page/15/

wlan0デバイス

初期インストール時点ではWiFiデバイスは見えません。

# cd /lib/firmware/brcm
# cp brcmfmac4356-sdio.bin brcmfmac43456-sdio.bin
# cp brcmfmac4356-sdio.txt brcmfmac43456-sdio.txt


再起動する

wlan0が生えてきました。
(現在開発中のためデフォルトでは有効にしていないものと思います)

WiFi設定ツール

armbian(debian-stretch)にはnetworkingとnetwork-managerの2つのデーモンが走っています。

network-managerはRaspbian(2019-04-08)にはインストールされていませんが現在のlinux系では主流のようです。


nmcliコマンドの練習
helpでは[OPTIONS] OBJECTの順になっていますがWeb上の多くはOBJECT [OPTIONS]で紹介されていると思います。(どっちでもいい)
OBJECT OPTIONSについては一文字で認識します。

nmtui-connect

NetworkManagerにnmtui-connectのコマンドがあります。

$ nmtui-connect


ここからWiFiルーター(aterm-a3b276-a)を選択
出現したダイアログにpskキーを入力
dhcpでIpを取得しました。(簡単に設定できますね)

nmtui

$ nmtui

WiFiは実験用途ですが当サイトのOrangePi3はファイルサーバーとして運用しているのでIPを固定する必要があります。

メニューを進んで行くと編集画面になります。
環境に合わせてIPを固定化します。
自動的に接続するを外してOKにしておきます。

イーサネット(eth0)はnetworking(/etc/network/interfaces)から設定していたのですが同様にNetworkManagerに切り替えます。
networkingは止めて/etc/network/interfacesもdefault設定ファイルに戻します。

# systemctl disable networking

作成されたプロファイル名は有線接続 1になっているかもしれませんがEthernet0に変更しました。
WiFiのデフォルトプロファイル名はルーターのSSIDになるはずです。
IPはWiFiと同じにしてこちらは自動的に接続するにしておきます。
設定したプロファイルは/etc/NetworkManager/system-connections以下に保存されます。
nmcli nmtuiコマンドは初回登録したユーザー権限でOKです。

pythonランチャの作成

下記のプログラムではWiFiで起動する場合はWiFiの自動接続をyesにEthernet0をnoにして再起動します。(Ethernetで起動する場合は逆に)
~/bin/network.py

#!/usr/bin/python3
from tkinter import *
from tkinter import ttk
import subprocess
import time

root = Tk()
root.title('Shutdown Menu')
style = ttk.Style()
style.theme_use('default') #('clam', 'alt', 'default', 'classic')

# Frame as Widget Container
frame1 = ttk.Frame(
    root,
    padding=5)
frame1.grid()

# Button 1 eth0
def eth0():
    subprocess.run("nmcli connection modify Ethernet0 connection.autoconnect 'yes'", shell=True)
    subprocess.run("nmcli connection modify aterm-a3b276-a connection.autoconnect 'no'", shell=True)
    time.sleep(1)
    subprocess.run("sudo reboot", shell=True)
icon1 = PhotoImage(file='~/.icons/ethernet.png')
button1 = ttk.Button(
    frame1,
    image=icon1,
    command=efh0)
button1.grid(row=1,column=1)

# Button 2 wlan0
def wlan0():
    subprocess.run("nmcli connection modify aterm-a3b276-a connection.autoconnect 'yes'", shell=True)
    subprocess.run("nmcli connection modify Ethernet0 connection.autoconnect 'no'", shell=True)
    time.sleep(1)
    subprocess.run("sudo reboot", shell=True)
icon2 = PhotoImage(file='~/.icons/wifi.png')
button2 = ttk.Button(
    frame1,
    image=icon2,
    command=wlan0)
button2.grid(row=1,column=2)

root.mainloop()


ネットワークモニタリングツール

# apt install iptraf slurm wavemon


イーサネットで接続

モニタツール
$ slurm -i eth0


WiFiで接続
WiFiも早そうです。

モニタツール
$ wavemon

Top