はじめての Raspberry Pi Zero W セットアップ

カメラモジュールを使用するために Raspberry Pi Zero V1.1 を購入しました。

私にとって初めてのラズパイで不慣れなので、公式の推奨どおりに NOOBS を使用して OS イメージを作成することを考えます。

セットアップに最初に必要なものはネットワークに接続されていて、SDカードを読み書きできる PC だけです。ここでは Linux マシンを使用します。動作環境は以下のとおりです。

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

最初に NOOBS と Raspbian OS をネットワークからダウンロードしてきます。公式サイトからダウンロードしても良いですが、物理的な距離がダウンロード速度にも影響しますので国内のミラーサイトを利用されたほうが高速です。

今回は北陸先端大学のミラーサイトを使用させていただきます。北陸先端大学と山形大学にはいつもお世話になります。

$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt -y install aria2
$ aria2c http://ftp.jaist.ac.jp/pub/raspberrypi/NOOBS/images/NOOBS-2019-09-30/NOOBS_v3_2_1.zip.torrent -d ~/Downloads/

Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
80cdf4|OK  |   2.0MiB/s|/home/buran/Downloads//NOOBS_v3_2_1.zip.torrent
f45f9a|OK  |    18MiB/s|/home/buran/Downloads//NOOBS_v3_2_1.zip

Status Legend:
(OK):download completed.

$ sha256sum ~/Downloads/NOOBS_v3_2_1.zip
9d040a0b2795e940cab848c612a9ccfd739cf7ea5fcb1d42141f93cefcef4078  /home/buran/Downloads/NOOBS_v3_2_1.zip

ダウンロードが完了しましたら、公式ダウンロードサイトにアクセスして SHA-256 hash が一致することを確認します。

一致していない場合は必要なファイルが正常にダウンロードできていませんので、再試行が必要です。




問題なければ NOOBS_v*_*_*.zip ファイルを解凍して README ファイルを開きます。

$ mkdir ~/Downloads/noobs
$ unzip ~/Downloads/NOOBS_v3_2_1.zip -d ~/Downloads/noobs/
$ cd ~/Downloads/noobs
$ cat INSTRUCTIONS-README.txt

それによると解凍したファイルを全てSDカードに記録させればブートできるようになるらしいので、そのとおりに実行します。

この時点でSDカードスロットルに記録メディアを挿入して、以下のようにフォーマットとマウンティングを行います。フォーマットは FAT または FAT32 が指定されていますので、ここを間違えると起動しなくなります。モニタに接続しても No Video Input と表示される場合には、こういうところが怪しいですね。

$ sudo gparted
$ sudo fdisk -l
$ sudo mount -t vfat /dev/sdc1 /media/buran/raspbian
$ cd /media/buran/raspbian
$ unzip ~/Downloads/NOOBS_v3_2_1.zip
$ cd ~
$ sudo umount /dev/sdc1

これで OS の書き込みが完了して、いよいよ Raspberry Pi を起動できるようになるはずです。

しかし USBケーブルを接続して通電しただけでは Raspberry Pi は起動しているのかどうか、よくわからないので HDMI ケーブルを通して動作確認用のモニタに出力を表示させます。

したがって、ここからはモニタとマウス、それから HDMI ケーブルが必要になります。この辺りは PC さえあれば、何でもできる Arduino のほうが良く出来てるなという感想を抱きます。

ここでキーボードを繋ぎたくなるところですが、インストール時にはマウス操作が必要になりますので、NOOBS を使用する場合には最初だけはマウスを接続します。

無事にインストールが完了しますと、一般的なデスクトップ Linux として使用できるようになります。無線LANにも接続できますし、ターミナルから設定を行えばサーバとして使用することも簡単にできるようになります。

個人的には GUI 環境は不要ではあるものの、このクレジットカードの半分ほどの大きさのマシンが27インチ FullHD ディスプレイを動かしているのを眺めていると、その性能に感心してしまいます。

続き Android タブレットを Raspberry Pi モニタ代わりに使用する

サイクルコンピュータを自作する — GPS トラッキング

今から数えてちょうど1年前 — 2018 年の 11 月に日本の衛星測位システム 『みちびき』の運用が開始されました

これは米国の GPS と協調して測位精度を向上させたり、2k bps もの伝送量のある信号を送信してセンチメータ級の測位補強情報を提供する日本独自の画期的な取り組みを行ったりしています。

ごく最近までの衛星信号の民生利用では、およそ 20,000 km も離れた位置にある GPS の微弱な信号しか拾えないことが一般的で、誤差も 10.0 m ぐらいあることが当たり前でした。

ロシアの GLONASS の信号が拾えるのは良い機器で、他の衛星(たとえばヨーロッパの Galileo や中国の北斗)の信号まで拾えるモジュールは個人では手が出せないような値段が付いていました。

それが現在では誤差 2.5-3.0 m 程度の高精度モジュールが 2,000 円から 5,000 円ぐらいで市販されていて、その一部は日本の『みちびき』にも対応しています。

さらに SONY に至っては衛星信号受信モジュールを標準搭載したボードコンピュータまで販売しています。これを使うと SONY 製のサイコンを作れます


SONY SPRESENSE メインボード

これから衛星測位システムの活用が本格化し、測位精度も高まってくるとホイールの回転数から移動速度を推定するよりも、距離と時間から速度を求めるほうが正確な数値を得られるのではないか…と思うかどうかは別として、わりと簡単に実装できるので知っておいて損はないかと思われます。

そこで、みんな大好き、GPS 受信機キット (太陽誘電社 GYSFDMAXB) を用意しました。




これと Raspberry Pi を組み合わせると、それだけでも市販のサイコンよりも高機能な玩具が作れます。しかし、どうせ雨で濡れたり、ダウンヒルで飛んでいったりするので、ここではそんなに高価で高性能なものは求めません。

安価で小型で通信機能が使えればいいということで ESP32 を使います。


ESP32 ESP-32S 2個セット NodeMCU-32S ESP32-WROOM-32 開発ボード 2.4GHz WiFi + Bluetooth

これを使って GPS 受信機キットで受信した測位情報を BLE でスマートフォンに転送し、 SQLite にログを残したり、走行記録を地図上にオーバーレイ表示することを考えているわけです。

取り付けようと思えば、液晶ディスプレイなども付けられますが、大きく、重たく、電池消費量が激しくなるだけで実用性があまりないので、個人的には不要に思えます。

また反対に機能を削って走行記録を SD カードに残すだけならば、さらに小型化しつつ稼働時間を伸ばせますが、それでは地味でつまらないので、必要なときだけスマートフォンの液晶ディスプレイを借りる方針です。

BLE 通信で接続するので、うまくやらないとスマートフォンのバッテリを無駄に消費する懸念があります、というか、そこを調べることが最大の目的で GPS もサイコンも本当はオマケです。

ただ、いきなり、スマートフォンのアプリ開発という重たいタスクに取り掛かるのは大変なので、今回は測位情報を Bluetooth で送信するところまでを行います。

まずは ESP32-WROOM-32 のデータシートを見て Pin Layout を確認します。そこから TxD の接続先がわかりますので、線でつないでスケッチを動かしてみます(RxDはいまのところは不要です)。

#include "HardwareSerial.h"
#include "BluetoothSerial.h"
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run 'make menuconfig' to and enable it
#endif

BluetoothSerial SerialBT;
HardwareSerial mySerial(2);

void setup() {
  SerialBT.begin("Hoge");
  mySerial.begin(9600, SERIAL_8N1, 34, 35);
}

void loop() {
  if (mySerial.available()) {
    SerialBT.write(mySerial.read());
  }
  delay(1000);
}

このスケッチをコンパイルしてアップロードすると、ESP32 は Bluetooth で測位情報を送信し続けるようになるはずなので、無事にデータ送信ができているかどうかを確認します。

うまくアップロードを行えない場合は、こちらを参考にしてみてください

送信されたデータを Linux で確認するには rfcomm コマンドを使用してシリアルポートにバインドしてしまえば良いです。

$ sudo bluetoothctl
[bluetooth]# power on
Changing power on succeeded
[bluetooth]# scan on
Discovery started
[bluetooth]# pair 00:00:00:00:00:00 
Attempting to pair with 00:00:00:00:00:00
[bluetooth]# exit
$ sudo rfcomm connect /dev/rfcomm0 1 00:00:00:00:00:00
Connected /dev/rfcomm0 to 00:00:00:00:00:00 on channel 1
Press CTRL-C for hangup
$ sudo cat /dev/rfcomm0 

※ 00:00:00:00:00:00 は架空のMACアドレスです

できましたら、ファイルを標準出力に表示するときと同様に cat で出力できるようになります。上の例ですと、GPS受信機キットの出力をそのまま Bluetooth に流してしまっていますけれども、いちど Arduino Serial Monitor に書き出して内容を確認してから同じものが表示されるかどうかを確かめたほうが安全かも知れません。

ともかく、これで位置情報を表示できていれば、ESP32 側の準備は万端です。

ここまでは難しいことはないのですが、遠隔でセンサデータを取得できるのはいつ見ても楽しいものですね。

スマートフォン側のアプリ開発は、こう簡単にはいきません。

BLE通信が前提になりますので、少しばかり手間と時間がかかります。

いま忙しくて、実際に走行ログを集めに行く暇もないので、だいぶ後回しになりそうな気がしますが、せっかくなので既存のサイコンと同一条件で計測を行って、結果を比較してみたいですね。


つづき: サイクルコンピュータを自作する #2 – みちびき対応 GPS と市販のサイコンの比較実験


関連: Garmin / Strava の走行記録をまとめて表示する

ESP32 開発ボードを Arduino IDE で扱う

ESP32-WROOM-32 を Arduino 互換機として設定するための自分用の備忘録です。

これは ESPRESSIF という上海の企業が製造しているマイコンボードです。なんと WiFi と Bluetooth Low Energy (BLE) がデフォルトで使えて、お値段は 1,300 円という汎用性抜群の便利アイテムです。

日本の技適認証もきちんとクリアされていて、箱から出した状態のまま使えます。BLE モジュールを購入してきて苦労していた過去の自分がアホらしく思えてくるほどの性能です。

ただし、ESP32 自体は Arduino ではありませんので、互換機として使用するには自身で設定を行う必要があります。

とは言え、既に先行事例がたくさんありますので、難しいポイントは皆無です。


arduino-esp32/boards_manager.md at master · espressif/arduino-esp32 · GitHub
https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/boards_manager.md


開発プラットフォームを設定するには、製造元の公開している資料(上のリンク)に従って Arduino IDE (Ver. 1.8 以降)に必要なファイルを読み込みこみます。




まずは Arduino IDE を開く前に必要なファイルを準備します。この過程で Python 3 が必要になります。

$ mkdir -p /usr/local/share/arduino/hardware/espressif && cd /usr/local/share/arduino/hardware/espressif
$ git clone https://github.com/espressif/arduino-esp32.git esp32
$ cd esp32 && git submodule update --init --recursive
$ python tools/get.py 

ここまで準備ができましたら Arduino IDE を起動して、Crtl と カンマ [Comma] キーを同時に押して Preferences ウィンドウを立ち上げます。

そして Additional Board Manager URLs の最後尾に  https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json を追記して OK を押します。

そうすると Tools > Boards Manager… に ESPRESSIF が出てくるので、これをインストールします。

使用するのは ESP32 Dev Module というやつです。

こいつはスケッチをアップロードするときに pyserial (Python ver 2) を使用するので、あらかじめインストールされていない環境ではエラーを吐きます。

エラーに慌てずに、必要なライブラリをインストールしてやれば問題ありません。

$ sudo pip2 install pyserial

これで一応は万全です。

まだ下記のようなエラーを吐くことがあるのですが、この場合は Tools > Upload Speed から転送速度を 115200 に変更します(デフォルト値は 912600 になっているようです)。


Serial port /dev/ttyUSB0
Connecting…….._____….._____….._____….._____….._____….._____…..____ An error occurred while uploading the sketch
_

A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header


そしてスケッチの転送時にボード本体の Boot ボタンを押してやります。

ボタンを押しながら転送を始めるぐらいでいいかもしれません。

これでもスケッチを書き込めないときは、正しいポートを選択できているかどうかを確認してみて下さい。

うまくいった場合には書き込みが始まります。

ESP32 にはサンプルが大量に用意されていますので、無事にスケッチを書き込めるようになりましたら、まず一通りのサンプルを動かしてやると挙動がつかめるようになります。