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

超小型SBC『LicheePi Nano』を触る! その2 〜microSDからOS起動・カーネルビルド編〜

前回の記事ではLicheePi nanoの構成の説明やSPIフラッシュからのOS起動から自作プログラムの実行までをまとめていました。
今回はラズパイのようにmicroSDからOS起動する方法と、LicheePi nano用Linuxカーネルのビルド方法をまとめていきます。

学習内容

事前実践準備

  • 前回記事の確認
  • LicheePi Nano本体
  • USBシリアル変換モジュール(cp2104等)
  • ブレッドボードなどの配線機材
  • Arduino IDE(シリアル通信ソフトならなんでも良い)
  • 電子工作・UART通信の配線知識
  • Linuxの基礎知識
  • ddコマンドの基礎知識
  • Docker環境・基礎知識

筆者開発環境

  • MacBookPro 2017
  • ArduinoIDE: 1.8.10
  • Docker: Docker version 19.03.5, build 633a0ea

参考ページ

https://steward-fu.github.io/website/mcu/lichee-nano/flash_image.htmsteward-fu.github.io

1. LicheePi nano用LinuxmicroSDに書き込む

まずはラズパイのセットアップ同様OSイメージをダウンロードします。
ダウンロードは以下のリンクから行います。

https://github.com/steward-fu/lichee-nano/releases/download/v1.0/image.7z

ダウンロードができたら早速解凍します。
解凍したディレクトリのNano_tf_480272.dd.zipファイルを解凍します。
Macでは標準のソフトでは解凍できないので、以下のソフトをインストールします。

The Unarchiver

The Unarchiver

  • MacPaw Inc.
  • ユーティリティ
  • 無料

apps.apple.com

解凍するとNano_tf_480272.ddファイルができます。

ファイルを解凍する

ラズパイのセットアップでは.imgファイルを使いますが今回は.ddファイルを使用することになります。
この形式はイメージの書き込みに使うEtcherなどに対応していないので、ddコマンドを使用して書き込みます。
microSDをパソコンに差し込んで、microSDのデバイスディレクトリを探します。
Macであれば、『ディスクユーティリティ』アプリを起動して確認できます。

筆者環境では上の図から/dev/disk2microSDのデバイスディレクトリであることがわかりました。
次に、microSDを『ディスクユーティリティ』アプリでアンマウントしてddコマンドの書き込み対象にできるようにします。
そしてターミナルで、解凍したNano_tf_480272.ddファイルと同じディレクトリまで移動して以下のコマンドでmicroSDにOSを書き込みます。 SDのデバイスディレクトリには先ほど調べたディレクトリを指定しますが、間違えると操作しているパソコンのシステムが起動不可状態になってしまいますので、絶対に間違えないようにしましょう。

$ sudo dd if=./Nano_tf_480272.dd of=SDのデバイスディレクトリ bs=1m

microSDへの書き込みが終わったら、microSDをアンマウントしてパソコンから取り外します。
これでOSブートmicroSDの用意ができました。

2. microSDからOSを起動してみる

出来上がったmicroSDを早速LicheePi nanoに差し込んで起動していきます。
機器の準備は、前回記事同様USBシリアル変換モジュールを通して操作をしていくのでUART接続します。
接続できたら、ArduinoIDEのシリアルモニタなどからLicheePi nanoからの通信を確認します。
無事microSDからのOS起動ができると、下の図のようなログが出た最後にログインなしでコマンドが使える状態になっていれば成功になります。

UBOOTのログ

SPIフラッシュ内蔵のシステムではログインがあったが...

試しにカーネルバージョンを確かめてみます。
コマンドは他のLinux同様$ uname -rで調べられます。

SPIフラッシュに内蔵されたバージョンと同じバージョンだった

3. 最新LicheePi nano用Linuxカーネルのビルド

前章で作成したmicroSDにはOSバージョン4.15.0-rc8-licheepi-nano+がインストールされましたが、この章ではこれを(2020/1/26現在)最新のバージョン5.2にアップデートしていきます。
RaspbianやUbuntuでは自身でLinuxカーネルをビルドしてアップデートすることができますが、LicheePi nanoにはWiFiが標準ではついてない上にコンパイラらしきものが見当たらないので不可能かと思われます。
なので、他のパソコンでビルドする必要があります。
今回は方法として、Dockerコンテナ上で行うことにしました。
Dockerでビルドする利点としては、ビルド対象がArmコア向けなのでツールチェーンのインストールが必要でパソコンの環境汚染を避けるためなどが挙げられます。
早速以下のリポジトリからDocker-composeファイルを入手してコンテナを立ち上げてみましょう。

github.com

ターミナルでクローンしたディレクトリで$ docker-compose upでコンテナを立ち上げます。
コンテナの立ち上がりには必須パッケージやGitリポジトリのクローンが含まれているので少々時間がかかります。
下の図のようにFinish! と表示されたら次の工程になります。

コンテナが立ち上がった!

コンテナが立ち上がったら、コンテナに入って作業をします。
先に以下のコマンドでコンテナIDを確認します。

$ docker ps

コンテナIDを確認

IDが確認できたら、以下のコマンドでコンテナに入ります。

$ docker exec -it コンテナID /bin/bash

コンテナに入れた!

コンテナに入れたら以下のコマンドでカーネルビルドをしていきます。
質問がたくさん出てきますが、特にこだわりがなければEnterキーを長押しで構いません。 ビルドにもかなり時間がかかるので、気長に待ちます。

# Dockerコンテナで実行

$ cd ./linux
$ CROSS_COMPILE=/usr/bin/arm-none-eabi- make ARCH=arm

ビルドが終わると、先ほどcdコマンドで移動したlinux/ディレクトリのarch/arm/boot/ディレクトリにzImageファイルと、arch/arm/boot/dts/ディレクトリにsuniv-f1c100s-licheepi-nano.dtbファイルがあります。
zImageファイルはカーネルの本体で、suniv-f1c100s-licheepi-nano.dtbファイルはデバイスリーファイルになります。
これらをコンテナ内から、ホスト側(Dockerを動かしているパソコン)にコピーするために以下のコマンドをホスト側のターミナルで実行します。

# ホスト側で実行

$ docker cp コンテナID:linux/arch/arm/boot/zImage ./
$ docker cp コンテナID:linux/arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb ./

zImagesuniv-f1c100s-licheepi-nano.dtbが準備できたら、LicheePi nanoの電源を落としてからmicroSDを抜き出して、ビルド作業をしたパソコンに刺します。
microSDがマウントされると、『Finder』やファイル操作アプリからマウントされたボリュームを確認すると以下のような三つのファイルが確認できます。

OS起動に関するデータ

このうち、zImagesuniv-f1c100s-licheepi-nano.dtbを先ほどDockerコンテナからコピーしたものと置き換えます。 置き換えたらパソコンからmicroSDを取り出して、LicheePi nanoに差し込んで起動します。
シリアルモニタで、OSが起動できたことが確認できたらOSのバージョンを確認します。

カーネルバージョンがアップデートされた!

このようにしてカーネルのアップデートが完了しました。

まとめ

コメント

このブログの人気の投稿

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/ (これから書くプログラムの保存領域)