スキップしてメイン コンテンツに移動

超小型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

前回の記事 に引き続きPhaser3+Typescriptを使って RPG の基礎を作っていきます。 この記事は前回の記事を呼んだ前提で説明していきますので、ぜひそちらを先に読むことをお勧めします。 また、今回の記事は前回よりも難易度と内容量が上がっていますが、記事の最後に作業後の リポジトリ のリンクがありますので、そちらを先にダウンロードしてそちらと比較しながら学習することができます。 前回まで作成した状態のプログラムが以下の リポジトリ からダウンロードできますので前回まででうまくいっていない方は参考にしてみてください。 github.com 最終目標(再掲) ・Phaser3とTypescriptで RPG ゲームの基礎を作る。 ・Phaser3をTypescriptで使う方法を学ぶ ・Phaser3の使い方を学ぶ 今回の目標 ・ゲームの作り方の断片を知る ・キャラの表示できるようにする ・キャラを移動できるようにする ・当たり判定をつける ・ NPC の追加してみる ・話しかけられるようにする 開発前提(再掲) ・Nodejsの環境・知識がある ・ Javascript ・Typescriptがある程度かける ・当ページ紹介の環境を試す場合はgit・ github の知識がある 使用した主要Nodeモジュール(再掲) ・typescript(Typescriptの コンパイル 用) ・phaser(フロントの Javascript 用ゲームライブラリ) ・live-server(ソースを監視してブラウザのページをリロード) ・ts-loader(webpackがTypescriptをバンドルする用)webpack(言わずと知れたモジュール依存をいい感じに解決しバンドルする) ・webpack- cli (webpackを コマンドライン で使用するのに必要) 注:各Nodeモジュールバージョンは後述 当ブログ仕様の画像素材の注意点 当ブログで使用する画像素材は『 ピポヤ倉庫 』より許可なしで無償再配布・改変が認められたものを改変して作成されたものです。 中には許可なく再配布・改変してはいけない素材もインターネット上には多く存在するのでそれらを使用するときは十分に規約を呼んでから使用しましょう。 1. キャラの表示 想定画面 今回は、はじめにキャラつまり操作

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

今回は、においセンサー(TGS2450)から取得したデータをM5Stackの LCD にグラフ表示をしていきます。 今回主に使用したもの M5Stack 10Ω抵抗 5本 Pch  MOSFET  2SJ334(スイッチとして利用) M5StackSideBB(ブレッドボード) M5Stackのピンはそのままだと配線するとき手間がかかるかと思いますので、今回はM5StackSideBBを利用しました。 ブレッドボードも付いているので、手軽に電子工作できるので個人的にオススメです。 SideBB for M5Stack www.switch-science.com 諸注意 本ブログのプログラムはArduinoIDEまたはPlatformIOでM5Stackの開発ができる状態であること前提のものですので、各自導入をお願いします。 過去に Windows のArduinoIDEで M5Stackの開発環境を構築する記事 があるので、参考にしてください。 においセンサー(TGS2450)について 今回使用したセンサーは 秋月電子通商 で購入できます。 http://akizukidenshi.com/catalog/g/gP-00989/ akizukidenshi.com TGS2450には4つのピンがあり、使用するのはそのうちの3本でヒーターを温めるピン、センサー情報を得るピン、GNDがあります。 ここで注意したいのは、ヒーター電圧は1.6Vと記述されているのでM5Stackで利用するときは分圧して3.3Vを1.6V近くまでに降圧することをお勧めします。 TGS2450のセンサーは可変抵抗になっており、データシートには5.62kΩ〜56.2kΩの間を抵抗が変化し、においが強いとより低くなると記述されていました。 よって、センサーの値をM5Stackで取得するにはセンサー抵抗と外部に接続する任意の値の抵抗による分圧回路によって求めることができます。 TGS2450の動作方法は、250ms周期でセンサーに電圧を5ミリ秒on、245ミリ秒offの状態にしてヒーターは8ミリ秒on、242ミリ秒offにすることで値を取得します。 配線 においセンサーとM5Stackの配線 上の図が配線図です。 30Ωの抵抗は10Ωの抵抗を三つ直列に接続して作成しました。 また、上部の抵抗10Ω二

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

今回はPhaser3とTypescriptを使って簡単な RPG ゲームを作る方法を紹介していきます。 内容はPhaser3およびゲーム作りについての記事なので、Nodejsの周辺モジュールなどの説明は一部省いての説明になりますのでご了承ください。 またこの記事では Phaser2 ではなく Phaser3 を使用するので注意してください。 この記事は二部構成になりますので、この記事を読んだ際はぜひ次の記事も読むことをお勧めします。 最終目標 ・Phaser3とTypescriptで RPG ゲームの基礎を作る。 ・Phaser3をTypescriptで使う方法を学ぶ ・Phaser3の使い方を学ぶ 今回の目標 ・開発環境を整える ・Phaser3の開発構成を知る ・スタート画面を作る ・マップ表示をさせる 開発前提 ・Nodejsの環境・知識がある ・ Javascript ・Typescriptがある程度かける ・当ページ紹介の環境を試す場合はgit・ github の知識がある 使用した主要Nodeモジュール ・typescript(Typescriptの コンパイル 用) ・phaser(フロントの Javascript 用ゲームライブラリ) ・live-server(ソースを監視してブラウザのページをリロード) ・ts-loader(webpackがTypescriptをバンドルする用)webpack(言わずと知れたモジュール依存をいい感じに解決しバンドルする) ・webpack- cli (webpackを コマンドライン で使用するのに必要) 注:各Nodeモジュールバージョンは後述 1. 最低限の開発環境の準備 今回最低限の環境を整えるために、『Typescript + Phaser3』の開発テンプレートを github リポジトリ で公開しました。 以下からZIPをダウンロードするか、 git clone コマンドで各自環境に展開してみてください。 ここから先は リポジトリ のプログラムを元に説明していきます。 github.com 展開するとファイル構造は以下のようになっているかと思われます。 注: 他にもファイルやフォルダがあるかと思われますが、表記されているのは今回使うものになっています。 - src/ (これから書くプログラムの保存領域)