2018年02月11日

Raspberry Pi ZeroでRaspbianをディスプレイ/キーボードなしでセットアップする

headless-setup.png

Raspberry Pi ZeroやZero Wは小さいのが取り柄なので、マイコンボードのようにディスプレイなしで使いたくなると思います。
通常、Raspbianをセットアップするときだけはディスプレイとキーボードが必要になりますが、その作業を飛ばしていきなりSSHでログインできるようにセットアップする方法があります。

「Headless Setup」で検索するといろいろ出てきますが、以下の記事の通りにやってみたところ、無事ディスプレイ/キーボードなしでセットアップが完了しました。

Use Wifi in latest raspbian lite stretch in headless mode - Raspberry Pi Forums

やり方を抜粋すると、以下のようになります。

1.RASPBIAN STRETCH LITEEtcherでMicroSDカードへ書き込む。

2.いったんMicroSDカードを取り出し、再度PCへ挿入する。

3.MicroSDカードのFAT32のパーティションへアクセスできるので、ルートディレクトリを開く。

4.そこへ「ssh.txt」(または拡張子なしの「ssh」)という空のファイルを作っておく。

5.同じく、ルートディレクトリに「wpa_supplicant.conf」というファイルを作る。

6.wpa_supplicant.confの中身を以下のように編集する。(ssidとpskには、使用したい無線LAN APのSSIDとパスフレーズを入れておく。)
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US

network={
ssid="Your network SSID"
psk="Your WPA/WPA2 security key"
key_mgmt=WPA-PSK
}

7.(Zero WでUART接続でシリアルコンソールを使いたい場合)config.txtを開き、「dtoverlay=pi3-disable-bt」という行を追記する。(Bluetoothが使えなくなる代わりにUARTが使えるようになります。)

8.MicroSDカードをRaspberry Piに挿入して起動する。

9.UART接続がある場合は、UARTからログインできる。ネットワーク経由の場合、Raspberry PiはIPアドレスをDHCPで取得するので、無線LAN APのログなどで割り当てられたIPアドレスを確認し、sshで「pi@IPアドレス」(パスワードはraspbian)に接続する。

2017-11-29版のRaspbian Stretch LiteとRaspberry Pi Zero Wの組み合わせでは、上記の方法でうまくいきました。最後のIPアドレスを調べるところだけ若干ハードルが高いかもしれませんが、UART接続ができればそれも不要です。

ちなみに、このヘッドレスインストールを試すことになったのは、誤ってRaspbianの入っているMicroSDカードのkernel.imgを別のファイルに上書きしてしまったからなのでした・・・。
別の起動ディスクから起動して、上書きしてしまったMicroSDカードのkernel.imgを復旧する方法が以下で紹介されています。

Manually place kernel.img on boot partition - Raspberry Pi Forums

ちなみに、正しいkernel.imgを単にコピーしなおすだけではうまくいかないはずです。
posted by boochow at 01:33| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2018年02月10日

Raspberry Pi 3でのベアメタルプログラミング

rpi3.jpg

Raspberry Pi 3はパワフルすぎて、かえってPCとの差分が小さいから魅力が薄い、と思っていた時期もあったのですが、結局入手しています。
直接のきっかけは最近公開された、下記のPi3専門のベアメタルチュートリアルです。

Yet Another Bare Metal Tutorial for the RPi3 - Raspberry Pi Forums

bztsrc/raspi3-tutorial: Bare metal Raspberry Pi 3 tutorials

このチュートリアルでは、例外や仮想メモリを扱っているのが興味深いです。
また、クロスコンパイラの導入から解説されていますし、コンパイル済みのバイナリもアップロードされており、かなり敷居が低くなっていると思います。

なお、上記GitHubサイトのREADMEでは、他のベアメタルチュートリアルについても紹介されており、それぞれ微妙に扱っている分野が違っていて、参考になります。
一番最初に挙げられているケンブリッジ大学のサイト「Baking Pi」は、USBキーボードからの入力や画面表示がメインなので、ベアメタル版MicroPythonへ移植したいと思っています。

最近では、Raspberry Piの中で3だけに対応しているソフトウェアも見かけることが増えてきましたので、そちらも気になっています。
64bit OSがRPi3専用なのは当然ですが、たとえば「Android Things」もRPi3のみ対応ですし、マニアックなところではオープンソースのTEEであるOP-TEEなんかもそうです。
そんなわけで、1台持っておくことにしたのでした。
posted by boochow at 00:31| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2018年01月20日

Raspberry Pi Zero Wにカメラモジュールをつないでみた

raspicamera.jpg


以前、PimoroniからRasPi Zero用カメラモジュール買ってあったことを思い出して、接続してみました。
使い方はこちらが詳しく、わかりやすいです。

第43回「Raspberry Pi Zero V1.3+カメラモジュールでミニ定点カメラを作ろう!」 | Device Plus - デバプラ

Python3用のライブラリは
sudo apt-get install python3-picamera
でインストールできます。
ライブラリのマニュアルも非常に詳しく、よくできています。

picamera − Picamera 1.10 documentation

画像の確認用に、以前紹介した3.5インチLCDも接続して、動かしてみました。

Pythonを起動して、カメラの画像をLCDへ表示させるのはこれだけです。
import picamera
camera = picamera.PiCamera()
camera.start_preview()
camera.stop_preview()
フレームレートも高いですし、動作も非常に安定しています。
機械学習のデモにRaspberry Piが使われれることが多いそうですが、この手軽さなら納得です。
学習するのではなく学習結果を用いて識別する部分だけなら、Raspberry Piでも動くのでしょうね。
camera.start_recording('video.h264')
camera.stop_recording()
とやるとH.264で動画の録画もできますし、画質もなかなかです。

rpi_video_snapshot.jpg


Raspberry Pi Zeroは大きさこそマイコンボードと変わりませんが、こういった処理になるとやはりマイコンとは違うパワフルさを実感します。
マイコンならMicroPython+Cortex-M7を使ったOpenMVというのもありますが、趣味で使うにはRasPi Zero+カメラモジュールが圧倒的にコストパフォーマンスが高いですね。
最近発表された下記のカメラモジュールも気になります。

およそ3 mm角の超小型レンズモジュール取扱いはじめました | スイッチサイエンス マガジン

IU233N2-Z/IU233N5-Z | ソニーセミコンダクタソリューションズ株式会社

高価なので手を出し辛いのが残念ですが、これだけ小さいと視線一致型のテレビ電話とかも作れてしまいそうですね。
posted by boochow at 20:31| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2018年01月15日

Raspberry PiのGPIO操作(3)NeoPixelを光らせる

rpi-8x8-neopixel.jpg

以前aliexpressで購入した8×8のNeoPixelボードをRaspberry Pi Zero Wにつないでみました。
(おそらくこれと同じものだと思います。価格は1/5くらいでしたが・・・)

ソフトウェアは、こちらのツールを使いました。

jgarff/rpi_ws281x: Userspace Raspberry Pi PWM library for WS281X LEDs

解説がこちらにあります。

Overview | NeoPixels on Raspberry Pi | Adafruit Learning System

NeoPixelは以前も書いたように1ビットの信号線で色信号を送ります。
この信号はかなり高速で、Linuxの上でソフトウェアでGPIOをオン・オフしていては間に合いません。
そのため、上記のソフトウェアではRaspberry Piのハードウェア機能のうち、シリアル通信を高速に行えるSPI、PWM、PCMのいずれかを使用して信号を送るようになっています。

今回はSPI(GPIO10/SPI0_MOSI)に接続してみました。電源は3.3Vに接続します。5Vだと信号がうまく送れないようでした。

まず、
sudo raspi-config
で「5 Interfacing Options」を選択し、SPIをenabledにしておきます。
また、ソフトウェアのビルドにsconsというツールが必要なので、これも
sudo api-get install scons
でインストールしておきます。
sconsは初めて使いましたが、Software Constructerの略でmakeの代わりになるようです。

git clone https://github.com/jgarff/rpi_ws281x
でソフトウェアをダウンロードし、
scons
でビルドできます。
testというコマンドが作成されますので、
sudo ./test -g 10 -c
で起動してみます。
これでLEDが点灯すればOKです。

ちなみに、Pimoroniからもunicorn HATが出ていて、ソフトウェアも提供されていますが、このソフトウェアが使えるかどうか試してみたところ、LEDの配列が違っているようです。

Adafruit版は
  1  2  3  4  5  6  7  8
9 10 11 12 13 14 15 16
と並んでいるのに対し、Pimoroni版は
  8  7  6  5  4  3  2  1
9 10 11 12 13 14 15 16
というように一筆書きで並んでいました。

そこだけ修正すれば利用することができます。
unicorndというデーモン形式のソフトウェアがあるので、NeoPixelを出力デバイスとして使用する場合には便利かもしれません。
posted by boochow at 23:56| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2018年01月14日

Raspberry PiのGPIO操作(2)サーボモータを動かす

raspbian-sg90.jpg

Arduinoでもおなじみのサーボモータ「SG-90」の制御をRaspberry Piでも試してみました。
SG-90は5V動作ですが、制御信号は3.3Vでもなんとか動作するようです。
ただし、Raspberry Piのピンヘッダの5VはUSBの5Vを分配しているだけなので、USBの電源出力が弱いとモータの動作に影響が出ます。

サーボモータの制御はPWMで行いますが、そのためのパッケージは「WiringPi」がメジャーなようです。
Stretch Liteにはデフォルトではインストールされていませんでしたが、
sudo apt-get install wiringpi
でインストールできます。

このパッケージには「gpio」というコマンドが含まれており、このコマンドでPWMの制御も行えます。

まず、GPIOピンをPWMモードにします。使えるピンは、前回の表を参照するとGPIO12、13、18、19となっています。

しかし、WiringPiのマニュアルによると、PWMが使えるのは18だけで、かつアナログオーディオ出力を使っていないこと、という条件があります。
GPIO12、13、19が使えないのは、初代Raspberry Piではピンヘッダが26本で、その中にはGPIO12、13、19が含まれていなかったからだと思われます。
RaspberryPi Zero/Zero Wではアナログオーディオ出力はありませんが、他のRaspberry Piのアナログ音声の出力はPWMで行っているようです。(音質は低そうですね。)

もう一つ注意しなければならないのは、WiringPiでのピン番号がGPIOのピン番号とは異なる点です。
いつもの以下の図を見てください。

GPIO18の前のカッコ書きで、「GPIO_GEN_1」とあります。この「1」がWiringPiでのピン番号になります。
なお「-g」オプションをつければ、WiringPiではなくGPIOのピン番号を使用することができます。

GPIO18を使う場合のSG90との結線は下図のようになります。
rpi-sg90.png


gpioコマンドを以下のように使うと、サーボを動かすことができます。

この例は「Software | Adafruit's Raspberry Pi Lesson 8. Using a Servo Motor | Adafruit Learning System」から拝借しました。

GPIO12, 13, 19も同様にPWM制御できますが、WiringPiのピン番号は定義されていませんので、-gオプションを使って指定する必要があります。

また、gpio modeコマンドでPWMの設定をピンに割り当てるとPWMの設定がリセットされるようなので、都度
gpio pwmr 2000
gpio pwmc 192
gpio pwm-ms
を行う必要があります。


これらのパラメータの意味は以下の通りです。

まず、PWMにはbalancedモードとMark:Spaceモードがあります。

・balancedモード
指定されたデューティ比を、できるだけ高い周波数で再現する。デューティ比50%のとき、最も高い周波数が得られる。デューティ比が0%や100%に近づくと周波数が下がる。

・Mark:Spaceモード
指定された周波数で、1周期内の1(Mark)と0(Space)の比を指定されたデューティ比で再現する。どのようなデューティ比でも周波数は変わらない。

以下のスライドに、両者の違いが視覚的に表現されています。

デジタルアンプのように、アナログ値でPWM変調した信号をローパスフィルタを通してアナログ値に戻す前提ならば、Balancedモードのほうが波形が歪まないと思われます。
しかし、今回のサーボモータは信号周期が20ms(50Hz)と決まっていますのでMark:Spaceモードを使う必要があります。
sg90.png

PWMの周波数は、以下の式で決まります。
19.2MHz / (pwm range * pwm clock divider)

pwm rangeとpwm clock dividerはそれぞれgpio pwmrおよびgpio pwmcで指定されています。
19,200,000 / (2,000 * 192) = 50 (Hz)

となります。

デューティ比は、0〜pwm rangeの範囲で指定します。0のとき0%、pwm rangeのとき100%です。
今回の設定ではpwm rangeが2000ですので、1000を指定したときデューティ比50%(H, Lの長さがそれぞれ10msec)となります。

SG90の仕様では、0.5ms〜2.4msの範囲で指定するようになっていますので、

-90度:0.5ms/20ms = 0.025; 0.025 * 2000 = 50
0度:1.45ms/20ms = 0.0725; 0.0725 * 2000 = 145
90度:2.4ms/20ms = 0.12; 0.12 * 2000 = 240

と指定すれば良いはずですが、私のSG90は50を指定すると「ジー」と振動音が出てしまいました。
一般的には、サーボでは1.5msのとき0度となる製品が多いようですので、

-90度:60
0度:150
90度:250

としておくのが良さそうです。
90度のとき240なら、1増やせば1度動くという感じになって覚えやすいのですが、実際には240だと90度までは回りきらず、250でちょうど回りきる感じでした。
posted by boochow at 19:41| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする
人気記事