ADC コンバーターを使用して Raspberry Pi の機能を拡張する: 知っておくべきこと

Raspberry Pi はさまざまな電子プロジェクトに最適なデバイスですが、ADC コンバータを使用することで、その機能を拡張してアナログ信号を測定し、より広範囲のデバイスと対話することができます。

Raspberry Pi には標準でアナログ入力がありません。このため、Arduino のようなマイクロコントローラーベースのボードと比較すると不利になります。

しかし、絶望しないでください。検討すべき選択肢はたくさんあります。 Raspberry Pi と外部 ADC を使用して開始できます。このガイドでは、主要な手順と潜在的な利点に焦点を当て、Raspberry Pi で ADC コンバータを使用する方法の包括的な概要を説明します。この記事を読んで、デバイスを最大限に活用し、電子プロジェクトに効果的に統合する方法を見つけてください。確認する アナログデジタルコンバーター (ADC) とは何ですか?彼の作品とデジタルテクノロジーの時代におけるその重要性を理解する.

エントリを追加する理由は何ですか?

現実の世界には、適切な回路があれば電圧を使って簡単に説明できる現象がたくさんあります。これらの電圧をデジタル形式に変換すると、それらを記録、処理し、パラメータやその他のデバイスの制御に使用できます。

おそらく、土壌の水分、温室の温度、またはハムスターの体重を監視したいと考えているかもしれません。 Pi にボリューム コントロールを追加したり、イコライザーを構築したり、ジョイスティックを最初から設計したりしたいと考えているかもしれません。多かれ少なかれ可能性は無限です。

ADC オプション

では、どの ADC が初心者に最適なのでしょうか?

最も一般的で簡単なオプションはチップセットです MCP3004 (そして MCP3008)マイクロチップ社製。 10 (または 200) の 111 ビット チャネルが得られ、最大 16k SPS を読み取ることができます。一方、860 SPS で XNUMX ビットを読み取る Texas Instruments の ADSXNUMXx デバイスもあります。したがって、速度と精度 (そしてもちろん価格) の間にはトレードオフの関係があります。

多くのマイクロコントローラーには ADC コンバーターが組み込まれています。平均的な Arduino に搭載されている ATMega は、いくつかの 10 ビット チャネルとその他すべてを提供します。これにより、Arduino は Raspberry Pi ではできないアナログ入力を提供できるようになります。セットアップにすでに Arduino が含まれており、10 ビットの精度で十分な場合は、これが実際には最も簡単な方法かもしれません。

ここでは、Adafruit の ADS1115 を使用して簡単に説明します。確認する プロジェクトで Arduino クローンを使用することの長所と短所.

プログラマブルゲインアンプとは何ですか?

このチップには、プログラマブル ゲイン アンプ (PGA) などの興味深い機能がいくつか搭載されています。これにより、希望する値の範囲を電圧の何分の一までデジタル調整できるようになります。 16 ビットで表現できる値の数により、数マイクロボルト程度の違いを検出できるようになります。

ここでの利点は、ゲインを途中で変更できることです。 MCP3004 などの他のチップは異なるアプローチを採用しています。追加のピンが付属しており、基準電圧を提供できます。

多重化についてはどうですか?

マルチプレクサ (またはマルチプレクサ) は、単一の ADC で複数の入力を読み取ることができるスイッチです。 ADC チップに複数の入力ポートがある場合、内部多重化が発生しています。 ADS1115 のマルチプレクサでは XNUMX つの入力が可能で、内部レジスタを介して選択できます。

取扱い記録

ADS1115 は、これらのオプションに加えて、その他のオプションも提供します。いくつかのキーをタップするだけで、マルチプレクサの操作、ゲインの調整、内蔵コンパレータのアクティブ化、サンプルレートの変更、デバイスの低電力スリープモードへの移行を行うことができます。

しかし、それらの鍵はどこにあるのでしょうか?これらはパッケージ内に、レジスタと呼ばれる非常に小さなメモリの形で存在します。特定の機能を有効にするには、関連するビットを 1 ではなく 0 に設定するだけです。

データシートを見てみると ADS111xこれらのモデルには、デバイスの動作を制御する構成レジスタを含む 4 つのレジスタが付属していることがわかります。

たとえば、ビット 14 ~ 12 はマルチプレクサを制御します。これら 100 ビットを使用して、7 つの構成から選択できます。ここで必要な数値は「5」で、ゼロエントリと最小値の差が得られます。一方、ビット 860 ~ 111 はサンプル レートを制御します。 XNUMX 秒あたり最大 XNUMX サンプルが必要な場合は、「XNUMX」に設定できます。

設定したいオプションがわかったら、ADC に 2 バイトを送信する必要があります。後で単一のビットをあちこちに設定したい場合は、ビット演算子を使用して個別に処理できます。

ここが混乱を招く可能性がある場所です。この場合、バイナリは値を表すのではなく、個々のトランスの値を表します。これらの変数は、10 進数または 16 進数の 1 つの大きな数値として表現できます。ただし、ストレスを避けたい場合は、読みやすいバイナリ バージョンを使用する必要があります。

接続線

このアダプターはシングルパネルに直接接続できます。 2 ~ 5.5 ボルトの正の電圧入力を受け入れます。つまり、Raspberry Pi の 3.3 ボルト レールは問題なく動作します。

SDA 入力と SCL 入力を RPi の対応する入力に接続し、グランドと 3.3V に対しても同じことを行います。接地線と電圧線の間に電圧計を用意し、中央の線を ADC の最初の入力に接続します。始めるために必要なのはこれだけです!

I2Cの扱い

異なる ADC は異なるプロトコルで動作します。 ADS1115 の場合は、I2C を使用します。

次の例では、Python を使用して ADC と対話します。ただし、その前に、セットアップする必要があります。 Raspberry Pi OS の最近のリリースでは、これが非常に簡単になりました。に行く 環境設定 > Raspberry Pi 構成。次に、「インターフェース」タブから「I2C」をオンにします。

すべてが機能していることを確認するには、ターミナルを開いて次を実行します。

sudo i2cdetect -y 1

このコマンドはメッシュを出力します。すべてが機能し、正しく接続されていると仮定すると、グリッドに新しい値が表示されるのがわかります。これは ADC のアドレスです。これは 0 進値であるため、以下のコードで使用する場合は、先頭に「0x」を付ける必要があることに注意してください。そして、ここに48xXNUMXがあります:

アドレスを取得したら、SMBus ライブラリを使用して I2C コマンドを送信できます。ここでは XNUMX つの方法を扱います。 XNUMXつ目は write_word_data()、デバイス アドレス、書き込み先のレジスタ、書き込みたい値の 3 つの引数を受け取ります。

2つ目は read_word_data()、 デバイスのアドレスと履歴のみを受け入れます。 ADC は電圧を継続的に読み取り、結果をスイッチング レジスタに保存します。このメソッドを使用すると、このレコードの内容を取得できます。

結果を少し美しくしてから印刷できます。ループの先頭に戻る前に、短い一時停止を行ってください。これにより、データで圧倒されることがなくなります。

from SMBus import SMBus
import 時間アドレス = 0x48
バス = SMBus(1)

# レジスタを読み取り用に設定する
構成 = 1
変換登録 = 0# アドレスレジスタを設定レジスタを指すように設定する# 設定レジスタに書き込む
bus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010)) 

# 範囲の上限を定義する
トップ = 26300while◯:
 # レジスタを読み取る
 b = bus.read_word_data(アドレス、CONVERSIONREG)

 # 2バイトを入れ替える
 b = ((b & 0xFF)< 8) | ((b >> 8)& 0xFF)
 
 # 範囲の半分を減算して地面をゼロに設定します
 b -= 0x8000# 結果を範囲で割って、0から1の間の値を取得します
 b /= トップ

 # 1 に制限
 b = 分(b、 1)

 # 下限はゼロ
 b = マックス(b、 0)

 # 小数点以下2桁
 b = 円形(b、 2)
 印刷(b) 時間.スリープ(.01)

これでほぼ完了です。取得する値の範囲を希望の値に設定し、希望する小数点以下の桁数に切り捨てます。最後の値と異なる場合にのみ新しい値を印刷するように印刷関数をカスタマイズできます。

ノイズへの対処

さて、セットアップが本当に素晴らしく、整頓されていない限り、多少のノイズに気づくでしょう。これは、16 ビットではなく XNUMX ビットを使用することの固有の欠点です。つまり、微量のノイズがより目立つことになります。

隣接する入力 (入力 1) をグランドに接続し、最初と XNUMX 番目の入力を比較するようにモードを切り替えると、より安定した結果が得られます。この調整を行う際には、長いノイズ収集ケーブルを細いケーブルに交換したり、コンデンサをいくつか追加したりすることもできます。ポテンショメータの値も違いを生む可能性があります。

ソフトウェアオプションもあります。移動平均を作成することも、小さな変化を単純に無視することもできます。欠点は、コードを追加すると計算コストがかかることです。 Python のような高級言語で条件ステートメントを作成し、毎秒数千のサンプルを取得している場合、これらのコストはすぐに増加します。確認する Raspberry Pi および Sense HAT 温度監視ガイド: 最良の手順とヒント.

よくある質問

Q1. ADC コンバータとは何ですか? Raspberry Pi ではどのように動作しますか?

ADC (Analog-to-Digital Converter) は、アナログ信号をデジタル信号に変換するデバイスです。 ADC を Raspberry Pi に接続すると、センサーや環境変数などのソースからアナログ信号を読み取ることができます。

Q2. Raspberry Pi で ADC コンバータを使用する主な利点は何ですか?

  • 測定機能の拡張:光、温度、音などのアナログ信号を利用できます。
  • より高い精度: アナログ信号をデジタルに変換することで、読み取り精度が向上します。
  • さまざまなデバイスをサポート: 幅広い電子デバイスや Raspberry Pi プロジェクトで使用できます。

Q3. ADC コンバータを Raspberry Pi に接続するにはどうすればよいですか?

ADC コンバータは、適切なケーブルとコネクタを使用して GPIO インターフェイス経由で Raspberry Pi に接続できます。 ADC コンバータに付属の通信ガイドに注意して従う必要があります。

Q4. ADC コンバータは Raspberry Pi のすべてのバージョンで使用できますか?

はい、ADC は Raspberry Pi のほとんどのバージョンで使用できます。ただし、特定のハードウェア バージョンに応じて、アダプターを適切な GPIO ポートに接続することを検討する必要がある場合があります。

Q5. ADC コンバータを利用するにはプログラミングの経験が必要ですか?

それはプロジェクトの範囲によって異なります。単純な場合には、既製のライブラリを使用できます。ただし、プロジェクトによっては、データを効果的に使用するためにプログラミング スキルが必要な場合があります。

いくつかの潜在的な次のステップに向けて前進

I2C 経由で読み取りを行うのは非常に簡単で、SPI などの他の方法にもほぼ同じことが当てはまります。利用可能な ADC オプション間には大きな違いがあるように見えるかもしれませんが、実際には、XNUMX つを実行すると、その知識を他のオプションに適用するのは簡単です。

それでは、さらに話を進めてみませんか?複数のポテンショメータを接続するか、光、音、温度を読み取ってみてください。作成したばかりのコントローラーを拡張して、実際に機能する Raspberry Pi セットアップを作成します。閲覧できるようになりました Raspberry Pi でプロジェクトをセルフホストする場合の潜在的な課題.

トップボタンに移動