Robit blog

株式会社ロビットの公式ブログです

OrangePi Zeroをいじってみた


http://blog.robit.co.jp/entry/2017032202
皆様、ごきげんよう。Robitの新井です。今回はIoTっぽいことをご紹介したいと思います。
ここ数年でRaspberry PiやEdisonを始めとした安価なSBC(Single Board Computer)が注目を浴びています。欧米企業のものが一般的には広く知られていますが、中国や台湾のメーカーもこぞって同様なボードを出してきており、そのエッジのきいたスペックや価格から、一部のコアな人々に非常に人気があります。
今回はそんな中華系SBCの一つである、OrangePi Zeroについてご紹介したいと思います。

f:id:robit-inc:20170322003210j:plain:w480

公式ストアより引用。このスペックでこの価格・・・!

OrangePi ZeroはXunlong Software CO.,Limitedが開発・販売をしているSBCです。その特徴は何と言ってもLinux(とAndroid)が動くSBCでありながら$6.99~というとんでもない価格設定です。
最大4コア1.2GHzの256MB/512MBメモリーというスペックとしてはボチボチではありますが、LANポート、OTG対応のMicro USB(未検証)やUSBポート、17本のGPIOがついていて、WiFi技適は通っていないようなので日本では使えません)までついていてこの価格。いやはや恐ろしいですね。ちょっと改造すれば色々と条件はあれどPoEでも動かせるようです。
ものづくり企業として電子基板を作るなんてことは日常茶飯事ではありますが、この価格で実際に作って売っちゃうのはさすがの中国パワーと言わざるをえないでしょう。
Allwinnerというこれまた中国系のSoCを使っていますが、この価格で成り立つとは一体仕入れ値いくらなんでしょうね。とても気になります。

もちろん全て完璧というわけでは決して無く、特にソフト面では

Kernelのメインラインから外れた独自実装が多い(=色々な意味で怪しい実装になっている可能性がある)
バックドアになりかねないデバッグ用プロセスが標準だと入っている(対処法もリンク先にあります)
・Kernelのアップデート実績が乏しい
・GPIO操作用のライブラリが乏しい

といった問題はありますが、これらを理解した上で使うのであれば、非常に面白いものだと思います。
小型で安価なLinuxボードとして使っているBlog等は結構あるので、今回は電子回路としていじってみるのを中心にご紹介したいと思います。

まずは何はともあれ現物を入手しましょう。Aliexpressに公式ストアがあるようなので、こちらから購入するといいでしょう。256MBモデルと512MBモデルがありますが、数百円しか違わないので迷ったら512MBモデルがオススメです。
届くまでしばらくかかりますが、その間にOS用のMicro SDカードも調達しておきましょう。使うイメージと用途にもよりますが、2GBもあればとりあえず起動はします。

続いてはOSイメージを用意しましょう。公式でも幾つかのイメージが提供されていますが、前述の通りアップデート実績が乏しかったり怪しいプロセスがそのまま入ってたりするので、armbianというOSをオススメします。公式サイトからOrangePi Zero用のイメージを入手し、ddコマンド等でSDカードに焼き込むだけです。

ボードが届いたら、まずは日本国内では使えないアンテナをもぎ取っておきましょう。26ピンのI/O部分にはピンヘッダがはんだ付けされていないので、GPIOを使うのであれば先にはんだ付けしておくといいでしょう。他のピンはオスピンがついていますが、電源ライン等もむき出しになるのでメスピンがオススメです。
下準備が出来たら、LANケーブルを挿入し、armbianのイメージが書き込まれたSDカードを裏側のMicro SDカードスロットに差し込み、Micro USB端子から電源を供給すると起動します。


セットアップ完了した状態。正常に起動すると緑色のLEDが光ったままになります。

最大で2A程度消費するようなので、PCのUSBからの給電だと不安定になる可能性が高いため、タブレットなどを充電出来るACアダプターから給電するといいでしょう。ちなみに、負荷をかけなければそこまで大した消費電力ではありません。


有線でLANに接続しただけの状態で消費電力1Wちょっと。SoCの温度はヒートシンク等無しで50度前後。

シリアルポートかsshを使ってログインできるので、ログインしましょう。ユーザー名はroot、パスワードは1234で初回ログインができます。その際に新規ユーザーとそのパスワードの作成を求められますので、指示に従って初期設定を済ませます。基本的には指示に従うだけですので、この辺りの詳細は割愛します。

初期設定ができたら、とりあえず下記のコマンドから最新にしておきましょう。

apt-get update
apt-get upgrade

ここまで来ればざっくりとした下準備は完了です。ホビー用途だとしても、ネットワーク上に常駐させるのであればssh公開鍵認証設定を行ったり、sshによるルートログインを出来なくする等の鉄板どころのセキュリティ対策は一通りしておいたほうがいいでしょう。

さて、いよいよGPIOを制御してみましょう。OrangePi Zero上でGPIOを制御するには、WiringOPというライブラリを使うのがいいようです。元々はWiringPiというRaspberry Pi用のライブラリをOrangePi用に改造したようで、ArduinoライクなインターフェイスでGPIOを制御出来るようになっているようです。
しかし、調べてみるとWiringOPはOrangePi PC用にGPIOマッピングがされているらしく、一部のGPIOが使えないようです。なので、回路図と照らし合わせながらGPIOマッピングを修正したので、GitHubにあげておきました。こちらからどうぞ。修正内容が気になる方はこちらをご参照ください。

それでは早速WiringOPをビルドしましょう。OrangePi Zero上で、OrangePi Zero用のWiringOPのリポジトリをクローンします。

git clone https://github.com/masa-a/WiringOP

次に、下記のコマンドを実行します。

cd WiringOP
chmod +x ./build
sudo ./build

ビルド中にWarningが大量に出ますが、ビルド自体は問題なく出来ると思いますので、ビルドが終わるまで待ちましょう。
ちなみに、gitやビルド環境は初期で入っているので、環境構築については特に気にしなくても大丈夫です。
ビルドが終わるとライブラリ本体やヘッダーファイルをインストールする所まで自動でやってくれるので、これだけで準備完了です。

次に、適当なサンプルプログラムを作って、Lチカしてみましょう。
こんな感じのサンプルプログラムをOrangePi Zero上に作成します。ホストPCで書いてscpで転送してもいいですし、vimやpicoでコピペするなりお好みの方法でどうぞ。

#include "unistd.h"
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>

int main() {
    wiringPiSetupPhys();
    int pin = 3;
    pinMode(pin, OUTPUT);
    int state = 1;
    while(1) {
        digitalWrite(pin, state);
        usleep(1000 * 250);
        state = ~state & 1;
    }
}

ファイルを保存したら、下記のコマンドでビルドしてみましょう。

gcc main.c -lwiringPi -lpthread -o main

エラーが発生せずにコマンドが終了すれば成功です。

次に、Lチカ用のLEDをOrangePi Zeroに接続しましょう。OrangePi Zeroの26ピン部分のピン配置は、こちらのサイトを参考にすると分かりやすいです。
右下の3.3Vが1番ピン、その左の5Vが2番ピン、といった具合でマッピングされています。
今回は3番ピン(TWI0_SDA/PA12)にLEDのアノードを接続し、Lチカさせてみます。ブレッドボード上に回路を展開してもいいですし、抵抗入りLEDを直接3番ピンとGNDに繋いでもテスト位であれば問題ないでしょう。


抵抗入りLEDを直挿し

回路の準備が出来たら、先ほどビルドした実行ファイルを起動します。

sudo ./main

これでLEDが点滅するはずです。お疲れ様でした。

その他の基本機能として、割り込みが動くことは確認しています。ただし、6番ピンだけはなぜか割り込み設定ができなかったので、ご注意ください。それ以外のピンだととりあえず割り込みも動いていたので、ちゃんと調査はしていないので原因がわかる方はPull Requestでも頂ければ。
TWI系のGPIOにはプルアップ抵抗が実装されていますので、外部プルアップやプルダウンの扱いにはご注意ください。この手のボードにプルアップ抵抗をボード上に実装するのって、ありがた迷惑系だと思うのは私だけでしょうか・・・。
ちなみに、SPIやTWIが動くかは確認していないので、その辺もまたいずれご紹介できればと。
余談にはなりますが、普段マイコンを使っている人はWiringOPの実装を眺めてみるのも面白いです。割り込みの処理は割り込みを設定した時点で新しいスレッドが作られ、そのスレッドの中でpollして、変化があったらコールバックを呼ぶ、というなんともLinuxっぽい実装になっていたりして興味深いです。

また、node.jsやPython向けのbindingまでは無いので、あくまでネイティブによるGPIO操作ライブラリになっていますが、真面目に組み込みらしいことをnode.jsやPythonから適当に作ったライブラリ等でやろうとするとメモリリークやらイベントバインディングやらで問題が出てくることがままあるので、全てを高級な言語でやるのではなく、ネイティブはネイティブの良い所を、高級言語高級言語の良い所をつかった実装にするといいんじゃないかと個人的には思っています。
この辺の方法論に関しては正解は無いかと思いますが、オススメの方法をいずれご紹介したいと思います。

購入(amazon)はこちら
> ロビットのWebサイトへ
> 採用情報はこちら