見出し画像

【GASでIoT】自由にボタンを割り付ける(その2)~苦手な分野は他のチップに手助けしてもらおう:SPI規格を使った通信の方法~

前の記事では、分圧抵抗器を使う事で、ラズベリーパイのピン数を増やさずにボタンを追加できる事をご紹介しました。

(前の記事はこちら)


ここで問題なのは、ボタンの識別をするための電圧をどう取得するかです。ラズベリーパイでは、残念ながらアナログ電圧をインプットする仕掛けがありません

そこで苦手なところは他のチップ(電子部品)に手助けしてもらう事にします。この記事では、こうしたチップの代表格である、「ADコンバータ」の使い方をご説明します。

また、協力するためには互いの通信にルールが必要です。こうしたルールの1つである、SPI規格についても併せてご説明します。

実機が関わる場合は様々な理由により、この説明通りにいかない場合がしばしばあります。申し訳ありませんが、自己責任・自己解決でお進めくださるよう、お願いいたします。


ラズベリーパイはアナログ値の読み取りができない~協力者:「ADコンバータ」のご紹介~


抵抗を直列につなげて、その間にボタンを入れると、多数のボタンの識別が電圧の違いとして取り出せる、「分圧抵抗器」という仕組みを先回の記事でご紹介しました。安価で最小限のピンで済むのがメリットです。

ここで問題になるのが、アナログ電圧の値をラズベリーパイに取り込む方法です。ラズベリーパイには取り込むにはこれをデジタル(オン・オフの信号)にしなければなりません。

そこで、他のチップ(電子部品)に手助けしてもらって、アナログな電圧の値をデジタル信号に変換してもらう事にします。

この様なアナログ入力を受け付けてデジタル情報に置き換えるチップを「アナログ/デジタルコンバータ(ADコンバータ)」といいます。ADコンバータには様々な仕様のものが手ごろな値段で市販されております。

今回使うのは「MCP3204」というICチップで、300円程度(2021年現在)で販売されているものです。

画像1

このICのシリーズは、ラズベリーパイの電源ピンから供給できる3.3V程度の電圧を利用でき、分解能は12ビット、つまり0Vから基準電圧の間を、2の12乗=4096分割した刻みで識別できます。。

また、ピンの間隔がブレッドボードに合っていますので、直接挿して使えます。(ブレッドボードに挿して使う場合は、中央付近の溝をまたいで挿すようにします)

画像2

こうした特徴から、このチップのシリーズであるMPCシリーズは、ラズベリーパイを使ったホビー用途でよく使われています。

なお、MCP3204を選んだのは偶々手元にあったからです。このシリーズ(MCPシリーズ)はピンの数や分解能の違いのタイプが色々ありますが、使い方はどれも似ていますので、他のタイプでも同様にできるはずです。


このADコンバータは上図の様なピンがありますが、その使い方を以下にご説明します。

給電関係・および測定部をつなぐピン

  • Vdd(電源電圧での給電)・・・ラズベリーパイの3.3Vピンにつなぎます

  • Vref(参照電圧用)・・・同じく3.3Vピンにつなぎます

  • Agnd(アナログ側のアース)・・・ラズベリーパイのGNDピンにつなぎます

  • Dgnd(デジタル側のアース)・・・同じくGNDピンにつなぎます

  • CH0~3(測定電圧用)・・・測定対象部につなぎます。今回はCH0を使います

これらのピンには、以下の様に配線します。(小さなくぼみがある方を上にします)


次にラズベリーパイとの通信用のピンについてご説明します。

今回取り上げたチップはSPI規格で他のデバイスと通信します。

SPI規格での通信では、①タイミング同期用の配線、②チップを選択するための配線、③入力用の配線、④出力用の配線の4つが必要です。これらの配線のためのピンを順にご紹介します。

SPI規格での通信用のピン(1) タイミングを取るためのピン

SPI通信でタイミングを合わせるためのピンが2つあります。


・①CS(チップ・セレクト)・・・このピンの電圧が下がる(上がる)と、チップは自分自身が選ばれた事を知り、通信を開始します。ラズベリーパイが出力側です。

・②CLK(クロック)・・・以降の信号のやりとりで、タイミングを同期させるための一定刻みの信号です。ラズベリーパイが出力側です。

これらの配線は以下の様になります。


上記の線は、ラズベリーパイ側に対しては、以下の様に配線します。①「はSPI CE0」ピン、②は「SPI CLK」ピンです。

この配線の間には、以下の様な信号が交わされます。

①CSは常時はオンの電圧が掛かっていますが、この電圧がLOWになると、チップは自分が呼び出されたもの判断して通信を開始します。(設定によっては逆の場合もあります)

②CLKは一定刻みでHIGHとLOWの電圧が掛かっています。呼び出しを受けたチップは、以降、CLKの信号がHIGHになるタイミングで、1ビットずつ情報を読み書きするようになります。


SPI規格での通信用のピン(2) 情報を交わすためのピン

SPI通信で情報を交わすためのピンが2つあります。この2本のピンがSPI通信の核心部です。

・①Din(データ・イン)・・・ADコンバータがラズベリーパイから信号を受けるためのピンです。(MOSI マスターアウト、スレーブイン と呼ばれる場合もあります)

・②Dout(データ・アウト)・・・ADコンバータがラズベリーパイに向けて信号を送るためのピンです。(MISO マスターイン、スレーブアウト と呼ばれる場合もあります)

これらのチップ側の配線は以下の様になります。


これにつなげるラズベリーパイ側の配線は以下の様になります。①はMOSI(マスターアウト・スレーブイン)ピン、②はMISO(マスターイン・スレーブアウト)ピンです。


やりとりする情報は、チップごとに決まっていますが、大抵は、ラズベリーパイ側から何等かの信号を投げかけると、チップ側から信号に応じたレスポンスが送られてくる仕掛けになっています。

なお、用語ででてきた「マスター(主人)」「スレーブ(奴隷)」は、この場合、ラズベリーパイ、ADコンバータをそれぞれ指します。マスター側が、タイミング(チップセレクトおよびクロック)を主導します。

ADコンバータMPC3204と取り交わされる信号のの内容

今回のチップであるMPC3204については、こちらのデータシートに信号の交わし方が書かれています。以下の様なチャートがありますが、その見方をご説明します。

上のチャートで下のを見ると、□で記されたビット(0か1かの信号)が8ケ集まった塊が、3組書かれています。

つまり、ADコンバータに8ビットの情報を3回送ると、同じ長さの信号で、測定値が返される、という訳です。

もう少し詳しくみてみましょう。

まず、ラズベリーパイ側から8ビットの信号を3回送ります。

順にみてみましょう。

最初の8ビットは、0,0,0,0、0、 1、DIFF、D2 です。

次の8ビットは、D1D0、x、x、x、x、x、x です。

最後の8ビットは何でも良いと書かれていました。

DIFF、D2、D1、D0は以下の表を見て、読み出すチャンネルに応じて決めます。(DIFFは1に固定してますがこれは低速モードを意味すると捉えてください。xは0でも1でも良い意味ですが、意味のある信号と区別するために0で固定するのがよいでしょう。)



次に、ラズベリーパイに返される値はどうなっているでしょうか。こちらも同様に8ビットx3回で返される様です。

同じく順に読み込んでみます。

最初の8ビットは「無視する意味の無いデータ」とありました。(資料では?と表示されています)

次の8ビットについてですが、最初の4ビットは意味の無いデータで、続く4ビットは、電圧の測定値(12桁の2進数、つまり12ビットのデータです)の内、4ビット分(B11~B8)とありました。

最後の8ビットは電圧の測定値の残りのビット(B7~B0)が送信されるとありました。

ラズベリーパイ側ではこの信号を受け取ったら、プログラムで処理して、B0~B11を数値に復元し、電圧の値として使います。


今回の記事では、ボタンを読み取るという話から大きく脇道にそれて、協力者であるADコンバータとその通信方法について説明しました。

一旦記事を切って、次の記事では、再びラズベリーパイの話に戻します。


この記事が気に入ったらサポートをしてみませんか?