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

Orange Pi 3 cpufrequtils

OrangePi3にはデフォルトでcpufrequtilsがインストールされていてarmbian-configから動作クロックやモードを変更することができます。

現在は開発バージョンということもありほぼ毎日アップグレードが入っています。

armbian-configから設定した値は保持されるのですがアップグレード後の再起動では初期値に戻ってしまいます。
状況に応じてもう少し簡単に動作クロックを変更できるようにしてみたいと思います。

アップグレード

# apt update && apt upgrade


現在のバージョン
armbian-image-release
カードを作成、インストール時のバージョン
armbian-release
アップグレード後のバージョン

armbian-config system cpu


クロックは9ステップ、governorは6モードあります
minimum 480MHz
maximum 1.8GHz
governor ondemand


設定した値は/etc/default/cpufrequtilsに記載されます。

minimum 480MHz governor ondemand は固定としてmaximumの値を変更します。


アイコンを作成
888MHzから1.8GHzの6Stepを切り替えます。

pythonランチャの作成

TKなどのインストールはZeroの記事を参照
書き換えは簡単に済ませるためsedを実行しています。(4行目を削除、新たに値をインサート)
~/bin/cpufreq.py

#!/usr/bin/python3

from tkinter import *
from tkinter import ttk
import subprocess
import time
import sys

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
def cpu888M():
    subprocess.run("sudo sed -i '4d' /etc/default/cpufrequtils", shell=True)
    subprocess.run("sudo sed -i '4i MAX_SPEED=888000' /etc/default/cpufrequtils", shell=True)
    subprocess.run("sudo systemctl restart cpufrequtils", shell=True)
icon1 = PhotoImage(file='~/.icons/cpu888M.png')
button1 = ttk.Button(
    frame1,
    image=icon1,
    command=cpu888M)
button1.grid(row=1,column=1)

# --- 省略 ---

# Button 6
def cpu180G():
    subprocess.run("sudo sed -i '4d' /etc/default/cpufrequtils", shell=True)
    subprocess.run("sudo sed -i '4i MAX_SPEED=1800000' /etc/default/cpufrequtils", shell=True)
    subprocess.run("sudo systemctl restart cpufrequtils", shell=True)
icon6 = PhotoImage(file='~/.icons/cpu180G.png')
button6 = ttk.Button(
    frame1,
    image=icon6,
    command=cpu180G)
button6.grid(row=2,column=3)

root.mainloop()

cpuは熱くなる


通常のファイルサーバーとしては1.8GHz動作でもほとんど問題ないのですがmp4エンコードなどではcpu温度が90℃を超えてきます。
Raspbianではクロック制御が入ってきますがarmbianではいまのところ無いようです。

http://www.orangepi.org/orangepibbsen/forum.php?mod=viewthread&tid=244

some temp:
cat /sys/devices/virtual/thermal/thermal_zone0/temp
current cpu freq:
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq


cpuには温度に対する何らかの保護回路があると思いますが危険な領域に突入しています。

アイドリング時は1.8GHz動作も変わらず現在のところ50℃以下に治まっています。


cpufrequtilsは実行中でもリアルタイムに制御します。
1.32GHzまで下げると72℃前後で落ち着いてきます。この辺は放熱板とのバランスになりますね。
(適当放熱板では少々役不足のようです)
それでもエンコードスピードはそれほど下がらずRPi3より早い。

通常運用は1.32GHz〜1.49GHzで行こうと考えています。
起動はshutdown.pyを含めてスクリプトで実行しています。(適当にdmenuやボタンに登録)
~/bin/shutdown.sh

#!/bin/sh
~/bin/cpufreq.py &
sleep 1
~/bin/shutdown.py &
sleep 1
xterm -e htop &

Orange Pi 3 onboard LED

armbianのフォーラムにonboard LEDについての話題が上がっていますね。
https://forum.armbian.com/topic/9368-orangepi-3-h6-allwiner-chip/page/17/

デフォルトの動作は電源オン後数秒で赤LED点灯そのままの状態になっています。(armbian)
赤LEDはかなり眩しいので当サイトのOrangePi3でも試してみることにしました。

LED制御

LEDは電源入力端子付近にあります。赤(D8)緑(D9)
もう1個USB3.0ハブIC近くにあるのですがUSB3.0端子になにか接続すると点灯します。USB機器を認識したぞというモニターでしょうか?(使えるかどうかは別問題)
制御できるのは(D8)(D9)になると思います。

ちなみにLEDそばにあるタクトSW(SW6)はSchematicを見るとPCIeのリセットスイッチになっているようです。


LEDの制御方法はRaspbianとほぼ一緒だと思います。

/sys/class/leds/orangepi:red:powerはリンクになっているのでどちらを指定しても同じです。

以下のトリガのなかからいくつか試したのですが確認できたのはnone default-on heartbeatだけでした。(実装はまだのようです)

$ cat trigger
[none] kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock usbport usb-gadget usb-host disk-activity disk-read disk-write ide-disk mtd nand-disk heartbeat cpu cpu0 cpu1 cpu2 cpu3 default-on panic mmc0 mmc1 mmc2 rfkill-any rfkill-none bluetooth-power hci0-power rfkill0 hci1-power rfkill1 stmmac-0:01:link stmmac-0:01:1Gbps stmmac-0:01:100Mbps stmmac-0:01:10Mbps rfkill2

デフォルトで点灯している赤を消灯するにはフォーラムにあるとおり一旦default-onかheartbeatを実行してからnoneを実行する必要があります。

$ pwd
/sys/devices/platform/leds/leds/orangepi:red:power
$ sudo sh -c "echo heartbeat > trigger"
$ sudo sh -c "echo none > trigger"

rc.localからコントロール

/etc/rc.local

#!/bin/sh -e
# rc.local

# LED Control
echo "heartbeat" > /sys/class/leds/orangepi:red:power/trigger
sleep 3
echo "none" > /sys/class/leds/orangepi:red:power/trigger
echo "default-on" > /sys/class/leds/orangepi:green:status/trigger

exit 0

電源接続数秒でデフォルトの赤LED点灯、10秒後位でheartbeat3回点滅後消灯、緑LED点灯
OSの立ち上がりもわかっていい感じになりました。

Top