HaLake Magazine

コワーキングスペースHaLakeの技術情報発信サイト!IoT,AR,VRなど最新技術情報をお届け!

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

f:id:takumishinoda:20200126133433j:plain

今回は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

参考ページ

nano.lichee.pro

目次

  1. LicheePi Nanoについて
  2. ハードウェア構成
  3. ソフトウェアについて
  4. 起動手順
  5. Goで書いたプログラムを動かす
  6. 問題点・調査予定

1. LicheePi Nanoについて

www.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 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
注2-1: 測定環境は標準OS起動後の電流を下の写真の機器で測定、いずれもディスプレイ表示なし

f:id:takumishinoda:20200126130948j:plain
アキバで売ってる300円くらいの安いヤツ

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

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

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

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

4. 起動手順

f:id:takumishinoda:20200126132411j:plain

まずは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を抜き差しするとボードが再起動するので、シリアルモニタにブートログが表示されます。

f:id:takumishinoda:20200126112511p:plain
Linuxのブートログ

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

ユーザ名 パスワード
root licheepi

無事ログインできればこれで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が認識されたことがログに出るので確認します。

f:id:takumishinoda:20200126120023p:plain
microSDが認識された!

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

f:id:takumishinoda:20200126120401p:plain
バイス名を確認

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

f:id:takumishinoda:20200126121036p:plain
/dev/mmcblk0p1 がマウントされた!

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

f:id:takumishinoda:20200126121417p:plain
ハロワができた!

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

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のデータシートをもとに試してみたが、うまくいかなかったので調査が必要です。
しかし前述通り中国語の資料ばかりで、方法を探るのにはもう少し時間がかかりそうだが次回以降にまとめられれば良いなと思います。

追記(2020/2/6): GPIOについての記事を追加しました。

magazine.halake.com

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

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

まとめ

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