ボタン用のArduinoポート拡張。 ポートエキスパンダを使用してArduinoのデジタルピンの数を増やす方法。 Arduino用のエキスパンダーモジュールの選択

Arduino が入出力機能として提供できるのは、13 個のデジタル ラインと 6 個のアナログ入力だけです。 ただし、場合によっては (特に多数の周辺デバイスを使用するプロジェクトでは)、このようなポート ラインのセットでは十分ではありません。



この点で、入出力回線数の拡張の可能性が疑問になります。 この資料では、MCP23017 チップを使用したそのような拡張の例を示します。


ご存知かもしれませんが、次の方法で 6 つのアナログ ピンをデジタル I/O ピンとしても使用できます。


アナログ入力 0 = ライン 14
アナログ入力 1 = ライン 15
アナログ入力 2 = ライン 16
アナログ入力 3 = ライン 17
アナログ入力 4 = ライン 18
アナログ入力 5 = ライン 19

したがって、実際には、digitalWrite(19,HIGH) のように、アナログ入力 5 をデジタル ラインとして参照できます。 このようなコマンドは、論理 1 をポート 19、つまりアナログ回線 5 に書き込みます。


技術的には、TX/RX シリアル ポート ラインを使用できます。 ただし、場合によっては、特にコードでシリアル ポートの操作に必要な Serial.begin() などの関数を使用する場合、これを実行するのが非常に困難になります。 したがって、ユーザーが使用できる接点の総数は依然として 17 個になります。しかし、17 個のピンで多数の LED またはサーボモーターを制御することは可能でしょうか? この場合、特別な外部マイクロ回路を使用することをお勧めします。 多くの場合、74HC595 のようなシフト レジスタがこれらの目的に使用されます。 ただし、制御のために 3 行の追加が必要であり、すべての行を同時に「展開」することはできません。 MAX7219などのディスプレイドライバも実際にはピンの数を「拡張」します。 しかし、MAX7219 は高価なチップです。 したがって、MCP23017 ポート拡張チップを使用する方が安価で合理的です。 このチップは 16 ライン用に設計されており、1.8 ~ 5.5 V の広い動作電圧範囲を備え、I2C インターフェイス経由で制御されます。


MCP23017 は 2 つの Arduino ピンを使用し、16 の I/O ラインを提供します。 したがって、技術的には、8 個の MCP23017 を使用して、1 つの 16 ピン Arduino を 16 x 8 = 128 ピンに拡張できます。 Arduino には Wire.h と呼ばれる I2C バス用のライブラリがあるため、MCP23017 とのインターフェースは非常に簡単です。 以下はArduinoとMCP23017間の接続図です。




#include "Wire.h" void setup() ( Wire.begin(); // I2C バスをアクティブ化 // ラインを出力に設定 Wire.beginTransmission(0x20); Wire.write(0x00); // IODIRA レジスタWire.write (0x00); // ポート A のすべてのラインを出力に設定します Wire.endTransmission(); ) void loop() ( Wire.beginTransmission(0x20); Wire.write(0x12); // アドレス バンク A Wire. write((byte )0xAA); // 送信された値 - ログの全行 1 Wire.endTransmission(); late(500); Wire.beginTransmission(0x20); Wire.write(0x12); // アドレスバンク A Wire .write(( byte)0x55); // 送信された値 - ログの全行 1 Wire.endTransmission(); late(500); )

Arduino プラットフォームの主な利点の 1 つは、その人気です。 この人気のプラットフォームは電子機器メーカーによって積極的にサポートされており、コントローラーの基本機能を拡張するさまざまなボードの特別バージョンがリリースされています。 このようなボードは、論理的には拡張ボード (別名: Arduino シールド、シールド) と呼ばれ、さまざまなタスクを実行するために使用され、Arduino オペレーターの作業を大幅に簡素化できます。 この記事では、Arduino 拡張ボードとは何か、またそれをさまざまな Arduino デバイス (モーター (モーター ドライバー シールド)、LCD スクリーン (LCD シールド)、SD カード (データ ロガー)、センサー) と連携させるためにどのように使用できるかを学びます。 (センサーシールド)他多数。

まずは用語を理解しましょう。 Arduino 拡張ボードは、特定の機能を実行するように設計された完全なデバイスであり、標準コネクタを使用してメイン コントローラーに接続されます。 拡張ボードの別の一般的な名前は、英語の Arduino シールド、または単にシールドです。 必要な電子コンポーネントはすべて拡張ボードに取り付けられており、マイクロコントローラーやメインボードの他の要素とのやり取りは標準の Arduino ピンを通じて行われます。 ほとんどの場合、シールドへの電力はメインの Arduino ボードからも供給されますが、多くの場合、他の電源から電力を供給することも可能です。 どのシールドにも、他のコンポーネントを接続して自由に使用できるいくつかの空きピンがあります。

英語のShieldは盾、スクリーン、スクリーンと訳されます。 私たちの文脈では、それはコントローラーボードを覆い、デバイスの追加層、つまりさまざまな要素が隠されている画面を作成するものとして理解されるべきです。

なぜArduinoシールドが必要なのでしょうか?

すべては非常に単純です: 1) 時間を節約するため、2) これで誰かがお金を稼ぐことができます。 組み立て済みですぐに使い始めることができるものを、設計、配置、はんだ付け、デバッグに時間を無駄にする必要はありません。 高品質の機器で組み立てられた適切に設計された拡張カードは、通常、信頼性が高く、最終デバイスで占めるスペースが少なくなります。 これは、自己組織化を完全に放棄する必要があるという意味ではなく、特定の要素の動作原理を理解する必要もありません。 結局のところ、本物のエンジニアは、自分が使用しているものがどのように機能するかを常に理解しようとします。 しかし、毎回車輪の再発明をするのではなく、これまでにほとんどの人が解決していないことに注意を集中すれば、より複雑なデバイスを作成できるようになります。

当然のことながら、機会を得るにはお金を払わなければなりません。 ほとんどの場合、最終シールドのコストは個々のコンポーネントの価格よりも高くなりますが、同様のオプションをいつでも安くすることができます。 ただし、費やした時間やお金が自分にとってどれだけ重要かを判断するのはあなた次第です。 中国産業界からのあらゆる支援を考慮すると、ボードのコストは常に低下しているため、既製のデバイスを使用することが選択されることがほとんどです。

シールドの最も一般的な例は、センサー、モーター、LCD スクリーン、SD カード、ネットワークおよび GPS シールドを操作するための拡張ボード、負荷に接続するためのリレーを内蔵したシールドなどです。

Arduino シールドの接続

シールドを接続するには、シールドをメインボードに慎重に「置く」だけです。 通常、櫛型シールド (オス) の接点は、Arduino ボードのコネクタに簡単に挿入できます。 場合によっては、基板自体が適切にはんだ付けされていない場合、ピンを慎重に調整する必要があります。 ここで重要なのは、慎重に行動し、過度な力を加えないことです。

原則として、シールドは非常に特定のバージョンのコントローラーを対象としていますが、たとえば、Arduino Uno 用のシールドの多くは Arduino Mega ボードでも非常にうまく機能します。 メガのピン配置は、最初の 14 デジタル ピンとボードの反対側のピンが UNO のピン配置と一致するように作られているため、Arduino シールドを簡単に挿入できます。

Arduinoシールドプログラミング

拡張ボードを使用した回路のプログラミングは、通常の Arduino プログラミングと何ら変わりません。コントローラーの観点からは、デバイスを通常のピンに接続しただけだからです。 スケッチでは、シールド内でボード上の対応する接点に接続されているピンを示す必要があります。 原則として、製造元はシールド自体または別の接続説明書にピンの対応関係を示します。 ボードのメーカー自体が推奨するスケッチをダウンロードした場合は、これを行う必要さえありません。

シールド信号の読み取りまたは書き込みも、 Arduino ユーザーなら馴染みのある関数やその他のコマンドを使用するという通常の方法で行われます。 特定の接続方式に慣れていて、メーカーが別の接続方式を選択している場合(たとえば、ボタンを地面に引き、シールドを電源に引き込んだ場合)、場合によっては衝突が発生する可能性があります。 ここだけは注意が必要です。

通常、この拡張ボードは Arduino キットに同梱されているため、Arduino エンジニアが最もよく遭遇するのは Arduino キットです。 シールドは非常にシンプルです。その主な役割は、Arduino ボードに接続するためのより便利なオプションを提供することです。 これは、ボード上にある追加の電源コネクタとグランド コネクタを介して、アナログ ピンとデジタル ピンのそれぞれに接続されて行われます。 また、ボード上には、外部電源を接続するためのコネクタ (スイッチを切り替えるにはジャンパを取り付ける必要があります)、LED、および再起動ボタンがあります。 シールドのオプションと使用例をイラストでご覧いただけます。




タッチ拡張ボードにはいくつかのバージョンがあります。 それらはすべてコネクタの数とタイプが異なります。 現在最も人気のあるバージョンは、Sensor Shield v4 と v5 です。

この Arduino シールドはロボット プロジェクトにおいて非常に重要です。 通常のモーターとサーボモーターを一度にArduinoボードに接続できます。 シールドの主な役割は、通常の Arduino ボードに十分な電流を消費するデバイスを制御することです。 このボードの追加機能は、モーター出力を制御し (PWM を使用)、回転方向を変更する機能です。 モーターシールド板には多くの種類があります。 それらのすべてに共通するのは、外部負荷が接続される強力なトランジスタ、放熱素子 (通常はラジエーター)、外部電源を接続する回路、モーターを接続するためのコネクタ、およびモーターに接続するためのピンが回路内に存在することです。アルドゥイーノ。



ネットワークを使用した作業を組織することは、現代のプロジェクトにおいて最も重要なタスクの 1 つです。 イーサネット経由でローカル ネットワークに接続するには、対応する拡張カードを使用できます。




プロトタイピング用の拡張ボード

これらのボードは非常にシンプルで、要素を取り付けるための接触パッド、リセット ボタン、および外部電源を接続する機能を備えています。 これらのシールドの目的は、必要なすべてのコンポーネントがメインボードのすぐ上に配置されている場合に、デバイスのコンパクト性を高めることです。





Arduino LCDシールドとTFTシールド

このタイプのシールドは、Arduino で LCD スクリーンを操作するために使用されます。 ご存知のとおり、最も単純な 2 行のテキスト画面を接続するのは簡単な作業ではありません。電源を除いて、6 つの画面接点を一度に正しく接続する必要があります。 完成したモジュールを Arduino ボードに挿入し、対応するスケッチをアップロードする方がはるかに簡単です。 人気の LCD キーパッド シールドでは、4 ~ 8 個のボタンがボード上にすぐに取り付けられるため、デバイスのユーザー向けに外部インターフェイスをすぐに構成できます。 TFTシールドも役立ちます



Arduinoデータロガーシールド

製品に独立して実装するのが非常に難しいもう 1 つのタスクは、センサーから受信したデータを時間基準とともに保存することです。 完成したシールドを使用すると、データを保存し、内蔵時計から時刻を取得できるだけでなく、はんだ付けまたは回路基板上で便利な形式でセンサーを接続することもできます。




簡単な概要

この記事では、Arduino の機能を拡張するさまざまなデバイスの膨大な範囲のほんの一部だけを取り上げました。 拡張カードを使用すると、最も重要なこと、つまりプログラムのロジックに集中できます。 シールドの作成者は、正しく信頼性の高い取り付けと必要な電源を提供しました。 あとは、貴重な英語のワード シールドを使用して必要なボードを見つけ、Arduino に接続してスケッチをアップロードするだけです。 通常、シールド プログラミングは、既製のプログラムの内部変数の名前を変更する単純なアクションの実行で構成されます。 その結果、使いやすさと接続が容易になるだけでなく、完成したデバイスやプロトタイプの組み立て速度も向上します。

拡張カードを使用する場合の欠点は、コストがかかることと、その性質上シールドの汎用性により効率が低下する可能性があることです。 狭いタスクやエンドデバイスの場合、すべてのシールド機能が必要ない場合があります。 この場合、シールドはプロトタイピングとテストの段階でのみ使用し、デバイスの最終バージョンを作成するときに、シールドを独自の回路とレイアウトのタイプの設計に置き換えることを検討する必要があります。 決めるのはあなた次第です。あなたには正しい選択をするあらゆる機会があります。

誰もが安価な Arduino ボードを愛していますが、多くの場合、プロジェクトには 1 つまたは 2 つの空きポートが必要なだけです。 また、十分なポートがあるにもかかわらず、構造の別の部分に大量のワイヤを引き込みたくない場合もあります。 デバイスの前面パネルにいくつかのボタンと LED を配置する必要があるとします。 ケーブルやハーネスを使用せずに、2 本のデータ バス ワイヤだけでメインボードに接続するほうが、より信頼性が高く、簡単ですよね。

さまざまな Arduino ポート エクスパンダは、このような状況向けに設計されています。

通常、マイクロコントローラーのピンはいくつかの異なる機能を実装するため、異なるエクスパンダが存在します。

  1. 標準 GPIO ポート エクスパンダ
  2. PWM出力エキスパンダ
  3. アナログ入力エキスパンダ – マルチプレクサおよび外部 ADC

これとは別に、デジタルアナログコンバータ (DAC) と I2C バスのアドレス空間エクスパンダについても言及する価値があります。 これらのデバイスはポートの機能を直接複製するものではありませんが、マイクロコントローラーの機能を拡張します。

シリーズの最初の記事では、デジタル I/O ポートとして機能する最もシンプルで便利なエクスパンダについて説明します。 これらは超小型回路と です。 これらはまったく同じように設計され、動作し、ポートの数のみが異なります。

Arduino用のエキスパンダーモジュールの選択

最も人気があり、安価なモジュールは PCF8574 チップで作られています (図 1)

米。 1. 人気のPCF8574ポート拡張モジュール

利点:
  • 低価格。
  • 1 つのモジュールのプラグを前のモジュールのソケットに挿入するだけで、モジュールをチェーンで接続できます。 ジャンパを異なるモジュールアドレスに設定することを忘れないでください。
欠点:
  • ブレッドボードに直接挿入することはできません (ポートコネクタを裏側にはんだ付けすることをお勧めします)。
  • 1 つのモジュールに合計 8 つのポート。

もっと本格的なプロジェクトに興味がある場合は、Aliexpress で 16 ビット PCF8575 モジュールを注文してください。 図に示すモジュールを強くお勧めします。 2.

米。 2. PCF8575 ポート拡張モジュール

利点:
  • ポート数が 2 倍。
  • 3.3 ボルト電源を内蔵しており、他のモジュールに電力を供給できます。
  • さまざまな電源電圧での I2C バスのロジック レベル マッチングを内蔵。
  • 基板のプロトタイピングに便利な形式。
欠点:
  • より高い価格。

PCF8574/PCF8575 GPIO ポート エクスパンダの動作原理

データ交換は I2C バス経由で行われます。 Arduino ボードへの接続には、電源を含めて 4 本のワイヤのみが必要です。 エクスパンダのアドレスは入力 A0...A2 の 3 つのジャンパによって設定されるため、8 つの同一チップをバスに同時に接続し、PCF8574 チップでは最大 8*8=64 個、PCF8575 チップでは 8*16=128 個の追加ポートを取得できます。 。

ポートにデータを出力するには、I2C バス上のモジュール アドレスにデータ バイトを書き込みます。 ポートからデータを読み取るには、同じアドレスのバイトを読み取ります。 バイトは常に全体として書き込まれ、読み取られ、個々のビットはプログラムによって処理されます。

マイクロ回路の出力は入力でもあり、出力の目的を決定するサービス レジスタはありません。 出力バイトが書き込まれるラッチ レジスタのみがあります。これはどのようにして可能でしょうか?

ポートは同様のオープンコレクタ方式で動作し、内部プルアップ抵抗が装備されています。 出力に論理 0 が書き込まれると、出力トランジスタが開き、出力が強制的にグランドに引き下げられます。 このようなポートから読み取ると、常に 0 が返されます。

低いピンに直接電源電圧を印加する場合や、電流が超過する場合には注意してください。 50mAチップをダメにしてしまいますよ!

ポートを入力として使用するには、ポートに 1 を書き込みます。 この場合、内部トランジスタはオフになり、読み取り結果はピンに印加される外部ロジック レベルによって決まります。 空き端子は内蔵抵抗により電源に接続されています。

ポートの一部を入力として、また一部を出力として同時に使用するには、エクスパンダにデータのバイトを書き込む前に、「論理演算子」を使用して、入力に対応するビットに 1 のマスクを適用する必要があります。 OR」操作。 それだけです)))

割り込み発生

PCF857* ポート エキスパンダが割り込みパルスを生成する 低レベルマイクロ回路の任意の入力における入力信号の変化を INT 出力で確認します。 これは、エクスパンダがキーパッドとして機能する場合に便利です。 ただし、どのボタンが押されたか離されたかを割り込みハンドラで自分で判断する必要があります。 割り込み発生器には接点バウンス抑制フィルタが装備されています。

例 1: PCF8574 モジュールの使用

4 つの LED、PCF8574 モジュール、Arduino ボードからなる簡単な回路を組み立ててみましょう (図 3 および 4)。 この接続方式では、LED のクエンチング抵抗も必要ありません。 電流は LED と電源レールに接続された内蔵抵抗を通って流れます。

米。 3. PCF8574モジュール接続図

米。 4. PCF8574モジュールを使用した回路レイアウト

スケッチ 1 をコピーして Arduino ボードに書き込みます。

// バス上のモジュール アドレス (A0、A1、A2 = 0) int address = 0x38; // モジュールから読み取られたデータ uint8_t dataReceive; // モジュールに書き込むデータ uint8_t dataSend; void setup() ( Wire.begin(); Serial.begin(9600); // すべてのポート PCF8574 dataSend = B11111111; pcf8574_write(dataSend); ) void loop() ( // モジュール dataReceive からバイトを読み取ります= pcf8574_read (); // バイナリ形式でモニターに出力 Serial.println(dataReceive, BIN); // ビットをニブルだけ左にシフト dataSend = dataReceive<< 4; // Накладываем битовую маску dataSend |= B00001111; // Записываем байт в модуль pcf8574_write(dataSend); delay(500); } // Процедура записи байта в модуль void pcf8574_write(uint8_t dt) { Wire.beginTransmission(address); Wire.write(dt); Wire.endTransmission(); } // Процедура чтения байта из модуля int8_t pcf8574_read() { Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(address, 1); return (Wire.read()); }

最初にチップのすべてのポートにハイ レベルが書き込まれるため、ポート P0 ~ P3 は入力として機能できます。

ポート端子のレベルを500msごとに読み取り、読み取り結果をモニターに表示します。 入力 P0 ~ P3 の 1 つを共通のワイヤに接続すると、そのビットに 0 が表示されます。 次に、読み取った値が 4 ビット左にシフトされ、結果がポートに出力され、LED の 1 つが消灯します。 たとえば、ピン P0 でゼロが読み取られると、ピン P4 に接続された LED がオフになります。

エキスパンダに書き込む前に、入力となるすべてのビットに 1 のビットマスクを適用する必要があることに注意してください。

I2C バスを操作するためのルーチンは非常に簡素化されており、エラーは処理されません。

アドバイス: I2C バス上のモジュール アドレスを検索して確認するには、 を使用できます。 バス要求に応答するすべてのデバイスのアドレスが端末に表示されます。

例 2: PCF8575 モジュールの使用

PCF8575 モジュールの特徴は、16 個のポートがあることです。 常に 2 バイトを書き込み、2 バイトを読み取ります。 2 番目のバイトが必要ない場合でも、この規則に従う必要があります。

図を少し変更してみましょう。 LED をポート P10 ~ P13 に接続し、ポート P00 ~ P03 をジャンパで共通線に接続します (図 5 および 6)。

米。 5. PCF8575モジュール接続図

米。 6. PCF8575モジュールを使用した回路レイアウト

スケッチ 2 では、最初にすべてのポートに 1 が書き込まれ、次にそれらのステータスが 500 ミリ秒ごとに読み取られます。 読み取りルーチンは、バイトに分割された 16 ビット ワードを返します。 下位バイト (ピン P00 ~ P07) の内容が上位バイトにコピーされ、モジュールにアップロードされます。 ピン P00 ~ P03 の 1 つを共通線に接続すると、P10 ~ P13 に接続された LED の 1 つが消灯します。

// I2C を操作するためのライブラリ #include // デフォルトではバス上のモジュール アドレス int address = 0x20; // モジュール uint8_t から読み取られたデータ こんにちは、こんにちは; uint16_t データ受信; uint8_t データハイバイト; // 上位バイト (P10...P17) uint8_t dataLowByte; // 下位バイト (P00...P07) void setup() ( Wire.begin(); Serial.begin(9600); // すべてのポートに High レベル PCF8575 dataHighByte = B11111111; dataLowByte = B11111111; pcf8575_write(dataLowByte, dataHighByte ); ) void loop() ( // モジュールからバイトを読み取ります dataReceive = pcf8575_read(); // バイナリ形式でモニターに出力 Serial.println(dataReceive, BIN); // ロングワードから下位バイトを選択しますdataLowByte = lowByte(dataReceive ); // 下位バイトを上位バイトにコピー dataHighByte = dataLowByte; // 下位バイトにマスクを適用します dataLowByte |= B11111111; // 新しいデータをモジュールに書き込みます (2 バイト) pcf8575_write(dataLowByte, dataHighByte); late(500); ) // モジュールにバイトを書き込む手順 void pcf8575_write(uint8_t dtl, int8_t dth) ( Wire.beginTransmission(address); Wire.write(dtl); // 下位バイトを書き込む(P00...P07) Wire.write(dth); // 上位バイトを書き込む (P10...P17) Wire.endTransmission(); ) // モジュールからバイトを読み取る手順 int16_t pcf8575_read() ( Wire .beginTransmission(アドレス); Wire.endTransmission(); Wire.requestFrom(アドレス, 2); lo = Wire.read(); // 下位バイト (P00...P07) を読み取ります。 hi = Wire.read(); // 上位バイト (P10...P17) を読み取ります return (word(hi, lo)); // 長い単語を返します )

PCF8574/PCF8575用Arduinoライブラリ

ライブラリは GitHub からダウンロードできます。 ただし、ご覧のとおり、ポート エクスパンダの操作は非常に簡単で、特別なライブラリがなくても簡単に実行できます。

エキスパンダーシールドの説明

Expander Shieldは、SPIまたはI2Cインターフェイスを備えたポートエクスパンダを使用して、Arduinoプラットフォームに基づくマイクロコントローラや他のマイクロコントローラの入出力ポートの数を増やすように設計されたオリジナルの追加モジュールです。


エキスパンダー シールド追加モジュールの主な要素は、2 つの MCP23S17 または MCP23017 マイクロ回路 (それぞれ SPI または I2C インターフェイスを備えた 2 つの 16 ビット I/O ポート エクスパンダ) で、これにより 4 つの 8 ビット I/O ポートを追加できます。 , 追加の「脚」は32本。

装置

Expander Shield モジュールは、組み立てられた SPI または I2C バージョン (関連チップ付き)、または個別に購入できるチップなしのキットとして提供されます。

モジュール端子には輸送用ロックが装備されている場合があり、作業を開始する前に取り外しておく必要があります。

エキスパンダーシールド SPI 1100 こすります。 850こする。 カートに追加

注文書。

ExpanderShield から SPI バスへ (MCP23S17 チップ搭載)。

エキスパンダー シールド I2C 1100 摩擦。 850こする。 カートに追加

注意! JavaScript が無効になっています。 注文システムとショッピングカートの通常の操作ができなくなります。 何らかの理由でJavaScriptを有効にできない場合は、注文フォームに注文する商品をリストしてください。

ExpanderShield から I2C バスへ (MCP23017 チップ搭載)。

仕様

Expander Shield モジュールの最も重要な機能特徴は次のとおりです。

  • 現在取り付けられているポート拡張チップのタイプに応じて便利なモジュール動作モード切り替え。
  • 使用される 2 つの 16 ビット I/O ポート エクスパンダ チップのそれぞれについて、バス上の 3 ビット アドレスがジャンパを使用して設定されます。これにより、このようなチップを 1 つのバス上に最大 8 つまで配置できます。
  • ジャンパーを使用して、SPI バスの CS 信号に対応する Freeduino/Arduino マイクロコントローラー出力 (デジタル ピン 8、9、または 10) の番号を選択する機能。
  • モジュールは「パススルー」コネクタを使用しているため、Arduino ボードに対して移動することなく複数のモジュールをドッキングできます。
  • マイクロ回路信号は、追加のグランドおよび +5V 接点を備えた 4 つの PBD-10R コネクタに出力されます。
  • ジャンパを使用して、16 ビット I/O ポート拡張チップと Freeduino/Arduino マイクロコントローラの個別または共同ハードウェア リセット (RESET ボタン) を選択する機能。
  • 割り込みピン (INTA、INTB)、ハードウェア リセット (RST)、およびチップ セレクト (CS) を備えた追加の JPIC コネクタ。

モジュールのその他の特性は、主に MCP23S17/MCP23017 マイクロ回路の特性によって決定され、その技術的説明はメーカーのドキュメントで入手できます。

さらに、追加の Expander Shield モジュールの使用を開始する前に、その回路図をよく理解しておくことをお勧めします。

動作モード

Expander Shield 動作モードは、DIP スイッチとジャンパを使用して選択します。

インターフェース選択とI2Cバスプルアップ制御

DIP スイッチを使用して、MCP23S17 マイクロ回路の場合は SPI モード (接点グループ 1 ~ 4 をオンにする)、MCP23017 マイクロ回路の場合は I2C モード (接点グループ 5 ~ 6 をオンにすること) を選択します。 また、I2C モードでは、必要に応じてピン 7 と 8 を使用して、I2C バスが電流制限抵抗を介して +5V 電源バスに接続されます。 通常、I2C バス上にデバイスが 1 つだけある場合は、プルアップ抵抗を接続する必要があります。 複数のデバイスがある場合、抵抗はそのうちの 1 つのデバイスにのみ接続されます。

SPIバスとI2Cバス、およびSPIバスと7、8ピングループの同時アクティブ化 禁じられている.

1 つのエキスパンダー シールド モジュール内の 2 つのマイクロ回路のうちの 1 つが SPI インターフェイス (MCP23S17) 経由で動作し、もう 1 つが I2C インターフェイス (MCP23017) 経由で動作する場合、組み合わせた動作モードは不可能です。

SPI および I2C インターフェイスを介して同時に作業を行う必要がある場合は、対応するスイッチ位置を持つ 2 つ (複数) の追加の Expander Shield モジュールを使用する必要があります。

SPIバスのCS信号を制御するピン番号の選択

SPI バスの場合、CS 信号として使用される Freeduino/Arduino マイクロコントローラー ピンを選択する必要があります。 通常、ピン 10 が使用されます。これは、SS1 コネクタの左端のジャンパ位置に対応します。 ジャンパを他の 2 つの位置のいずれかに移動すると、それぞれピン 9 と 8 を選択できます。

バス上の超小型回路のアドレスの選択

MCP23S17/MCP23017 マイクロ回路のアドレスの下位 3 ビットは、IC1_addr/IC2_addr コネクタのジャンパを使用して、ビット 0、1、2 をグランド (Gnd) または +5V (5V) にプルすることで選択されます。

各チップのアドレスは一意である必要があります。

したがって、最大 8 つの超小型回路を 1 つのバス上に配置できます (たとえば、4 つのエキスパンダー シールドを組み合わせることで)。

ハードウェアリセット動作モードの選択(RESETボタン)

RESET ボタンの多数の動作モードの 1 つを整理することができます。

  • RESET ボタンは Freeduino/Arduino および MCP23S17/MCP23017 チップをリセットします
  • RESET ボタンは Freeduino/Arduino のみをリセットします
  • RESET ボタンは MCP23S17/MCP23017 チップのみをリセットします

JRS コネクタ上の対応するジャンパ位置 (左から右) を以下に示します。

ライブラリ MCP23xxx

このモジュールおよび他の多くのモジュールの操作を簡素化するために、MCP23xxx シリーズのマイクロ回路の機能へのシンプルなインターフェイスを提供する MCP23xxx ライブラリが開発されました。 ライブラリは無料でダウンロードできます。ライブラリは Arduino ソフトウェア バージョン 1.0.5 と互換性があります (それ以降のバージョンとの互換性も期待されています)。

実際、これは MCP23xxx と LiquidCrystal_MCP23x17 という 2 つのライブラリのセットです。

ライブラリのインストールについては、「ライブラリを接続する」セクションで詳しく説明します。 インストール後のライブラリフォルダーのディレクトリ構造は次のようになります。

/libraries/LiquidCrystal_MCP23x17
/ライブラリ/MCP23xxx

MCP23xxx ライブラリは、MCP23017、MCP23S17、MCP23008、および MCP23S08 ポート エクスパンダとの連携を構成するクラス テンプレートを実装しています。 LiquidCrystal_MCP23x17 ライブラリは、ロシア語をサポートし、ポート エキスパンダを通じて動作する、修正された標準 LiquidCrystal ライブラリです。

ライブラリには、その操作方法を説明するサンプルが付属しています。 ライブラリの以前のバージョンもダウンロードできます。

I2C バスのモジュールを操作する例を見てみましょう。

//例では1番目のチップのピンの状態を読み取り、2番目のチップにも同じ値を設定します

//I2C バージョンの場合は、Wire.h を接続します。
#含む
//ライブラリを接続する
#含む

//CMCP23017 クラスの 2 つのオブジェクトを作成しますが、初期化はしません。 I2C バスの準備ができていません
CMCP23017 mcp23_1;
CMCP23017 mcp23_2;

void setup()
{
//I2Cバスを初期化します...
Wire.begin();
//... およびアドレス 0 と 1 を持つ MCP23* オブジェクト
mcp23_1.init(0);
mcp23_2.init(1);

//1 番目のチップのすべてのピンを入力にし、2 番目のピンを出力にする必要があります
//これはループ内で実行できます
for (int i= 0 ; i< 16 ; i++ ) {
mcp23_1.pinMode (i, 入力) ;
mcp23_2.pinMode (i, 出力) ;
}
// または、pinMode16 メソッドを呼び出して一度に
//mcp23_1.pinMode16(0x0ffff);
//mcp23_2.pinMode16(0x00000);
}

ボイドループ()
{
// ループ内で 1 番目のチップのすべての入力を読み取り、2 番目のチップに同じ値を設定できます
for (int i= 0 ; i< 16 ; i++ ) {
mcp23_2.digitalWrite (i, mcp23_1.digitalRead (i) ) ;
}
//またはdigitalRead16メソッドとdigitalWrite16メソッドを使用して一度に
//mcp23_2.digitalWrite16(mcp23_1.digitalRead16());
}

すでに行ったように、Arduino 用の重複しないセンサーのセットを 3 つ注文しました。 両方のセットで、74HC595 マイクロ回路を受け取りましたが、当面は箱の中に入れておきました。 当分の間、私はそれがどのような超小型回路なのか、そしてこの黒いゴキブリがどのようにラベル付けされているのかさえ知りませんでした。

しかし、ステッピング モーターをテストするデバイスを構築しているときに、Arduino Nano の出力信号を十分に取得できないという暗い日がやって来ました。 (TODO: 準備ができたら、SD テスターに​​関する記事へのリンクを挿入します)。 その結果、ステッピング モーターをテストするための私のデバイスは非常に複雑であることが判明しました。フル機能の 4x4 キーボードによって制御されるメニュー システムを備えた 2 行の 1602 ディスプレイ、ステッピング モーターのマイクロステッピング値を設定するための 3 つのデジタル数字、ステップステッピングモーターなどのDir信号 Arduino の別のバージョンに移行する時期が来たようです。 しかし、私の生来の怠け者はこの移住に反対しました。 そして怠惰な頭は解決策を探し始めました。

既存のものに基づいて解決策を探すことにしました。 キットのスカーフやパーツを整理していたら、16ピンの黒い「カブトムシ」に気づきました。 最初は 1 つのセットで、次に別のセットで。 これはどのようなパーツなのか、なぜセットに追加されたのかを聞いてみることにしました。 なぜキットに入れているのか分かりませんが、チップ自体はNXPのWebサイトで見つけました。

これはかなり興味深いマイクロ回路であることがわかりました。シリアル入力とパラレル出力を備えたシフトレジスタです。

(データシートより)

ピンの説明

接触 名前 説明と接続
10 ~MR マスターリセット- リセット、アクティブレベルはローです。 理想的には、最初にこの入力を Low に駆動し、次に単一状態に駆動するリセット回路を作成することをお勧めします。 ただし、わざわざ +5V に接続する必要はありません。 この場合、最初のレコードの前の出力にはランダムな値が含まれます。
13 ~OE 出力イネーブル- 出力解像度、アクティブレベルは低い。 0 が適用されると、レジスタの内容が出力に供給され、1 が適用されると、出力はオフになり、Z ステートに転送され、異なるデバイスが 1 つのバスを交互に使用できるようになります。 出力の状態を制御する必要がない場合は、グランドに接続します。
14 D.S. シリアルデータ入力- シリアル入力。 この入力は、SHCP シフト クロックが適用される前に入力信号値に設定する必要があります。
11 SHCP シフトレジスタ入力クロック- シフトレジスタのクロック入力。 ビットをレジスタに移動するには、0 から 1 への遷移を適用する必要があります。いつ 0 に戻すかはあなたの裁量に任されています。 すぐにでもいいし、押し込む直前でもいい。 最初のケースでは、スイッチングは直接信号のエッジに沿って発生し、2 番目のケースでは、反転信号の減衰に沿って発生すると仮定できます。 以下のパフォーマンスに関するメモも参照してください。 また、この信号が到着するとシリアル出力Q7/Sの値が変化します。
12 STCP ストレージ レジスタ クロック入力- ラッチレジスタのクロック入力。 このパルスのエッジで、値がシフト レジスタからパラレル出力 Q0 ~ Q7 に転送されます。
9 Q7S シリアルデータ出力- シリアル出力。 シフトレジスタの最上位ビットの値が表示されます。 この出力を使用して、シフト レジスタを 16 ビット、24 ビットなどにスケールすることができます。 スキーム
15, 1-7 Q0、Q1~7 ラッチレジスタ出力。 これらへの信号は、STCP 信号の到着時に内部シフト レジスタから転送されます。
8 GND 栄養- コモンワイヤー
16 VCC 栄養 - +

栄養

マイクロ回路の HC バージョンには 2V ~ 6V の電源が必要ですが、HCT バージョン (TTL 互換) には 4.5V ~ 5.5V の電源が必要です。 HCT - TTL - まだ使用されていますか? Arduino自体はCMOSのようであるため、HCTは必要ありませんが、外部のTTLコンシューマとレベルを調整する必要がある場合は、HCに3.3Vから電力を供給でき、信号レベルはTTLと互換性があります。 一般に、HC と HCT はどちらも 5 ボルトの Arduino で動作するはずです。 これは彼らがインターネット上に書いていることです。

さらに重要なのはブロッキングコンデンサです。 これらがないと、回路が意図したとおりに動作しない可能性があり、さらには予測不能になる可能性があります。 理論的には、それぞれの場合の電源回路に 0.1 µF のコンデンサを取り付ける必要があります。 この容量値はインターネットから平均として計算しました。 彼がいなくても私の計画はうまくいきました。 明確にするために、私は回路設計者のバイブルを調べて明確にしました - ヒルとホロウィッツの「回路設計の芸術」は、ドナルド・クナットの「プログラミングの芸術」にほぼ似ていますが、ハードウェア担当者のみを対象としています (ちなみに、ヒルとホロウィッツクヌート氏は、人々にはるかに近いところにいますが、彼は賢すぎるのです)が、そこではブロッキングコンデンサを入力のデカップリングコンデンサと呼んでいるようです。 とても良い本ですが、すでに時代遅れになっているのが残念です。 私が持っているのは 90 年代後半か 0 年代前半の 2 冊目か 3 冊目のロシア語版ですが、オリジナルはおそらくまだ 10 年前のものです。 3 番目のピンクの巻には、「14 ルーブル」というステッカーが貼られていました。現代の基準からすると、当時はすべてがどれほど安かったかがわかります。 しかし、まだ15年か少ししか経っていません。 ノスタルジーが圧倒的でした。

パフォーマンス

データシート 74HC595 のタイトルには、100 MHz で動作すると書かれています。 データシートのグラフと表をざっと見ると、4.5V電源で-40℃~+85℃の温度範囲での最長タイミングは10~20ns(100~50MHz)であることがわかります。 Arduino が動作する周波数については、他に何も知る必要はありません。 標準ライブラリのdigitalRead/digitalWriteがさまざまなチェックのために大きなブレーキになっている可能性があり、より高速なバージョンとして書き換えることができる(そしてそうすべき)です。 これについては掘り下げて詳しく書くつもりですが、今のところ特に必要はありません。

私の観察によると、出力の切り替えと入力の処理速度という点での Arduino Nano と Arduino ライブラリのパフォーマンスは、数 kHz から数十 kHz の中間あたりです。 したがって、私の意見では、74HC595 シフト レジスタを制御するコードを作成する場合、制御信号の設定の遅延を心配する必要はありません。

もう1つのことは、8ビットシリアルエクスパンダの場合、Arduinoで利用可能な最大出力スイッチング周波数を分割する必要があります-DSを設定し、SHCPを1に設定し、SHCPを0にリセットし、STCPを設定/リセットします。 一見すると、合計は 3 * 8 + 2 = 26 回のdigitalWrite 操作になります。 合計すると、Arduino 自体が実行できる速度よりも約 25 倍遅いことがわかります。

出力を 16、24、または 32 に拡張すると、速度低下はそれぞれ約 3*16 + 2 = 50 倍、3*24 + 2 = 74 倍、および 3*32 + 2 = 98 倍になります。

明らかに、このような 74HC595 シフト レジスタ エクスパンダは、非常に高速なものを制御するのには適していませんが、一部のアプリケーションでは、めったに変化しない静的信号を指定するのに非常に適しています。 そこで、たとえば、ステッピング モーター用テスターで DRV8825 ステッピング モーター ドライバーのマイクロステップ モードを設定するために、このようなエクスパンダを使用して 3 ビット マイクロステップ モードを設定しました。 ちなみに、これは私にとってまだ特に役に立ちません。ドット マトリクス プリンタのステッパは、少なくとも DRV8825 ドライバの制御下では、マイクロステッピング モードではひどく動作します。たとえば、マイクロステッピング モードでは、ステップの 1/2 がどういうわけか鈍くて不安定ですが、後半だけが明るくて力強いです。 したがって、マイクロステップを使用すると、ステッピング モーターの軸に少し力を加えただけで、前半のステップがスキップされ始めました。 その後、私はどういうわけか既存のプリンタ SD に残っているマイクロステッピング モードを調べませんでした。

スケーリング

74HC595 に基づく Arduino 出力エキスパンダは、8 ビット バージョンから任意の容量の回路に非常に簡単に変換できます。 これを行うには、下位レジスタ Q7S のシリアル出力を上位レジスタの DS 入力に接続し、SHCP ラインと STCP ラインを並列接続する必要があります。 採用した回路とソフトウェア ソリューションに応じて、~MR ラインと ~OE ラインを接続する方法を選択する必要があります。

入力拡張

Arduino の入力ラインの拡張は、出力で DS 値を設定する必要はなく入力で読み取ることと、74HC597 タイプのチップを使用するという事実を考慮すると、原理的には出力の拡張と似ています。 ただし、実際にはまだテストしていません。

多重化

Arduino によって制御される出力ラインの数は、次の 2 つの方法で増やすことができます。 1) 1 つのシリアル出力のビット容量を増やします。ビット容量を 2 倍、3 倍、または 4 倍に増やすと、それに対応してエクスパンダの速度が 2 倍低下します。 、3、4回。 2) 複数のエクスパンダを並列接続し、各エクスパンダに 1 つの追加出力を使用します。これによりパフォーマンスを許容レベルに維持できますが、各エクスパンダに少なくとも 1 つの Arduino 出力を使用する必要があります。

Arduino でレジスタ信号 74HC595 - ~MR、~OE を直接制御しない場合、シフト レジスタ信号 DS、SHCP、STCP を制御して 8 または 16 以上の出力信号にするには、3 つの Arduino 出力だけで十分です。 74HC595チップを使用。

74HC595 に基づいて複数のエクスパンダを多重化するには、次の 2 つの方法があります。 1) 各信号エクスパンダに対して、個別のラッチ信号を選択します。 バス上のすべてのレジスタは受信データを並列にシフトし、それに応じて内部シフト レジスタの出力の値をシフトしますが、値を内部シフト レジスタからマイクロ回路の出力に送信するのは 1 つだけです。 2) シフト信号はエクスパンダの 1 つにのみ送信され、出力への信号値の転送はすべての拡張モジュールに対して同時に行われます。

内部シフト レジスタに必要なものを何でも含めることができ (オプション 1)、以前の値の一部が出力で固定されている場合、私はこのオプションを使用する傾向があります。その理由は次のとおりです。内部シフト レジスタから値を転送する場合レジスタから出力への接続では、内部レジスタと出力の初期値が同じであっても、0 から 1 への制御されていない遷移やその逆が発生する可能性があり、ある種の信号バウンスが発生する可能性があります。 そして、私の考えでは、内部シフトレジスタの状態を 74HC595 の出力に転送する操作は、できるだけ使用しないほうがよいと考えています。

ソフトウェアサポート

この拡張機能および同様の拡張機能のソフトウェア サポートは、使用される Arduino コントローラーのdigitalRead/digitalWrite を使用して特定のピンを介してデバイスに直接アクセスするのではなく、抽象 I/O デバイスのピンを介してアクセスすることで構成されます。これにより、抽象 I/O デバイスは、特定のタイプの Arduino と、別の同様の抽象デバイスに接続します。
トピックの続き:
コンピューター

「このタイプの通信は Beeline 加入者には利用できません」 - このようなメッセージはそれほど頻繁には表示されませんが、その表示は良い前兆ではありません。 そして最大の悩みは…