チュートリアル:ArduinoとSPIバス

これは、SPIデータバスの調査を開始しようとしている二つの章の最初のものです,そして、私たちは私たちのArduinoシステSPIバスはマスターするための複雑なインターフェイスのように見えるかもしれませんが、この説明と実用的な例のいくつかの簡単な研究では、すぐにバ これを行うには、必要な理論を学び、さまざまなデバイスを制御して適用します。 このチュートリアルでは、物事はできるだけシンプルに保たれます。しかし、まず第一に、それは何ですか? そして、いくつかの理論…

SPIは”Serial Peripheral Interface”の頭字語です。 これは同期シリアル–データ-バスであり、データは(たとえば)i2Cバスとは対照的に、同時に両方向に移動することができます。 同期データ伝送を可能にするために、SPIバスは4本のワイヤを使用します。 それらは次のように呼ばれます:

  • MOSI–Master-out、Slave-in。 このラインは私達のArduinoからのSPI制御装置にデータを運びます;
  • MISOマスターイン、奴隷。 このラインは、SPI制御デバイスからArduinoにデータを戻します;
  • SS–Slave-select. この行は、我々はそれと通信したいバス上のデバイスを伝えます。 各SPIデバイスには、Arduinoに戻る一意のSSラインが必要です。
  • SCK–シリアルクロック。

これらのチュートリアルでは、Arduinoボードをマスターとみなし、SPIデバイスをスレーブとみなします。 私たちのArduino Unoと互換性のあるボードでは、使用されるピンは次のとおりです。

  • SS–digital10。 他のデジタルピンを使用できますが、他のSPIピンの隣にあるため、通常は10がデフォルトです。
  • MOSI–digital11;
  • MISO–digital12;
  • SCK–digital13;Arduinoのメガユーザー-MISOは50、MOSIは51、SCKは52、SSは通常53です。 Arduino Leonardoを使用している場合、SPIピンはICSPヘッダーピン上にあります。 詳細はこちらを参照してください。 SPIバスを使用して1つ以上のデバイスを制御できます。 たとえば、あるデバイスの配線は次のようになります。

    sspiss1

    データは、ArduinoとSPIデバイスの間のMOSI線とMISO線に沿って前後に移動します。 これは、SSラインがLOWに設定されている場合にのみ発生します。 言い換えれば、バス上の特定のSPIデバイスと通信するには、そのデバイスのSSラインをLOWに設定してから、それと通信してから、ラインをHIGHに戻します。 バス上に複数のSPIデバイスがある場合、配線は次のようになります。

    sspiss2

    二つのSSラインがあることに注意してください–バス上の各SPIデバイスに一つが必要です。 あなたはSSラインとしてあなたのArduinoの任意の自由なデジタル出力ピンを使うことができます。 その時に使用したいSPIデバイスに接続されているラインを除いて、すべてのSSラインをハイにすることを忘れないでください。

    データはバイト形式でSPIデバイスに送信されます。 これで、8ビットが1バイトになるため、ゼロから255の間の値を持つ2進数を表すことがわかります。SPIデバイスと通信するときは、デバイスがデータを処理する方法を知る必要があります–最初にMSBまたはLSB。 MSB(最上位ビット)は2進数の左辺で、LSB(最下位ビット)は数値の右辺です。 それは…:

    binnum

    SPIバスに沿って数値を送信するだけでなく、二進数もコマンドを表すことができます。 1バイトのデータを使用して8つのオン/オフ設定を表すことができるため、1バイトのデータを送信することでデバイスのパラメータを設定できます。 これらのパラメータはデバイスごとに異なり、特定のデバイスのデータシートに記載されている必要があります。 たとえば、6つのポットを備えたデジタルポテンショメータIC:

    sdata1

    このデバイスには2バイトのデータが必要です。 ADDRバイトは、6つのポテンショメータのうちどれを制御するか(0~5の番号)をデバイスに指示し、データバイトはポテンショメータの値(0~255)です。 これらの2つの値を表すために整数を使用できます。 たとえば、ポテンショメータ番号2を125に設定するには、2から125をデバイスに送信します。

    スケッチでSPIデバイスにデータを送信するにはどうすればよいですか?

    まず、SPIライブラリを使用する必要があります。 これはデフォルトのArduino IDEインストールに含まれているので、スケッチの先頭に次のものを入れてください。

    #include "SPI.h"

    next,in void。setup()SSに使用するピンを宣言し、出力として設定します。 たとえば、

    pinMode(ss, OUTPUT);

    ここで、ssは以前に値tenの整数として宣言されています。 次に、SPIバスをアクティブにするには、

    SPI.begin();

    最後に、

    SPI.setBitOrder(MSBFIRST);

    または

    SPI.setBitOrder(LSBFIRST);

    デバイスにSPIバスをダウンさせてデータを送信する時が来たとき、三つの方法でデータ、MSBまたはLSBを最初に送信する方法をスケッチに指示する必要があります。物事が起こる必要があります。 まず、SSのデジタルピンをlowに設定します。:次に、データをバイト単位で送信します。

    SPI.transfer(value);

    値は、ゼロから255までの整数/バイトにすることができます。 最後に、デバイスへのデータの送信が終了したら、SSをhighに設定して送信を終了します。

    digitalWrite(ss, HIGH);

    データの送信は非常に簡単です。 一般的に、人々にとって最も困難な部分は、送信のためにコマンドとデータをどのように構造化する必要があるかを理解するために、デバイスのデータシート しかし、いくつかの練習では、これらの小さなハードルを克服することができます。今、いくつかの実用的な例のために!

    SPIバスに乗って一部のデバイスを制御する時間。 以下の例に従うことで、ARDUINOボードでSPIバスとデバイスをどのように使用できるかを実用的に理解する必要があります。

    MCP4162の例

    最初の例では、シンプルで興味深い部分、デジタルポテンショメータを使用します(I2Cチュートリアルでも使用しました)。 今回は、マイクロチップMCP4162シリーズ10kレオスタットを持っています:

    digipotss

    ここでは、あなたの閲覧のためのデータシートです。 それを制御するには、2バイトのデータを送信する必要があります–最初のバイトは制御バイトであり、ありがたいことにこの例では常にゼロです(ワイ 2番目のバイトは、抵抗を制御するワイパーを設定する値です。 まず、SS(スレーブ選択)行をlowに設定します。

    digitalWrite(10, LOW);

    次に、データの二つのバイを送信します。

    SPI.transfer(0); // command byteSPI.transfer(value); // wiper value

    最後に、SS行をhighに戻します。

    SPI.transfer(0); // command byteSPI.transfer(value); // wiper value

    最後に、SS行をhighに戻します。

    SPI.transfer(0); // command byteSPI.transfer(value); // wiper value

    最後に、SS行をhighに戻します。

    SPI.transfer(0); // command byteSPI.transfer(value); // wiper value

    最後に、SS行をhighに戻します。

    SPI.transfer(0); // command byteSPI.transfer(value); // wiper value

    digitalWrite(10, HIGH);

    簡単に完了しました。 私たちのArduinoボードへの接続は非常に簡単です–mcp4162ピン配置を考慮してください:

    mcp4162pinout

    Vddは5V、VssからGND、CSからデジタル10、SCKからデジタル13、SDIからデジタル11、SDOからデジタル12に接続します。 次に、次のスケッチでMCP4162の使用可能な値を実行してみましょう。

    /* SPI bus demo using a Microchip MCP4162 digital potentiometer */#include "SPI.h" // necessary libraryint ss=10; // using digital pin 10 for SPI slave selectint del=200; // used for various delaysvoid setup(){ pinMode(ss, OUTPUT); // we use this for SS pin SPI.begin(); // wake up the SPI bus. SPI.setBitOrder(MSBFIRST); // our MCP4162 requires data to be sent MSB (most significant byte) first}void setValue(int value){ digitalWrite(ss, LOW); SPI.transfer(0); // send command byte SPI.transfer(value); // send value (0~255) digitalWrite(ss, HIGH);}void loop(){ for (int a=0; a<256; a++) { setValue(a); delay(del); } for (int a=255; a>=0; --a) { setValue(a); delay(del); }}

    スケッチの結果を確認します。 次のビデオクリップでは、抵抗範囲を調べ、マルチメータでレオスタット値を測定します:

    先に進む前に、デジタルポテンショメータが新しい場合は、機械的ポテンショメータとデジタルポテンショメータの違いについてMicrochipが書いたこの短いガイ

    別の例:

    この例では、アナログ-デバイセズのAD5204四チャンネル-デジタル-ポテンショメータ(データシート。pdf)。 それは4つの10kオームの線形電位差計を含み、各電位差計は256の位置の1つに調節可能である。設定は揮発性であるため、電源がオフになっても記憶されません。

    設定は揮発性であるため、電源がオフになっても記憶されません。 従って力が応用であるとき電位差計はスケールの中間にすべて前に置かれる。 私たちの例はSOIC-24表面実装の例ですが、DIP形式でも製造されています。

    ad5204ss

    生活を楽にするために、それはスルーホールパッケージに変換SOICブレイクアウトボードにはんだ付けすることができます:

    ad5204boardss1

    この例では、四つのLedの明るさを制御します。 配線は非常に簡単です。 ピン配列はデータシートにあります。

    ex34p2schematic1

    そしてスケッチ:

    #include <SPI.h> // necessary libraryint ss=10; // using digital pin 10 for SPI slave selectint del=5; // used for fading delayvoid setup(){ pinMode(ss, OUTPUT); // we use this for SS pin SPI.begin(); // wake up the SPI bus. SPI.setBitOrder(MSBFIRST); // our AD5204 requires data to be sent MSB (most significant byte) first. See data sheet page 5 allOff(); // we do this as pot memories are volatile}void allOff()// sets all potentiometers to minimum value{ for (int z=0; z<4; z++) { setPot(z,0); }}void allOn()// sets all potentiometers to maximum value{ for (int z=0; z<4; z++) { setPot(z,255); }}void setPot(int pot, int level)// sets potentiometer 'pot' to level 'level'{ digitalWrite(ss, LOW); SPI.transfer(pot); SPI.transfer(level); digitalWrite(ss, HIGH);}void blinkAll(int count){ for (int z=0; zvoid indFade(){ for (int a=0; a<4; a++) { for (int l=0; l<255; l++) { setPot(a,l); delay(del); } for (int l=255; l>=0; --l) { setPot(a,l); delay(del); } }}void allFade(int count){ for (int a=0; a<count; a++)="" {="" for="" (int="" l="0;" l<255;="" l++)="" setpot(0,l);="" setpot(1,l);="" setpot(2,l);="" setpot(3,l);="" delay(del);="" }="">=0; --l) { setPot(0,l); setPot(1,l); setPot(2,l); setPot(3,l); delay(del); } }}void loop(){ blinkAll(3); delay(1000); indFade(); allFade(3);}

    関数allOff()とallOn()は、それぞれポテンショメータを最小値と最大値に設定するために使用されます。 スケッチの開始時にallOff()を使用してLedをオフにします。 これは、パワーアップ時にワイパーが一般的に半分に設定されているため、必要です。さらに、blinkAll()関数でそれらを使用してLedを点滅させます。 関数setPot()は、ワイパー番号(0~3)とそのワイパーを設定する値(0~255)を受け入れます。 最後に、関数indFade()は、各LEDのオンとオフを順番にフェージングする素晴らしい仕事をします。最後に、ここでそれが動作しています:

    だから、あなたはそれを持っています–うまくいけば、SPIバスの世界とその中のデバイスを制御する方法を理 いつものように、今では制御したり、他のペテンに立ち上がるために何かを見つけるためにあなたとあなたの想像力次第です。 次のSPI記事では、SPIバスを介したデータの読み取りと書き込みについて説明します。この投稿はpmdwayによってあなたにもたらされました。

    com-世界中の無料配信とメーカーや電子愛好家のためのすべて、。

    新しい投稿を最新の状態に保つには、次の手順を実行します。

    tronixstuff.com右のボックスにあるメーリングリストを購読するか、twitter@tronixstuffでフォローしてください。p>

    他の人と共有してください:

    印刷

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です