SlideShare a Scribd company logo
1 of 45
Download to read offline
ウルシステムズ株式会社
http://www.ulsystems.co.jp
mailto:info@ulsystems.co.jp
Tel: 03-6220-1420 Fax: 03-6220-1402
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
「Raspberry Pi」勉強会
2015/3/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
ソフト
ウエア
ハード
ウエア ロボット
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
Raspberry Piで動かせる(はず)のロボットたち
 Raspberry Piがあれば、様々なロボットを自分で作ったソフトウエアで制御出来ます。
2
← こんなローバーは、左右の車輪に別々のモーターを
付け、それらのモーターの回転を個別に制御すれば
簡単に進む方向を変えたり出来ます。(戦車と同じ)
漫画やアニメの「宇宙兄弟」を観た人は、
こんなローバーに見覚えがあるはず。
← ラジコンカーの制御も、DCモーターやサーボモーターの
制御が出来てしまえばロボットに出来ます。
ラジコンのように、もともと制御系が半分出来ている
ものは、ロボットにしやすいです。
← 人型ロボットの制御は、サーボモーターの制御さえ
出来れば、ひとまず動作させることは可能です。
ただし、バランスを取って動くようにするための、
制御ソフトは複雑になります。
結局のところ、Raspberry Piがあれば、これらのおもちゃをソフトウエア
的に制御する所までは、ある程度簡単に到達できます。
なお、ハードの設計をゼロからするより、既成品のおもちゃを買ってきて
改造したほうが簡単な場合が多いかもしれません。既成品のデメリットと
しては、想定外の制御方式となっていた場合、分からず、悩むことです。
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
(電気仕掛けのスイッチ)
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
ブレッドボードとは
 ブレッドボードとは、以下のように前もって配線されている基盤です。このボードに、各
種電子部品を差し込んでいくことで、ハンダ付けすることなく、素早く回路を組み上げて
試すことが可能になります。部品を差しこむだけなので、とても簡単です。
 なお、ブレッドボードは回路のプロトタイプを作る際に使うものなので、実際に運用する
段階では通常使いません。実際に運用する段階では、ユニバーサル基板やストリップボー
ドにハンダ付けを伴う作業を経て、しっかりと電子部品を固定します。
4
結線省略
結線省略
ユニバーサル基板 ストリップボード
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
Raspberry PiなしでLEDを光らせてみる
(LEDとブレッドボードの練習)
 以下のように回路を組めば、LEDは光ります。電球と似てます。
 いくつものLEDを直列に繋いで光らせてみたり、並列に繋いで光らせてみたり。
5
1KΩの抵抗を挟んでいるのは、LEDに過度な電流が流れてし
まわないためです。このような抵抗は色々な局面で出てきま
す。
このような抵抗をどういった考えで挟むかですが、考え方と
しては、回路上に登場するすべての電子部品の持つ、「最大
電圧」や「最大電流」を超えないようにするのが基本となり
ます。過度な負荷をかけると、Raspberry Piを含め、過負荷
がかかった部品が壊れてしまいます。
電子回路の鉄則
電子部品の「最大電圧」や「最大電流」を超えないようにするこ
と!よく分からなかったら、1KΩか10KΩくらいの抵抗をとりあ
えず付けてみて電気を流すといいかも。
直列 並列
←
光らない
(電圧不足)
←
光る
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
Raspberry PiなしでDCモーターをスイッチでON/OFFする
 回路Aのように組めば、DCモーターは回ります。
回路Bのように組むと、スイッチでモーターのON/OFFを制御できるようになります。この
ようなタイプのスイッチ(タクタイルスイッチ)は、押している間だけ通電します。
6
<回路A(スイッチ無し)> <回路B(スイッチ付き)>
<スイッチ>
緑色の線は、いつ
も繋がっています。
オレンジ色の線も、
いつも繋がってい
ます。
ボタンを押すと、
全部が繋がります。
ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 7
Raspberry Pi
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
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を使う事が推奨されているため、Pytho
nを使ったほうが有利です。Pythonを使えばRaspberry Pi用のライブラリーが充実してい
ますし、沢山の人がWebで情報を提供しています。
9
 ちなみに私の感覚では
Python以外では以下の言語の
利用が多いと感じました。
・C言語
・Scratch(左の写真)
 C言語はハードウエア制御が
しやすいという理由で使われ
ているのだと思います。
 Scratchは小中学校の生徒が
主に使っています。Scratch
はSqueak(Smalltalk)で書か
れています。ハードウエア制
御も一応出来ます。
ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 10
LEDの点灯を
Raspberry Piで制御
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の電圧がかかってい
るかを読み取ることが出来ます。
I2C
USBみたいな役割のピンです。センサーなどを複
数繋げることが出来ます。
SPI
USBみたいな役割のピンです。センサーなどを複
数繋げることが出来ます。
UART シリアル通信用のピンです。
EEPROM add-onボードの自動設定用ピンです。
GND
マイナス極です。ground、グランド、アースなどとも
呼ばれます。
5V電源 プラス極です。5Vの電圧がかかっています。
3.3V電源 プラス極です。3.3Vの電圧がかかっています。
GPIOの現在の状態を表示する有名なコマンドとして、WiringP
iが提供する「gpio」というコマンドがあります。左の表示は
「gpio readall」を実行した結果です。このgpioコマンドでピ
ンの電圧を上げ下げする事も可能です。
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の一部なので、表示上出てきます。
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
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番を指定します。
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', 'da
ylight', 'gmtime', 'localtime', 'mktime', 'sleep', 'strftime', 'strptime', 'struct_time', 'time',
'timezone', 'tzname']
>>> help(time)
Help on built-in module time:
NAME
time - This module provides various functions to manipulate time values.
FILE
(built-in)
DESCRIPTION
There are two standard representations of time. One is the number
of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer
or 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)
ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 16
ソフトウエアでLEDを徐々に
明るくしたり暗くしたりする
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
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
ソフトウエア制御でLEDを徐々に明るくしたり暗くしたりする(ソースコード)
 pigpioライブラリーを用いると、PWMを簡単に生成することが可能です。以下に配線とソースコードを
載せます。ソースコードの内容は、sinカーブにしたがって、ゆっくりとLEDの明るさを変えるものにな
っています。
18
ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 19
ソフトウエアでモーターを制御する
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円くらい
gate
drain
source
ピンの
種類
意味 (Nチャンネルの場合)
gate
GPIOを繋げます。このピンへ与える電
圧がスイッチのON/OFFを意味します。
drain
gateに電圧がかかると、drainから
sourceへと電流が流れます。
source マイナス極に繋ぎます
※ PチャンネルMOSFETの場合、sourc
eをプラス極に繋ぎます。電流はsource
からdrainに流れます。
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
Nチャンネル パワーMOSFETを用いたモーターの制御例
 以下のようにRaspberry Piに配線することにより、GPIOでモーターの回転を制御できます。PWMを使
うと、回転数も変更可能です。この制御に使うソースコードとしては、LEDをsinカーブにそって明るく
したり暗くしたりするソースコードがそのまま使えます。
21
パワーMOSFETは大電力のモーターを簡単に扱える一方、モーターの逆回転やブレ
ーキ制御など、より細かな制御をしようとすると他の工夫が必要になってきます。
このような細やかな制御をしたい場合は、モータードライバーを使うのが手っ取り
早い方法となります。ラジコンカーみたいなものはこれを使ったほうが楽です。
モータードライバー
ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 22
ラジコンサーボの制御
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
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
サーボを制御する回路例
 以下にサーボを制御する回路の例を載せます。注意事項としては、サーボ用の電源はDCモ
ーターの時と同じく、Raspberry Piからではなく別の電源から取得します。そうしないと、
Raspberry Piの中を大きな電流が流れてしまって、Raspberry Piが壊れてしまうためです。
24
この↑ロボットは17個のサーボを使います。Raspberry Piは最大で26本のGPIO
ピンを制御可能なので、このロボットの全身のサーボを同時に制御可能です。
ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 25
加速度センサーを使う
(I2Cを使ってみる)
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
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によって、レジスターの中身は
読み書き可能となっている。
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
加速度センサー情報をレジスターのどこから読めばよいかを
データシートから読み取る
 MPU-6050のデータシートによると、以下のアドレスに加速度や温度やジャイロの情報が
リードオンリーで存在することが分かります。
よって、この情報をI2Cを使って、たとえば「アドレス 0x3B から1バイト取得」すると、
X軸方向の加速度情報の16bitのうち上位8bitが取得出来ます。
28
加速度セン
サーのXYZ
方向の情報
温度
XYZ方向そ
れぞれの
ジャイロ
注:このデータシートの表は3ページに渡って記述があります。この表は抜粋です。
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
加速度センサーからの情報をPythonからダンプしてみる
 加速度センサーからの情報をPythonからダンプするコードは以下のようになります。デー
タは2バイト1組のsignedワードで来るので、実際には以下に示すto_signed_word関数の
ようなものを作り、デコードしてあげる必要があります。
29
ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 30
どうやってロボットを作るの?
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
ロボットの制御
31
行動計画の
立案
(結構得意)
計画した
動作を実行
誤差が発生
状況把握
誤差を修正
ロボットの思考と
行動のサイクル
 ロボットの制御は、典型的には以下の様なサイクルを無限ループで回します。
状況把握にはセンサーを使いま
す。
複数のセンサー情報を組み合
わせ、それらの情報から、外部
の世界の「イメージ」をプログラム
内に持ちます。
実際の外部の世界と、ロボット
の持つ内部イメージが可能な限
り合えば合うほど、ロボットの制
御はうまく行きます。
実際にモーターを動かしたりサー
ボを動かしたりします。
モーターにどの程度電流を流す
べきかや、サーボの角度をどうす
べきかを決めるロジックが必要に
なります。
この際、よく用いられるのはPIDコ
ントロールという手法です。
補足2にて説明を記載しました。
現実世界と脳内と
の齟齬が拡大して
しまうフェーズ
現実世界と脳内
との齟齬を修正で
きる唯一のタイミン
グ
状況をどう変えたいかを考えま
す。
たとえば壁にぶつかりそうなので
あれば、右か左に回避するとか、
2足歩行ロボットが倒れそうなの
であれば右足を出すとかです。
ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 32
子どものための
Raspberry Pi
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
音楽の演奏も可能
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
Minecraft Pi で子どもの興味を引く
 Raspberry PiにはMinecraft Piという3Dゲームのようなものが入っています。この中では地面を数百メ
ートルも掘ったり、空を飛べたり、海の中に潜ったりと色々な事が出来ます。家を建てたり、塔を立て
たり、広大な地下迷宮を作ったりも出来ます。(うちの子は地下室を作るのが好きみたいです)
 重要な事は、このゲームはScratchやPythonから操作ができる事です。最初は手作業でブロックを1つ
ずつ積むのでしょうが、手作業では作業が大変です。プログラムなら、雲の上まで続く塔を立てるのは、
たった数行記述するだけで実現できます。広大な地下迷宮も、プログラムなら簡単でしょう。
34
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を触る中で、算数や数学や科学の基礎を身に付けて行って欲し
いなと、親としては願っています。
ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 36
補足1
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
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
初期セットアップと、sshとtightvncserverの設定
 Raspbianのセットアップ
Raspbianは、http://www.raspberrypi.org/downloads/ からダウンロード可能です。ダ
ウンロードしたら、Win32DiskImagerなんかを使ってmicroSDカードに焼いて、Raspber
ry 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」と打つと、Raspber
ry Pi側にtightvncserverが入ります。tightvncserverを起動すれば、Raspberry Piのデス
クトップ環境にVNC接続出来るようになります。VNCクライアントは何でもよいのですが、
TightVnc Viewerというものがあるのでそれを使うのが良さそうです。
38
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-blaster
ServoBlasterの派生(おそらくフォーク)だと思います。こちらは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
ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 40
補足2:PIDコントロールについて
ULS Copyright © 2015 UL Systems, Inc. All rights reserved.
PIDコントロールとは
 身近なPIDコントロールの例は、エアコンの制御です。エアコンは温度センサーの情報をもとに、どれだ
けコンプレッサーを回すかを決めます。この際、制御がうまく行っていないと、たとえば寒くなったり
暑くなったりを繰り返すという不快な制御になってしまいます。もしくは、いつまで経っても暑いまま
だったりもします。このように、ある目標値(エアコンの場合は温度)に対して、うまく機械を制御す
る方法がPIDコントロールです。
 たとえばロボットカーの場合、内部で走行ラインの計画が終わった後、いよいよロボットカーはステア
リングの舵角を決定したり、アクセルやブレーキを調整したりします。以降、単純化のため、ステアリ
ングの舵角のみに焦点をあてて説明します。
 ステアリングの舵角は、PIDコントロール(proportional-integral-derivative control)という方法で決定
します。もともとは船の自動操舵方法として発展したもののようです。
41
走りたい
走行ライン
走行ラインに戻るためには、
右に打を切ったほうが良い。
でもどのくらい切ればいいんだろう?
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は定数)
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は定数)
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という方法を用います。

More Related Content

What's hot

10分でわかるPythonの開発環境
10分でわかるPythonの開発環境10分でわかるPythonの開発環境
10分でわかるPythonの開発環境Hisao Soyama
 
久しぶりのPythonでgoogleのアレを制御してみた
久しぶりのPythonでgoogleのアレを制御してみた久しぶりのPythonでgoogleのアレを制御してみた
久しぶりのPythonでgoogleのアレを制御してみたShohei Tai
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようKenji NAKAGAKI
 
Raspberry Pi勉強会(後編)-京大機械研究会
Raspberry Pi勉強会(後編)-京大機械研究会Raspberry Pi勉強会(後編)-京大機械研究会
Raspberry Pi勉強会(後編)-京大機械研究会Naoki Matsumoto
 
これから Raspberry Pi をいじる方向けの資料 20130616版
これから Raspberry Pi をいじる方向けの資料 20130616版これから Raspberry Pi をいじる方向けの資料 20130616版
これから Raspberry Pi をいじる方向けの資料 20130616版Michiya Tominaga
 
簡単に楽しくはじめよう!Raspberry Pi入門
簡単に楽しくはじめよう!Raspberry Pi入門簡単に楽しくはじめよう!Raspberry Pi入門
簡単に楽しくはじめよう!Raspberry Pi入門Akira Ouchi
 
Javascriptを書きたくないヒ トのためのPythonScript
Javascriptを書きたくないヒ トのためのPythonScriptJavascriptを書きたくないヒ トのためのPythonScript
Javascriptを書きたくないヒ トのためのPythonScriptKazufumi Ohkawa
 
楽しく使おう・始めよう!Raspberry Pi入門〜実践編〜
楽しく使おう・始めよう!Raspberry Pi入門〜実践編〜楽しく使おう・始めよう!Raspberry Pi入門〜実践編〜
楽しく使おう・始めよう!Raspberry Pi入門〜実践編〜Akira Ouchi
 
RaspberryPi を持ち運びパソコンとして使いたい
RaspberryPi を持ち運びパソコンとして使いたいRaspberryPi を持ち運びパソコンとして使いたい
RaspberryPi を持ち運びパソコンとして使いたいKenichiro MATOHARA
 
BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3Atsushi Odagiri
 
パッケージングの今と未来
パッケージングの今と未来パッケージングの今と未来
パッケージングの今と未来Atsushi Odagiri
 
Pythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクターPythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクターRansui Iso
 
Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門Takayuki Shimizukawa
 
配布用Raspberry pi+arduino+scratchでフィジカルコンピューティング体験!
配布用Raspberry pi+arduino+scratchでフィジカルコンピューティング体験!配布用Raspberry pi+arduino+scratchでフィジカルコンピューティング体験!
配布用Raspberry pi+arduino+scratchでフィジカルコンピューティング体験!Kazuhiro Abe
 
PYNQで○○してみた!
PYNQで○○してみた!PYNQで○○してみた!
PYNQで○○してみた!aster_ism
 
Hubotを使ってbotをつくろう!
Hubotを使ってbotをつくろう!Hubotを使ってbotをつくろう!
Hubotを使ってbotをつくろう!Daisuke Kikuchi
 
Raspberry PiとPdでオリジナルのシンセを作る
Raspberry PiとPdでオリジナルのシンセを作るRaspberry PiとPdでオリジナルのシンセを作る
Raspberry PiとPdでオリジナルのシンセを作るChikashi Miyama
 

What's hot (20)

10分でわかるPythonの開発環境
10分でわかるPythonの開発環境10分でわかるPythonの開発環境
10分でわかるPythonの開発環境
 
久しぶりのPythonでgoogleのアレを制御してみた
久しぶりのPythonでgoogleのアレを制御してみた久しぶりのPythonでgoogleのアレを制御してみた
久しぶりのPythonでgoogleのアレを制御してみた
 
Windowsにpythonをインストールしてみよう
WindowsにpythonをインストールしてみようWindowsにpythonをインストールしてみよう
Windowsにpythonをインストールしてみよう
 
Raspberry Pi勉強会(後編)-京大機械研究会
Raspberry Pi勉強会(後編)-京大機械研究会Raspberry Pi勉強会(後編)-京大機械研究会
Raspberry Pi勉強会(後編)-京大機械研究会
 
rpi_handson_1
rpi_handson_1rpi_handson_1
rpi_handson_1
 
これから Raspberry Pi をいじる方向けの資料 20130616版
これから Raspberry Pi をいじる方向けの資料 20130616版これから Raspberry Pi をいじる方向けの資料 20130616版
これから Raspberry Pi をいじる方向けの資料 20130616版
 
簡単に楽しくはじめよう!Raspberry Pi入門
簡単に楽しくはじめよう!Raspberry Pi入門簡単に楽しくはじめよう!Raspberry Pi入門
簡単に楽しくはじめよう!Raspberry Pi入門
 
Javascriptを書きたくないヒ トのためのPythonScript
Javascriptを書きたくないヒ トのためのPythonScriptJavascriptを書きたくないヒ トのためのPythonScript
Javascriptを書きたくないヒ トのためのPythonScript
 
楽しく使おう・始めよう!Raspberry Pi入門〜実践編〜
楽しく使おう・始めよう!Raspberry Pi入門〜実践編〜楽しく使おう・始めよう!Raspberry Pi入門〜実践編〜
楽しく使おう・始めよう!Raspberry Pi入門〜実践編〜
 
RaspberryPi を持ち運びパソコンとして使いたい
RaspberryPi を持ち運びパソコンとして使いたいRaspberryPi を持ち運びパソコンとして使いたい
RaspberryPi を持ち運びパソコンとして使いたい
 
BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3BPStudy#54 そろそろPython3
BPStudy#54 そろそろPython3
 
パッケージングの今と未来
パッケージングの今と未来パッケージングの今と未来
パッケージングの今と未来
 
第1回python勉強会
第1回python勉強会第1回python勉強会
第1回python勉強会
 
Pythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクターPythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクター
 
210728 mpy
210728 mpy210728 mpy
210728 mpy
 
Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門Pythonスタートアップ勉強会201109 python入門
Pythonスタートアップ勉強会201109 python入門
 
配布用Raspberry pi+arduino+scratchでフィジカルコンピューティング体験!
配布用Raspberry pi+arduino+scratchでフィジカルコンピューティング体験!配布用Raspberry pi+arduino+scratchでフィジカルコンピューティング体験!
配布用Raspberry pi+arduino+scratchでフィジカルコンピューティング体験!
 
PYNQで○○してみた!
PYNQで○○してみた!PYNQで○○してみた!
PYNQで○○してみた!
 
Hubotを使ってbotをつくろう!
Hubotを使ってbotをつくろう!Hubotを使ってbotをつくろう!
Hubotを使ってbotをつくろう!
 
Raspberry PiとPdでオリジナルのシンセを作る
Raspberry PiとPdでオリジナルのシンセを作るRaspberry PiとPdでオリジナルのシンセを作る
Raspberry PiとPdでオリジナルのシンセを作る
 

Similar to 「Raspberry pi」勉強会 2015.03.20

WWCT ラズパイ Bluemix 講習資料
WWCT ラズパイ Bluemix 講習資料WWCT ラズパイ Bluemix 講習資料
WWCT ラズパイ Bluemix 講習資料Masaya Fujita
 
ぼちぼちぼっち開発 With raspberry pi アイデアソン 20141019
ぼちぼちぼっち開発 With raspberry pi アイデアソン 20141019ぼちぼちぼっち開発 With raspberry pi アイデアソン 20141019
ぼちぼちぼっち開発 With raspberry pi アイデアソン 20141019catmoney
 
教室にスーパーコンピュータを
教室にスーパーコンピュータを教室にスーパーコンピュータを
教室にスーパーコンピュータをkimio kosaka
 
Raspberry Pi しかないときのIoTハンズオンチュートリアル
Raspberry Pi しかないときのIoTハンズオンチュートリアルRaspberry Pi しかないときのIoTハンズオンチュートリアル
Raspberry Pi しかないときのIoTハンズオンチュートリアルKohei Nishikawa
 
ロボットシステム学2015年第7回
ロボットシステム学2015年第7回ロボットシステム学2015年第7回
ロボットシステム学2015年第7回Ryuichi Ueda
 
Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Kazuo Asano (@kazuo_asa)
 
Singularityで分散深層学習
Singularityで分散深層学習Singularityで分散深層学習
Singularityで分散深層学習Hitoshi Sato
 
A security study on Raspberry pi version 0.2
A security study on Raspberry pi version 0.2A security study on Raspberry pi version 0.2
A security study on Raspberry pi version 0.2Kiyoshi Ogawa
 
Lambda(Python)のデプロイについて考えたというか作った
Lambda(Python)のデプロイについて考えたというか作ったLambda(Python)のデプロイについて考えたというか作った
Lambda(Python)のデプロイについて考えたというか作ったTerui Masashi
 
機械学習プロジェクトにおける Cloud AI Platform の使い方 (2018-11-19)
機械学習プロジェクトにおける Cloud AI Platform の使い方 (2018-11-19)機械学習プロジェクトにおける Cloud AI Platform の使い方 (2018-11-19)
機械学習プロジェクトにおける Cloud AI Platform の使い方 (2018-11-19)Yaboo Oyabu
 
Morinezumiiii 20150425-bluetooth
Morinezumiiii 20150425-bluetoothMorinezumiiii 20150425-bluetooth
Morinezumiiii 20150425-bluetoothAmuro Nishizawa
 
I2CでRaspberry Piから 複数の周辺機器を制御する
I2CでRaspberry Piから複数の周辺機器を制御するI2CでRaspberry Piから複数の周辺機器を制御する
I2CでRaspberry Piから 複数の周辺機器を制御するHirokazu Nishio
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますinfinite_loop
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングRansui Iso
 
Raspberrypitraining20171027
Raspberrypitraining20171027Raspberrypitraining20171027
Raspberrypitraining20171027Kiyoshi Ogawa
 
High performance python computing for data science
High performance python computing for data scienceHigh performance python computing for data science
High performance python computing for data scienceTakami Sato
 
Lpicl300セミナー資料_20170218(鯨井貴博)
Lpicl300セミナー資料_20170218(鯨井貴博)Lpicl300セミナー資料_20170218(鯨井貴博)
Lpicl300セミナー資料_20170218(鯨井貴博)Takahiro Kujirai
 

Similar to 「Raspberry pi」勉強会 2015.03.20 (20)

WWCT ラズパイ Bluemix 講習資料
WWCT ラズパイ Bluemix 講習資料WWCT ラズパイ Bluemix 講習資料
WWCT ラズパイ Bluemix 講習資料
 
ぼちぼちぼっち開発 With raspberry pi アイデアソン 20141019
ぼちぼちぼっち開発 With raspberry pi アイデアソン 20141019ぼちぼちぼっち開発 With raspberry pi アイデアソン 20141019
ぼちぼちぼっち開発 With raspberry pi アイデアソン 20141019
 
教室にスーパーコンピュータを
教室にスーパーコンピュータを教室にスーパーコンピュータを
教室にスーパーコンピュータを
 
Raspberry Pi しかないときのIoTハンズオンチュートリアル
Raspberry Pi しかないときのIoTハンズオンチュートリアルRaspberry Pi しかないときのIoTハンズオンチュートリアル
Raspberry Pi しかないときのIoTハンズオンチュートリアル
 
ロボットシステム学2015年第7回
ロボットシステム学2015年第7回ロボットシステム学2015年第7回
ロボットシステム学2015年第7回
 
Pythonでゲーム作る
Pythonでゲーム作るPythonでゲーム作る
Pythonでゲーム作る
 
Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6Starting qt5beta at_raspberry_pi Qtnagoya#6
Starting qt5beta at_raspberry_pi Qtnagoya#6
 
Singularityで分散深層学習
Singularityで分散深層学習Singularityで分散深層学習
Singularityで分散深層学習
 
A security study on Raspberry pi version 0.2
A security study on Raspberry pi version 0.2A security study on Raspberry pi version 0.2
A security study on Raspberry pi version 0.2
 
mruby os(案)の開発
mruby os(案)の開発mruby os(案)の開発
mruby os(案)の開発
 
Lambda(Python)のデプロイについて考えたというか作った
Lambda(Python)のデプロイについて考えたというか作ったLambda(Python)のデプロイについて考えたというか作った
Lambda(Python)のデプロイについて考えたというか作った
 
機械学習プロジェクトにおける Cloud AI Platform の使い方 (2018-11-19)
機械学習プロジェクトにおける Cloud AI Platform の使い方 (2018-11-19)機械学習プロジェクトにおける Cloud AI Platform の使い方 (2018-11-19)
機械学習プロジェクトにおける Cloud AI Platform の使い方 (2018-11-19)
 
Morinezumiiii 20150425-bluetooth
Morinezumiiii 20150425-bluetoothMorinezumiiii 20150425-bluetooth
Morinezumiiii 20150425-bluetooth
 
Ladder of cqrs+es
Ladder of cqrs+esLadder of cqrs+es
Ladder of cqrs+es
 
I2CでRaspberry Piから 複数の周辺機器を制御する
I2CでRaspberry Piから複数の周辺機器を制御するI2CでRaspberry Piから複数の周辺機器を制御する
I2CでRaspberry Piから 複数の周辺機器を制御する
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
 
Raspberrypitraining20171027
Raspberrypitraining20171027Raspberrypitraining20171027
Raspberrypitraining20171027
 
High performance python computing for data science
High performance python computing for data scienceHigh performance python computing for data science
High performance python computing for data science
 
Lpicl300セミナー資料_20170218(鯨井貴博)
Lpicl300セミナー資料_20170218(鯨井貴博)Lpicl300セミナー資料_20170218(鯨井貴博)
Lpicl300セミナー資料_20170218(鯨井貴博)
 

More from Minoru Chikamune

有名論文から学ぶディープラーニング 2016.03.25
有名論文から学ぶディープラーニング 2016.03.25有名論文から学ぶディープラーニング 2016.03.25
有名論文から学ぶディープラーニング 2016.03.25Minoru Chikamune
 
「機械学習 By スタンフォード大学」勉強会 2015.09.11
「機械学習 By スタンフォード大学」勉強会 2015.09.11「機械学習 By スタンフォード大学」勉強会 2015.09.11
「機械学習 By スタンフォード大学」勉強会 2015.09.11Minoru Chikamune
 
「Googleを支える技術」の解説 2010.08.23
「Googleを支える技術」の解説 2010.08.23「Googleを支える技術」の解説 2010.08.23
「Googleを支える技術」の解説 2010.08.23Minoru Chikamune
 
省メモリーに関するデザインパターン 2011.04.18
省メモリーに関するデザインパターン 2011.04.18省メモリーに関するデザインパターン 2011.04.18
省メモリーに関するデザインパターン 2011.04.18Minoru Chikamune
 
AspectJによるJava言語拡張 2012.09.07
AspectJによるJava言語拡張 2012.09.07AspectJによるJava言語拡張 2012.09.07
AspectJによるJava言語拡張 2012.09.07Minoru Chikamune
 
Stormとその周辺 2013.03.15
Stormとその周辺 2013.03.15Stormとその周辺 2013.03.15
Stormとその周辺 2013.03.15Minoru Chikamune
 
D3によるデータビジュアライゼーション 2013.09.13
D3によるデータビジュアライゼーション 2013.09.13D3によるデータビジュアライゼーション 2013.09.13
D3によるデータビジュアライゼーション 2013.09.13Minoru Chikamune
 
「グーグルの自動運転Carの技術要素」勉強会 2014.08.29
「グーグルの自動運転Carの技術要素」勉強会 2014.08.29「グーグルの自動運転Carの技術要素」勉強会 2014.08.29
「グーグルの自動運転Carの技術要素」勉強会 2014.08.29Minoru Chikamune
 
「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04Minoru Chikamune
 

More from Minoru Chikamune (9)

有名論文から学ぶディープラーニング 2016.03.25
有名論文から学ぶディープラーニング 2016.03.25有名論文から学ぶディープラーニング 2016.03.25
有名論文から学ぶディープラーニング 2016.03.25
 
「機械学習 By スタンフォード大学」勉強会 2015.09.11
「機械学習 By スタンフォード大学」勉強会 2015.09.11「機械学習 By スタンフォード大学」勉強会 2015.09.11
「機械学習 By スタンフォード大学」勉強会 2015.09.11
 
「Googleを支える技術」の解説 2010.08.23
「Googleを支える技術」の解説 2010.08.23「Googleを支える技術」の解説 2010.08.23
「Googleを支える技術」の解説 2010.08.23
 
省メモリーに関するデザインパターン 2011.04.18
省メモリーに関するデザインパターン 2011.04.18省メモリーに関するデザインパターン 2011.04.18
省メモリーに関するデザインパターン 2011.04.18
 
AspectJによるJava言語拡張 2012.09.07
AspectJによるJava言語拡張 2012.09.07AspectJによるJava言語拡張 2012.09.07
AspectJによるJava言語拡張 2012.09.07
 
Stormとその周辺 2013.03.15
Stormとその周辺 2013.03.15Stormとその周辺 2013.03.15
Stormとその周辺 2013.03.15
 
D3によるデータビジュアライゼーション 2013.09.13
D3によるデータビジュアライゼーション 2013.09.13D3によるデータビジュアライゼーション 2013.09.13
D3によるデータビジュアライゼーション 2013.09.13
 
「グーグルの自動運転Carの技術要素」勉強会 2014.08.29
「グーグルの自動運転Carの技術要素」勉強会 2014.08.29「グーグルの自動運転Carの技術要素」勉強会 2014.08.29
「グーグルの自動運転Carの技術要素」勉強会 2014.08.29
 
「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04「Lispインタープリター」勉強会 2014.12.04
「Lispインタープリター」勉強会 2014.12.04
 

「Raspberry pi」勉強会 2015.03.20

  • 1. ウルシステムズ株式会社 http://www.ulsystems.co.jp mailto:info@ulsystems.co.jp Tel: 03-6220-1420 Fax: 03-6220-1402 ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 「Raspberry Pi」勉強会 2015/3/20 講師役:近棟 稔
  • 2. 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 ソフト ウエア ハード ウエア ロボット
  • 3. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. Raspberry Piで動かせる(はず)のロボットたち  Raspberry Piがあれば、様々なロボットを自分で作ったソフトウエアで制御出来ます。 2 ← こんなローバーは、左右の車輪に別々のモーターを 付け、それらのモーターの回転を個別に制御すれば 簡単に進む方向を変えたり出来ます。(戦車と同じ) 漫画やアニメの「宇宙兄弟」を観た人は、 こんなローバーに見覚えがあるはず。 ← ラジコンカーの制御も、DCモーターやサーボモーターの 制御が出来てしまえばロボットに出来ます。 ラジコンのように、もともと制御系が半分出来ている ものは、ロボットにしやすいです。 ← 人型ロボットの制御は、サーボモーターの制御さえ 出来れば、ひとまず動作させることは可能です。 ただし、バランスを取って動くようにするための、 制御ソフトは複雑になります。 結局のところ、Raspberry Piがあれば、これらのおもちゃをソフトウエア 的に制御する所までは、ある程度簡単に到達できます。 なお、ハードの設計をゼロからするより、既成品のおもちゃを買ってきて 改造したほうが簡単な場合が多いかもしれません。既成品のデメリットと しては、想定外の制御方式となっていた場合、分からず、悩むことです。
  • 4. 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 (電気仕掛けのスイッチ)
  • 5. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. ブレッドボードとは  ブレッドボードとは、以下のように前もって配線されている基盤です。このボードに、各 種電子部品を差し込んでいくことで、ハンダ付けすることなく、素早く回路を組み上げて 試すことが可能になります。部品を差しこむだけなので、とても簡単です。  なお、ブレッドボードは回路のプロトタイプを作る際に使うものなので、実際に運用する 段階では通常使いません。実際に運用する段階では、ユニバーサル基板やストリップボー ドにハンダ付けを伴う作業を経て、しっかりと電子部品を固定します。 4 結線省略 結線省略 ユニバーサル基板 ストリップボード
  • 6. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. Raspberry PiなしでLEDを光らせてみる (LEDとブレッドボードの練習)  以下のように回路を組めば、LEDは光ります。電球と似てます。  いくつものLEDを直列に繋いで光らせてみたり、並列に繋いで光らせてみたり。 5 1KΩの抵抗を挟んでいるのは、LEDに過度な電流が流れてし まわないためです。このような抵抗は色々な局面で出てきま す。 このような抵抗をどういった考えで挟むかですが、考え方と しては、回路上に登場するすべての電子部品の持つ、「最大 電圧」や「最大電流」を超えないようにするのが基本となり ます。過度な負荷をかけると、Raspberry Piを含め、過負荷 がかかった部品が壊れてしまいます。 電子回路の鉄則 電子部品の「最大電圧」や「最大電流」を超えないようにするこ と!よく分からなかったら、1KΩか10KΩくらいの抵抗をとりあ えず付けてみて電気を流すといいかも。 直列 並列 ← 光らない (電圧不足) ← 光る
  • 7. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. Raspberry PiなしでDCモーターをスイッチでON/OFFする  回路Aのように組めば、DCモーターは回ります。 回路Bのように組むと、スイッチでモーターのON/OFFを制御できるようになります。この ようなタイプのスイッチ(タクタイルスイッチ)は、押している間だけ通電します。 6 <回路A(スイッチ無し)> <回路B(スイッチ付き)> <スイッチ> 緑色の線は、いつ も繋がっています。 オレンジ色の線も、 いつも繋がってい ます。 ボタンを押すと、 全部が繋がります。
  • 8. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 7 Raspberry Pi
  • 9. 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
  • 10. 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を使う事が推奨されているため、Pytho nを使ったほうが有利です。Pythonを使えばRaspberry Pi用のライブラリーが充実してい ますし、沢山の人がWebで情報を提供しています。 9  ちなみに私の感覚では Python以外では以下の言語の 利用が多いと感じました。 ・C言語 ・Scratch(左の写真)  C言語はハードウエア制御が しやすいという理由で使われ ているのだと思います。  Scratchは小中学校の生徒が 主に使っています。Scratch はSqueak(Smalltalk)で書か れています。ハードウエア制 御も一応出来ます。
  • 11. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 10 LEDの点灯を Raspberry Piで制御
  • 12. 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の電圧がかかってい るかを読み取ることが出来ます。 I2C USBみたいな役割のピンです。センサーなどを複 数繋げることが出来ます。 SPI USBみたいな役割のピンです。センサーなどを複 数繋げることが出来ます。 UART シリアル通信用のピンです。 EEPROM add-onボードの自動設定用ピンです。 GND マイナス極です。ground、グランド、アースなどとも 呼ばれます。 5V電源 プラス極です。5Vの電圧がかかっています。 3.3V電源 プラス極です。3.3Vの電圧がかかっています。 GPIOの現在の状態を表示する有名なコマンドとして、WiringP iが提供する「gpio」というコマンドがあります。左の表示は 「gpio readall」を実行した結果です。このgpioコマンドでピ ンの電圧を上げ下げする事も可能です。
  • 13. 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の一部なので、表示上出てきます。
  • 14. 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
  • 15. 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番を指定します。
  • 16. 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', 'da ylight', 'gmtime', 'localtime', 'mktime', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname'] >>> help(time) Help on built-in module time: NAME time - This module provides various functions to manipulate time values. FILE (built-in) DESCRIPTION There are two standard representations of time. One is the number of seconds since the Epoch, in UTC (a.k.a. GMT). It may be an integer or 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)
  • 17. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 16 ソフトウエアでLEDを徐々に 明るくしたり暗くしたりする
  • 18. 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
  • 19. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. ソフトウエア制御でLEDを徐々に明るくしたり暗くしたりする(ソースコード)  pigpioライブラリーを用いると、PWMを簡単に生成することが可能です。以下に配線とソースコードを 載せます。ソースコードの内容は、sinカーブにしたがって、ゆっくりとLEDの明るさを変えるものにな っています。 18
  • 20. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 19 ソフトウエアでモーターを制御する
  • 21. 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円くらい gate drain source ピンの 種類 意味 (Nチャンネルの場合) gate GPIOを繋げます。このピンへ与える電 圧がスイッチのON/OFFを意味します。 drain gateに電圧がかかると、drainから sourceへと電流が流れます。 source マイナス極に繋ぎます ※ PチャンネルMOSFETの場合、sourc eをプラス極に繋ぎます。電流はsource からdrainに流れます。
  • 22. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. Nチャンネル パワーMOSFETを用いたモーターの制御例  以下のようにRaspberry Piに配線することにより、GPIOでモーターの回転を制御できます。PWMを使 うと、回転数も変更可能です。この制御に使うソースコードとしては、LEDをsinカーブにそって明るく したり暗くしたりするソースコードがそのまま使えます。 21 パワーMOSFETは大電力のモーターを簡単に扱える一方、モーターの逆回転やブレ ーキ制御など、より細かな制御をしようとすると他の工夫が必要になってきます。 このような細やかな制御をしたい場合は、モータードライバーを使うのが手っ取り 早い方法となります。ラジコンカーみたいなものはこれを使ったほうが楽です。 モータードライバー
  • 23. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 22 ラジコンサーボの制御
  • 24. 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
  • 25. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. サーボを制御する回路例  以下にサーボを制御する回路の例を載せます。注意事項としては、サーボ用の電源はDCモ ーターの時と同じく、Raspberry Piからではなく別の電源から取得します。そうしないと、 Raspberry Piの中を大きな電流が流れてしまって、Raspberry Piが壊れてしまうためです。 24 この↑ロボットは17個のサーボを使います。Raspberry Piは最大で26本のGPIO ピンを制御可能なので、このロボットの全身のサーボを同時に制御可能です。
  • 26. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 25 加速度センサーを使う (I2Cを使ってみる)
  • 27. 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
  • 28. 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によって、レジスターの中身は 読み書き可能となっている。
  • 29. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 加速度センサー情報をレジスターのどこから読めばよいかを データシートから読み取る  MPU-6050のデータシートによると、以下のアドレスに加速度や温度やジャイロの情報が リードオンリーで存在することが分かります。 よって、この情報をI2Cを使って、たとえば「アドレス 0x3B から1バイト取得」すると、 X軸方向の加速度情報の16bitのうち上位8bitが取得出来ます。 28 加速度セン サーのXYZ 方向の情報 温度 XYZ方向そ れぞれの ジャイロ 注:このデータシートの表は3ページに渡って記述があります。この表は抜粋です。
  • 30. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 加速度センサーからの情報をPythonからダンプしてみる  加速度センサーからの情報をPythonからダンプするコードは以下のようになります。デー タは2バイト1組のsignedワードで来るので、実際には以下に示すto_signed_word関数の ようなものを作り、デコードしてあげる必要があります。 29
  • 31. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 30 どうやってロボットを作るの?
  • 32. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. ロボットの制御 31 行動計画の 立案 (結構得意) 計画した 動作を実行 誤差が発生 状況把握 誤差を修正 ロボットの思考と 行動のサイクル  ロボットの制御は、典型的には以下の様なサイクルを無限ループで回します。 状況把握にはセンサーを使いま す。 複数のセンサー情報を組み合 わせ、それらの情報から、外部 の世界の「イメージ」をプログラム 内に持ちます。 実際の外部の世界と、ロボット の持つ内部イメージが可能な限 り合えば合うほど、ロボットの制 御はうまく行きます。 実際にモーターを動かしたりサー ボを動かしたりします。 モーターにどの程度電流を流す べきかや、サーボの角度をどうす べきかを決めるロジックが必要に なります。 この際、よく用いられるのはPIDコ ントロールという手法です。 補足2にて説明を記載しました。 現実世界と脳内と の齟齬が拡大して しまうフェーズ 現実世界と脳内 との齟齬を修正で きる唯一のタイミン グ 状況をどう変えたいかを考えま す。 たとえば壁にぶつかりそうなので あれば、右か左に回避するとか、 2足歩行ロボットが倒れそうなの であれば右足を出すとかです。
  • 33. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 32 子どものための Raspberry Pi
  • 34. 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 音楽の演奏も可能
  • 35. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. Minecraft Pi で子どもの興味を引く  Raspberry PiにはMinecraft Piという3Dゲームのようなものが入っています。この中では地面を数百メ ートルも掘ったり、空を飛べたり、海の中に潜ったりと色々な事が出来ます。家を建てたり、塔を立て たり、広大な地下迷宮を作ったりも出来ます。(うちの子は地下室を作るのが好きみたいです)  重要な事は、このゲームはScratchやPythonから操作ができる事です。最初は手作業でブロックを1つ ずつ積むのでしょうが、手作業では作業が大変です。プログラムなら、雲の上まで続く塔を立てるのは、 たった数行記述するだけで実現できます。広大な地下迷宮も、プログラムなら簡単でしょう。 34
  • 36. 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を触る中で、算数や数学や科学の基礎を身に付けて行って欲し いなと、親としては願っています。
  • 37. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 36 補足1
  • 38. 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
  • 39. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 初期セットアップと、sshとtightvncserverの設定  Raspbianのセットアップ Raspbianは、http://www.raspberrypi.org/downloads/ からダウンロード可能です。ダ ウンロードしたら、Win32DiskImagerなんかを使ってmicroSDカードに焼いて、Raspber ry 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」と打つと、Raspber ry Pi側にtightvncserverが入ります。tightvncserverを起動すれば、Raspberry Piのデス クトップ環境にVNC接続出来るようになります。VNCクライアントは何でもよいのですが、 TightVnc Viewerというものがあるのでそれを使うのが良さそうです。 38
  • 40. 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-blaster ServoBlasterの派生(おそらくフォーク)だと思います。こちらは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
  • 41. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. 40 補足2:PIDコントロールについて
  • 42. ULS Copyright © 2015 UL Systems, Inc. All rights reserved. PIDコントロールとは  身近なPIDコントロールの例は、エアコンの制御です。エアコンは温度センサーの情報をもとに、どれだ けコンプレッサーを回すかを決めます。この際、制御がうまく行っていないと、たとえば寒くなったり 暑くなったりを繰り返すという不快な制御になってしまいます。もしくは、いつまで経っても暑いまま だったりもします。このように、ある目標値(エアコンの場合は温度)に対して、うまく機械を制御す る方法がPIDコントロールです。  たとえばロボットカーの場合、内部で走行ラインの計画が終わった後、いよいよロボットカーはステア リングの舵角を決定したり、アクセルやブレーキを調整したりします。以降、単純化のため、ステアリ ングの舵角のみに焦点をあてて説明します。  ステアリングの舵角は、PIDコントロール(proportional-integral-derivative control)という方法で決定 します。もともとは船の自動操舵方法として発展したもののようです。 41 走りたい 走行ライン 走行ラインに戻るためには、 右に打を切ったほうが良い。 でもどのくらい切ればいいんだろう?
  • 43. 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は定数)
  • 44. 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は定数)
  • 45. 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という方法を用います。