今日も微速転進

ここではないどこかへ

ラズパイ関連本の比較(2018/09)

Raspberry Pi(以下、ラズパイ)の関連書籍の紹介です。 数が多いので2017年以降のものを中心にレビューします。

おすすめは『みんなのRaspberry Pi入門 第4版』。電子工作をがっつりやりたいならブルーバックスの本。

前置き

ラズパイ関連書において重要なのは、Raspberry Pi固有のノウハウ、Linuxの基本操作、電子工作、プログラミング(ほぼPython)の3つのどれに重点をおくか、その配分。またはラズパイを何に使うか(用途)。

ページ数という制約があるのでどこかでトレードオフが発生します。そのため想定読者からマッチしているかが本を選ぶ上での最重要ポイント。

本を書いている人の経歴によって得意分野が違うので本によっては説明に問題があるケースがあります。

ハードよりの人はどうもLinuxのお作法*1やセオリーを知らずに書いているケースがあります。非常に残念です*2

ブルーバックス

内容はいいが新書サイズなので開いたまま固定しにくいのが難点。新書サイズでブックスタンドに固定しにくいのでKindle版か洗濯ばさみで固定するとか。

『カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる 』

評判の良かったRaspberry Piで学ぶ電子工作 超小型コンピュータで電子回路を制御する (ブルーバックス)(モノクロ版)の改訂版+カラー化したもの。

面白いのはタミヤの工作キット+WebIOPiを使ったキャタピラ式のラジコン製作記事など。

回路図、配線図がしっかりしていて丁寧。

あえてモノクロの方を買う必要はまったくないです(内容が古いので)。

かなり丁寧で初心者向け。発売時期の関係で新しいモデルについて記載がありません。

『実例で学ぶRaspberry Pi電子工作 作りながら応用力を身につける』

上記の応用編的な位置づけ。他のシリーズ本と違ってカラーではない点に注意。

『カラー図解 Raspberry Piではじめる機械学習

Tensorflowについては記載されてない(Kerasは紹介している)。 前半はちょっと退屈かも。

『みんなのRaspberry Pi入門』

みんなのRaspberry Pi入門 第4版

みんなのRaspberry Pi入門 第4版

出版社サイト:リックテレコム、「みんなのRaspberry Pi入門 第4版」発刊——Python 3に対応 | fabcross

書店の店頭に古い版が置いてあることがあるので購入時は注意。

  • カラー
  • 紙質がいい感じ
  • Python 3
  • 日本語の入力はibus-mozc
  • RaspbianのインストールはNOOBS経由

Pythonの解説とRaspbianのセットアップに重点を置いている。 LED、モーター、カメラモジュール、センサなど基本は押さえている。

良書。一番バランスがいい本。

Raspberry Piで遊ぼう! 改訂第2版 』

Raspberry Piで遊ぼう! 改訂第2版

Raspberry Piで遊ぼう! 改訂第2版

2017年発行の版が最新です。改訂第4版というのが存在しますが、内容が古いです。購入時は発行年を確認して下さい。

どういう経緯なのかさっぱりですが、改定第2版をリニューアルして2017年に発行しており、こちらが最新です*3

他とはちょっとタイプが違う本。ラズパイをデスクトップPCのように使ったり小型サーバーとして使うノウハウなど何でもあり。

装丁が非常にいい。

  • 実用性はともかく、帯の折返しにgpioのピン配置図がある(表紙側と裏表紙側)。
  • 章ごとに見出しの色とサンプルコードの背景色が違うようになっている
  • Raspberry Pi 3 model B+についての補足のチラシがはさまっている
  • PythonだけでなくJavascriptを使用したサンプルあり(逆に言うとPythonの解説はほとんど無い)
  • WebIOPi *4
  • radikoや動画再生、Webカメラなど
  • ラジコン戦車

サポートページのURLが不明です。

『これ1冊でできる! ラズベリー・パイ 超入門 改訂第4版』

サポートページ:これ1冊でできる!ラズベリー・パイ 超入門 改訂第4版 サポートページ

総論賛成各論反対という感じ。ちょっとどうかと思う。正直微妙。

なぜかsloginコマンドを使用している。とっても不思議。sshなにか恨みでもあるのか?

素直にsshコマンドを使うべき。

  • raspbianのguiを解説
  • 小型pcとしてのラズパイ
  • Lチカ、センサなど
  • 日本語入力にibus-mozc、フォントはIPAフォントとtakaoフォント
  • pythonの解説は数ページ。

本文のコマンド紹介でkillコマンドをー9オプション付きで載せている。むやみに使うコマンドではないのですけど。

また巻末のコマンド解説は順序がちょっと変。いきなりリダイレクトの説明とか。

ちょっと偏った知識で書いているようにと思います。

同じ著者の他の本はともかくこの本はおすすめしない

『電子部品ごとの制御を学べる! Raspberry Pi 電子工作実践講座』

  • 部品の仕組みや構造の解説は有意義
  • Python3
  • 個別の部品をつかうサンプル付き
  • RaspbianのインストールはNOOBS
  • Raspbianの解説はイマイチ
  • Wringpi
  • 索引が貧弱
  • 巻末付録の部品リストはなかなか良い(特に通販の商品コード)

見開き2ページの右ページ右下にPythonのコードが掲載されている。しかし掲載エリアの比率としてはページの6分の1〜2分の1ぐらい。

Pythonのコードがいわゆるラムネ付きの食玩のラムネみたい。

センサやモーターの解説書と電子工作の本とラズパイについての解説を足して2.5ぐらいで割ったような本。

子供の好奇心を満たすという上ではいい本だけど、人によっては中途半端。コンセプトは悪くないが索引がしょぼくて本としてのつくりに疑問。

『ここまで作れる! Raspberry Pi 実践サンプル集』

ここまで作れる! Raspberry Pi 実践サンプル集

ここまで作れる! Raspberry Pi 実践サンプル集

確かにAmazonのレビューどおり、あまり読みやすい文章という感じではない。

なぜか日本語フォントとしてkochi-gothicパッケージをインストール……。他に利用できる日本語フォントがあるのに東風ゴシックは選ぶ必要性がわからない*5

2017年7月発行の本でIPAフォントのパッケージがあるのにわざわざ古いフォントをインストールする理由はない。ラズパイの日本語フォントが問題になることはまずない。その点では細かいことを気にする必要はどこにもない。書くならちゃんと調べてほしいという話。

また冒頭部で唐突にswapを無効化する手順を説明しているけどswapの仕組みの説明はなく、ちょっと不親切。

作例サンプル集としては有意義だと思う。ただし目次をよく見て自分がつくりたいものと類似しているサンプルがあるか要チェック。

なお、日本語フォントとしてはfonts-ipafont-gothicfonts-noto-cjkというパッケージがあり、コマンド一発でインストールできます。

まとめ

本を買わなくてもネット情報で十分なことも多いですが、電子工作にガッツリ取り組みたいならラズパイ関連の本を1冊、ラズパイ関連ではない電子工作系の本を1冊でやっぱり2冊は買う必要があると思います。

ラズパイの初期設定に関してはどの本もちょっと中途半端な印象です。ラズパイで何をするか、はっきり目的を決めないと、どの本も中途半端だと思います。

*1:常識といったほうがいいか

*2:出版社に紹介してもらってチェックしてもらえばいいのに

*3:混乱させてどうするのか

*4:新しいモデルでは動かないかも

*5:ライセンス問題の発覚前ならともかく、それほど品質がいいわけでもない。

PythonとPmodのマイクモジュールで玄関のチャイムの音を検知する

ラズパイコンテストの応募ネタです。しょぼいけど動いたので。

背景

難聴による聴力低下が進むと玄関のチャイムの音が鳴っても聞こえない、または聞こえづらいという問題が発生する。

補聴器というソリューションも存在するが、一日中補聴器を装用しているわけではない。玄関のチャイムそのものをワイヤレスタイプや光で通知するタイプに交換するということも考えられるが、借家等の事情により必ずしも適切とは言えない。

玄関のチャイムそのものを改造せず、玄関のチャイムの音を検知するプログラムにより難聴者のQoLを改善することを目指す。

なお、健常者に置いてもなにかに没頭していて玄関のチャイムが鳴ったことに気づかないということは充分あるので健常者にとっても有益なはずである。

前提

f:id:atuyosi:20180910220631j:plain:w480

過去記事で紹介しているマイクモジュールを使う。

a244.hateblo.jp

ラズパイはRaspberry Pi 3 model B+。別にGPIOピンヘッダがハンダ付けされていればPi Zero Wでも問題ない。

ただし、マイクは安いUSBマイクでは感度が良くないのでMEMSタイプか、設置位置を考慮する必要がある。

事前調査

USBのマイクで玄関のチャイムの音を録音してAudacityで分析してみる。

arecordコマンドで録音する。さすがにデフォルトの8,000Hzはどうかと思うので、CD音質で録音してみます。音質を下げるのは難しくないので。

$ arecord -D plughw:1,0 -f cd  mic.wav

-f cdで録音フォーマット(サンプリング周波数、ビット数)を指定しています。このオプションを省略すると8,000Hz、8bit。ステレオである必要性はないです……。

f:id:atuyosi:20180910195404j:plain:w480

ローパスとハイパスフィルタでノイズ除去、正規化を施す。

f:id:atuyosi:20180910194231j:plain:w480

ものすごくざっくりだが2,000Hzあたりの周波数の成分を検出すれば良いという仮定でやってみる。

方針

残念ながらマイクモジュールの信号をWAV形式に落とし込む方法がわからないのでマイクからの信号値変動幅で判定する。

一定時間内にしきい値を一定回数超えたら玄関のチャイムがなったとみなす。

2,000Hzということなので0.5ミリ秒以下でサンプリングすればいいはず。

準備

SlackのIncomming Webhockを使えるようにする。

  1. WorkspaceのApp管理ページへ移動する(もしくはhttps://slack.com/appsから遷移する)。
  2. 上段にある検索ボックスに"incoming"と入力して検索
  3. 「設定を追加」をクリックする
  4. 画面の表示に従って必要なパラメータを入力
  5. 投稿用のURLをコピーしておく

api.slack.com

環境変数Pythonスクリプトと同じディレクトリの.envというファイルに書き込む。

SLACK_HOCK_URL=https://(省略)

各種モジュール

プログラム側に環境変数経由で投稿用のURLを渡すのでdotenvをインストール。

$ pip install python-dotenv
$ pip install slackweb
$ pip install designspark.pmod

なお、Pythonのバージョンは3.5.3。

Pythonスクリプト

マイクモジュールからの入力値が一定時間内にしきい値を超えたら通知するスクリプト

こんなので動くのかって感じだけど動きました。

大きな音に反応したり、センサ本体が物理的に揺れたりしたときも電圧値が変化します。

センサの接続部がゆるいのも不安定な要因の一つっぽいです。

実行した様子

Slackのおかげで超お手軽。

$ python3 detect_sound_and_notify.py > /dev/null 2>&1

実際は実行し続ける必要があるのでtmux上で起動してセッションをdetach。

通知

f:id:atuyosi:20180910215159j:plain:w480

メッセージ

f:id:atuyosi:20180910215222j:plain:w480

課題など

  • パラメータの調整が不十分
  • 設置位置とマイク感度に応じた調整
  • Slack以外の通知手段
  • 部品がむき出し……

チャイムの音を人工知能に学習させればよかったのでは……。

ALSA経由で使えるマイクモジュールの方が良かったかも。

感想

少しばかり難しく考えて途方に暮れましたが、センサから値で音がなったかは検知できているので妥協しました。

理想を言えば、チャイムの音の周波数成分を分析して人工知能でいい感じにできると誤検知が減るはずです。 しかしながら、そもそもセンサの入力値をPCM形式のような音として扱える形式にする方法がわかりませんでした。

alsa - How to recording audio file with PMod mic3 on Raspberry PI? - Stack Overflow

動いたので良しとしましょう。

何より提供いただいたPmod HATの返却義務を回避できたはずなので。

Pmod HATとマイクモジュール(Pmod MIC3)

とりあえずゲットした部品を使えるようにしただけ。ものは7月末に届きました。

経緯

某コンテストの、部品提供キャンペーンに応募したらブツが送られてきたので。

みんなのラズパイコンテスト |ラズパイマガジン、 日経Linux、日経ソフトウエア 主催

応募しないと返却義務が発生するんで何とかしないといけない。

作品のアイディアはすでに固まっているのでマイクからの入力データの処理について調べさえすればあとは難しくないはず。

付属品など

本体の方はスペーサー×4。ただし両側がメスでネジが×2×4。ラジオベンチがないとバラすのに不便かも。

スペーサーは市販の片側メスのタイプを使ってます。

環境・その他

ref: ラズパイを使った試作に便利! Pmod HAT

ハード

ラズパイはRaspberry 3 model B+。

コンポーネントをつなぐ拡張基板の名称がPmod HATという名称。今回ゲットしたモジュール(子コンポーネント)はPmod MIC3というMEMSマイクモジュール。 マイク以外にもモジュールはたくさんあります。

RETIREDってEOLってことですよね、売れなかった?

USBマイクでいいんじゃないかというツッコミはなしで。

ドキュメント

ライブラリ

セットアップ

ハードウェアの接続は普通のpHATと同じようにGPIOコネクタに接続するだけ。本体をセットしたらマイクユニットを取り付ける。GNDのピンが本体側とマイクモジュール側で一致していればOK。SPIプロトコルを使うのでJAまたはJBのコネクタのどちらかに接続する。

f:id:atuyosi:20180829220035j:plain

写真はJAAに接続しています。音量調整は黄色いネジを回して調整。初期状態はミュート最小音量(感度?)。

SPIの有効化

Raspbianのセットアップは完了しているものとする。

$ sudo rasp-config

f:id:atuyosi:20180829215757j:plain:w480

特に難しくはない。忘れずに再起動する。

パッケージの追加

$ sudo apt install python3-pip python3-dev libfreetype6-dev libjpeg-dev libopenjp2-7-dev libtiff-dev build-essential

venvモジュールもインストール。

$ sudo apt install python3-venv

Python環境のセットアップとライブラリのインストール

作業ディレクトリの作成。

$ mkdir myproject
$ cd myproject

仮想環境の作成、有効化。

$ python3 -m venv venv
$ . venv/bin/activate

本命のライブラリをインストール。

$ pip install designspark.pmod

ハードウェアの注意

  • 初期状態はマイクボリュームが最小なので黄色いプラスネジを右に回す。
  • JAでもJBでもいいが、2段になっている上の段に差し込む

f:id:atuyosi:20180829215003j:plain:w480

動作チェック

リファレンスのサンプルの接続先のみ変更。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2017 RS Components Ltd
# SPDX-License-Identifier: MIT License

"""
Print a continous sound level reading out.
"""

from DesignSpark.Pmod.HAT import createPmod
import time

s = ':'
lut = [s]
for i in range(128):
    s+=':'
    lut.append(s)

if __name__ == '__main__':
    
    mic = createPmod('MIC3','JAA')
    time.sleep(0.1)
    
    try:
        while True:
            int = mic.readIntegerValue()
            #print(int)
            print(lut[int>>5])
            snd = mic.readPhysicalValue()
            #print(snd)
            
            #time.sleep(0.01)
    except KeyboardInterrupt:
        pass
    finally:
        mic.cleanup()

JBAという箇所をJAAに。

ref. 3. Basic Examples — DesignSpark.Pmod 0.2.0 documentation

動作の様子

上記のコードをsample.pyという名前で保存して、実行する際は以下のように。

$ python sample.py

f:id:atuyosi:20180829215246j:plain

音に合わせて出力される:の個数が変動する。

readIntegerValue()またはreadPhysicalValue()でそれぞれ整数、実数で値が取れる。

まとめ

とりあえず動作チェックまで。日本語の情報が殆ど無いのが残念なところ。

接続さえ間違えなければ特に難しくない。

[2018/08/31 追記]

Python経由で扱うのは限界がある。まずLinuxリアルタイムOSではないし、Pythonでマイクロ秒間隔でセンサからデータを取れるかというとちょっと微妙。

ALSA経由でデータを取れるようにするか、Cでがっつりコードを書くか、要検討。

参考URL

Voice Kit とサーボモーター その1

最終的な目標は音声でVoice Kit につないだカメラの首振りなどの制御。

まずは下準備としてラズパイからサーボをコントロールする。

f:id:atuyosi:20180115222935j:plain:w480

やりたいこと

  • Voice HAT (Voice Kitの拡張ボード)のカメラマウント用のサーボモーターをつなぐ
  • Pythonからサーボモーターの制御

用意するもの

  • ラズパイ本体(Raspberry Pi model 3B)
  • microSD
  • Google AIY Voice Kit
  • サーボモーター制御のカメラマウント


※ マーケットプレイス注意

なお、Voice Kit付属のプラスチックスペーサーは取り外しが不便なので下記で代用しています。

ピンヘッダの取り付け

Voice HAT accessory board(Voice Kit付属のメイン拡張基盤)にはサーボモーターやDCモーター、ステレオスピーカー化するためのはんだ付け用のパターンが用意されています。逆いうと自分でピンヘッダなり必要な端子をはんだ付けする必要があるということ……。

今回はサーボモーターを2個つなげることができれば良いので、3ピンのピンヘッダを2つ取り付けることにします。

f:id:atuyosi:20180115222434p:plain:w320

電子部品ショップにレッツゴーするか秋葉原詣でに行くか、あるいは通販でピンヘッダを入手します。

寺町通のマルツに行って確保してきました*1。10個入りで21円(税抜き)。交通費に比較してなんと微妙な価格でしょう……。

f:id:atuyosi:20180115222536j:plain:w320

f:id:atuyosi:20180115222830j:plain:w320

配線

f:id:atuyosi:20180117020103j:plain:w320

f:id:atuyosi:20180115223517j:plain:w320

取り付けたピンヘッダにつなぐ。オレンジ色の線が制御信号で、Voice Hat の端側に来るように接続する。

内部でどのGPIOピンにつながっているかは付属の冊子の最後の方の配線図で判断できる。

動作テスト

Voice Kit付属の小冊子に記載されているコードをちょっとだけ改造。

from gpiozero import Servo
from time import sleep

servo_0 = Servo(26)
servo_1 = Servo(6)

#servo_1.mid()
servo_1.max()

while True:
    servo_0.min()
    servo_1.max()
    sleep(1)
    servo_0.mid()
    servo_1.mid()
    sleep(1)
    servo_0.max()
    servo_1.min()
    sleep(1)
    servo_0.mid()
    servo_1.mid()
    sleep(1)

Servo()関数に、サーボモーターの信号線のつながっているGPIO番号を指定する。 一番上側がGPIO 26、その下がGPIO 06。

停止させるときはCtrl-C。

動作の様子

gif にしたらファイルサイズがちょっと残念な感じだったので省略。ちゃんと動きました。

まとめ

次はカメラマウントにセットして、任意の角度で可動させたい。

流石にそろそろ出発準備しないとまずいのでどこまでいけるかちょっと微妙だけど。

*1:Pi Zero Wと一緒に……

Raspberry Pi Zero W のセットアップ

初詣のついでに買った*1ヤツをセットアップしたのでメモ。

概要

f:id:atuyosi:20180115010205j:plain:w480

公式:Raspberry Pi Zero W - Raspberry Pi

購入したのはマルツで販売されていたセット商品。

www.marutsu.co.jp

不満な点としてはmicroSDが8GBなのと、インストールされているのが2017年7月のイメージだったところ(NOOBS 2.4.2)。 

別に上書きしちゃえばいいんだけどさ。

はんだ付けしたのはいいけれど……

f:id:atuyosi:20180115005110j:plain:w480

純正ケースのフタは3種類ありますが、GPIO用の40ピンのピンヘッダを取り付けると干渉してしまうので1種に限定されます。皆さんご注意を。

f:id:atuyosi:20180115005723j:plain:w320

用途を検討の上ではんだ付けするのがいいと思います。というか、普通はそうしますよね……。

導通確認はしていませんが、どうにかこうにかはんだ付けできたっぽいです。

はんだ付けの手順については下記を参考にさせていただきました。

Raspberry Pi ZeroのGPIOピンをはんだ付けする(Rev.C) | 電子工作の環境向上

goot 高密度集積基板用はんだ SD-60

goot 高密度集積基板用はんだ SD-60

公式の動画チュートリアルもいいと思います。

Getting started with soldering - Video tutorial | Raspberry Pi Projects

なお、拡大鏡の類がないとつらいです。 私は手元にあった拡大鏡をどっちもクリップという製品で保持して作業してました。

長さ的に微妙だったのでロングタイプの方がいいかも。

YAZAWA(ヤザワ) どっちもクリップ ロングタイプ  CLW5

YAZAWA(ヤザワ) どっちもクリップ ロングタイプ CLW5

純正ケースの脱着

4カ所のピンと赤い出っ張り部分で固定しているので、長辺側をたわませるとスムーズにケースから本体を取り外すことができます。

f:id:atuyosi:20180115005333j:plain:w320

ちょっとコツがありますが、慣れればどうということはない、かな。

OSのインストール

セット商品なのでOSインストール済みのmicroSDが付属するわけですが、どうもNOOBSを使ってインストールされているようです(マルツの場合)。

これでは/bootにファイルを置くことによるギミックが機能しないのでインストールし直します。

公式サイトから"Raspbian Stretch Lite"の方をダウンロードする。

Download Raspbian for Raspberry Pi

イメージファイルの書き込みはEtcher。

etcher.io

セットアップ

下準備

microSDの/bootパーティション直下にファイルを作成し、Wifiの設定を書き込む。

$ vim /Volumes/boot/wpa_supplicant.conf

下記の内容を入力。

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="your-SSID"
        psk="your-passphrase"
}

内容は環境に応じて修正する。

起動時にsshを有効化するために、同じ要領で空のファイルを作成。

$  touch /Volumes/boot/ssh

/VolumesというのはmacOSにおけるデバイスのマウントポイント。Windowsのドライブレター(D:とかE: みたいなもの)だと思えばいい。

sshでログインする

$ ssh pi@raspberrypi.local

初期設定

まずはパッケージのアップデート。

$ sudo apt update
$ sudo apt upgrade

Wifi の確実化

rfkillフラグのリセット問題が発動すると面倒なので、念のため。

$ sudo apt install rfkill
$ sudo vi /etc/rc.local

適当な場所に下記を追加。

$ sudo vi /etc/rc.local

参考:Raspbian Stretch Lite で突然無線LANに接続不能になったとき - ながいものには、まかれたくない

パッケージの追加

ひとまず最低限。

$ sudo apt install tmux vim

ホスト名の変更

$ sudo vi /etc/hostname

任意で書き換える。

$ sudo vi /etc/hosts

raspberrypiという箇所を上記と同じホスト名になるように書き換え。

パスワード変更

$ passwd
Changing password for pi.
(current) UNIX password:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

雑多な設定

$ sudo raspi-config

f:id:atuyosi:20180115004150p:plain

"4. Localization Options"から"11. Change Locale"を選択して、"ja_JP.UTF-8"を有効に。 f:id:atuyosi:20180115004201p:plain

同様に"4. Localization Options"から"12 Change Timezone"。"Asia"、"Tokyo"と順にたどっていく。

感想

まあ、スペック通りに小さくて……、遅い。これはOpenCV3系列入れるならクロスコンパイル環境の作り方を調べないとダメか。

ラズパイ3Bの2台目とどっちが良かったのかちょっと微妙な感じ。

まとめ

特別なことは基本的に何もしていないです。何より用途を決めずに勢いで購入してしまったので。

純正のカメラモジュールをつなごうかと思いましたが、それだとなおさらGPIOピンヘッダをつないだ意味がないのでLEDで遊ぼうかどうするか。

それではまた。

参考URL

ラズパイマガジン 2018年2月号 (日経BPパソコンベストムック)

ラズパイマガジン 2018年2月号 (日経BPパソコンベストムック)

*1:買ってしまった

広告