Raspberry Pi 3を使用した迅速なシステム開発(入手困難なRaspberry Pi Zeroとの対比)
DigiKeyの北米担当編集者の提供
2017-03-08
Raspberry Piボードは、そのどのモデルもプロおよび一般の開発者の両方に恩恵をもたらしてきました。大きな注目を集めたRaspberry Pi Zeroは入手困難なほどです。幸い、Piファミリにはほかにも多くのボードがあり、アプリケーションの要件を満たす優れた機能を提供しています。
クアッドコアプロセッサを搭載したRaspberry Pi 3は、シングルコアのPi Zeroの2倍のメモリ容量を提供します。設計フットプリントを縮小するという課題に対して Pi Zeroの性能では物足りない場合は、Pi 3の高性能とPi Zeroの小フットプリント(クレジットカードサイズ)を兼ね備えたRaspberry Pi Compute Module 3 (CM3)を利用できます。豊富なアドオンハードウェアボードと直ちに利用可能なソフトウェアを活用すれば、Pi 3とCM3を使って広範囲にわたるアプリケーションの要件に対応できます。
Raspberry Piの使用開始
Raspberry Piシステムには堅牢なオープンソースの基盤があります。ベンダ、サードパーティ開発者、ユーザーは、充実したソフトウェアとハードウェアのエコシステムを活用しながら、それらの発展に貢献することができます。Raspberry Piハードウェアは、元来はRaspberry Pi Foundationによるコンピューティング教育用の低コストプラットフォームとして開発されたものですが、迅速なプロトタイプ開発と(ますます拡大する)組み込みコンピューティングの用途に適した、高性能かつ低コストのプラットフォームへと進化してきました。
Piソフトウェアは、ハードウェアと同じくらい高性能で利用しやすくなっています。Piボード上では、Raspberry Piボード用に最適化されたGNU/Linuxオペレーティングシステム(OS)バージョンであるRaspbianが動作します。開発者は、PiボードのSDインターフェースにRaspbianインストーラ(NOOBS)を格納したSDカードを挿入し、わずか数秒で使い慣れたLinux環境の使用を開始できます。
Raspberry Piコミュニティの非常に活発な活動の成果として、開発者は、Ubuntu Desktop、Ubuntu Core、Windows 10 IoT Core、LinuxベースのOpen Source Media Center(OSMC)、RISC OSなど各種のOSから、特定の要件に応じたOSを選択できます。これらのディストリビューションは、SDカードに格納されたダウンロード済みのイメージをシステムにロードすればすぐに使用できます。また、ソフトウェア技術者は、各種のプログラミング言語での開発をサポートする充実したソフトウェアライブラリを利用できます。
Raspberry Piの構成要素
ハードウェアレベルでは、Piハードウェアは主に3つのタイプへと進化してきました。これらは性能、サイズ、機能にいくつかの重要な違いがあります(表1)。小さなサイズで注目されている、最近発表されたPi Zeroは、コスト削減とフットプリント縮小を優先し、機能的要素を多少犠牲にしたエントリレベルのボードです。対照的に、Pi 3とその組み込み版であるCM3は、高性能クアッドコアプロセッサと大容量メモリを搭載し、組み込み機器に必要とされる堅牢なハードウェアプラットフォームを提供します。さらにCM3は、性能や機能を犠牲にすることなく、Pi Zeroとほぼ同じフットプリントを実現しています。
|
表1:Raspberry Pi 3、Compute Module 3(CM3)、Pi Zeroの比較(出典:DigiKey。Raspberry Pi Foundationのデータを編集)
標準ハードウェアインターフェースは、Raspberry Piのようなプラットフォームの成功における重要な要因です。Pi 3やPi Zeroなどの最近のPiボードは、同じ40ピンインターフェースを備えています。これには28本のGPIOピンが含まれ、その一部は I2C、SPI、およびUART接続の用途を兼ねています(図1)。GPIOピン以外に、このPi標準インターフェースは、3.3V、5V、グランドおよびその他のライン(EEPROM IDなど)を提供します。この共通のピン配置により、Piユーザーは、標準インターフェースに合わせて開発されたサードパーティベンダの幅広いアドオンボードを利用できます。

図1:Pi 3やPi ZeroなどのPiボードに共通の40ピンインターフェースは、GPIOと、ボードのホストプロセッサおよびそれに関連するコンポーネントからのその他のラインを提供します。(画像提供:Raspberry Pi Foundation)
ただし、Pi Zeroではこの40ピンインターフェースがPCB上のめっきスルーホールとして提供されるため、Pi Zeroユーザーは、スルーホールコネクタヘッダ上でプレスフィット接続またははんだ付けを行う必要があります。Pi 3では、コネクタヘッダが標準です(図2)。表に示したように、Pi Zeroでは利用できないWi-FiやEthernetなどの機能のコネクタも標準で搭載されています。

図2:Pi標準40ピンインターフェースを提供するに際して、Pi Zero(a)はスルーホール接続のみを提供するのに対して、Pi 3(b)はHAT(Hardware Attached on Top)と呼ばれるアドオンボードをただちに接続できる40ピンコネクタを搭載しています。(画像提供:Raspberry Pi Foundation)
アドオンハードウェア
Piインターフェースがパワー、グランドおよびGPIOを供給しているので、開発者はディスクリート回路をPi 3のGPIOインターフェースピンに直接配線できます。しかし、Piプラットフォームは、回路をゼロから配線しなくても、より効率的な方法でPi 3システムの機能を拡張できます。Pi 3上では40ピンヘッダが利用可能であり、HAT(Hardware Attached on Top)として構成されるアドオンボード用の標準インターフェースが提供されます。この簡単な電気的および機械的インターフェースにより、アプリケーション固有の機能でPi 3ベースボードを迅速に拡張できます。開発者は、Pi対応アドオンHATを40ピンコネクタに押し込むだけで機能を追加できます。複数のアドオンボードのスタックを作成し、この1つのインターフェースを共有させることも可能です。
開発者は多種多様なアドオンボードを利用できます。たとえば、Pi Sense HATは、方向検知または環境検知アプリケーションに必要なすべてのセンサを搭載しています。またこのHATは、ユーザーへのフィードバック用のLEDマトリックスと操作用の5ボタンジョイスティックを提供します(図3)。

図3:開発者は、このPi Sense HATのようなHATを差し込むだけでPiボードに機能を追加できます。Pi Sense HATは複数のセンサに加え、LEDマトリックスとユーザーの操作用の5ボタンジョイスティックを提供します。(画像提供:Raspberry Pi Foundation)
Sense HATは独自の機能を備えた高度なサブシステムです。このアドオンボードは、Microchip Technologyの8ビットATtiny MCU (ATTINY88)に加え、STMicroelectronicsのLSM9DS1慣性計測ユニット(IMU)、STMicroelectronicsのHTS221湿度/温度センサ、およびSTMicroelectronicsのLPS25HBTR圧力センサを搭載しています。
簡単な導入
Sense HATは、ほかのPi対応アドオンボードと同じように、Pi 3上の40ピンヘッダに押し込むだけでPi 3システムに接続できます。ソフトウェアインターフェースも同じように簡単に使用できます。公式にサポートされているPython sense-hatライブラリは、簡単で直感的な呼び出しの背後に低レベルのハードウェアインタラクションを隠蔽します(リスト1)。
from sense_hat import SenseHat
sense = SenseHat()
temp = sense.get_temperature()
print("Temperature: %s C" % temp)
humidity = sense.get_humidity()
print("Humidity: %s %%rH" % humidity)
# get_orientation_degreesは
# pitch、roll、yawのキーを含むPython辞書を返す
orientation = sense.get_orientation_degrees()
print("p: {pitch}, r: {roll}, y: {yaw}".format(**orientation))
リスト1:Raspberry Pi Sense HATライブラリにより、ソフトウェア開発者は、少数の直感的な呼び出しを使用してSense HATハードウェアからデータを取得できます。(コード提供:Raspberry Pi Foundation)
Pi Sense HAT以外にも、ほとんどの標準的アプリケーション要件に対応するサードパーティHATが提供されています。たとえば、Seeed Technologyの114990831は、2チャンネル16ビットデジタル/アナログコンバータ(DAC)および24ビットアナログ/デジタルコンバータ(ADC)と、8つのシングルエンドチャンネルまたは4つの差動入力チャンネルを提供します。開発者は、SeeedのGPS、DFRobotの超音波レンジファインディングセンサ、Adafruitのステッピングモータをはじめとするさまざまなアドオンを利用できます。
既存のアドオンボードでは開発者の要件に対応できない場合のために、Seeed Technologyは、P-MOS、N-MOS、NPN、PNPトランジスタなどの少数のビルトインコンポーネントを備えたブレークアウトボードHATを提供しています。
HATを使用する開発者は、Raspberry Pi Foundation、ベンダや、その他のPiコミュニティメンバーが提供している多数のソフトウェアツールを利用できます。たとえば、Raspberry Pi raspi-gpioツールにより、GPIOの状態の表示と動作の変更が可能です。プログラマは、このツールのオープンソースCコードをモデルとして、独自のGPIO制御ソフトウェアルーチンを作成できます。
また開発者は、Pythonなどの高水準言語に対応したGPIOライブラリも利用できます。RPi.GPIO Pythonモジュールにより、開発者は、GPIO.input(channel)などの呼び出しを使ってGPIOピンの値を読み出し、GPIO.output(channel, state)を使って指定したGPIOピンを指定した状態に設定することで、GPIO機能のすべての要素をピンレベルで制御できます。
gpiozero Pythonライブラリにより、モーションセンサ、光センサ、LED、モータなどの高い抽象化レベルでGPIOを簡単にプログラミングできます。この手法により、プログラマは、基盤となるGPIOトランザクションの管理にライブラリを利用し、LEDを点灯させるled.on()などの直感的なコマンドを使ってハードウェアの状態を読み出したり希望する状態へ設定したりすることで、基盤となるハードウェアを取り扱えます。
Groveの利用
Pi HATインターフェース標準は、サードパーティ開発者に魅力的な基盤を提供しますが、その利用はPiプラットフォームのみに制限されています。対照的に、Groveインターフェースは、複数のハードウェアプラットフォームにまたがる単一の標準的な基盤を提供するため、さらに多くのアドオンボード開発者の関心を呼んでいます。Seeed TechnologyのGroveスターターキットは、Pi対応HATボードに複数のGrove対応コネクタを提供します。他のHATと同じように、Grove HATはPi 3の40ピンコネクタに取り付けられます(図4)。

図4:Seeed TechnologyのGroveスターターキットは、Pi標準40ピンコネクタに接続されます。これにより、開発者は広範囲にわたるGrove対応ペリフェラルを使用してPiシステムを拡張できます。(画像提供:Seeed Technology)
Grove HATにより、Pi 3の簡素さと高性能を維持しながら、アクチュエータ、ガスセンサ、モータ制御デバイス、スピーカ、ワイヤレストランシーバなどの幅広いGrove対応アドオンを利用できます。Pi 3の40ピンコネクタにアドオン機能を直接接続する代わりに、Grove対応アドオン製品に付属しているGroveコネクタを、Grove HATの上面にあるGroveソケットの1つに接続します(図4)
開発者は、C、Java、Node.js、Pythonやその他の言語対応のGroveソフトウェアライブラリを利用して、開発中のアプリケーションのプラグインとしてGrove機能を追加できます。次のプログラムのように、開発者は高レベルルーチンによってアナログデータの収集を実行し(リスト2)、それに対応するビットレベルのトランザクションの実行にはライブラリ内の低レベルルーチンを利用できます(リスト3)。
# Raspberry Piを使用して温度、光、サウンドレベルをツイートする
# http://www.dexterindustries.com/GrovePi/projects-for-the-raspberry-pi/raspberry-pi-twitter-sensor-feed/
import twitter
import time
import grovepi
import math
# 接続ポート
sound_sensor = 0 #ポートA0
light_sensor = 1 #ポートA1
temperature_sensor = 2 #ポートD2
led = 3 #ポートD3
intro_str = "DI Lab's"
# Twitterに接続する
api = twitter.Api(
consumer_key='YourKey',
consumer_secret='YourKey',
access_token_key='YourKey',
access_token_secret='YourKey'
)
grovepi.pinMode(led,"OUTPUT")
grovepi.analogWrite(led,255) #LEDを最大に点灯して準備完了を示す
while True:
# GrovePiとの通信に問題が発生した場合のエラー処理
try:
# 温度センサから値を取得する
[t,h] = grovepi.dht(temperature_sensor,0)
# 光センサから値を取得する
light_intensity = grovepi.analogRead(light_sensor)
# PWM出力をLEDに供給する
grovepi.analogWrite(led,light_intensity/4)
# サウンドレベルを取得する
sound_level = grovepi.analogRead(sound_sensor)
# ツイートを投稿する
out_str ="%s Temp: %d C, Humidity: %d, Light: %d, Sound: %d" %(intro_str,t,h,light_intensity/10,sound_level)
print (out_str)
api.PostUpdate(out_str)
time.sleep(60)
except IOError:
print("Error")
except KeyboardInterrupt:
exit()
except:
print("Duplicate Tweet or Twitter Refusal")
リスト2:開発者は、Piボード、Groveアドオン、Groveソフトウェアライブラリを使用して、この例のような高度なアプリケーションを素早く実装し、環境データをホストサービス(この場合はTwitter)に送信するモノのインターネット方式のプロセスをエミュレートできます。(コード提供:Dexter Industries)
# ピンからアナログ値を読み出す
def analogRead(pin):
write_i2c_block(address, aRead_cmd + [pin, unused, unused])
read_i2c_byte(address)
number = read_i2c_block(address)
return number[1] * 256 + number[2]
リスト3:Groveソフトウェアライブラリがハードウェアペリフェラルへのアクセスに必要なビットレベルの操作を処理するため、開発者はanalogRead(pin)などの直感的な呼び出しを使って作業できます。(コード提供:Dexter Industries)
簡略化されたコンフィギュレーション
従来は、新しいハードウェアをシステムに追加する場合、多くのレベルで面倒な作業が必要でした。ハードウェア技術者は、適切な機械的および電気的インターフェースを設計する必要がありました。アプリケーション開発者は、生産性を最大限に高めるのに必要な抽象化を提供できる、適切なソフトウェアライブラリを見つける必要がありました。Pi 3とそのエコシステムは、上記のPi標準40ピンコネクタとただちに利用可能なソフトウェアライブラリによって、これらの作業を不要にしました。それにとどまらず、Piアーキテクチャは、ハードウェア固有のボードサポートパッケージ(BSP)の発見とロードに必要な追加作業の¾から開発者を解放しました。BSPは、通常はOSとアドオンハードウェア間のインターフェースを完成するのに必要な低レベルコードを提供します。
Piアーキテクチャでは、Piのユーザーが各種のハードウェアデバイス用のBSPをインストールして設定する必要は大きく軽減されます。PiシステムはBSPの代わりにデバイスツリーを使用します。デバイスツリーは、モジュールのロードとリソース割り当ての管理を実行するメカニズムを提供し、同じリソースを要求する複数のソフトウェアモジュールが競合することを回避します。ハードウェアデバイスに専用のソフトウェアが必要な場合でも、Piユーザーは少数の設定項目を設定するだけです。OSカーネルが、対応するハードウェアデバイスに関連するモジュールを自動的に見つけてロードします。たとえば、PiシステムのI2C機能は、デフォルトでは無効になっています。開発者は、次のように、コンフィギュレーションファイル(config.txt)を編集して1行のコメントを解除するだけで機能を有効にできます。
#dtparam=i2c_arm=on
Piプラットフォームはこの手順もさらに簡略化します。Raspbianは、初回のブート時に、設定項目のメニューをユーザーに示すコンフィギュレーションツールを実行します。このメニューから各種のインターフェースを有効にできます。
I2Cベースのハードウェアを利用するアプリケーションについても、すでに説明したような高レベルライブラリにより、I2Cトランザクションレベルでのコーディングは不要になります。開発者は、特殊なI2C処理用のコードを開発する必要がある場合、Linux対応I2Cツールのようなソフトウェアを利用できます。これらのソフトウェアを直接使用することも、カスタムI2Cソフトウェア作成の例として利用することもできます。
組み込みPi
最近発表されたCM3は、組み込みPiシステムの設計者に便利な、コンパクトなドロップイン型のPiソリューションを提供します(図5)。Pi 3と同じクアッドコアプロセッサをベースにしたCM3は、Pi 3と同じ機能を備えています。さらにCM3は、ボード上に4GBのeMMCフラッシュを搭載しています。CM3以外のPiボードには、外部フラッシュメモリカードを追加するためのマイクロSDスロットがあります(Raspberry Piには、CM3の軽量版であるCM3L(CM3 Lite)もあります。CM3Lは、オンボードフラッシュを除くCM3のすべての機能を備えています)。

図5:Raspberry Pi Compute Module 3(CM3)は、Pi Zeroの小さなサイズとPi 3の高性能を両立し、Pi ZeroやPi 3よりも多くのピンを搭載した製品です。CM3は4GBフラッシュモジュールを(ボードの裏側に)搭載しています。(画像提供:Raspberry Pi Foundation)
CM3は、Pi 3とPi Zeroに使用されている40ピンI/Oインターフェースを採用していません。代わりに、CM3は拡張版のインターフェースをボードの縁の200ピンSODIMM(Small Outline Dual In-line Memory Module)コネクタとして提供します(図6)。実際、CM3ボード全体がDDR2 SODIMMのフォームファクタとの互換性があるため、開発者は標準DDR2 SODIMMコネクタを介してCM3とターゲットシステムを接続できます。

図6:Raspberry Pi CM3は、CM3以外のPiボードに搭載された40ピンインターフェースを拡張し、プロセッサピンやその他のボードコンポーネントの200ピンブレークアウトを提供します。(画像提供:Raspberry Pi Foundation)
開発作業を簡略化するために、Raspberry PiCM3開発キットを利用できます。これはCM3モジュールとRaspberry Pi Compute Module IOボードを組み合わせたものです。このI/Oボードは、CM3対応DDR2 SODIMMコネクタと200ピンCM3インターフェース用ヘッダを搭載した、簡単なオープンソースのボードです(図7)。さらにこのI/Oボードは、Pi 3ボード上で提供されるHDMI、USB、カメラ、ディスプレイの各ポート用のコネクタを提供します。

図7:CM3開発キットに同梱されたRaspberry Pi Compute Module I/Oボードは、CM3対応DR2 SODIMMコネクタ、 200ピンCM3インターフェース用ヘッダ、およびHDMI、USB、カメラ、ディスプレイの各ポート用のコネクタを提供します。(画像提供:Raspberry Pi Foundation)
リアルタイムアプリケーション
高性能と小型フォームファクタの利点を組み合わせたCM3は、テレビ、オーディオ装置、家電製品などのエレクトロニクス製品の組み込みシステムの用途に最適です。しかしリアルタイムアプリケーションについては、開発者はデフォルトのPiプラットフォームの制限をいくつか考慮に入れる必要があります。
特に、Piシステムはリアルタイムクロック(RTC)を搭載していません。さらに、Pi 3およびCM3に採用されたCortex-A53(またはPi Zeroに採用されたARM1176)などのコアは、指定時刻に作動するセンサ読み出しなどのリアルタイムイベントに必要なSysTickシステムタイマの機能を備えていません。SysTickタイマは、確定的なリアルタイムアプリケーション専用に設計されたARM Cortex-Mシリーズなどのコアの重要な機能です。
この欠点は、Maxim IntegratedのDS3231などの高精度RTC ICを使用して簡単に補うことができます。消費者向け温度範囲全体で±2ppmの精度を誇るDS3231 RTC ICが生成する矩形波出力は、ソフトウェアシステムタイマの駆動に使用できます。またDS3231は、リアルタイムクロックカウント読み出し用の簡単なI2Cインターフェースを提供します。開発者は、すでに説明したI2CツールキットをベースにしたCルーチンを使用して、リアルタイムアプリケーションにRTCデータを簡単に統合できます。
標準Piシステムをリアルタイムアプリケーションに使用する場合、OSそのものにもう1つ制限があります。汎用アプリケーションを意図した標準的なLinuxディストリビューションは、リアルタイムプロセスを高い信頼性で監視し制御するために必要な、確定的な応答機能を持っていません。実際のところ、Linuxのデフォルト動作モードでは、非常に優先度の高いスレッドでもカーネルへの割り込みに失敗することがあります。その結果、優先度の高いルーチンがセンサの読み出しやモータの制御などを実行しようとする場合、その「リアルタイム」ルーチンには待機が必要となりますが、どのくらい待機するのかは不確定です。
幸いなことに、LinuxカーネルにはCONFIG_PREEMPTと呼ばれるコンフィギュレーションオプションがあり、これを使ってこの制限に対処できます。このオプションは、カーネルが(リソースを待機してブロックされた)スピンロック中のカーネルスレッドを実行している場合などの特殊な状況を除いて、優先度の高いルーチンがカーネルに割り込めるようにします。実際には、確実にカーネルへ割り込めるようにするには、この設定項目の変更以外にも追加の手順が必要です。Linuxオープンソースコミュニティは、CONFIG_PREEMPT_RTパッチセットのリリースにより、Linuxを完全にプリエンプティブルなカーネルに変換するプロセスを定義しました。簡単ではないにしても、複雑さの少ないこのパッチ手順は、Raspberry Pi FoundationとPi コミュニティメンバーによって手順が厳密に定義され、比較的定型的な作業になっています。
結論
Raspberry Pi Zeroボードへの関心が高まり、最近は品薄で入手困難なほどですが、Raspberry Pi 3およびCM3は、高性能システム開発用のより魅力的なプラットフォームを提供します。Pi 3とCM3はクアッドコアプロセッサを搭載し、シングルコアのPi Zeroの2倍のオンボードRAMが利用可能です。
Pi 3はPi Zeroよりも高性能なコンピューティング基盤を提供し、Pi標準40ピンGPIOインターフェースに準拠して開発された幅広い市販アドオンボードを活用できます。CM3は、Pi Zeroの小さなサイズとPi 3の高性能の両方の利点を兼ね備えたコンピューティング基盤を提供します。開発者は、これらの最新のPiボード、ハードウェアアドオン、およびすぐに利用可能なソフトウェアライブラリを使用して、さまざまなアプリケーション要件を満たすカスタマイズされたシステムを迅速に開発できます。
免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、DigiKeyの意見、信念および視点またはDigiKeyの公式な方針を必ずしも反映するものではありません。


