45
ウルシステムズ株式会社 http://www.ulsystems.co.jp mailto:[email protected] Tel: 03-6220-1420 Fax: 03-6220-1402 ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 「Raspberry Pi」勉強会 2015/3/20 講師役:近棟 稔

「Raspberry pi」勉強会 2015.03.20

Embed Size (px)

Citation preview

Page 1: 「Raspberry pi」勉強会 2015.03.20

ウルシステムズ株式会社http://www.ulsystems.co.jp

mailto:[email protected]

Tel: 03-6220-1420 Fax: 03-6220-1402

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

「Raspberry Pi」勉強会

2015/3/20

講師役:近棟 稔

Page 2: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

目的: ~子どものコンピューター体験のためのRaspberry Pi~

Q: なぜRaspberry Piに注目しているか?

→ A: 自分の子どもに、より良いコンピューター体験をさせたいためです。

この目的にはRaspberry Piは最適だと思いました。

Googleの自動運転から垣間見られるように、自分の子ども(いま5歳)が大人になる頃には、ある程度「賢いロボット」が今よりも世に出ていると思っています。そのため、イメージとしては以下の様な内容のコンピューター体験をさせてあげるのが良いんじゃないかと思いました。

まず、作る対象はロボットにするという事です。ロボットは、子どもには「おもちゃ」に見えます。こういうものは、子どもは大好きです。(ちなみに私も大好きです)

ロボットを作るには、ハードウエアとソフトウエアの両方の知識が必要になります。本当なら高度な知識が必要になりそうな分野ですが、そこを最も簡単に乗り越えることが出来そうなものが、Raspberry Piだと思います。

実際、最近は小学校に入ったらRaspberry Piを使って遊ぶ子どもが増えているみたいです。早い子は5歳から触っているみたいです。

1

ソフトウエア

ハードウエア ロボット

Page 3: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

Raspberry Piで動かせる(はず)のロボットたち

Raspberry Piがあれば、様々なロボットを自分で作ったソフトウエアで制御出来ます。

2

← こんなローバーは、左右の車輪に別々のモーターを付け、それらのモーターの回転を個別に制御すれば簡単に進む方向を変えたり出来ます。(戦車と同じ)漫画やアニメの「宇宙兄弟」を観た人は、こんなローバーに見覚えがあるはず。

← ラジコンカーの制御も、DCモーターやサーボモーターの制御が出来てしまえばロボットに出来ます。ラジコンのように、もともと制御系が半分出来ているものは、ロボットにしやすいです。

← 人型ロボットの制御は、サーボモーターの制御さえ出来れば、ひとまず動作させることは可能です。ただし、バランスを取って動くようにするための、制御ソフトは複雑になります。

結局のところ、Raspberry Piがあれば、これらのおもちゃをソフトウエア的に制御する所までは、ある程度簡単に到達できます。なお、ハードの設計をゼロからするより、既成品のおもちゃを買ってきて改造したほうが簡単な場合が多いかもしれません。既成品のデメリットとしては、想定外の制御方式となっていた場合、分からず、悩むことです。

Page 4: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

Raspberry Piを始めるときに、ひとまず買い揃えたもの

amazonなどで買って、全部で1万円くらいになりました。ハンダごては持っていました。

3

Raspberry Pi B+(今はver2が出てます)

一応ケースも買いました

ブレッドボードとワイヤー類

LEDや抵抗、スイッチもあったほうが良い

USB接続のWiFi子機

サーボモーターI2C接続の

加速度センサー 超音波による距離センサー

マイクロUSBから電源を取るためのコネクタ

マイクロモーター

モータードライバー

2SK4017 (60V 5A)パワーMOSFET

(電気仕掛けのスイッチ)

Page 5: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

ブレッドボードとは

ブレッドボードとは、以下のように前もって配線されている基盤です。このボードに、各種電子部品を差し込んでいくことで、ハンダ付けすることなく、素早く回路を組み上げて試すことが可能になります。部品を差しこむだけなので、とても簡単です。

なお、ブレッドボードは回路のプロトタイプを作る際に使うものなので、実際に運用する段階では通常使いません。実際に運用する段階では、ユニバーサル基板やストリップボードにハンダ付けを伴う作業を経て、しっかりと電子部品を固定します。

4

結線省略

結線省略

ユニバーサル基板 ストリップボード

Page 6: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

Raspberry PiなしでLEDを光らせてみる(LEDとブレッドボードの練習)

以下のように回路を組めば、LEDは光ります。電球と似てます。

いくつものLEDを直列に繋いで光らせてみたり、並列に繋いで光らせてみたり。

5

1KΩの抵抗を挟んでいるのは、LEDに過度な電流が流れてしまわないためです。このような抵抗は色々な局面で出てきます。このような抵抗をどういった考えで挟むかですが、考え方としては、回路上に登場するすべての電子部品の持つ、「最大電圧」や「最大電流」を超えないようにするのが基本となります。過度な負荷をかけると、Raspberry Piを含め、過負荷がかかった部品が壊れてしまいます。

電子回路の鉄則電子部品の「最大電圧」や「最大電流」を超えないようにすること!よく分からなかったら、1KΩか10KΩくらいの抵抗をとりあえず付けてみて電気を流すといいかも。

直列 並列

←光らない(電圧不足)

←光る

Page 7: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

Raspberry PiなしでDCモーターをスイッチでON/OFFする

回路Aのように組めば、DCモーターは回ります。回路Bのように組むと、スイッチでモーターのON/OFFを制御できるようになります。このようなタイプのスイッチ(タクタイルスイッチ)は、押している間だけ通電します。

6

<回路A(スイッチ無し)> <回路B(スイッチ付き)>

<スイッチ>

緑色の線は、いつも繋がっています。

オレンジ色の線も、いつも繋がっています。

ボタンを押すと、全部が繋がります。

Page 8: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 7

Raspberry Pi

Page 9: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

Raspberry Piってどんなもの?

歴史Raspberry Piは、Eben Uptonという人が、子供の教育用コンピューターとして開発しました。子どもでも手軽に買えるように、価格は教科書程度の値段におさえられています。Eben Uptonさんの信念として、以下のようなものとして作られています。

子どもが自分のお小遣いで買える程度の値段にすること

GPIOを持たせ、外部のハードウエアを制御しやすくすること(コンピューターを閉じたものにしない)

Raspberry Piを買った子どもが家の中から調達することを想定しているもの

自宅のテレビをディスプレイ代わりにする(HDMI接続)

HDMIケーブル(もしくは100均で買う)

スマフォ用のマイクロUSB端子用充電器

スマフォやデジカメ用に持っているmicroSDカード

追加で調達する必要があるもの

マウスとキーボード

OS(ダウンロードする必要があります)

ブレッドボードや、各種電子部品(ほとんどのものは安価)

8

Eben Upton氏の本

これがGPIO

Page 10: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

OSはRaspbianを使います。プログラミング言語はPythonを使います。

Raspberry Piは「小さなLinuxパソコン」です。DebianベースのLinuxディストリビューションである、Raspbianを通常使います。(Raspbian以外のOSも動きます)

RaspbianにはX11+LXDEによる、グラフィカルなデスクトップ環境が提供されています。このデスクトップ環境はなかなか快適に使えます。emacsなんかも快適に動作します。

プログラミング言語に関しては、Linuxで通常使えるものはすべて簡単に利用可能です。ただ、Raspberry PiのPiはPythonに由来し、Pythonを使う事が推奨されているため、Pythonを使ったほうが有利です。Pythonを使えばRaspberry Pi用のライブラリーが充実していますし、沢山の人がWebで情報を提供しています。

9

ちなみに私の感覚ではPython以外では以下の言語の利用が多いと感じました。・C言語・Scratch(左の写真)

C言語はハードウエア制御がしやすいという理由で使われているのだと思います。

Scratchは小中学校の生徒が主に使っています。ScratchはSqueak(Smalltalk)で書かれています。ハードウエア制御も一応出来ます。

Page 11: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 10

LEDの点灯をRaspberry Piで制御

Page 12: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

Raspberry PiのGPIO

Raspberry PiにはGPIOが付いています。このGPIOによってソフトウエアからピンの電圧の上げ下げを自在にソフトウエアから制御出来ます。また、プログラムから、ピンに電圧がかかっているか否かの読み取りも可能です。なお、ピンには5Vか0Vのどちらかの電圧がかかっています。trueもしくは1ならば5Vの電圧がかかっているという意味です。(コンピューターは0や1しか扱えなくて、0は電圧がかかっていないことを意味し、1は電圧がかかっている事を意味します)

GPIOのピンの中には特殊な役割をするピンもあります。特に重要なのは、I2CやSPIといった基板内におけるUSB接続みたいな役割を担当するピンです。これらはUSBのように特別なプロトコルに沿った信号処理を担当します。GPIOのピンの種類を以下に記載します。

11

GPIOは、この40本あるピンのこと。

ピンの種類

意味

GPIO

プログラムから0Vもしくは5Vの電圧をかけることが出来るピンです。モードを変更すれば、電圧の読み取りも可能です。読み取りモードの場合は、0Vの電圧がかかっているか5Vの電圧がかかっているかを読み取ることが出来ます。

I2CUSBみたいな役割のピンです。センサーなどを複数繋げることが出来ます。

SPIUSBみたいな役割のピンです。センサーなどを複数繋げることが出来ます。

UART シリアル通信用のピンです。

EEPROM add-onボードの自動設定用ピンです。

GNDマイナス極です。ground、グランド、アースなどとも呼ばれます。

5V電源 プラス極です。5Vの電圧がかかっています。

3.3V電源 プラス極です。3.3Vの電圧がかかっています。

GPIOの現在の状態を表示する有名なコマンドとして、WiringPiが提供する「gpio」というコマンドがあります。左の表示は「gpio readall」を実行した結果です。このgpioコマンドでピンの電圧を上げ下げする事も可能です。

Page 13: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

ピンの呼び方

Raspberry PiにおけるGPIOのピンの呼び方には4種類のバリエーションがあり、混乱しがちです。混乱しないように理解しておく必要があります。

12

GPIOは、この40本あるピンのこと。

名前の種類 意味

Physicalまたはboard Raspberry Piのマザーボード上の40ピンの物理配置です。つまりこの並び順です。

BCM(Broadcom)Broadcom社製のBCM2835というSoC(System-on-a-chip)におけるピン番号です。要するに、チップ側での呼び方です。プログラムを書くときは、このBCM側の呼び方をする事が多いです。

(論理名)ピンの論理的な意味を表現する際に、「GPIOの0番」や、「SDA」などという論理名で呼ぶこともあります。

WiringPi (wPi)Raspberry Piの黎明期から存在するWiringPiというツールがサポートするピンの呼び方です。gpioコマンドはWiringPiの一部なので、表示上出てきます。

Page 14: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

LEDの点灯をRaspberry Piからソフトウエアで制御

以下のようにLEDと1KΩ抵抗をRaspberry PiのGPIOに繋ぎます。黒い線は物理的なピン番号で言うと6番ピンに繋いであります。この6番ピンはGND(マイナス極、アース、グランド(ground)などとも呼ばれます)です。赤い線は物理的なピン番号での11番ピンに繋いであります。この11番ピンはプログラムから電圧の上げ下げ(5Vもしくは0V)をコントロール可能です。

13

Page 15: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

pigpioライブラリーを使ってPythonからGPIOを制御

pigpioライブラリーを利用すれば、PythonからGPIOを制御可能です。以下にソースコードを記載します。なお、pigpioライブラリーは、裏でpigpiodというデーモンを動かしておく必要があります。実際のハードウエア制御は、このpigpiodがやっています。

14

実行方法:$ sudo pigpiod$ python pig-led.py

LEDが1秒ごとに光ったり消灯したりすれば成功です。

Raspberry Piの11番ピンは、Raspberry PiのSoC(System-on-a-chip)であるBCM2835では17番ピンに相当します。

pigpioではBCM2835でのピン番号を指定する必要があるので、ソースコード上では17番を指定します。

Page 16: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

[コラム] PythonでAPIを調べたかったら

Pythonは、モジュールをimportしたら、そのモジュールのドキュメントをhelp関数やdir関数でダンプ可能です。JavaDocのようなものが付属してくるというイメージです。

15

(PythonのREPLにて)

>>> import time>>> dir(time)['__doc__', '__name__', '__package__', 'accept2dyear', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'gmtime', 'localtime', 'mktime', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname']>>> help(time)Help on built-in module time:

NAMEtime - This module provides various functions to manipulate time values.

FILE(built-in)

DESCRIPTIONThere are two standard representations of time. One is the numberof seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integeror a floating point number (to represent fractions of seconds).The Epoch is system-defined; on Unix, it is generally January 1st, 1970.The actual value can be retrieved by calling gmtime(0).

The other representation is a tuple of 9 integers giving local time.The tuple items are:

year (four digits, e.g. 1998)month (1-12)

Page 17: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 16

ソフトウエアでLEDを徐々に明るくしたり暗くしたりする

Page 18: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

ソフトウエア制御でLEDを徐々に明るくしたり暗くしたりする(PWMの紹介)

ソフトウエア制御によってLEDを徐々に明るくしたり暗くしたりするためには、PWMという方法を用います。PWMはpulse width modulationの略です。PWMの発想としては、消灯と点灯を高速に(通常20ミリ秒ごとに)切り替え、消灯の時間比率を多くすればLEDは暗くなり、点灯の時間比率を多くすれば明るくなるという発想の制御方法です。このような制御方法は、DCモーターの回転数制御や、ラジコンなどに用いられるサーボの制御など、かなり広範に用いられます。

17

時間

電圧

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

<10%くらいまで暗くしたい時>

時間

電圧

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

<80%くらいまで明るくしたい時>

5V

0V

5V

0V

Page 19: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

ソフトウエア制御でLEDを徐々に明るくしたり暗くしたりする(ソースコード)

pigpioライブラリーを用いると、PWMを簡単に生成することが可能です。以下に配線とソースコードを載せます。ソースコードの内容は、sinカーブにしたがって、ゆっくりとLEDの明るさを変えるものになっています。

18

Page 20: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 19

ソフトウエアでモーターを制御する

Page 21: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

ソフトウエアからモーターのON/OFFを行う

LEDをソフトウエアから制御したように、モーターの回転もソフトウエアから行うことが可能です。しかしながら、LEDの時のようにGPIOピンにモーターを直結することは出来ません。なぜなら、モーターの駆動には大きな電力が必要になるためです。直結した場合、電力不足でモーターが動かないか、もしくは、電流が流れすぎてRaspberry Piが壊れてしまうと思います。

モーターの駆動には、パワーMOSFETというトランジスターが必要です。パワーMOSFETを使えば、微弱なRaspberry PiのGPIOピンの電圧の指示通りに、大電圧・大電流を流したり止めたり出来ます。どの程度の電圧・電流が流せるかは、パワーMOSFETの性能によります。大電圧・大電流に対応したものは、それなりに値段が高く、チップも大きくなります。

たとえば2SK4017(1個30円)というNチャンネル パワーMOSFETを使うと、60V、5Aまで扱えます。模型用モーターとしてはかなり強力なモーターを駆動できます。ものすごく強力な、大きめのクアッドコプターに使うモーターを制御する場合は、10Aくらい流れてしまうので、もっと大容量のものを選びます。60V、25A駆動可能なものが100円程度で手に入ります。

20

2SK2232 (60V 25A)大きさは1.5cmくらい

100円くらい

2SK4017 (60V 5A)大きさは5mmくらい

30円くらい

gatedrain

source

ピンの種類

意味 (Nチャンネルの場合)

gateGPIOを繋げます。このピンへ与える電圧がスイッチのON/OFFを意味します。

draingateに電圧がかかると、drainからsourceへと電流が流れます。

source マイナス極に繋ぎます

※ PチャンネルMOSFETの場合、sourceをプラス極に繋ぎます。電流はsourceからdrainに流れます。

Page 22: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

Nチャンネル パワーMOSFETを用いたモーターの制御例

以下のようにRaspberry Piに配線することにより、GPIOでモーターの回転を制御できます。PWMを使うと、回転数も変更可能です。この制御に使うソースコードとしては、LEDをsinカーブにそって明るくしたり暗くしたりするソースコードがそのまま使えます。

21

パワーMOSFETは大電力のモーターを簡単に扱える一方、モーターの逆回転やブレーキ制御など、より細かな制御をしようとすると他の工夫が必要になってきます。このような細やかな制御をしたい場合は、モータードライバーを使うのが手っ取り早い方法となります。ラジコンカーみたいなものはこれを使ったほうが楽です。

モータードライバー

Page 23: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 22

ラジコンサーボの制御

Page 24: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

ラジコンサーボの制御もPWMで行います

ラジコンサーボはPWMによって制御するには、以下の通りのPWMを出力すればOKです。サーボ用のPWM信号は数マイクロ秒程度に信号時間をきちんと制御しなくてはならず、単純にソフトウエア的に生成する事が困難な領域になります。pigpioは、このあたりのことを半分ハードウエアの力を借りてちゃんとやってくれるので、実用になるレベルのサーボの制御が可能になっています。

23

時間

電圧

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

<一番左まで首を振りたい時は、パルス幅を700マイクロ秒に>

時間

電圧

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

cycle time= 通常20ミリ秒

<一番右まで首を振りたい時は、幅を2300マイクロ秒に>

5V

0V

5V

0V

Page 25: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

サーボを制御する回路例

以下にサーボを制御する回路の例を載せます。注意事項としては、サーボ用の電源はDCモーターの時と同じく、Raspberry Piからではなく別の電源から取得します。そうしないと、Raspberry Piの中を大きな電流が流れてしまって、Raspberry Piが壊れてしまうためです。

24

この↑ロボットは17個のサーボを使います。Raspberry Piは最大で26本のGPIOピンを制御可能なので、このロボットの全身のサーボを同時に制御可能です。

Page 26: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 25

加速度センサーを使う

(I2Cを使ってみる)

Page 27: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

I2C接続の加速度センサーを使う

Raspberry Piは、周辺機器と接続するための規格としてUSB以外にI2CとSPIやUARTをサポートしています。これらの規格は、加速度センサーや温度センサー、気圧センサー、液晶、GPSなど様々なデバイスを繋げる事が出来ます。

I2Cは複数のデバイスを右の図のように数珠つなぎに繋ぐ事が出来ます。

今回扱うのは、MPU-6050というチップです。6軸加速度センサーをチップ内に備えている上に、Digital Motion Processorもチップ内に備えているために、よりノイズの少ない姿勢制御が可能になっているものです。

このようなチップを買ってきたら(もしくは買う前に)、まずすることは「データシートを読むこと」になります。パワーMOSFETのようなものも同様なのですが、このような電子工作の世界では、ほとんどの物にデータシート(要はマニュアル)があり、ネットからダウンロード可能になっています。これを読まないと、特に私のような素人は何も出来ません。

26

(Wikipediaより)

MPU-6050

Page 28: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

ひとまずRaspberry Piと加速度センサーを接続

I2C接続は4本の線で繋ぎます。4本のうち2本は電源とGNDです。残り2本はデータとクロックです。それぞれ、対応するピンに繋ぎます。

27

線を繋いだら、i2cdetectというコマンドを使って、この加速度センサーがI2C接続の中のどこのアドレスに繋がったかを確認します。この場合、16進数で0x68に接続した事が分かります。このアドレスは、後でプログラムからI2Cデバイスを制御する際に必要になります。

I2Cで繋がったデバイスは、そのデバイスの中に「レジスター」と呼ばれるメモリー空間を持ちます。レジスターには、デバイスの設定情報を読み書きする領域や、センサーで読み取った最新情報を保持している領域があります。どんな領域があるかは、データシートに記載があります。

この中にレジスターがある。

中には設定値や、加速度センサーのデータなどが入っている。

I2Cによって、レジスターの中身は読み書き可能となっている。

Page 29: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

加速度センサー情報をレジスターのどこから読めばよいかをデータシートから読み取る

MPU-6050のデータシートによると、以下のアドレスに加速度や温度やジャイロの情報がリードオンリーで存在することが分かります。よって、この情報をI2Cを使って、たとえば「アドレス 0x3B から1バイト取得」すると、X軸方向の加速度情報の16bitのうち上位8bitが取得出来ます。

28

加速度センサーのXYZ方向の情報

温度

XYZ方向それぞれのジャイロ

注:このデータシートの表は3ページに渡って記述があります。この表は抜粋です。

Page 30: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

加速度センサーからの情報をPythonからダンプしてみる

加速度センサーからの情報をPythonからダンプするコードは以下のようになります。データは2バイト1組のsignedワードで来るので、実際には以下に示すto_signed_word関数のようなものを作り、デコードしてあげる必要があります。

29

Page 31: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 30

どうやってロボットを作るの?

Page 32: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

ロボットの制御

31

行動計画の立案

(結構得意)

計画した動作を実行誤差が発生

状況把握

誤差を修正

ロボットの思考と行動のサイクル

ロボットの制御は、典型的には以下の様なサイクルを無限ループで回します。

状況把握にはセンサーを使います。

複数のセンサー情報を組み合わせ、それらの情報から、外部の世界の「イメージ」をプログラム内に持ちます。

実際の外部の世界と、ロボットの持つ内部イメージが可能な限り合えば合うほど、ロボットの制御はうまく行きます。

実際にモーターを動かしたりサーボを動かしたりします。

モーターにどの程度電流を流すべきかや、サーボの角度をどうすべきかを決めるロジックが必要になります。

この際、よく用いられるのはPIDコントロールという手法です。補足2にて説明を記載しました。

現実世界と脳内との齟齬が拡大してしまうフェーズ

現実世界と脳内との齟齬を修正できる唯一のタイミング

状況をどう変えたいかを考えます。

たとえば壁にぶつかりそうなのであれば、右か左に回避するとか、2足歩行ロボットが倒れそうなのであれば右足を出すとかです。

Page 33: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 32

子どものためのRaspberry Pi

Page 34: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

Scratchについて

Raspberry Piでプログラムを作る際、小学生たちは、Scratchという言語を使う事が多いみたいです。Scratchは、よく使われている大きくバージョンが2種類あります。ひとつはRaspberry Piにデフォルトで入っている1.4で、これはSqueak(Smalltalk)で書かれたものです。もう一つはWebブラウザー(もしくはAdobe AIRによるオフライン環境)で動作する2.0です。2.0はRaspberry Piでは使えないので、1.4を使う事になります。

33

音楽の演奏も可能

Page 35: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

Minecraft Pi で子どもの興味を引く

Raspberry PiにはMinecraft Piという3Dゲームのようなものが入っています。この中では地面を数百メートルも掘ったり、空を飛べたり、海の中に潜ったりと色々な事が出来ます。家を建てたり、塔を立てたり、広大な地下迷宮を作ったりも出来ます。(うちの子は地下室を作るのが好きみたいです)

重要な事は、このゲームはScratchやPythonから操作ができる事です。最初は手作業でブロックを1つずつ積むのでしょうが、手作業では作業が大変です。プログラムなら、雲の上まで続く塔を立てるのは、たった数行記述するだけで実現できます。広大な地下迷宮も、プログラムなら簡単でしょう。

34

Page 36: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

Raspberry Piに興味を持ってもらう方法(案)

ワークショップに連れて行く子どもたちの集団心理を利用します。子どもは同世代の子どもたちと遊ぶと、非常に活き活きと活動します。Raspberry PiやScratchやMinecraft Piのワークショップが時々開催されているみたいなので、それに参加させると良さそうです。

その子に「所有」させるRaspberry Piを自分のものと認識させて、所有させます。そして、なるべく好きに遊ばせたり、一緒に遊んだりするようにします。できるだけ、目の届く範囲で遊んで欲しいので、親としてはテレビに出力して、一緒に画面を見たいです。

「凄いの作って!」と言ってみる「なんでも良いので、これで凄いの作ってみて!」と時々言ってみようかと思っています。体系的に教えるのは最後にしようと思います。

35

うちの子がどこまで興味をもつのか、今はよく分からずにいます。うちの子の場合、5歳になったばかりですが、いま興味を持っているのは以下の様なことです。まだプログラミングは出来ません。

・LEDを光らせるのは好き!全部光らせたい!・モーターを回らせるのは好き!スイッチ2つ同時押しで回らせるのが好き!・Minecraft Piで地面を掘ること。・ロボットが動くのを見ているのは好き!ロボットが好き!・100均で買った車のおもちゃをラジコン化してあげたら、大反応!

将来的にRaspberry Piを触る中で、算数や数学や科学の基礎を身に付けて行って欲しいなと、親としては願っています。

Page 37: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 36

補足1

Page 38: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

小さな飛行機やクアッドコプターを作りたい人へ

TWE-Liteという、おはじきくらいの大きさのチップがあります。このチップは無線が組み込まれていて、リモートから指示が出せるようになっています。

消費電力が低く、ボタン電池1個でも動きます。

32bit CPUと32KBのメモリーも内蔵です。

GPIO, PWM, I2C, SPI などがRaspberry Piと同じように扱えます。

これだけ入って、重量は1グラム程度です。

小さな飛行機や小さなクアッドコプターを作りたい人は、Raspberry Pi自体のの重量が問題になるはずなので、このような選択肢があるということです。値段は1700円くらいです。

もっと安く済ます方法としては、PICマイコンを使う方法もあります。大小さまざまな物が売られてます。安いものは50円程度で入手できます。これらもプログラムを記述でき、GPIOピンが付いています。PICマイコンの場合、通信方式を考える必要がありますが、テレビのリモコンのように、赤外線を使う人が多いようです。安くて軽くて、手軽です。

37

Page 39: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

初期セットアップと、sshとtightvncserverの設定

RaspbianのセットアップRaspbianは、http://www.raspberrypi.org/downloads/ からダウンロード可能です。ダウンロードしたら、Win32DiskImagerなんかを使ってmicroSDカードに焼いて、Raspberry Piを起動します。(参照: http://www.raspberrypi.org/documentation/installation/installing-images/README.md)

起動したら、raspi-configという設定画面が出るので、色々設定します。また、ネットワークの設定も行います。このあたりの設定には画面が必要なので、HDMIケーブル経由で画面をテレビかディスプレイかプロジェクターに映しながら操作します。

sshのセットアップ(必要があれば)raspi-configから、Advanced Optionsに行き、SSHをONにすると使えるようになります。

tightvncserverのセットアップ(必要があれば)Raspberry Piのコンソールで「sudo apt-get install tightvncserver」と打つと、Raspberry Pi側にtightvncserverが入ります。tightvncserverを起動すれば、Raspberry Piのデスクトップ環境にVNC接続出来るようになります。VNCクライアントは何でもよいのですが、TightVnc Viewerというものがあるのでそれを使うのが良さそうです。

38

Page 40: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

Raspberry PiのGPIOライブラリーをpigpioに決めるまでの紆余曲折Raspberry PiでPWMを正常に動作させようと色々試した結果、pigpioに最終的に落ち着きました。試してみたのは以下のライブラリーたち。

RPi.GPIO ← とっても有名。本には必ず登場します。LEDをPWMでゆっくり明るさを調整する程度のPWMであればうまく制御できましたが、サーボモーターを制御しようとすると、PWMの不正確さが表に出てきてしまい、jitterが発生しました。また、sinカーブにそってスムーズにサーボを首振りしようとしても、かなりぎくしゃくした動きしかしませんでした。

RPIO.PWM.Servo ← Pythonだけで制御する場合、RPi.GPIOよりも高い性能が出ると言われています。RPIOに付属するサーボ制御用のライブラリーですが、これもうまくサーボを制御出来ませんでした。ある位置に静止しておく程度の制御であれば、RPi.GPIOよりも綺麗に静止してくれますが、sinカーブにそって首振りしようとすると、毎回リセットがかかったような変な動きをします。

RPIO.PWMこれのadd_channel_pulseを用いれば、GPIOのピン数が許す限りの複数のサーボモーターを綺麗に制御できました。sinカーブにもかなり綺麗にそった動きをしてくれます。しかし、一方でLEDの明滅をゆっくり制御しようとすると、これがうまくいきません。突然変なタイミングで一瞬明るくフラッシュします。サーボがうまく制御できるのに、LEDの明滅がうまく行かないなんて・・・。

ServoBlaster ← 高度なソフトウエアPWM方式を最初に実装したソフトウエアですServoBlasterを使えばとてもうまくサーボが制御できました。ただし、ServoBlasterのメンテナンスは1年前から止まってしまっているみたいで、たとえばRapberry Pi B+のピン配列をサポートしていないように見えました。そのため、ピンのマッピング部分のソースコードを自分で修正する必要がありました。

pi-blasterServoBlasterの派生(おそらくフォーク)だと思います。こちらは9ヶ月前までメンテナンスされていた形跡がありました。入出力方式はServoBlasterと同じで、/dev/pi-blasterに書き込む形みたいです。このpi-blasterは実際には試していません。ServoBlasterと中身は同じはずです。試す前にpigpioが見付かりました。

pigpio ← ServoBlasterの良い所を取り入れつつ、全く新たに設計されたものpigpioは、現在でも活発にメンテされているライブラリーです。数日前にもメンテナンスされた形跡がありました。おそらく今後はこれが今後しばらくメインストリームになる気がします。PWMの制御方法は、DMAとPWMもしくはPCMを組み合わせたもので、精度の高い方式を使っています。また、ソフトウエアの構成はServoBlasterなどと同じくデーモン方式です。ServoBlasterなどと異なり、デバイスファイル経由のアクセスだけではなく、TCP/IP経由のアクセスも許しているために、PC側のプログラムからpigpioデーモンと会話可能になっています。pigpioは、PWMだけではなく、GPIOの入出力制御(トリガー含む)やI2CやSPIなんかも扱えるので、GPIOがらみの制御は全部出来てしまう感じです。

39

Page 41: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 40

補足2:PIDコントロールについて

Page 42: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

PIDコントロールとは

身近なPIDコントロールの例は、エアコンの制御です。エアコンは温度センサーの情報をもとに、どれだけコンプレッサーを回すかを決めます。この際、制御がうまく行っていないと、たとえば寒くなったり暑くなったりを繰り返すという不快な制御になってしまいます。もしくは、いつまで経っても暑いままだったりもします。このように、ある目標値(エアコンの場合は温度)に対して、うまく機械を制御する方法がPIDコントロールです。

たとえばロボットカーの場合、内部で走行ラインの計画が終わった後、いよいよロボットカーはステアリングの舵角を決定したり、アクセルやブレーキを調整したりします。以降、単純化のため、ステアリングの舵角のみに焦点をあてて説明します。

ステアリングの舵角は、PIDコントロール(proportional-integral-derivative control)という方法で決定します。もともとは船の自動操舵方法として発展したもののようです。

41

走りたい走行ライン

走行ラインに戻るためには、右に打を切ったほうが良い。でもどのくらい切ればいいんだろう?

Page 43: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

PIDコントロール: Pコントロール

Pコントロールを説明するために、まずCTE(cross tracking error)の説明をします。CTEとは、走りたい走行ラインから車がどれだけ離れているかを測定した距離情報です。走行ラインの真上をちゃんと走行している場合はCTEはゼロです。もしも走行ラインの左を走っている場合は正の値となり、走行ラインの右を走っている場合は負の値となります。

Pコントロールの考え方は単純で、CTEに比例した量だけ右に打を切れば、走行ラインに戻る方向に打を切れるという理屈になります。なお、PコントロールのPは比例(proportional)の意味です。

CTEがゼロの場合は打を切らない CTEが正(走行ラインの左側)の場合はCTEが大きいほど大きく打を右に切る CTEが負(走行ラインの右側)の場合はCTEが大きいほど大きく打を左に切る

ただ、実際にはPコントロールだけでは、走行ラインを中心に蛇行してしまいます。あたかも走行ラインを中心に振動しているような振る舞いになります。

42

走行ラインに戻るためには、CTEに比例した量だけ、右に打を切ったほうが良い。=Pコントロール

走りたい走行ラインから車がどれだけ離れているかはCTE(cross tracking error)と呼ばれます。

走りたい走行ライン

走りたい走行ライン

CTE

走行結果

舵角 = 𝑎 ∙ CTE(aは定数)

Page 44: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

PIDコントロール: PDコントロール

Pコントロールだけを使うと、走行ラインを中心に蛇行してしまいます。この蛇行を抑制するために、Dコントロールという制御を追加します。Dはderivative(微分)のDです。Dコントロールを理解するために、まず⊿CTEを説明します。

⊿CTEはCTEの変化量です。たとえば⊿t時間前の前回のCTEの値がCTE1で、再度CTEを測定した際の値がCTE2だった場合、⊿CTE=CTE2 - CTE1となります。

⊿CTE/⊿tは以下の様な意味を持ちます。 ⊿CTE/⊿tがゼロの場合、車は走行ラインと平行に走っています。 ⊿CTE/⊿tが正の場合、どんどん左にそれています。よって、それだけ打を右に切る必要があります。 ⊿CTE/⊿tが負の場合、どんどん右にそれています。よって、それだけ打を左に切る必要があります。

PDコントロールでは、この⊿CTEに比例した量だけの舵角をPコントロールに加えて補正します。そうすると、なめらかに走行ラインに沿うようになります。

43

走りたい走行ライン

CTE1 CTE2

⊿CTE = CTE2 - CTE1

走りたい走行ライン

舵角 = 𝑎 ∙ CTE + 𝑏 ∙⊿CTE

⊿t(a, bは定数)

Page 45: 「Raspberry pi」勉強会 2015.03.20

ULS Copyright © 2015 UL Systems, Inc. All rights reserved.

PIDコントロール: PIDコントロール

完全な世界であればPDコントロールだけでもうまく機能するかもしれませんが、実際にはもう一つ解決しなければならない問題があります。それは「機械的な狂い」です。たとえば車のホイールの取り付け角などが若干悪く、ステアリングを切ってなくても左へ左へと曲がってしまう場合があります。このような機械的な狂いがある場合、PDコントロールだけではうまく走行ラインに乗せられません。

機械的な狂いの問題を解消するため、PDコントロールに加え、Iコントロールというものを追加します。Iはintegralの略で、積分という意味です。Iコントロールでは、移動の開始以降に測定したすべてのCTEの量を累積し、その累積量に比例した量で舵角を補正します。

44

[極端なドリフトの例]舵角をゼロに保った状態でもホイールの向きがもともと曲がったりしていて、旋回してしまう。 走行ライン

ドリフトがあると、走行ラインにうまく乗らない

走行ライン

舵角 = 𝑎 ∙ CTE + 𝑏 ∙⊿CTE

⊿t+ 𝑐 ∙ CTE

(a, b, cは定数)

PIDコントロールによる舵角の決定

[参考]PIDコントロールの定数項a,b,cは、最適な値を見付けるためにTwiddleという方法を用います。