Raspberry Piにハードウエアをつなぐための資料を集めてみる

ブログネタもないのでRaspberry PiのGPIOポートに何かを付けて動かしてみようと思います。Lチカの記事はたくさん見つかりますがソフトウエアライブラリの使い方程度の記事が多いようです。自分でロボットを動かしたい! と思ってLチカに挑戦しても次に何をしたら良いかわからないでしょう。
そこで、Raspberry Piでハードウエアを動かす方法を記事にしていこうと思います。ソフトウエア的な事は他のサイト様に任せて、主にハードウエアをいじるのには何を知らなくてはいけないかを書いていこうかと思います。

で・す・が、まずは私のお勉強用の資料集めから始めます。


Raspberry Piでハードウエアをいじる初心者向けの記事を書いていこうと思います。
ですが、私がRaspberry Piのハードウエアをまだ知りません。まずは、Raspberry PiのGPIOがどうなっているのかを知らなくては何も始まりません。

今回は私の勉強のための資料集めです。

GPIOを使うために必要なハードウエアの資料

Raspberry Piの心臓であるBroadcomのプロセッサのデータシートでハードウエアに関する部分を探したいです。まずは公式ページをうろうろ。
DOCUMENTATION> HARDWARE > RASPBERRYPI > GPIO
詳しいデータシートを見たいのだがRaspberry Pi 3のBCM2837のデータシートは公開されていないようです。
GPIO周りはBCM2835の資料しかありません。特に変わっていないようなのでBCM2835のデータシートを参照します。
Peripheral specification
Note: This document contains a number of errors. A list of currently known errata and some additional information can be found here.

GPIOのブロック図

ハードウエアをいじるには入出力回路の等価回路を知っていると安心です。データシートに等価回路は無いですがブロック図があります。入出力端子でどういう機能が有るかを知るのに良い図です。
BCM2835 ARM Peripherals | Figure 6-1 GPIO Block Diagramより
GPIO Block Diagram
一番左の四角に☓の印が入出力ピンになります。
プルアップとプルダウン抵抗が内蔵されていて有効無効の設定がプログラムできるのがわかります。
出力として使う時は、3bitの値で何かを設定できるようです。
入力として使う時は、入力信号の状態変化で割り込みをかける事ができるようです。

GPIOの等価回路

ブロック図ではGPIOをソフトウエアで使う時に何ができるかがわかります。ですがハードウエアを扱うとなると情報不足です。
等価回路が欲しい所ですが、どうやら等価回路は公式資料に無いようです。

こちらのサイトに等価回路のような情報があります。類似したICの資料からの類推でしょうか?
GPIO Electrical SpecificationsMosaic Documentation WebGPIO Electrical Specifications
GPIOピンにダイオードが書かれていますが実際には存在せず寄生ダイオードを表しているそうです。
プルアップ・プルダウンの抵抗値は50kΩと書かれていますが、明示された資料はなく40kから100 KΩのばらつきがあるそうです。これは有用な情報です。
プルアップとプルダウンはFETスイッチで電源側へつなぐかGND側へつなぐかを選択します。
入力バッファはヒステリシスも有効にできるようです。
この図のあるページにはGPIOの電気特性の表があります。まとまっていて見やすいです。

出力の駆動能力の切り替えは公式ページのGPIOから辿った資料にあります。
GPIO pads control
GPIO Output Driver
2mA, 4mA, 8mAの駆動能力のあるバッファが並列に4つあり、どのバッファを動かすかでドライブ能力を切り替えます。2mA~16mAまで2mAステップで指定できる事になります。

出力電圧はハイで3.3V近く出ると期待できます。ローの時は0Vです。ですが、ドライブ能力以上の電流を流そうとするとハイでも電圧が上がらないとかローでも電圧が高いままとかになります。

このページには入力電圧の閾値についても書かれています。
To answer that question I/O ports have two parameters which deal with the output level:
VIL : The maximum low level voltage. (0.8V on the BCM2835)
VIH : The minimum high level voltage. (1.3V on the BCM2835)
Raspberry Piにローと認識させるには0.8V以下の電圧にします。ハイと認識させるには1.3V以上の電圧にします。

GPIOポートの初期状態

コンピュータに電子回路をつないだ時に重要なのがGPIOポートの初期状態です。入力と出力が逆になると電流が逆に流れる可能性があり故障の原因になります。
"All GPIOs revert to general-purpose inputs on power-on reset. The default pull states are also applied, which are detailed in the alternate function table in the ARM peripherals datasheet. Most GPIOs have a default pull applied."
電源投入した後には、GPIOポートはすべて入力に設定されているようです。そしてプルダウンされるようです。
電源投入直後、本当は出力として使うポートでも入力になります。プルダウンされているのでローとして出力されているように見えます。ですがドライブ能力は無いので外の回路が電流を必要とする場合やプルアップされているとローになりきらず誤作動する可能性に注意します。

他サイトのLチカの記事を見ると、ラズパイの電源を入れるとLEDが光ってる、というのを見かけます。これはGPIOの初期状態の影響です。初期状態ではプルダウンされていますから、電流は外の電源からLEDを通ってGPIOに入り、内部の抵抗を通ってGNDへと流れていきます。

その他の注意事項

Raspberry Piの電源電圧は5VですがプロセッサのあるSoCは3.3Vで動きます。よって、GPIOの電圧は3.3Vです。GPIOに3.3V以上あるいは0V以下の電圧をかけると破損します。

公式資料のGPIOの項を辿ると出力電流に関して電源の制約がある事がわかります。
Why don't I set all my pads to the maximum current!
Two reasons:
  1. The raspberry-Pi 3V3 supply was designed with a maximum current of ~3mA per GPIO pin. If you load each pin with 16mA the total current is 272mA. The 3V3supply will collapse under that!
  2. Big current spikes will happen especially if you have a capacitive load. That will"bounce" around all the other pins near it. It is likely to cause interference with theSD-card or even the SDRAM behaviour.
SoCへの3.3Vの電源はRaspberry Piの電源5Vから作っています。3.3Vの電源容量はGPIOの各ポートへ3mAを流せるように設計されているそうです。全てのポートが16mAを出そうとすると電源容量を超えてしまいますので出せません。

また、GPIOに流れる電流はすべてプロセッサが入っているICであるSoCの中を通っています。電流が流れると熱が発生します。沢山の電流をGPIOから流すとあっというまにSoCの温度が上がってしまいます。SoCの熱設計を見積もれるデータシートをどこかで見たような気がしたのですが見つけられませんでした。

要はGPIOから電流を取り出すような使い方は好ましくありません。LEDをたくさん光らせたい場合など、GPIOにたくさんLEDを付ければいいんだ、と思ったらそれは間違えです。
今後記事を書く予定ですが、このような場合は外部にトランジスタなどで電流バッファ回路を設けます。

まとめ

ハードウエアの資料を探しましたが情報はあまりありませんでした。ソフトウエアに必要な資料ばかりのようです。ハードウエアといっても3.3Vデジタルの世界なので、基本的な知識があれば問題はないのですが、初心者がラズパイでハードウエアを学習するのは難しそうです。

Raspberry Piはコンピュータというものの学習用として良くできています。ハードウエア制御もソフトウエアでハードウエアを動かす感じを体験する事ができます。あくまでソフトウエアの学習としてですね。

Raspberry Piでせっかくハードウエアにも興味を持ってくれた方々がLチカで終わってしまうのはもったいないと思います。初心者向けのハードウエア記事を少しずつ書いていきたいと思います。
とはいえ何から書けばいいんだろう。最低限の基礎知識をどこに設定したら良いのやら・・・。


コメント

最近のコメント

Threaded Recent Comments will be here.