超小型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の基礎知識
筆者開発環境
参考ページ
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(フレキシブルフラットケーブル)でしか対応していない
このようにデメリットが多く結局『ラズパイの方がいいじゃん!』と思うかもしれませんが、その通りです。
しかし筆者はとある理由でこのボードに触れることとなったのですが、記事の続きが出れば理由を記載するかもしれません...
2. ハードウェア構成
LicheePi Nanoのハードウェア構成はざっくり以下のようになっています。
競合相手として『Raspberry Pi Zero W』のスペックも記載します。
ボード名 | SOC(CPU) | CPU周波数 | メモリ | 標準OS | 消費電力 | WiFi・BLE | ストレージ | HDMI |
---|---|---|---|---|---|---|---|---|
LicheePi Nano | Allwinner F1C100s | 900MHz | 32MB | licheepi-nano+ | 50mA前後(注2-1) | なし(外付け技適なし) | 外部SPIフラッシュ 16MB・microSD | なし |
Raspberry Pi Zero W | BCM 2835 | 1GHz | 512MB | Raspbian | 110mA前後(注2-1) | WiFi・BLE対応(技適あり) | microSD | mini HDMI |

次に、LicheePi Nanoのもう少し詳しいハードウェア構成です。
SOC(CPU) | メモリ | 外部SPIフラッシュ |
---|---|---|
Allwinner F1C100s(Arm926ej-s Armv5tej) | SOC内臓 32MB | Winbond 25Q128FVSG 16MB(初期状態でOSが内臓) |
3. ソフトウェアについて
LicheePi Nanoの標準OSはlicheepi-nano+
という名前ですが、これ以外にもMainline Linux
やBSP Linux
といった軽量OSも動くようです。
本記事ではボードに外付けされたSPIフラッシュに内蔵されている、licheepi-nano+
というOSのみについて記述していきます。
4. 起動手順
まずはSPIフラッシュからOSを起動して、Linuxが動いていることを確認します。
LicheePi Nanoで動くLinuxにコマンドを送信したり、ログを確認するにはUSBシリアル変換モジュールを通して行います。
なので、開発に最低限必要なのはUSBシリアル変換モジュールとArduino IDEです。
下の図を参考にUSBシリアル通信モジュールとLicheePi NanoをUART接続(4線接続)します。
開発の間LicheePi nanoに電源を供給するのはUSBシリアル変換モジュール経由からになるのでLicheePi nanoのUSB端子にはUSBケーブルを刺さないようにしましょう。
USBシリアル変換モジュールをPCと接続してArduinoIDEのシリアルモニタを開き、ボーレートを115200
にセットします。
LicheePi nanoに供給するために接続したGNDを抜き差しするとボードが再起動するので、シリアルモニタにブートログが表示されます。

ブートが終わると、ログインユーザとパスワードが聞かれるので入力して送信します。
ユーザ名 | パスワード |
---|---|
root | licheepi |
無事ログインできればこれでLinuxコマンドで遊べるようになります。
このOSではLinuxコマンドがBusyBoxで提供されているため、使えないコマンドも存在しますが基本は使えるのでいろいろ試すことはできます。
これでLinuxへのログインまでできましたが、これではコマンドでしか遊べないので次はプログラムを作って実行するところまでやってみます。
5. Goで書いたプログラムを動かす
ログインできたLinuxで自作プログラムを動かすとことまでやってみます。
ボード内蔵OSにはもちろんcやc++のコンパイラは存在しません。
なのでコンパイルは別のパソコンで行ってmicroSDを使ってLicheePi nanoで実行します。 Arm用のcやc++のコンパイラもありますが、手っ取り早くコンパイル環境を整えるために今回はGoを使用します。
まずは以下のリポジトリからハロワプログラムをコンパイルするパソコンにダウンロードかクローンします。
ダウンロードできたら、Go環境が整っていればターミナル等からプログラムのディレクトリに移動してsh ./build.sh
を実行してください。
すると実行ファイルができるので、microSDにコピーしてログイン済みのLicheePi nanoに差し込みます。 うまくコンパイルできなければ、ディレクトリにhello
というファイルがありコンパイル済みの実行ファイルなのでそちらをmicroSDにコピーします。
microSDを差し込むと、シリアルモニタに下の図のようにmicroSDが認識されたことがログに出るので確認します。

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

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

そしたら$ 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の学習にはとても良い教材だと思った
- わかったことやできることを順次公開できればと思った
コメント
コメントを投稿