情報理工学実験
コンピュータによる電子機器制御の基礎
2021 年版 v2.0
概要
コンピュータの利用分野のひとつに，自動車などの電気機械装置を制御することや，そのような装置と利用者のインタフェースの役割を果たすものがある．このように，装置に組み込んで利用されるコンピュータシステムを組込みシステムと呼ぶ．この実験では，組込みシ
ステムとしてのコンピュータの基本的な機能を学習する．
組込みシステムにおけるコンピュータは，マイコンと呼ばれる CPU とメモリや IO 装置を備えた CPU 基板の形で利用される．電気機械装置の全体は，CPU 基板に装置固有の部品や回路・システム・機構部を接続することで構成される．
本実験では，CPU 基板として Raspberry Pi を用いて３種類の実験を行う．第一の実験ではカメラモジュールを接続し，撮影した画像から対象物の面積を測定するシステムを開発する．
第二の実験では，加速度・角速度センサを接続し，センサ信号の性質を調べるとともに，角速度センサの出力値から角度を推定する．第三の実験では，LED（発光ダイオード）とスイッ
チでできた簡単な回路を接続し，C 言語によるプログラムでこれらを制御する．

1

目次
1 章 組込み機器に用いるコンピュータ
2 章 Raspberry Pi 入門
2.1 Raspberry Pi の概要
2.2 接続・起動・利用・終了
2.3 Linux 入門
3 章 実験 1：画像処理による面積計測システム
3.1 予備実験
3.1.1 カメラモジュールの装着
3.1.2 コマンドツールによる静止画と動画の撮影
3.1.3 C/C++言語と OpenCV による画像の入力・表示・出力
3.1.4 OpenCV を使った画像処理

3.2 課題「画像処理による面積計測システム」
3.2.1 装置の概要と測定原理
3.2.2 面積計測システムの処理手順
3.2.3 マーカー位置の認識
3.2.4 画像の二値化と面積の測定
3.2.5 面積計測システムの精度評価

3.3 実験 1 のレポート作成

4 章 実験 2：加速度・角速度センサの性質と角度の測定
4.1 加速度・角速度センサ
4.2 位置・姿勢と加速度・角速度の関係
4.3 センサ信号を解析する
4.4 センサ信号を処理する
4.5 角度の測定
4.6 実験 2 のレポート作成

5 章 実験 3：スイッチを使った LED の点滅制御装置
5.1 予備実験
5.1.1 Raspberry Pi と周辺装置・周辺回路の接続
5.1.2 GPIO 端子の設定と入出力
5.1.3 GPIO 端子の接続
5.1.4 スイッチ On/Off の入力と LED の点滅制御

5.2 課題「スイッチを使った LED の点滅制御装置」
5.3 実験 3 のレポート作成

2

付録 1：Raspbian のインストールから日本語環境の設定まで
付録 2：テキストエディタ
付録 3：Raspberry Pi 用 SD カードのバックアップと複製
付録 4：USB メモリの利用
付録 5：スクリーンショットの撮り方
付録 6：カメラモジュールと OpenCV の利用
付録 7：3 軸ジャイロ・加速度センサモジュール GY-521 の接続
付録 8：無線 LAN への接続
付録 9：WiringPi のインストール
付録 10：LeafPad，nano，vi のタブキーの設定変更
付録 11：MacBoook から無線 Lan で Raspberry Pi をリモート操作する方法
付録 12：7 インチ公式タッチパネルディスプレイの接続

3

1章 組込み機器に用いるコンピュータ
コンピュータはさまざまに利用されている．Google や Amazon のクラウドコンピューティ
ングやスパコンのような超大型システムから，14 号館１階にあるサーバーマシンのような中型のシステム，そして，日常使っているパソコンやスマホが，代表的なコンピュータである．
実際にはこれらだけではなく，ほとんどの電気機械装置にはコンピュータが組み込まれている．原子力発電所・飛行機・自動車や交通制御システム・自動改札・銀行の ATM・医療機器・
テレビ・カメラ・プリンタ・冷蔵庫・炊飯器など，数え上げればきりがない．
装置に組み込まれるコンピュータは専門化した機能を持ち，一般に動作の信頼性が高い．
大量に生産するものは，消費電力が少なく，小型で安価である．このようなものを組込み用
コンピュータとよぶ．図 1.1 に，入手が容易な組み込み用コンピュータの例を示す．

85.6mm

53.4mm

56.5mm

68.6mm

Arduino UNO

Raspberry Pi 3 B+

26.0mm

9.0mm

44.0mm35.0mmPIC28DIP

mbed 
図 1.1 組み込み用コンピュータの例
Raspberry Pi はカードサイズの CPU ボードに，周辺機器を接続できる入出力機能を加えたものである．基本的には Linux パソコンであり，４つの中では格段に処理性能が高い．プ
ログラム言語は Python・C・Java のいずれかを用いることが多い．ソフト開発は比較的容易であるが，Linux で動作するため厳密なリアルタム処理には向かない．Arduino はオープ
ンソース／オープンハードを特徴とし，組込み用コンピュータとして古くから実績がある．
OS はなく，C 言語風プログラム言語を使う．mbed は arduino を小型にしたような装置である．PIC は，比較的簡単な命令語を持つ CPU コアに，ROM・RAM，タイマー・割り込みコ
ントローラ，周辺機器とのインタフェース回路を一体化したマイコンチップである．非常にたくさんのバリエーションを備えている．プログラムは C 言語かアセンブラで記述する．他の３つが主に試作用の部品であるのに対して，実製品にも広く利用される．

4

2 章 Raspberry Pi 入門
2.1 Raspberry Pi の概要
Raspberry Pi はカードサイズの CPU 基板である．Linux 系 OS が動作し，ディスプレイ，
キーボード，マウス，ネットワークを接続することでパソコンとして利用することができる．
いくつかのモデルがあり，この実験では Raspberry Pi 3 あるいは 2 を利用する．表 2.1 に，RasPi3 の主な仕様を示す．
表 2.1 RasPi3 の主な仕様-58r

63 -ABC

I

cU

Oe

I

h

e

M

8 ,G

1.32

c

c

BA

.Pe

eS
rlm

r

eR
WV

01Fr 0,W/, D CAAC

0524IH

io

G

RasPi3 の主な部品の名称と機能を，図 2.1 に示す．microSD カード（以下，本文中では
SD カードと記す）はシステムプログラム（OS）とユーザプログラムやデータを格納する外部メモリとして利用する．CPU は４コアの ARM Cortex-A53 である．ボード中央にあるチップは，CPU を始めとする多くの機能を一つのチップに集積した SoC（System on Chip）
である．ディスプレイ，キーボード，マウスは HDMI コネクタ，USB 端子に接続する．電源はマイクロ USB の電源コネクタを介して供給する．電源を切る場合にはあらかじめシステ
ムをシャットダウンし，動作が止まったことを確認（緑の LED が点滅しなくなる）すること．
40 ピンのピンヘッダや専用のコネクタを介して外部の機器・装置・センサ・モーター・カメ
ラモジュールなどを接続できる．
P

P
c

R

I
i
,

4

:

0

A
C

m

Sm

H

O

G
DOBH

DOBH

図 2.1

A

U
DOBH

RasPi3 と各部の説明

5M

一般ユーザは，Raspberry Pi の機能を OS(Operating System，オペレーティングシステム)を使って利用する．Raspberry Pi には複数の Linux 系 OS が開発されており，この実験では最も代表的な Raspbian を用いる．

2.2 接続・起動・利用・終了
Raspbian がインストール済みの SD カードを RasPi に装着する．USB マウス，USB キー
ボード，ディスプレイを図 2.2 のように接続する．この状態でマイクロ USB コネクタから電源を供給するとシステムが起動する．

-

図 2.2 RasPi の接続
最終的に，図 2.3 のデスクトップ画面が表示される．デスクトップ環境の操作は Mac や
Windows と似たようなものである．図 2.3 に初期状態で表示されている主なアイコンの意味を示す．この中で，実験に利用するものは，プルダウンメニューのアクセサリにある Emacs，
LeafPad と呼ばれる Text Editor，ターミナル，ファイルマネージャなどである．

 
Web 
 図 2.3 デスクトップ画面

6

RasPi を終了するには，Menu からシャットダウンを選択するか，ターミナルを起動し$ sudo shutdown –h now
あるいは$ sudo haltと入力する．ここで，sudo は root（ルート，スーパーユーザー，管理者）としてコマンドを実行させることを意味している．一般ユーザとして実行できないコマンドであっても，その前に sudo を入れることで，実行できるようになる．正しくシャトダウンするとディスプレ
イの表示が消え，最後にボード上の緑色 LED が消える．この段階で電源を切る．緑色 LED
は SD カードへのアクセスが発生していることを示す．これが点灯・点滅している時に電源を切断すると，SD カードの内容が破壊される可能性が高い．
RasPi で利用できるテキストエディタの代表は nano と LeafPad である．また，emacs もインストールしてある．Vi，vim も利用できる．nano はターミナルから利用するエディタ，
LeafPad は GUI で操作するエディタである．
LeafPad は Menu からアクセサリ→Text Editorと選択して起動する．なお，emacs はインストールしたままのデフォルト状態であるから，
プログラミング演習で利用している環境とは操作感が少し異なっている．この実験では，自分の使いやすいエディタを使えばよい．
（特にこだわりがなければ emacs を使ってください）

2.3 Linux 入門
SD カードにインストールした Raspbian は，Linux ディストリビューションの一つである
Debian を Raspberry Pi 用に最適化した OS である．Mac の OS X とは，共に UNIX 系 OSであるという意味で親戚と言える．実験で利用する RasPi の機能の多くは，ターミナルからLinux コマンドを入力することで利用する．
（Linux コマンドは Mac のターミナルから入力
するコマンドとほぼ同じである）

2.3.1 Linux コマンドの例
デスクトップ環境でターミナルを起動すると，ターミナル画面にpi@raspberrypi ~ $と表示される．これはコマンド入力待ちであることを示す．pi はユーザ名，raspberrypi はコンピュータ名（ホストネーム），~はホームディレクトリ（/home/pi）を示す．Linux のファイルシステムは，ディレクトリがツリー状に構成されている．それぞれのディレクトリにファイルと下位のディレクトリが保存される．代表的なコマンドの例を次に示す．
$ cd ..

カレントディレクトリを一段階上がる$ cd /

カレントディレクトリを/（ルート）にする$ ls

カレントディレクトリのファイルの一覧を表示する$ ls -lファイルの一覧を詳細に表示する

7

$ ls -laドットファイルを含めてファイルの一覧を詳細に表示する$ touch foo

空ファイル foo を生成する．foo が存在する場合，作成日時を更新する．

$ mv foo baz

foo の名前を baz に変更する$ cp foo baz

foo と同じ内容のファイル baz を作る$ rm baz

ファイル baz を削除する

空のディレクトリを削除するには rmdir，中にファイルが入っているディレクトリを削除す
るには rm –r を用いる．rm コマンドにオプション-r をつけると「ディレクトリの中身を再帰的に削除せよ」という意味になる．
$ man curl

curl コマンドのマニュアルを表示する$ rm --help

rm コマンドのヘルプを表示する$ mkdir myDir

新しいディレクトリ myDir を作る$ grep Puzzle */* カレントディレクトリの下にある全ファイルで文字 Puzzle を検索する$ sudo find / -name “stdio.h”
stdio.h という名前のファイルを，/以下の全ての場所から探す

2.3.2 パイプとリダイレクション
Linux（UNIX）の機能にパイプとリダイレクションがある．パイプは２つのプログラムを連携して機能させるしくみで，第一のプログラムの標準出力（stdout）を第二のプログラムの標準入力（stdin）に接続する機能である．例えば，$ ls -la | lessとすることで，ls -la の出力を less コマンドの形式で表示する．ここで‘|’がパイプを表す．
リダイレクションはプログラムの標準出力（stdout）をファイルに向ける機能である．
$ ls > list.txtとすることで，ls の出力を list.txt というテキストファイルに保存することができる．
$ cat wibble.txt wobble.txt > wobble.txtとすることで，２つのファイル wibble.txt と wobble.txt をつないだファイル wobble.txt を作ることができる．
‘>’がリダイレクションの記号である．

2.3.3 プロセス
Linux が管理するプログラムの単位をプロセスとよぶ．Linux は，常時，数十個のプロセスが動作している．ps コマンドは実行中のプロセスの状態を表示する．
$ ps -auxとすることで，実行中の全てのプロセスの状態を表示する．プログラムを強制終了するには，$ ps –aux | grep プログラム名のようにして，プログラムのプロセス ID を調べ，

8

$ kill プロセス ID
で強制終了させる．自分には権限がないプロセスを終了させる場合$ sudo kill プロセス IDとする必要がある．ただし，権限がないプロセスの終了は慎重に行う事．

2.3.4 パーミッション
Linux では，一般ユーザに権限がない操作であっても，root ユーザとしてコマンドを実行することができる．root としてコマンドを実行する場合，通常のコマンドの前に sudo をつけて実行させる．しかし，root としてコマンドを実行することはシステムに大きなダメージを引き起こすこともあるので，特に注意すること．
すべてのファイルとディレクトリは，一人のユーザと一つのグループに属している．chownと chgrp のコマンドを使うと，所有者とグループを変更することができる．
$ sudo chown pi garply.txt

garply.txt の所有者を pi にする$ sudo chgrp staff plugh.txt

plugh.txt のグループを staff にする

各ファイルとディレクトリは読む（r），書く（w），実行する（x）という３種類のパーミッション（許可）が設定されている．その設定状態は，ls -l コマンドでファイルの詳細情報を表示することで，図 2.5 のように確認することができる．パーミッションは chmod コマン
ドで変更することができる．chmod コマンドは表 2.2 の略号を使い，$ chmod u+rwx, g-rwx, o-rwx wibble.txt

所有者のみが rwx 可能とする$ chmod g+wx wobble.txt

グループに wx の権利を追加する$ chmod -rwx, +r wobble.txt

全ユーザに r だけを許可するのようにパーミッションを設定する．あるいは，rwx を 3 桁の８進数に見立てて，$ chmod 755 wobble.txt のように設定することも可能である．これによって所有者は rwx 全て可能，その他のものは r と x が可能となる．
" 
   # 
 
 

%'%'!$&%'

図 2.5 ファイルのパーミッション情報
実験中に，実行できるはずのファイルが実行できない，という状況になったときは，$ chmod 755 ファイル名のようにして，実行権限を与えると解決する場合が多い．

9

表 2.2 chmod コマンドで使われる略号










 









"





"



"



" !



" #

2.3.5 ソフトウエアのインストールとアップデート
ネットワークに接続した Raspberry Pi の IP アドレスを調べる場合，ifconfig コマンドを用いる．
$ ifconfig
他のコンピュータと通信可能かを調べる場合には ping コマンドを用いる$ ping yahoo.com
ネットワークを介してソフトウエアをインストールするには，多くの場合，APT とよばれる Debian 用のパッケージ管理システムを用いる．例えば，次のコマンドで emacs エディタ
がインストールできる（実際にインストールする必要はない）．
$ sudo apt-get install emacs
APT が管理するソフトウエアパッケージは頻繁に更新される．そのパッケージリストを更新し，インストールしたソフトウエアをアップデート・アップグレードするために，$ sudo apt-get update$ sudo apt-get upgradeを行う（この実験では，これらを行う必要はない．参考情報として記述している）．

10

3 章 実験 1：画像処理による面積計測システム
この実験は予備実験と課題からなる。予備実験では，カメラモジュールを RasPi に接続し画像入力の動作を確認する．また，カメラから入力した画像を OpenCV というライブラリで処理することで，画像処理の概要を理解する．課題では，平面的な物体をカメラで撮影し，その面積を測定することに取り組む．
この実験で使うプログラムは~/C/camera/source にある．
それらを~/C/camera にコピーし，ここを作業ディレクトリとして実験を進めること．

3.1 予備実験
3.1.1 カメラモジュールの装着
カメラモジュールは電子部品としてのカメラのことである．画像センサ・レンズ・抵抗やコンデンサなどの部品を実装した小さい基板とケーブルなどからできている．この実験で使うカメラモジュールは，5M ピクセル（500 万画素）か 8M ピクセル（800 万画素）の CMOS 画
像センサを使っている（V1 が 500 万画素，V2 が 800 万画素）
．これを，15 ピンのフレキシブ
ルケーブルで，RasPi ボードの CSI（Camera Serial Interface）コネクタに装着する．CSI
コネクタのカバー（図 3.1 の白い部分）を引き上げ，フラットケーブルの金属端子が図 3.1
で手前側に来るように挿入する．ケーブルを奥まで差し込んだ状態でカバーを押し込む．
RasPi にカメラモジュールを接続する場合には，必ず，RasPi の電源を切っておくこと．

CSI	

図 3.1 カメラモジュールと基板への装着（写真は古い Raspberry Pi であるが，コネクタの位置はほぼ同じである）
3.1.2 コマンドツールによる静止画と動画の撮影
Raspberry Pi には静止画を撮影するコマンドツール raspistill と，動画を撮影するコマン
ドツール raspivid が用意されている．
これらを使ってカメラモジュールの動作を確認しよう．
$ raspistill –o image.jpgと入力すると，ディスプレイに５秒間プレビュー映像を表示した後，最終時点の静止画をファイル名 image.jpg として保存する．プレビューとは，カメラの映像を取り込む前に，ディ11スプレイに表示だけを行うことである．次のコマンドのように-t 1000 をつけると，プレビュ
ー時間を 1 秒に設定できる．
$ raspistill –o image.jpg –t 1000
これらの命令で最大画素数のカラー画像が保存される．画像サイズを指定する場合には，
次の例のように-w と-h のオプションを使う．
$ raspistill –o image.jpg –t 1000 –w 640 –h 480
ファイルに保存した画像を表示する簡単な方法は，Menu のグラフィックスにあるイメー
ジビューワを使うことである．ファイルマネージャから画像ファイルをダブルクリックしてもイメージビューワが画像を表示する．
raspistill には多くのオプションがある．Shell Script でそれらをプログラムするだけで，簡単なカメラシステムを構築することができる．オプションの一覧を表示するには，引数なしで raspistill を実行させる．
動画を撮影するには raspivid コマンドを使う．例えば，$ raspivid –o video.h264 –t 10000とすると，video.h264 というファイル名で，H.264 形式の動画ファイルが保存される．動画の撮影時間は-t オプションで指定しており，この場合，10 秒間撮影する．
raspivid コマンドは，1080p フォーマット（1920×1080 画素）で撮影することがデフォルトである．画像サイズを設定するには，-w と-h のオプションを使い，次のように記述する．
$ raspivid –o video.h264 –t 10000 –w 640 –h 480
保存した動画ファイルは，Menu のサウンドとビデオにある VLC メディアプイヤーを使って再生することができる．raspivid にも多くのオプションがある．オプションの一覧を表示
するには，引数なしで raspivid コマンドを実行する．

3.1.3 C/C++言語と OpenCV による画像の入力・表示・出力
raspistill や raspivid で画像・映像の入力は可能であるが，画像・映像の中身を処理することはできない．この実験では，C/C++言語によるプログラムで画像・映像の内容に処理を加える．カメラモジュールの画像を C/C++言語のプログラムに入力したり，入力した画像をディスプレイに表示したり，処理・保存するために OpenCV を使う．OpenCV は事前にインストールしてある．
図 3.2 に，カメラモジュールから画像を入力し，ディスプレイに表示し，キーボードから’q’
キーを押したときに，画像をファイルに保存して終了するプログラム raspicam.cpp の一部を示す．このプログラムは C++のコードである．見慣れない書き方もあると思うが，C++は C
言語を含むので，類推しながらプログラムを追ってほしい．10〜15 行目は OpenCV のVideoCapture クラスを使い，カメラモジュール（この場合，0 がカメラモジュールに対応する）を変数 capture に関連付けている．21 行目で画像を保存するための，cv::Mat クラスの12

変数 src_img を宣言する．30 行目でカメラモジュールから src_img に画像を読み込む．31
行目で，変数 src_img に読み込んだ画像を“capture”という名前のウィンドウに表示する．
34〜37 行目はキー入力を 1 ミリ秒待ち，その間に’q’のキーが入力されれば，src_img に読み込んだ画像を src_img.jpg として保存し，プログラムを終了する．また 40〜44 行目では，このプログラムのフレームレート（１秒あたりの処理枚数）を計算して表示している．

図 3.2 画像を入力し，表示し，ファイルに保存するプログラム raspicam.cpp
OpenCV のような大規模なライブラリを使って，プログラムをコンパイルし実行ファイルを作るには，長いオプションのついた g++コマンドを入力する必要がある（g++は C++のコ
ンパイラ）．そのような長いコマンドラインは入力を間違いやすいので，コマンドラインの文
字列からなるテキストファイルを作成し，それに実行権限を与えることで，ファイル名を入力するだけで複雑なコマンドラインを実行させることがある．さらに進んだ方法としてとして make コマンドがある．これは，Makefile という名前のテキストファイルに，コンパイル
手順を記述しておき，make コマンドを入力することで，Makefile ファイルを実行させるものである．図 3.2 のプログラム raspicam.cpp をコンパイルするための Makefile を図 3.3 に示す．これを Makefile という名前のテキストファイルとして準備しておき，$ make raspicam

13と入力すると，図 3.2 のプログラム raspicam.cpp がコンパイルされる．ソースコードか
Makefile にエラーがあれば，エラーメッセージが表示され，実行コードは生成されない．実行コード raspicam が生成されれば$ ./raspicamと実行して，プログラムの動作を確認すること．

図 3.3 raspicam.cpp をコンパイルする Makefile の例
図 3.3 の Makefile を簡単に説明する．赤い点線で囲んだ部分が OpenCV に関する設定，
黒い点線で囲んだ部分がコンパイルの手順である．
“-I”で始まる文字列はインクルードファ
イ ル の パ ス ，“ -l ” で 始 ま る 文 字 列 は ラ イ ブ ラ リ の 名 称 で あ る ． 8 行 目 の raspicam:
raspicam.cpp という記述は，
raspicam が raspicam.cpp から生成されることを意味している．
9 行目がコンパイルのコマンドラインに変換される行であり，例えば“$@”はターゲットのファイル名（この場合であれば“raspicam”という文字列）に変換される．
C 言語のプログラムでは，#include <stdio.h>のように書くことでファイルを読み込む．読み込まれるファイルのことをインクルードファイルと呼ぶ．stdio.h は標準のインクルードフ
ァイルなので，コンパイル時にその場所を指定する必要はないが，インクルードファイルの場所を明示する場合には，“-I”に続いて，パスを指定する．ライブラリは実行できるように準備されている多数の関数のことである．自作のプログラムとライブラリを関係づけることをリンクするという．リンクするためには，ライブラリの場所と名前を指定する必要がある．
図 3.3 の例では，“-l”に続く文字列（例えば opencv_highgui など）がライブラリの名前である．ライブラリの場所を指定する場合には“-L”に続いて書くのであるが，今回は，デフ
ォルトの場所にあるので，指定する必要がない．
この実験ではプログラムを作ることはないが，Makefile と make コマンドは便利なツールであるから，使い方の雰囲気は理解すること．また，インクルードファイルやライブラリの設定もプログラミングの基本事項である．

3.1.4 OpenCV を使った画像処理
次に OpenCV を使った画像処理プログラムを説明する．画像処理の一つに空間フィルタがある．空間フィルタの一つに画像の平滑化がある．これを OpenCV でプログラムすると図14

3.4 のようになる．図 3.4 のプログラム image_blur.cpp は図 3.2 のプログラム raspicam.cppに 27 行目，34 行目，38 行目などを書き加えたものである．このプログラムを$ make image_blurとコンパイルし，続いて，image_blur を実行させて動作を確認せよ．
このプログラムを見ると，34 行目の関数 cv::blur で画像を処理している．変数 src_img が表す入力画像を平滑化し，変数 blur_img が表す画像に出力する．第三引数の cv::Size(15,15)は，15×15 画素を平均化することで平滑化することを表している．
空間フィルタと呼ばれる画像処理について調査し，処理の方法や機能について報告せよ．

図 3.4 OpenCV を使って画像の平滑化を行うプログラム image_blur.cpp
OpenCV を使った画像処理プログラムの別の例を図 3.5 に示す．これは，入力画像からエッジを検出するプログラム image_edge.cpp である．34 行目の関数 cv::cvtColor で入力のカラー画像 src_img を濃淡画像 gray_img に変換し，36 行目の関数 cv::Canny でその濃淡画像か
らエッジ画像 edge_img を計算している．このように OpenCV の関数を書き並べるだけで，複雑な処理を実現することができる．
エッジ抽出と呼ばれる画像処理について調査し，処理の方法や用途について報告せよ．

図 3.5 Canny オペレータでエッジを抽出するプログラム image_edge.cpp

15

image_blur.cpp，image_edge.cpp 以外に，今回の実験のために faceDetect.cpp を作っておいた．これは顔検出を行うプログラムである．

3.2 課題「画像処理による面積計測システム」
3.2.1 実験の概要と測定原理
画像処理の一つに画像計測がある．これは，観察している対象物の長さ・面積・角度・個数などの定量的な数値を，画像から導き出す処理である．今回は，図 3.6 のように観察した画像から黒い平面物体の面積を計算する面積計測システムを開発する．測定物は 150mm×150mm の正方形に収まる任意形状の平面的な物で黒色とする．

図 3.6 面積を計測する対象物の例
この実験で必要なプログラムはあらかじめ作ってある．学生は，この資料の説明に従って作業すれば，課題を完成することができる．
図形の面積を求める方法について考えてみよう．円であれば半径の長さを計り，πr2 という公式に代入すれば良い．多角形であれば，全体を三角形に分割し，それぞれの三角形の面積を足し合わせる．図形の形状が数学関数で与えられていれば，関数を定積分すれば良い．
すなわち図 3.7 のように図形の左端（x1）と右端（x2）の範囲で上側の関数 f1(x)と下側の関数#

f2(x)が定義されていれば，図形の面積は∫# ! (𝑓! (𝑥) − 𝑓" (𝑥))𝑑𝑥で求めることができる．しかし，"これらの方法は一般的な不定形な形状の面積を測定することには適していない．画像を使う
方法は，そのような場合でも，比較的簡単に面積を求めることができる．

16

!" ($)!& ($)x2x1

図 3.7 関数で定義された図形
まず，測定原理を理解しよう．図 3.8 は，カメラが平面的な被写体を真上から観察している様子を示す模式図である. 150mm×150mm の正方形領域を 600 画素×600 画素のデジタル画像として撮影したと仮定する．150mm を 600 画素でサンプリングするので，１画素の大きさは A mm× A mm =B mm2 になる．また，デジタル画像の全画素数は360,000 画素である．被写体が画像の中で占める画素数を数えることができ，それが 100,000
画素であれば，その被写体の面積は C mm2 となる．今回の実験では真上から撮影することが難しいので，斜めから撮影した画像を幾何学的に変換して，真上から撮影した画像を推定して面積を求める．上の文章における A，B，C の値を求めて，報告書の説明文に記述する
こと．
150mm600
A mm

150mm600



図 3.8 画像から面積を求めるための説明図

17

A mm

3.2.2 面積計測システムの操作
コンピュータが処理するデジタル画像を mm 単位の実寸と対応させるために，図 3.9 の測定用紙の上に対象物を置き，撮影する．測定用紙は A4 サイズで，図のように印刷されている．中央の薄い灰色部分が 150mm×150mm でこの上に測定物を載せる．４隅の黒い正方形のマークは，測定用紙を位置決めするための目印である．
計測システムの処理は図 3.10 のように進む．対象物を測定用紙の上に置き，４隅のマーカーが写り込むように撮影する．４箇所のマーカーの位置を画像処理で認識する．これらは，測定用紙上では正方形の四隅に位置するが，撮影した画像ではそうなっていない（正方形をカメラで斜めから撮影すると歪んだ四角形になる）．そこで，画像を幾何学的に変形し，歪んだ四角形を正方形に戻す．そして，150mm×150mm の灰色領域が 600 画素×600 画素になるように変形すれば，図 3.8 と同じ関係になる．変形した画像を，背景領域と対象物の領域に分離し，対象物の領域の画素数をカウントする．カウント数に B mm2 を乗じたものが165mm

150mm

165mm

対象物の面積である．

150mm

図 3.9 面積計測システムで使う測定用紙

18#0-, )0
7-46260!"*/7-4626 (-%,+/.',
0  ,  -&0 -&-02153*/
0$, */

図 3.10 面積計測システムの処理の流れ
3.2.3 マーカー位置の認識
図 3.6 のように測定用紙と対象物を撮影した画像から，４箇所のマーカー位置を認識する処理をテンプレートマッチングという画像処理技術で実装する．テンプレートマッチングは，あらかじめ準備した小画像（テンプレートとよぶ）を画像内で漏れなく探索し，最も類似する位置を検出する処理である．
４箇所のマーカーに対応するテンプレート画像を次のように準備する．
① raspicam を実行し，測定用紙全体を撮影する．画像がファイル名 src_img.png として保存される（図 3.11 のような画像）．

図 3.11 測定用紙を撮影した画像（src_img.png）

19

② ペイントソフト mtpaint を起動し（Menu のグラフィックスから mtpaint を選択する），
測定用紙の画像を読み込む．画像を 400%程度に拡大し，左上のマーカーがはっきり見えるようにする．選択ツールで，左上マーカーを 15×15 画素の領域として囲む（図 3.12のような状態）．マーカー中央と選択領域中央が一致するように上下左右のカーソルキー
で微調整する．

図 3.12 mtPaint の操作画面③ コマンド「イメージ -> トリミング」で選択した領域を切り取る．
④ コマンド「ファイル -> 名前を付けて保存」で template1.png として保存する．
⑤ ②から④と同様の手順で，右上マーカーを template2.png，左下マーカーを
template3.png，右下マーカーを template4.png として保存する．
テンプレートが準備できれば，対象物を測定用紙の上に置き，あらかじめ準備したプログ
ラム imageWarp を実行する．カメラで撮影した画像が表示される．４箇所のマーカーが写り込んでいれば，認識したマーカー位置が図 3.13 のように示される．テンプレートを作成した時の画像と入力画像の状態が近ければこのようになるが，あまりに異なっていれば誤認識することもある．４箇所のマーカーを正しく認識した状態で，‘q’を押す．その時の入力画像がファイル名 src_img.png として保存され，150mm×150mm の灰色領域を 600 画素×600画素の画像に変換したものが dst_img.png として保存される（図 3.14）．src_img.png を
dst_img.png に幾何学的に変換する方法について調査し，報告せよ．

20

図 3.13 imageWarp を実行中の画面

図 3.14 imageWarp を‘q’で終了した時に保存される画像 src_img.png と dst_img.png
4.2.4 画像の二値化と面積の測定
dst_img.png をイメージビューワで観察し，灰色の背景領域と黒っぽい対象物の領域に分かれていることを確認する．図 3.15 に dst_img.png の一例を示す．この画像は濃淡画像である．濃淡画像の画素値は 0 から 255 の範囲になる．対象物体の領域は暗いので画素値は小さく，背景領域は明るいので画素値は大きい．dst_img.png とそのヒストグラムの例を図 3.15に示す．画像のヒストグラムは画素値ごとの画素数（度数や頻度とも言う）をグラフ化したものである．このグラフには２つの山がある．画素値が小さい方の山（左側の山）は対象物
体領域に対応し，画素値が大きい方の山（右側の山）は背景領域に対応する．

21






 

 

図 3.15 dst_img.png の一例とそのヒストグラム
対象物体の面積を求めるために，dst_img.png を一つのしきい値（しきい値は境界となる値のこと）を使って，画素値がしきい値よりも大きい画素と，小さい画素に分ける．このような処理を画像の二値化という．図 3.16 に，dst_img.png をいくつかのしきい値で二値化した例を示す．しきい値を 30 にした場合，対象物体領域の一部が背景になる．しきい値が 80の場合，正しく領域を分けることができている．しきい値が 140 や 150 では，背景の一部が対象物体の領域になっている．図 3.15 のヒストグラムを見ると，60 から 120 ぐらいのしきい値であれば，どのような値であっても，正しく二値化できるように思われる．画像全体を一つのしきい値を使って二値化する場合、そのしきい値を自動的に決める方法について調査し，報告せよ．プログラム化できる程度に説明し，その方法が良い理由も記述すること．









図 3.16 dst_img.png を二値化した例（正しく二値化できているのはしきい値=80 の場合だけである）

22

続いて，computeArea を実行するとターミナルに面積が表示される．computeArea は
dst_img.png の二値化を行い，黒画素の数をカウントする．そしてカウント数に B mm2を乗算することで面積を求めている．
図 3.15 の例は，対象物体の領域と背景領域が，比較的きれいに分かれている．しかし，場合によっては，どのようにしきい値を設定しても，正しく分離できない場合がある．図 3.17はそのような一例である．図 3.17 のようになる原因を考察せよ。また、正しく面積が測定できるために注意すべき事項について考察せよ．

   $"#!&%

  

 

 図 3.17 dst_img.png の別例とヒストグラム、二値化した例

3.2.5 面積計測システムの精度評価
面積を測定する時に，対象物体の領域だけが正しく抽出できていることを，毎回，目視で確認すること．対象物体の領域内に少しでも白い領域がある状態や，背景領域に少しでも黒い領域がある状態では，正しく抽出しているとは言えない．正しく抽出できていれば，面積の測定精度の評価を行う．
対象物の面積の真値を T mm2（T の値は型紙の裏に書いてある数値を用いる），測定した
面積を M mm2 とすると，測定値は(M-T)/T×100（%）の誤差率を持っているという．測定
値の誤差率を計算して，%で示せ．対象物体の領域が正しく抽出できた状態で同じような計23

測を 10 回繰り返し，10 個の誤差率を求めて報告せよ．また，その平均と標準偏差も報告せよ．くどいようだが，誤差を評価する場合には，対象物体の領域が正しく抽出できていることを目視で確認すること．10 個の誤差率の数値を担当教員（あるいは TA）に確認してもらうこと．
（毎年，この確認をせず，単に 10 回の測定を行う学生が存在するが，実験に真剣に取り組んでいるのか疑わしく感じる．
）
この実験では誤差率を 10 回測定し，その平均と標準偏差を求めた．しかし，この平均値と標準偏差の数値もって測定装置の誤差とするには，あまりにも測定回数が少ない．そこで，誤差率の測定回数を 100 回，1000 回，10000 回と増やすことが考えられる．このように測定回数を増やして求めた平均と標準偏差の値と，10 回の測定による平均と標準偏差の値にはどのような違いがあるか考察せよ．
（参考）体温計であれ，今回のような面積測定器であれ，測定器の出力は，真の値の近辺で揺らいでいる．多くの場合，この揺らぎは正規分布（ガウス分布とも呼ぶ）に従う．つまり，真値からの誤差は小さいものが多く，大きいものは少ない．揺らいでいる 10 個の測定値を平均したとして，そのような平均値も元になる測定値に依存しており，そこに存在する揺らぎを完全に取り除くことはできない．しかし，平均することで揺らぎの程度を緩和することはできる．

3.3 実験 1 のレポート作成
タイトル：「画像処理を用いた面積計測システム」
概要：最初に 300 文字程度で概要（この実験の全体を短くまとめたもの）を書くこと．
本文：次のような章立てで記述すること．具体的な章・節のタイトルは自分で考えること．
また，自分の考えがあれば，章立てを変更しても良い．この資料で，青字で示した部分に対しては，レポート内に調査結果などを記述すること．
１章 この実験の目的を書く．
２章 予備実験の内容を簡単にまとめる．
３章 「画像処理による面積計測システム」の理論・方法・アイデアについて説明する．
４章 実験結果とそれに対する考察を書く．
５章 まとめる．
本文中で指示したことに従うこと．第１回「実験レポートの書き方」を参考にして，わかりやすい日本語で書くこと．適切に図表を挿入すること．これらを自分の言葉で記述すること．

24

4 章 実験 2：角速度・加速度センサの性質と角度の測定
この実験では加速度・角速度センサを Raspberry Pi に接続し，その信号を処理することで，物体の角度を測定する．この実験で使うプログラムは~/C/sensor/source にある．それらを~/C/sensor にコピーし，ここを作業ディレクトリとして実験を進めること．

4.1 加速度・角速度センサ
実験 2 では，加速度・角速度センサ（GY-521，図 4.1 のもの）を使って，物体の角度を測定する．図 4.1 のプリント基板中央にある 4mm 四方の部品が，3 軸周りの角速度と 3 軸方向の加速度を計測するセンサ（MPU6050）である．なお，角速度センサはジャイロとよぶことも多い．航空機などの姿勢を制御するために用いるジャイロスコープを起源としている．もと
もとは比較的，大きな装置であったが，現在では，MEMS（Micro Electro Mechanical Systems）
技術を用いることで，加速度センサと角速度センサを一体化し，非常に小型に作ることができる．

図 4.1 ３軸ジャイロ・加速度センサモジュール（GY-521）

4.2 位置・姿勢と加速度・角速度の関係
３次元空間に存在する物体の位置と姿勢は３次元座標で定義する．３次元座標の位置と姿勢は３要素の並進ベクトル（位置）と，３つの回転角度（姿勢）で指定する（図 4.2 左）．図
4.1 のセンサで３次元空間の位置と姿勢を計測することが可能であるが，この実験では，簡単化のために，一つの軸方向の位置と姿勢だけを扱う（図 4.2 右）
．
Z

X

ωZ
aZ

ωY
ax
	
aY

ωx

	

X

	
 

図 4.2 ３次元空間における加速度と角速度

25図 4.2 右は，図 4.2 左の様子を X 軸の負の方向から見たものである．この実験では，この図が示すように，Y 軸方向の位置と X 軸まわりの姿勢（回転角）だけを扱う．位置は軸方向の移動量で定義し，姿勢は軸周りの回転角で定義する．
時刻 0 に物体が静止しており，その後，時刻 t における Y 軸方向の加速度が a(t)であったとすると，時刻 t における物体の速度 v(t)は， v(t) =t∫ a(t)dt となる（加速度を時間について積0分すると速度になる）．そして，時刻 t における物体の位置 p(t)は， p(t) =t∫ v(t)dt になる(速0度を時間について積分すると移動量（位置）になる)．同様に，時刻 t における X 軸周りの角
速度が ω(t)であるとき，
時刻 t における物体の姿勢を表す角度 θ(t)は θ (t) =t∫ ω (t)dt となる(角0

速度を時間について積分すると角度になる)．このように，加速度と角速度を時間に対する連続量 a(t)，ω(t)で表現し，それらから速度や位置，角度を求めるには，時間について積分する必要がある．
一方，加速度・角速度センサをコンピュータに接続し，離散的な時間間隔でコンピュータ
が読み取るセンサ値から速度や位置，角度を求める計算は，上記の積分を数値的に計算するものである（数値積分という）．詳細は 4.4 節で説明するが，要するに，加速度センサの出力値と時間間隔の乗算で，その時間間隔での速度変化を求め，時間間隔ごとの速度変化を積算することで速度を求める．角速度について言えば，角速度センサの出力値と時間間隔の乗算
で，その時間間隔での角度変化を求め，時間間隔ごとの角度変化を積算することで角度を求める．
ところで，図 4.1 のセンサの X 軸・Y 軸はプリント基板にシルク印刷されている（シルク
印刷とは，プリント基板上に描かれている印刷のこと）．Y 軸はセンサ基板の縦方向，X 軸は横方向である．Z 軸はプリント基板に垂直な軸になる．

4.3 センサ信号を解析する
センサと RasPi をブレッドボードとジャンパ線を用いて図 4.3 のように接続する．RasPiにセンサを接続する時には，必ず，RasPi の電源を切っておくこと．センサと RasPi は，I2C（Inter-Integrated Circuit）と呼ばれるシリアルバスで通信を行う．I2C はさまざまなデバ
イスとデジタル装置の間で通信を行うための規格である．RasPi で I2C を使えるようにするには設定が必要であるが，この実験の RasPi は設定ずみである．

26

P2
P4
P6
P8

RasPi2
P13.3V
P6GNDP5GPIO3, I2C1 SCL
P3GPIO2, I2C1 SDA

P1
P3
P5
P7

GY-521
VCC
GND
SCL
SDA

5    

図 4.3 加速度・角速度センサと RasPi の接続
図 4.4 のプログラム mpu.c を使って Y 軸方向の加速度と X 軸周りの角速度をセンサから入力する．図 4.4 の 15〜18 行目はセンサチップである MPU6050 の機能にアクセスするためのア
ドレスである．29 行目で Y 軸方向の加速度，32 行目で X 軸周りの角速度を入力し，34 行目
でそれらを printf する．加速度 ay は重力加速度を単位とする数値で，角速度 gx はラジアン/s を単位とする数値で表示される．図 4.5 のプログラム mpu.c から$ gcc –o mpu mpu.c –lwiringPi -lm
によって実行ファイル mpu を作る．
mpu を実行すると加速度 ay の値と角速度 gx の値が表示される．センサが乗ったブレッド
ボードを傾けたり動かしたりすると，表示される数値が変化する．例えば，Y 軸方向を垂直に立てると ay が 1.0 あるいは-1.0 前後の数値になる．これは Y 軸方向に重力加速度が加わるからである．また，X 軸方向を軸にして回転させると gx の数値の絶対値が大きくなる．これは，X 軸周りに大きな角速度が発生するためである．

27

図 4.4 加速度・ジャイロセンサから信号を読み取るプログラム mpu.c
作成したプログラム mpu.c とセンサを装着したブレッドボードを利用して，センサの位置・
姿勢や動きとセンサから得る数値の関係がどのようになっているかを詳しく知ろう．そのために，次のことについて実験し，報告せよ．

① ブレッドボードを机の上に静止させた状態では，ay，gx ともに 0 に近い値である．しかし，それらの数値は揺らいでいるし，また，完全に 0 ではない．まず，センサの出力値のそれぞれについて平均値を求めよ．平均値を求めるためのサンプル数は，十分に多く取る必要がある．今回は 10,000 個にする．これを行うために，mpu.c のプログラムを参考にして，それにデータの平均値を求めるコードを追加すること．
（注：センサーデータを10,000 個読み込むと 10 秒以上の時間を要する．この程度の時間であっても，デバッグのために何度も繰り返すと，時間を無駄にしているように感じる．そこで，繰り返し回数を記号定数として#define で定義し，それを利用したプログラムを作成するとよい．デバッ
グ中は 100 回程度の繰り返し回数で実行させ，プログラムを完成させる段階で 10,000 回に設定する）

28

② 次に，測定値の揺らぎの程度を計算しよう．一定の値であるべきセンサの出力値がランダ
ムに微小変化する現象を，測定値にノイズがのっているという．この実験では，ノイズの量を平均値との差によって評価するために，分散と標準偏差を計算する．2 つの測定値について，分散と標準偏差を報告せよ．分散・標準偏差を求めるためのサンプル数は，10,000
個にすること．①と同様に，mpu.c のプログラムにコードを追加すること．

平均値，分散，標準偏差を計算する式は次のようになる．ここで，data(i)が測定値，i=1〜N，N は測定値の個数である．
平均： µ =
2

1 N
∑ data(i)N i=1

分散： σ =1 N
2
( data(i) − µ )∑N i=1

標準偏差： σ = σ 2
次の実験③に行く前に，計算した平均・分散・標準偏差の値が，概ね正しいことを確認せよ．どのように判断したかを報告せよ．
一般に，センサを同じ状態に保って測定を繰り返すと，個々の測定値はばらつくが，測定値の平均は一つの値に収束する．ばらつき具合を評価するために，測定値のヒストグラム（分布状態）をとると，図 4.5 の形になることが多い．この図は横軸を測定値，縦軸を測定値の頻度（回数，分布密度）としたものであり，曲線の形状は平均値μ・標準偏差σの正規分布（ガウス分布ともいう）である．測定値の分布が正規分布にしたがうならば，全データの68.26%はμ±σに収まり，全データの 99.74%はμ±3σに収まる．

%%
%
+

+

+	
 

	
 

	
 

.-

図 4.5 ランダムなノイズをもつ測定値の分布（正規分布（ガウス分布））③ 10,000 個の測定データのヒストグラムを求めよう．測定データが正規分布しているなら，その 99.74%，すなわち 9,974 個はμ±3σの範囲に収まっているはずである．ヒストグラ
ムを計算するにあたって，μ±3σの範囲で考える．この範囲を幅一定の 25 個の区間に分29

割し，各区間に存在する測定値の個数をカウントするプログラムを作成せよ．範囲に収まらないデータはヒストグラムのカウントには含めず，それらを全てまとめて外れ値の個数とせよ．25 個の区間についてカウントした数値データを持ち帰り，Excel などのソフトウ
エアを使ってグラフ化すること．グラフは図 4.7 のようになるので，それをレポートに貼り付けること．

ヒストグラムの計算法を，図 4.6 を使って説明する．ヒストグラムを計算する範囲を a〜bとする．この範囲を M 個の区間に分解し，それぞれの区間に属するデータの個数を求めることを考える．それぞれの区間をヒストグラムのビンとよぶ．全体で M 個のビンがある．data(i)が属するビンの番号は図 4.6 に書いたように求めることができる．
ab

0 1 2 3

data(i) − a
M
b−a

M&1

j

j

	

図 4.6 data(i)が属するビンの求め方
棒グラフ化したヒストグラムは図 4.7 のような感じになる．自分が作成したヒストグラムを観察して考察を行え．例えば，正規分布と言えるか言えないか？不自然な分布か，自然な分布か？不自然な分布であれば，どのようなところが不自然か．また，不自然な分布になっておれば，その原因は何か？などについて考えてみよ．自分の頭の中で正規分布がイメージできていなければ，この問いに正しく答えることができない．
「分布の形状が…になっている









ので，正規分布と言える／あるいは，正規分布と言えない．
」のように答えること．





図 4.7 グラフ化したヒストグラムの例

4.4 センサ信号を処理する
センサ値を入力し始めた時刻を t0 とし，この時点で加速度が 0m/sec2，角速度が 0 ラジアン
/sec であったとする．そして，時刻 ti における加速度を a(ti)，角速度を ω(ti)とする．加速度30と速度・位置の関係は 4.2 節で説明したとおりである．これをプログラムで計算する場合，
表 4.1 のように，加速度と時間変化の積から速度の変化量を求め，それを足し合わせること
で速度を推定する．そして，速度と時間変化の積から位置の変化量を求め，それを足し合わせることで位置を推定する．角速度と角度の関係も同様で，角速度と時間変化の積を足し合わせることで角度を推定する．
表 4.1 時間の加速度・速度・位置，角速度・角度の関係
t

t0

t1

t2

	
 

tn

0

t1-t0

t2-t1

	
 

tn-tn-1

a

0

a(t1)

a(t2)

	
 

a(tn)

v

v(t0)=0v(t1)=v (t0)+a(t1)(t1-t0)v(t2)=v (t1)+a(t2)(t2-t1)

	
 v(tn)=v (tn-1)+a(tn)(tn-tn-1)pp(t0)=0p(t1)=
p(t0)+v(t1)(t1-t0)p(t2)=
p(t1)+v(t2)(t2-t1)	
 p(tn)=p(tn-1)+v(tn)(tn-tn-1)

ω

0

ω(t1)

ω(t2)

	
 

ω(tn)

θ

θ(t0)=0

θ(t1)=
θ (t0)+ω (t1)(t1-t0)

θ(t2)=
θ (t1)+ω (t2)(t2-t1)

	
 θ(tn)=
θ (tn-1)+ω (tn)(tn-tn-1)

センサ信号の扱いでは，オフセットとドリフトがしばしば問題になる．オフセットは，ゼロであるべき信号値が，定常的にずれている状態である．ドリフトはセンサの特性が時間とともに変化する現象である（多くの場合、センサデバイスの温度とともに変化するので、温度特性と呼ばれる）．4.3 節で ay と gx の平均値を求めた．それらの値は，理想的にはゼロであるが，そうではなく，無視できない数値になっていることが多い．これらはオフセットである．センサの信号処理では，オフセットやドリフトをキャンセルすることが重要である．
図 4.8 に ay と gx のオフセットをキャンセルするプログラム mpu_adjust.c を示す．このプ
ログラムは 42・43 行目でそれぞれのオフセット求めている．関数 compute_offset は，このプログラムの少し上に記述してあるのだが，1000 回の読み込み値を平均したものを返す．そして 52 行目と 55 行目で，センサの読み込み値からこれらのオフセットを引くことで，オフセットをキャンセルしている．
なお，図 4.8 のプログラム mpu_adjust.c は 45 行目〜48 行目，及び，57 行目〜63 行目のコードも追加されている．これらは，while ループの１回の繰り返しに要する時間を計るためのものである．このプログラムを$ gcc –o mpu_adjust mpu_adjust.c –lwiringPi -lmとコンパイルして実行すると，センサが静止状態にあるときは，ay，gx の値がほぼ 0 になっていることと，実時間がとれていることがわかる．それでも，ay と gx の値は完全には 0 にならない．その理由について考察せよ．

31

図 4.8 オフセットをキャンセルしてセンサ値を読み取るプログラム mpu_adjust.c

4.5 角度の測定
mpu_adjust.c を参考にして，角速度センサの信号値から角度を計算するプログラムを作成
せよ．角度は度で表示せよ．なお，mpu_adjust.c の gx はラジアン/sec を単位としているが，ラジアンを度に変換するには M_PI で割り，180 をかける．
プログラムが正しく動作するようになれば，オフセットをキャンセルする機能がどの程度，有効に働いているかを確認して報告せよ．オフセットをキャンセルする場合としない場合の動作を，できる限り正確に記述せよ．

4.6 実験 2 のレポート作成
タイトル：「角速度・加速度センサの性質と角度の測定」
概要：最初に 300 文字程度で概要（この実験の全体を短くまとめたもの）を書くこと．
本文：次のような章立てで記述すること．具体的な章・節のタイトルは自分で考えること．
また，自分の考えがあれば，章立てを変更しても良い．この資料で，青字で示した部分に対しては，レポート内に調査結果などを記述すること．
１章

この実験の目的を書く

２章

角速度・加速度センサの一般的な性質や，角速度と角度の関係，加速度と速度・位置の関係などについて述べる．

３章

センサ信号の解析結果について報告する．

４章

角度の測定方法，測定精度などについて書く．

５章

まとめる

32

本文中で指示したことに従うこと．第１回「実験レポートの書き方」を参考にして，わかりやすい日本語で書くこと．適切に図表を挿入すること．これらを自分の言葉で記述すること．

33

5 章 実験 3：スイッチを使った LED の点滅制御装置
この実験で使うプログラムは~/C/swled/source にある．２つのプログラムが用意されているので，それらを~/C/swled にコピーし，ここを作業ディレクトリとして実験を進めること。

5.1 予備実験
5.1.1 Raspberry Pi と周辺装置・周辺回路の接続
RasPi が普通の Linux パソコンと異なっている点のひとつは，周辺装置やセンサなどの電子部品との接続が容易なことである．図 5.1 に，RasPi を外部機器と接続するために利用する 40 ピンの端子列（ピンヘッダ）のピンアサインを示す．
これらの端子は図の右表のようにさまざまな役割で利用することができる．GND（電気回路を接続するときに基準となる電圧で 0V），+3.3V，+5V はそれぞれの電圧が供給される．
GPIO2 など GPIO で始まるものはデジタル信号（0 か 1）の入出力に利用する端子である．
I2C1 SDA など独特な名前の端子は，ある規格に基づいてデジタル信号を入出力する端子である．これらの名前から，Raspberry Pi が I2C，SPI，UART などの規格をサポートしていることがわかる．したがって，これらの規格を持つ装置と容易に接続することができる．なお，“GPIO2, I2C1 SDA”などのように２つの名称が併記されている端子は，プログラムによってそれらの機能を切り替えることができる．
P1 P2

9

)

2938

3

0.

9

9(

)

2938

3

5

9)

9

270

2938( 29 549+9,2938 (

.

0

270

9

9

2938 ).

02938 +

992938 , 9 6542938 + 9 6 08

9

9 (

270

2938

9 )

9

2938

9 +

9 ,

2938 (

2938

93 68 3

9

9

270

2938

93 63 8992938 )

2938

93

9

9 (

2938,

93

1

9 )

9

2938+

93

1

9 +

9 ,

30

2938)

9

9

270

2938

9

9

2938

2938

9

9 (

270

2938

9 )

9

2938

9 +

9 ,

2938

9

9(

2938

54

270
30

P39 P40

9

2938

0

270

D

CA

図 5.1 RasPi の 40 ピンの端子列のピンアサイン

34

E

CA

5.1.2 GPIO 端子の設定と入出力
GPIO（General Purpose Input Output，汎用入出力）はさまざまな用途に利用することができる入出力端子という意味である．Raspberry Pi のプログラムで GPIO 端子を入力に設定したあとで，その端子に 0V の電圧を加えれば，その状態を値 0 としてプログラムに読み込む．加える電圧が 3.3V であれば値 1 として読み込む．
（Raspberry Pi の GPIO 端子に加えることができる電圧は 0V〜3.3V の範囲である．5V の電圧を加えると回路が壊れてしまうので，注意する事．）GPIO 端子を出力に設定し，プログラムがその端子を値 0 に設定すると，実際の出力電圧は 0V になる．値 1 を設定すると，出力電圧は 3.3V になる．
それでは，実際に GPIO 端子をプログラムしてみる．この実験では，C 言語のプログラム
から WiringPi というライブラリを使って，RasPi の GPIO を制御する．GPIO21（P40）を出力に設定して値１を出力し，GPIO26（P37）を入力に設定して値を読み込み，ディスプレ
イに表示するプログラムの例を図 5.2 に示す．これを$ gcc –o sample sample.c –lwiringPi
でコンパイルする．-lwiringPi はコンパイラに対するオプションで，ライブラリ wiringPi を利用することを意味する．実行ファイル sample が出力されれば，$ ./sample
で実行させる．プログラムの出力は“GPIO26: ?”（?は 0 か 1）となり，GPIO26 の端子の電圧値がそのように解釈されたことがわかる．この段階で，GPIO26 の端子になにも接続していなければこの値にあまり意味はない．GPIO26（ピンヘッダの 37 番端子）と GPIO21 （ピンヘッダの 40 番端子）の端子を接続すれば，“GPIO26: 1”となるはずである．
#include <stdio.h>#include <wiringPi.h>#define GPIO21 21#define GPIO26 26
int main() {//wiringPi の初期化
if (wiringPiSetupGpio() == -1) {printf("error: wiringPiSetupGpio()\n");return 1;}//GPIO21 を出力に、GPIO26 を入力に設定する
pinMode(GPIO21, OUTPUT);
pinMode(GPIO26, INPUT);//GPIO21 に 1 を出力し、GPIO26 の信号を読み取り表示する。
digitalWrite(GPIO21, 1);
int sw = digitalRead(GPIO26);
printf("GPIO26: %d\n", sw);}

図 5.2 sample.c，GPIO 端子を設定するプログラムの例

35

プ ロ グ ラ ム の 内 容 を 確 認 す る ． 関 数 pinMode() で 端 子 を 入 力 か 出 力 に 設 定 す る ．
pinMode(GPIO21,OUTPUT) は GPIO21 ， す な わ ち 40 番 の 端 子 を 出 力 に 設 定 す る ．
pinMode(GPIO26,INPUT)は GPIO26，すなわち 37 番の端子を入力に設定する．
関数 digitalWrite()で出力端子に信号値を設定する． digitalWrite(GPIO21,0)にすると 40番の端子電圧は 0V になる．digitalWrite(GPIO21,1)にすると 40 番の端子電圧は 3.3V になる．関数 digitalRead()で入力端子から信号値を読みとる．37 番の端子に 0V を加えた状態でdigitalRead(GPIO26)を実行すると，その端子の値を 0 として読み取る．37 番の端子に 3.3Vを加えた状態で digitalRead(GPIO26)を実行すると，その端子の値を 1 として読み取る．
pinMode()，digitalWrite()，digitalRead()は WiringPi に存在する関数である．このようにあらかじめ準備してある関数を自分のプログラムで利用すること“リンク”する，という．

5.1.3 GPIO 端子の接続
この実験では，ブレッドボードとジャンパ線を使って簡単な電気回路を作る．ブレッドボ
ードは多数の穴が配置され，穴が内部で規則的に接続されている．図 5.3 左の製品では，左右両端の縦 4 列は列ごとに全ての穴がつながっている．それ以外の穴は，横方向に５つの穴がつながっている．ジャンパ線は，内部接続されていない穴同士を接続するために用いる配線である．赤いジャンパ線を図 5.3 左のように接続すると，赤色の点線で示した位置にある穴が全て導通する．

図 5.3 左：ブレッドボードとジャンパ線，右：接続の例
ここから先の実験では実際に電気回路を作る．間違えて GND と 3.3V や 5V を接続したり，
GPIO 端子に 5V を接続すると，RasPi や SD カードが壊れる．十分に注意して実験を進める
こと．このような致命的な間違いでなくとも，出力に設定した端子同士を接続することや，出力端子に GND や 3.3V あるいは 5V を接続すると，その端子が壊れる可能性がある．
ブレッドボードとジャンパ線を使って RasPi のピンヘッダの端子を接続し，プログラム
sample.c の動作を実際に確認しよう．これを行う回路の実体配線図の例を図 5.4 に示す．図5.4 左の回路は，GPIO26 の端子に 3.3V を加えた状態である．この状態で sample.c を実行

36

すると“GPIO26: 1”と表示される．GPIO26 の端子に 0V を加えるように変更し，sample.cを実行すると“GPIO26: 0”と表示される．
図 5.4 右の回路は GPIO21 を GPIO26 に接続している．この状態で sample.c を実行すると“GPIO26: 1”と表示される．GPIO21 に 0 を出力するように変更し，sample.c を実行す
ると“GPIO26: 0”と表示される．
（図 5.3 の右側の写真や図 5.4 の実体配線図は，回路の接続状態を説明するために便宜的に用いているのであり，正式な回路図ではない．レポートで回路を説明するときには，正しい回路図を使うこと．
）
P1:3.3V

P37:GPIO26

P37:GPIO26

P40:GPIO21
P39:0V
1

.7
6	
  2

G

1
7

2
I2

2

7
7

0

3

I2

図 5.4 GPIO21, GPIO26 の端子の動作を確認する実体配線図の例

5.1.4 スイッチ On/Off の入力と LED の点滅制御
前節の実験では入力端子に電圧を加え，0V と 3.3V の違いを，論理値の 0/1 で検出した．
この節では，これをスイッチに置き換え，スイッチの ON/OFF を 0/1 で検出する．
図 5.5 にタクトスイッチを示す．このスイッチは２本の端子があり，スイッチを押すと端子が導通する．図 5.5 右に，スイッチの ON/OFF によって，「スイッチの出力」と書かれた部分の電圧を０V と 3.3V に切り替える回路の例を示す．スイッチが OFF の時，スイッチ下部は抵抗を介して GND に接地されるので，そこの電圧は 0V になる．スイッチを ON するとスイッチの出力電圧は 3.3V になる．
図 5.5 の回路を作り，スイッチの ON/OFF を sample.cのプログラムを使って GPIO26 から読み取り，その動作を確認せよ．
D
D

D NO

I

1

6
0 K
D
0
NO
.
1 V

D
1
26

3
NO
6
6
P
G

V

図 5.5 タクトスイッチと，その ON/OFF を 0V/3.3V に変換する回路の例

37

LED（Light Emitting Diode，発光ダイオード）は電流を流すと発光する半導体である．
図 5.6 に LED の外観と，GPIO 出力端子で LED の発光を制御する回路の例を示す． LED
はアノード，カソードとよぶ２つの端子を持ち，アノード（リードが長いほう）からカソード（リードが短いほう）に適量の電流を流すことで発光する．例えば，図 5.6 右のように配線し，GPIO21 の電圧を０（0V）にすると LED が消灯し，1（3.3V）にすると点灯する．
まず，GPIO21 の出力を，周期的に０と１（0V と 3.3V）に切り替えることで，LED を点滅させてみよう．点滅は，点灯と消灯を比較的ゆっくり繰り返すことであり，そのためには，
一定の時間を待つ必要がある．プログラムで一定時間待つには， wiringPi にマイクロ秒単位の遅延を入れる関数 delayMicroseconds(マイクロ秒)があるので，delayMicroseconds(1000000)のように使うとよい（これで 1 秒の遅延になる）．これらの回路の実体配線図の例を図 5.7 に示す．
（この実験で GPIO21 を直接アノードに接続する学生を見かける（抵抗を使わないということ）．その場合，電流が多大に流れるので LED は明るく光るが，LED や GPIO 出力端子が劣化する．必ず，図 5.6 のように配線すること）
0 /
0

OP
4D5
NP
4D5
LP
NP
E LP
I

=

1

A
A

1
G

A=
	
 

NP

2
V
9

LP
NP

LP

.

G
G

9

図 5.6 LED を発光させる回路の例

	
 
2

1
4

0

図 5.7 LED を発光させる回路の実体配線図の例
led-control.c として，delayMicroseconds()を使って短い時間間隔で LED をオン・オフさせるプログラムを用意した．このプログラムを参考に，点滅の時間間隔を短くして，点滅を目で認識できる限界の周波数（臨界融合周波数，あるいは限界フリッカー周波数とよぶ）を

38

報告せよ．また，LED の点滅が目視確認できない周波数（例えば 100Hz や 1kHz）に設定し，周期に対するオン時間の比率を変えると，LED の明るさがどのように変化するかを調べよ．
なお、限界周波数を求める実験では、オン時間とオフ時間の比率は 1:1 に設定すること。また、LED の明るさ変化を確認する実験では、点滅の周期を一定にするため，オン時間+オフ
時間は一定に保つこと．
LED に加える電圧をオン／オフし，そのオン／オフの時間を変化させることで明るさを制御する技術を PWM（Pulse Width Modulation）と呼ぶ．図 5.8 に PWM で LED を制御す
るタイミングを示す．LED は周期的に点滅している．その周期が長ければ，人間の目に点滅していることが見える．周期が早くなれば点滅の見分けがつきにくくなる．周期が十分に早ければ，点滅していることが全くわからない．このとき通常の点灯のように見え，その LEDの明るさは周期に対する onTime の比率（デューティ比）によって決まる．

LED On/Oﬀ

	
 Hz =1/sec
onTimeoﬀTime

図 5.8 PWM の説明図
ここでは，PWM で明るさを制御したが，モーターに加える電圧を PWM 制御し，回転速度を調節することなどにも使う．PWM 制御について調査し，技術内容，利点・欠点を報告せよ．調査した文献の名称や Web サイトの URL を参考文献として，報告書の末尾に記述し，本文中で参照すること．

5.2 課題「スイッチを使った LED の点滅制御装置」
スイッチを押すごとに LED の明るさが３段階に変化する装置を作れ．プログラムを開始した時点では，LED は消灯している．スイッチを押すと，暗く点灯する．スイッチを離してもその状態が維持される．次にスイッチを押すと中間の明るさで点灯する．スイッチを離してもその状態が維持される．次にスイッチを押すと明るく点灯する．スイッチを離してもその状態が維持される．次にスイッチを押すと LED は消灯する．スイッチを離してもその状態が維持される．以降，同じ動作を繰り返す．
いくつか，注意するべきことがある．
a. LED の明るさは PWM を使って調整すること．
b. スイッチを離しても LED の明るさを維持するためには，スイッチが押された瞬間を検出する必要がある．

39

c. スイッチを長押ししたことによる誤動作を防ぐこと．
d. スイッチを押した瞬間にチャタリングと呼ばれる現象が起きる可能性がある．これは，接点での接触が不安定になり，プログラムが数回のオン／オフを検出してしまう現象である．
長押しによる誤動作と異なり，不安定な現象である．これが発生しているようであれば，対策すること．チャタリングはスイッチを検出する周波数が高いと発生しやすい（経験的には、周期 100μsec 程度よりも小さいと発生する）。
e. LED の明るさを３段階（消灯を合わせると４段階）に制御するためには，その状態を記憶する変数が必要である．
これらの注意事項をどのように解決したかを報告すること．仕様どおりに動作しない場合，
その原因・解決手段を十分に考えて報告すること．

5.3 実験 3 のレポート作成
タイトル：「Raspberry Pi を使ったスイッチと LED の制御」
概要：最初に 300 文字程度で概要（この実験の全体を短くまとめたもの）を書くこと．
本文：次のような章立てで記述すること．具体的な章・節のタイトルは自分で考えること．
また，自分の考えがあれば，章立てを変更しても良い．この資料で，青字で示した部分に対しては，レポート内に調査結果などを記述すること．
１章 この実験の目的を書く．
２章 予備実験の内容を簡単にまとめる．
３章 「スイッチを使った LED の点滅制御装置」の方法・アイデアについて説明する．
４章 実験結果とそれに対する考察を書く．
５章 まとめる．
１章や２章で次のようなことを説明する．① 組み込み装置とは何か．② 組み込み装置に使うコンピュータの性質．
③ Raspberry Pi に使われる ARM が組み込み装置や IoT（Internetof Things）に適している理由．④ マイコンとパソコンの違い．また，本文中で指示したことに従うこと．第１回「実験レポートの書き方」を参考にして，わかりやすい日本語で書くこと．適切に図表を挿入すること．これらを自分の言葉で記述すること．

40

付録 1：Raspbian のインストールから日本語環境の設定まで
2019 年 3 月 4 日に，NOOBS_v3_0_0 をダウンロードして，Raspbian をインストールした手順を説明する（インストール画面と操作は，バージョンによって若干の違いがある）．
インストールに先立って SD カードをフォーマットする．フォーマッターは SD アソーシ
エーションから提供されている(https://www.sdcard.org/jp/downloads/formatter_4/)．フォー
マットにはクイックフォーマットと上書きフォーマットがある．通常，クイックフォーマッ
トで良いが，カードに残った情報を読み取られる可能性がある．
Raspberry Pi の DOWNLOADS サイト（http://www.raspberrypi.org/downloads/，あるいは http://ftp.jaist.ac.jp/pub/raspberrypi/NOOBS/images/などのミラーサイト）から NOOBSの Download ZIP をダウンロードする．解凍した NOOBS_v3_0_0 フォルダの中身を SD カ
ードにコピーする（フォルダごとコピーしないで，中身をコピーすること）．
SD カードを Raspberry Pi に装着し，ディスプレイ・キーボード・マウスを接続し，電源を投入する．しばらくすると，付録 1-図１に示すような，インストール OS を選択する画面になる．Raspbian と日本語を選択し，インストールをクリックする．15 分程度で，「OS のインストールに成功しました」と表示されるので OK をクリックする．

	
 

	
 

付録 1-図 1 OS の選択画面（NOOBS_v3_0_0 よりも古い画面だが，ほぼ同じ）
続いて Raspbian が立ち上がり，デスクトップ画面が表示される．自動的に，言語やタイ
ムゾーン，パスワード，WiFi などの設定画面になるので，適切に入力する．その後，インターネットに接続し，ターミナルから次のコマンドを入力することでシステムを更新する。
$ sudo apt-get update$ sudo apt-get upgrade
なお，京産大の学内から有線でインターネットに接続する場合，Web ブラウザからhttps://ccauth.kyoto-su.ac.jp

41

にアクセスし，認証を受ける必要がある．これらを設定すればリブートする．
この段階で日本語の表示は可能であるが，入力ができない．ここから次の順番で日本語環境を整える．
① キーボードの設定② 日本語フォントとかな漢字変換ソフトをインストール③ ロケールとタイムゾーンの設定
ターミナルを起動し，$ sudo raspi-configと入力する．raspi-config はシステムの設定を行うプログラムである．Localisation Options
を選択し，続いて，Change Keyboard Layout を選択する．キーボードモデルの選択で「標準 101 キー PC」，キーボードのレイアウトで「日本語」，AltGr として機能させるキーは「キーボード配置のデフォルト」，コンポーズキーは「コンポーズキーなし」，X サーバを強制終了するのに Control+Alt+Backspace を使いますか？に「はい」を選択する．
（使用するキー
ボードによっては，異なる選択を行う必要がある．
）
日本語の表示と入力を行うために，日本語フォント・入力メソッド・かな漢字変換ソフト
をインストールする．
$ sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big
xfonts-kaname$ sudo apt-get install uim uim-anthyuim（Universal Input Method）は多言語入力メソッドフレームワーク，uim-anthy はかな
漢字変換ソフトウエアである．
最後にロケールとタイムゾーンを設定する．raspi-config を起動し，Localisation Options
を選択し，
続いて，
Change Locale を選択する．
ロケールの選択画面で「en_GB.UTF-8 UTF-8」「ja_JP.EUC-JP EUC-JP」「ja_JP.UTF-8 UTF-8」の三箇所でスペースキーを押す．＊マー
クが表示され，これらの設定が選択されたことを示す（すでに＊マークが表示されておれば，
そのままでよい）．<了解>し，続くデフォルトロケールの設定画面では「ja_JP.UTF-8」を選択し，<了解>する．raspi-config の初期画面に戻るので，Localisation Options を選択し，Change Timezone を選択する．地理的領域で「アジア」を選択する．時間帯で「東京」を選択する．
これらの設定はリブートすることで有効になる．以上．
これらの設定の順番を間違えると日本語が文字化けする．一旦，文字化けすると，なにを操作しているのかわからなくので，慎重に行うこと．
2019 年 3 月 4 日更新

42

付録 2：テキストエディタ
Raspbian に最初からインストールされているエディタは vi , nano，LeafPad である．次のコマンドで emacs をインストールする．
$ sudo apt-get install emacs
インストールを終了すると，Menu のアクセサリに GNU Emacs が追加されている．Emacsを起動し，日本語変換などのキー入力が正しく行えることを確認する．
2019 年 3 月 4 日確認43

付録 3：Raspberry Pi 用 SD カードのバックアップと複製
SD カードに Raspbian をインストールし，また，raspi-config の設定や必要なソフトウエ
アのインストールを行ったカードの内容をバックアップする方法と，同じ内容の SD カードを複製する方法を説明する．ここでは Mac で行う場合について説明する．
複製元の SD カードをカードリーダーに接続する．デスクトップに RECOVERY と bootの２つのボリュームが表示される．ターミナルを起動し，$ mountを入力する．出力メッセージの中に/dev/disk2s6 on /Volumes/boot …
/dev/disk2s1 on /Volumes/RECOVERY …
の表示が見える．
“disk2”の部分は Mac の機種や SD カードリーダーによって異なる可能性がある．この表示は，SD カードが/dev/disk2 としてマウントされていることを示す．次に$ diskutil umountDisk /dev/disk2$ sudo dd if=/dev/rdisk2 of=ファイル名.dmg bs=1m
として，SD カードの内容をファイル名.dmg にコピーする．dd はファイルのコピーと変換を行う Linux コマンドである．/dev/rdisk2 と’r’が付いているのはアンバッファモードでの転送を意味し，転送が高速になる．bs=1m は，転送時のブロックサイズが 1MB であることを意味する．8GB・class10 の SD カードの読み込みに 7 分程度を要した．
$ diskutil eject /dev/disk2を入力した後，SD カードを取り出す．
コピー先のフォーマット済み SD カードをスロットに接続する．
$ diskutil umountDisk /dev/disk2$ sudo dd if=ファイル名.dmg of=/dev/rdisk2 bs=1m
として，ファイル名.dmg を SD カードに書き込む．8GB・class10 の SD カードで書き込みに 14 分程度を要した．書き込み終了後，$ diskutil eject /dev/disk2とした後，SD カードを取り出す．
バックアップした SD カードを他の SD カードに書き戻す時，SD カードの容量は正確に一致している（あるいは大きい）必要がある．同じ容量の SD カードであっても，製品が異なるとわずかの容量差があり，小さい SD カードへの複製は失敗する．SD カードのメモリ容量
は，ディスクユーテリティを使えば，バイト単位で確認することができる．
2017 年 11 月 23 日確認44

付録 4：USB メモリの利用
USB メモリを挿入すると，ファイルマネージャで開くかどうかの確認画面が現れる．OKをクリックすると，ファイルマネージャを通じて USB メモリにアクセスすることができる．
また，/media/pi/の下に USB メモリの名前の付いたディレクトリができるので，これを介してアクセスすることができる．
USB メモリを取り外す場合，まず，/media/pi/に 1DEF-5904 のような名前のディレクト
リがあることを確認する．具体的な名前は，USB メモリごとに異なる．そして，$ umount /media/pi/1DEF-5904
を実行し，USB メモリをアンマウントし，取り外す．あるいは，画面右上，タスクバーの右端にある△のアイコンクリックし，該当する USB メモリを選択する．その後，取り外す．
2019 年 3 月 4 日更新45

付録 5：スクリーンショットの撮り方
スクリーンショットを撮るツール ksnapshot について説明する．
$ sudo apt-get install ksnapshot
でインストールする（実験で使う Raspberry Pi にはインストール済み）．
例えば，Menu から Run を選び，ksnapshot を実行して起動する．付録 5-図 1 のような操作画面が表示される．例えば，Capture mode で Window Under Cursor と On Click が選択されていれば，Take a New Snapshot をクリックすることでマウスの形状が「＋」マークになり，キャプチャーするウィンドウをマウスでクリックする．その後，「名前を付けて保存する」で適当なファイル名を入力し，画像ファイルを保存する．

付録 5-図 1 ksnapshot の操作画面（古いバージョン）
2019 年 3 月 4 日更新46

付録 6：カメラモジュールと OpenCV の利用
カメラモジュールの有効化
raspi-config を起動する．Interfacing Options から P1 Camera を選択する．カメラを有効化するかという問いに，<はい>と答え，raspi-config を終了する．Raspberry Pi を再起動す
ると，カメラモジュールが利用可能になる．

C/C++用 OpenCV のインストール$ sudo apt-get install libopencv-dev
で OpenCV をインストールする．このようにインストールすると，ヘッダファイルは/usr/include/opencv，/usr/include/opencv2 に保存される．opencv_core.a などのライブラリ
は/usr/lib/arm-linux-gnueabihf の下に保存される．OpenCV のバージョンは/usr/include/opencv2/core/version.hpp で確認できる．
OpenCV を使ったソースコードをコンパイルするためには，$ g++ –o sample sample.cpp –I/usr/include/opencv –I/usr/include/opencv2 -lopencv_core –lopencv_highgui -lopencv_imgproc -lopencv_ml -lopencv_video -lopencv_features2d-lopencv_calid3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann –lpthread -ldl –lmのような長いコマンドラインを入力する必要がある．このような場合，コマンドラインを記述したファイルを作り，それを$ chmod 755 コマンドラインを記述したファイル名のように実行可能にして利用するのが一つの方法である．また，Makefile を作り，make コ
マンドを利用する方法もある．なお，OpenCV は C から利用するバージョンを OpenCV1，
C++から利用するバージョンを OpenCV2 として区別している．通常，OpenCV2 を C++から利用する．

UVC 対応のカメラから RasPi に画像を入力する方法
USB カメラの多くは UVC（USB Video Class）対応である．UVC 対応のカメラからOpenCV の機能を使って画像を入力し，ディスプレイに画像を表示するプログラムの例を付
録 6-図 2 に示す．付録 6-図 2 の 7 行目では，USB カメラを cv::VideoCapture クラスの変数
capture として宣言する．capture の引数はカメラ番号であるが，-1 はデフォルトカメラを意味する値である．このプログラムを usbcam.cpp とすると，これをコンパイルするには，$ g++ -o usbcam usbcam.cpp –I/usr/include/opencv2 –lopencv_core –lopencv_highgui
とする．

47

付録 6-図 2 UVC 対応のカメラから画像を入力し，それを表示するプログラムの例

Raspberry Pi カメラモジュールから画像を入力する方法
Raspberry Pi カメラモジュールの場合，付録 6-図 2 のように画像を取り込むことができな
い．ファイル/etc/modules の末尾に bcm2835-v4l2 の行を書き加え，再起動すると，付録 6図 2 のように利用することができる．ただし，7 行目の capture(-1)は capture(0)に修正する必要があった．

(参考) 2018 年度の学生実験までは，raspicam_cv ライブラリを使っていたので，参考のために，その時の記述を残しておく．
（2019 年 3 月 5 日に動作確認したところ，下記の手順の最後の make でエラーが発生して使えなかった．
）
https://github.com/robidouille/robidouille/blob/master/raspicam_cv/README.md を参考にした．raspicam_cv ライブラリは
https://github.com/robiouille/robidouille/tree/master/raspicam_cv から入手する．まず，
cmake をインストールする．
$ sudo apt-get install cmake
次いで，raspberry pi userland ライブラリをインストールする．
$ mkdir ~/git$ cd ~/git$ mkdir raspberrypi$ cd raspberrypi

48

$ git clone https://github.com/raspberrypi/userland.git$ cd userland$ ./buildme
ここで少し時間を要する．
$ cd ~/git$ git clone https://github.com/robidouille/robidouille.git$ cd robidouille/raspicam_cv$ mkdir objs
$ make
インストール後，~/git/robidouille/raspicam_cv/にある libraspicamcv.a を/usr/lib にコピーする．
カメラモジュールから映像を入力し，それをディスプレイに表示するサンプルプログラムを付録 6-図 3 に示す．4 行目の”RaspiCamCV.h”は，~/git/robidouille/raspicam_cv/にあるRaspiCamCV.h をカレントディレクトリにコピーした．25 行目で cv::Mat 型の変数 img に
カメラモジュールの画像を取り込んでいる．そこまでに，raspicam_cv ライブラリの関数を使ってカメラモジュールを変数 capture に関連付けている．付録 6-図 4 にサンプルプログラ
ムをコンパイル・リンクするための Makefile の例を示す．インクルードファイルとリンクフ
ァイルが多くあるので，注意が必要である．このサンプルプログラムを画像サイズ 640×480で実行させた場合 25fps 程度のフレームレートであった．
なお，raspicam_cv ライブラリを Opencv3.1, Opencv3.2 で make すると，cvRound への参照が解決できないという主旨のエラーが発生した．それを解決する方法はhttps://github.com/robidouille/robidouille/issues/16に記述されている（2017 年 3 月 16 日）．

49

付録 6-図 3 raspicam_cv ライブラリと OpenCV を使ったサンプルプログラム

付録 6-図 4 raspicam_cv ライブラリと OpenCV を使うときの Makefile の例
2019 年 3 月 5 日更新

50

付録 7：加速度・角速度センサモジュール GY-521 の接続
センサモジュール，GY-521
GY-521 は，インベンセンス社の三軸ジャイロ・加速度センサ MPU-6050 を搭載したモジュールである．このセンサモジュールに関する情報は，インターネット上（例えば，「androcity
MPU-6050 三軸加速度三軸ジャイロセンサーモジュール」など）から入手する．

付録 7-図 1 GY-521 の外観

RasPi との接続
GY-521 を，I2C インタフェースを介して RasPi2 接続する．GY-521 の VCC 端子を RasPiの pin1（3.3V）に，GND を pin6（GND）に，SCL を pin5（GPIO3, I2C1 SCL）に，SDA
を pin3（GPIO2, I2C1 SDA）に接続する．続いて，RasPi の I2C を有効にするために，次のように操作する．
① raspi-config の Interfacing Options で I2C を有効にする．
② ファイル /etc/modules の末尾に i2c-dev を加える．
（デフォルトで設定されている模様）③ sudo apt-get install i2c-tools libi2c-dev で，i2cdetect などのコマンドツールを使えるようにする．
リブート後，lsmod コマンドを入力すると i2c_dev と i2c_bcm2835 が表示される．sudo
i2cdetect –y 1 を入力すると，接続されているデバイスのアドレスを確認することができる．
GY-521 を接続している場合，0x68 に接続されていることがわかる．
2018 年 2 月 28 日更新

51

付録 8：無線 LAN への接続
WiFi を内蔵した Raspberry Pi3 であれ，それ以前の Raspberry Pi に USB タイプの無線
LAN アダプタを用いる場合であれ，接続の操作は同じである．ただし，Raspberry Pi の USB
ポートは供給できる電流が小さく，無線 LAN アダプタの機種によっては，動作が安定しないので注意が必要である．無線 LAN アダプタを USB ポートに挿入すると，自動的にドライ
バーがインストールされ，利用可能になる．このことは、lsusb コマンドで無線 LAN アダプ
タの製品名が見えることや，iwconfig コマンドで wlan0 が存在することなどで確認することができる．
京産大の学内無線 LAN に接続する場合，/etc/wpa_supplcant /wpa_supplcant.conf を次のように設定する．再起動すると，自動的に接続される．ping www.yahoo.co.jp などで接続を確認することができる．
（wpa_supplcant.conf の書き方は，無線 LAN 環境によって異なる．
）
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={ssid=”KSU2010gx”
proto=RSN
key_mgmt=WPA-EAP
pairwise=CCMP
auth_alg=OPEN
eap=PEAP
identity=”ユーザ ID”
password=”パスワード”}
以前は，sudo ifdown wlan0 コマンドで無線 LAN を切り、sudo ifup wlan0 で無線 LANを再接続が可能であったが，正しく動作しなくなっているようである．
市販の無線 LAN アダプタの中で、planex GW-USNANO2A は消費電力が小さく（1.3W）、
Raspberry Pi に向いている。他の製品は 2.5W 程度のものが多い。
2019 年 3 月 5 日更新

52

付録 9：Wiring Pi のインストール
Wiring Pi は Gordon Henderson 氏が開発した Raspberry Pi 用 GPIO のライブラリで，GPIO を利用するプログラムを C 言語で作成する際に役立つ（http://wiringpi.com）．
WiringPi を使用するには libi2c-dev という I2C の開発用ライブラリが必要である．それを次のようにインストールする．
$ sudo apt-get install libi2c-dev
WiringPi はソースコードをダウンロードしてビルドすることによってインストールする．
Git というバージョン管理システムを使ってソースファイルを入手する．Git を次のようにインストールする．
$ sudo apt-get install git-core
次に WiringPi のソースファイルをダウンロードする．
$cd ~$ git clone git://git.drogon.net/wiringPi
ソースファイルを次のようにコンパイルする．
$ cd ~/wiringPi$ ./build
正常にコンパイルが完了すると，ライブラリや gpio ユーティリティがインストールされる．
次のコマンドで gpio ユーティリティのバージョンを確認できる．
$ gpio –v
注）上の手順の中で，git clone …でファイルをダウンロードできない場合（京産大の学内ネットワークで，情報センターに登録されていない Raspberry Pi ではできなかった），他のパ
ソコンやネットワークを通じてソースファイルをダウンロードし，
それを RPi にコピーする．
2017 年 3 月 2 日更新53

付録 10：LeafPad，nano，vi のタブキーの設定変更
Python や C/C++のプログラムを作成するときに，タブキーが半角 8 文字分になっているとソースコードが横に長くなりすぎる．半角 4 文字か半角 2 文字が適当であろう．Raspberry
Pi で用いるテキストエディタ Leafpad，nano，vi でタブキーの設定は，次のように変更する．
Q: Leafpad のタブをデフォルト（半角 8 文字）から半角 4 文字に変更する．
A: 設定ファイル/usr/share/raspi-ui-overrides/applications/leafpad.desktop の 43 行目をExec=leafpad %f から Exec=leafpad --tab-width=4 %f に変更する．
Q: nano のタブをデフォルト（半角 8 文字）から半角 4 文字に変更する．
A: 設定ファイル~/.nanorc に set tabsize 4 を記述する．
Q: vim の設定ファイル.vimrc に設定方法．
A: vim の初期設定を行うファイル~/.vimrc を次のように記述すると良い．
set tabstop=4
set showmodeset number
set nocompatible
第一行はタブを半角 4 文字にする（デフォルトは 8 文字）．
第２行は現在のモードを表示する．
第３行は行番号を表示する．
第４行は vi コンパチブルを解除する．
vi コンパチを解除すると，入力モードで矢印キーによるカーソル移動が可能になる．

2017 年 3 月 2 日更新54

付録 11：MacBoook から無線 Lan で Raspberry Pi をリモート操作する方法⒈ MacBook を無線 Lan のアクセスポイントとして設定する
MacBook の無線 Lan は、通常、アクセスポイント（AP）に接続するための子機として利用する。今回は Raspberry Pi の無線 Lan に対する AP として設定する。
MacBook を USB Ethernet アダプタを使って、LAN に接続しておく。
「システム環境設定」
を起動し、「共有」を選択する。共有パネルの左側にあるサービスから「インターネット共有」
をクリックする（この時点では、入にチェックを入れないで、選択するだけ）。右側の「共有する接続経路」は「USB Ethernet」を選ぶ。
「相手のコンピュータが使用するポート」は「Wi-Fi」を選ぶ。
右下にある「Wi-Fi オプション」をクリックすると、下のようなパネルが表示される。ネットワーク名とパスワードは各自で適当なものを入力する。チャネルとセキュリティは図のようにする。
「OK」をクリックして戻る。

図 1 Wi-Fi オプションの設定画面
共有パネルのサービスで「インターネット共有」の入にチェックを入れる。確認のダイア
ログボックスが表示されるので「開始」をクリックする。
「インターネット共有」のインジケータが緑になり、設定が有効になったことがわかる。また、メニューバーにある WiFi の扇型アイコンの中に「↑」が現れる。
「システム環境設定」を閉じる。

2. Raspberry Pi の無線 Lan 設定
USB タイプの無線 Lan アダプタを接続する（Planex の GW-USNANO2A は消費電力が小さく（1.3W）、Raspberry Pi に向いている）。初めてアダプタを接続すると、ドライバーが自動的にインストールされる。lsusb コマンドや iwconfig コマンドを入力し、wlan0 が存在す55

ることを確認する。wlan0 は 1 台目の無線 Lan を示す名前である。
sudo iwlist wlan0 scan | grep ESSID を入力し、図１で設定したネットワーク名が ESSIDの一つとして表示されていることを確認する。設定したネットワーク名が表示されない場合、
MacBook のメニューバーに、WiFi アイコンが「↑」付きで表示されているか？など、1.で行った設定を確認すること。
/etc/network/interfaces ファイルを次のように設定する。
auto lo
iface lo inet loopback
auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wap_supplicant.conf
iface default inet dhcp
wireless-power off/etc/ wpa_supplicant/wap_supplicant.conf ファイルを次のように設定する。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={ssid=”設定したネットワーク名”
psk=”設定したパスワード”
key_mgmt=WPA-PSK}

sudo ifdown wlan0 で無線 Lan を切断し、sudo ifup wlan0 で無線 Lan を接続する。リブートすれば、自動的に無線 Lan に接続する。ifconfig コマンドなどを使って、IP アドレスを確認する。

3. xrdp リモートデスクトップ
ネットワーク接続されたコンピュータから、他のコンピュータを操作するデスクトップ環
境をリモートデスクトップとよぶ。VNC や xrdp などのソフトウエアがある。ここでは、xrdpを使う。次の手順で、Raspberry pi に xrdp をインストールする。
sudo apt-get update
sudo apt-get install xrdp

56

日本語キーボードの配列を指定するために、次の操作を行う。
cd /etc/xrdp
sudo wget http://w.vmeta.jp/temp/km-0411.ini
sudo ln –s km-0411.ini km-e0010411.ini
sudo ln –s km-0411.ini km-e0200411.ini
sudo ln –s km-0411.ini km-e0210411.ini
sudo service xrdp restart

Mac 用の xrdp クライアント（Microsoft Remote Desktop）がマイクロソフトから提供されている。
https://itunes.apple.com/jp/app/microsoft-remote-desktop/id715768417?mt=12の手順にしたがってインストールする。
Microsoft Remote Desktop を開始する。図 2 のような画面が表示される（ここで Raspi2となっている部分は、最初はない）。

図 2 Microsoft Remote Desktop の画面
New をクリックすると、図 3 のような表示になる。Connection name は好きな名前を入力する。PC name は、2.の最後に確認した Raspberry Pi の wlan0 の IP アドレスを入力する。
User name と Password は Raspberry Pi 側のもので、初期状態では pi と raspberry である。
Resolution と Colors は自分の MacBook の仕様に合わせる。その他は、そのままで良い。この画面を左上の●をクリックして閉じる。

57

図 3 Edit Remote Desktop の画面
元の画面に戻ると、設定した Connection name が表示されている。これをダブルクリック（あるいは選択して Start）する。全ての設定が正しければ、Raspberry Pi のデスクトップが表示され、操作可能になる。一旦、操作可能になれば、Raspberry Pi 本体側のケーブル類
は、電源を除いて取り除くことができる。
全ての設定を正常に終了し、MacBook から無線 LAN で Raspberry Pi を使う場合には次のようにする。
(1) MacBook を USB Ethernet で LAN に接続して起動する。メニューバーにある WiFi の扇型アイコンの中に「↑」が現れていることを確認する。
(2) Raspberry Pi を起動する。ブートアップの完了を待つ。
(3) MacBook で xrdp を起動し、Raspberry Pi に接続する。
2016 年以前の情報

58

付録 12：7 インチ公式タッチパネルディスプレイの接続
Raspberry Pi 7 インチ タッチ・スクリーンディスプレイの接続・取り付けを解説している Web サイト（例えば，https://raspberry-pi.ksyic.com/page/page/pgp.id/4）を参考に接続する．これだけで正しく表示されない場合，次のことを確認する．
(1) /boot/config.txt の display_default_lcd=0 の行を#でコメントアウトする(2) 上下逆さまに出力するときは，さらに lcd_rotate=2 を書き加えると，正常に出力する．

2016 年以前の情報

592019 年春学期に使う RasPi2 の状態
1. NOOBS_v3_0_0
2. 付録 1 に記した日本語環境
3. 付録２に記した emacs
4. 付録 5 に記した KSnapshot
5. 付録 6 に記したカメラモジュール関係の環境
6. 付録 7 に記した I2C の環境
7. 付録 9 に記した WiringPi
8. mtPaint

60