超小型SBC『LicheePi Nano』を触る! その1 〜セットアップ編〜

今回はSBC(シングルボードコンピュータ)の中でもかなり小型なLicheePi Nanoについてまとめていきます。
SBCではラズパイが代名詞として挙げられますが、今回扱うLicheePi Nanoはラズパイゼロよりもさらに小さなSBCです。
日本語の情報がほとんどなく、まだわからないことが多いボードですが、現在わかっていることを共有できればと思います。

学習内容

  • LicheePi nanoで内蔵フラッシュに搭載されたLinuxを起動
  • Go言語で書いたプログラムをLicheePi nanoで実行

事前実践準備

  • LicheePi Nano本体
  • USBシリアル変換モジュール(cp2104等)
  • ブレッドボードなどの配線機材
  • Arduino IDE(シリアル通信ソフトならなんでも良い)
  • 電子工作・UART通信の配線知識
  • Go言語開発環境
  • Linuxの基礎知識

筆者開発環境

  • MacBookPro 2017
  • Go言語: go version go1.13.5 darwin/amd64
  • ArduinoIDE: 1.8.10

参考ページ

http://nano.lichee.pro/nano.lichee.pro

1. LicheePi Nanoについて

Sipeed Lichee Nanowww.switch-science.com

LicheePi Nanoは超小型&安く購入ができる点が利点として挙げられます。
しかし、その反面デメリットもあるのでまとめていきます。

メリット

  • 超小型
  • 1000円前後と安い(注1-1)
  • ラズパイよりOS起動が早く感じる(標準OSが最小限であるため)
  • 消費電力はラズパイより低い

デメリット

  • 開発情報がほとんど中国語
  • ラズパイに比べてSOC(CPU・メモリ等)性能は低い
  • LicheePi NanoだけではWiFi・BLEが使えない
  • モニタ用インターフェースがFFC(フレキシブルフラットケーブル)でしか対応していない
注1: Raspberry Pi Zero v1.3(WiFi・BLEなし)よりは割高になります。

このようにデメリットが多く結局『ラズパイの方がいいじゃん!』と思うかもしれませんが、その通りです。
しかし筆者はとある理由でこのボードに触れることとなったのですが、記事の続きが出れば理由を記載するかもしれません...

2. ハードウェア構成

LicheePi Nanoのハードウェア構成はざっくり以下のようになっています。
競合相手として『Raspberry Pi Zero W』のスペックも記載します。

ボード名SOC(CPU)CPU周波数メモリ標準OS消費電力WiFi・BLEストレージHDMI
LicheePi NanoAllwinner F1C100s900MHz32MBlicheepi-nano+50mA前後(注2-1)なし(外付け技適なし)外部SPIフラッシュ 16MB・microSDなし
Raspberry Pi Zero WBCM 28351GHz512MBRaspbian110mA前後(注2-1)WiFi・BLE対応(技適あり)microSDmini HDMI
注2-1: 測定環境は標準OS起動後の電流を下の写真の機器で測定、いずれもディスプレイ表示なし

アキバで売ってる300円くらいの安いヤツ

次に、LicheePi Nanoのもう少し詳しいハードウェア構成です。

SOC(CPU)メモリ外部SPIフラッシュ
Allwinner F1C100s(Arm926ej-s Armv5tej)SOC内臓 32MBWinbond 25Q128FVSG 16MB(初期状態でOSが内臓)

3. ソフトウェアについて

LicheePi Nanoの標準OSはlicheepi-nano+という名前ですが、これ以外にもMainline LinuxBSP Linuxといった軽量OSも動くようです。
本記事ではボードに外付けされたSPIフラッシュに内蔵されている、licheepi-nano+というOSのみについて記述していきます。

4. 起動手順

まずはSPIフラッシュからOSを起動して、Linuxが動いていることを確認します。
LicheePi Nanoで動くLinuxにコマンドを送信したり、ログを確認するにはUSBシリアル変換モジュールを通して行います。
なので、開発に最低限必要なのはUSBシリアル変換モジュールとArduino IDEです。
下の図を参考にUSBシリアル通信モジュールとLicheePi NanoをUART接続(4線接続)します。

https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcSIc6dleqC_CgmmHiL7VE34jmIf1y-XQUVD2VH65_0rs2oK_5cY

開発の間LicheePi nanoに電源を供給するのはUSBシリアル変換モジュール経由からになるのでLicheePi nanoのUSB端子にはUSBケーブルを刺さないようにしましょう。
USBシリアル変換モジュールをPCと接続してArduinoIDEのシリアルモニタを開き、ボーレートを115200にセットします。
LicheePi nanoに供給するために接続したGNDを抜き差しするとボードが再起動するので、シリアルモニタにブートログが表示されます。

Linuxのブートログ

ブートが終わると、ログインユーザとパスワードが聞かれるので入力して送信します。

ユーザ名パスワード
rootlicheepi

無事ログインできればこれでLinuxコマンドで遊べるようになります。
このOSではLinuxコマンドがBusyBoxで提供されているため、使えないコマンドも存在しますが基本は使えるのでいろいろ試すことはできます。
これでLinuxへのログインまでできましたが、これではコマンドでしか遊べないので次はプログラムを作って実行するところまでやってみます。

5. Goで書いたプログラムを動かす

ログインできたLinuxで自作プログラムを動かすとことまでやってみます。
ボード内蔵OSにはもちろんcやc++コンパイラは存在しません。
なのでコンパイルは別のパソコンで行ってmicroSDを使ってLicheePi nanoで実行します。 Arm用のcやc++コンパイラもありますが、手っ取り早くコンパイル環境を整えるために今回はGoを使用します。
まずは以下のリポジトリからハロワプログラムをコンパイルするパソコンにダウンロードかクローンします。

github.com

ダウンロードできたら、Go環境が整っていればターミナル等からプログラムのディレクトリに移動してsh ./build.shを実行してください。
すると実行ファイルができるので、microSDにコピーしてログイン済みのLicheePi nanoに差し込みます。 うまくコンパイルできなければ、ディレクトリにhelloというファイルがありコンパイル済みの実行ファイルなのでそちらをmicroSDにコピーします。
microSDを差し込むと、シリアルモニタに下の図のようにmicroSDが認識されたことがログに出るので確認します。

microSDが認識された!

そしたらまずはmicroSDをマウントします。
マウントするためにまず$ fdisk -lコマンドを実行してmicroSDのデバイス名を確認します。

バイス名を確認

バイス名は今回は/dev/mmcblk0p1だとわかったのでこのデバイスをマウントしていきます。
$mount /dev/mmcblk0p1 /media/sdを実行しますが、今回は/media/sdを作成してマウント先に指定しています。
実行できたら$ mountを実行してマウントされたか確認します。

/dev/mmcblk0p1 がマウントされた!

そしたら$ cd /media/sdでマウントディレクトリに移動します。
$ lsを実行すると先ほどmicroSDにコピーしたハロワの実行ファイルがあるので、早速実行してみましょう。

ハロワができた!

この流れでプログラムを作成&実行させることができます。

6. 問題点・調査予定

自作プログラム実行までの流れができましたが、問題点がいくつかあります。

1. 開発時プログラム作成から実行までがめんどくさい

microSD経由のプログラム実行では毎度microSDをマウント・アンマウントする処理が必要なのでめんどくさいのが現状です。
筆者はLinux初心者なので自動化する方法や設定があるかもしれませんが、microSDの抜き差しなどやはりめんどくさいです。

2. 内蔵SPIフラッシュの容量が小さい

LicheePi nanoに搭載されているSPIフラッシュは16MBでその内自由に使える領域は300KBほどしか残されていません。
これはdfコマンドを実行すればわかることですが、16MB中のほとんどがLinuxカーネルやシステムに利用されています。
さらにGoでコンパイルした実行ファイルはハロワでもそのままでは1MB、最適化しても600KB前後にしかならないためとても内蔵フラッシュには入りきりません。
なので最終的にmicroSDなしで実装する場合、実行ファイルを静的リンクで生成して不必要な/lib/usr/libを削除して、容量稼ぐなどが挙げられます。

3. GPIOの操作方法がわからない

ラズパイではコマンドからGPIOを操作する際は/sys/class/gpioディレクトリで操作する方法が挙げられており、LicheePi nanoでもSOCのデータシートをもとに試してみたが、うまくいかなかったので調査が必要です。
しかし前述通り中国語の資料ばかりで、方法を探るのにはもう少し時間がかかりそうだが次回以降にまとめられれば良いなと思います。(追記記事)

4. Arm向けc・c++コンパイラコンパイルしても動かない

Go言語では実行ファイルが大きすぎたので、Arm向けc・c++コンパイルしたプログラムを動かそうとしたが、そう簡単にはいきませんでした。
具体的にはSegmentation Faultが発生するが、ハロワや何もしないのプログラムでも発生しているためコンパイルオプションの間違いなのか?
コンパイラgcc-arm-none-eabiを使用してオプションでCPU・アーキテクチャを指定していました。

まとめ

  • 初心者向けではないことがわかった
  • わからないことが多いがLinuxやArmの学習にはとても良い教材だと思った
  • わかったことやできることを順次公開できればと思った

コメント

このブログの人気の投稿

Phaser3 + Typescriptを使ってRPGゲームの基礎を作ろう!その2

M5Stackで、においセンサー(TGS2450)を使ってみる。(LCDに表示編)

Phaser3 + Typescriptを使ってRPGゲームの基礎を作ろう!その1