しばらく更新が滞っていましたが生きています。w
とりあえず研究室で横のやつから邪魔されながら更新してる状況です。

んで今回のネタはSPI通信です。

SPI通信とは同期式のシリアル通信で高速で通信でき
また複数のスレーブを接続可能です。
ただデメリットとして伝送距離が短いというのがあるので優位が必要です。

 それではやっていきましょう!
1.はじめに

はじめに用意するものを書いておきます。

  1. Arduino本体
  2. SPI通信ができるスレーブデバイス(ここではDigital Pot)
  3. ブレッドボード
  4. 抵抗値測定用のテスター

Digital Potとは受信する信号値に応じて抵抗値を変化させられる素子のことです。
ちなみに秋月とかスイッチサイエンスで売ってます.

10kデジタルポテンショメータ SOP型

10kデジタルポテンショメータ DIP型


まあこんなかんじなやつを買ってくればいいわけです。

2.機器の接続

物が用意できたら次は今回使いたいDigital Potとマスターデバイスを以下のように接続します。

SPI

ここで書く端子の説明を書いていきます。

  • SCLK : 同期信号を送るピン生成はマスター側のデバイスで使用される 
  • MOSI : スレーブ入力(データ線)
  • MISO : スレーブ出力(データ線)
  • SS     : 複数デバイスを使用する場合デバイス選択に用いる。
端子説明はざっとこんなもんです。

それで使用するDigital Potの使いかたにちょいと特殊な部分があるので説明しておきます。

MOSI,MISOが一緒のピンになっているので、SCK(シリアルの同期クロック)でSDI/SDOの動作を変更してやる必要があります。
SPI2


詳しくはデータシートの41ページ参照

SPI3


MCP4131データシート

まあこれだけ注意しとけば単なるシリアル通信ですのでとっつきやすいかと思われます。


それで上記の接続以外にもICのGND,Vccがあるのでデータシートを見ながら接続するのも忘れずに
 
SPI4
SPI5


3.プログラミング

まずArduinoの開発環境のArduino IDEを起動します。
ここで??って人はArduino 入門記事をご覧ください

Arduino入門編
 

ここに詳しい内容が載ってます。
Arduino SPI日本語リファレンス 
Arduino関数一覧 

んで今回はSPI通信を用いるのでSPI.hをインクルードしておきます。


んで一応サンプルコード

//MCP4101の抵抗値をArduinoで制御するプログラム
#include <SPI.h>

#define DIGITAL_POT_SS_PIN 53
#define DIGITAL_POT_R_AB 10011
#define DIGITAL_POT_R_W 50

//Digital Potentiometer の抵抗値を 0 ~ 255 の段階の入力で制御する関数
void DigitalPotWriteFor256Level(int address, int level){
digitalWrite(DIGITAL_POT_SS_PIN, LOW);
SPI.transfer(address);
SPI.transfer(level);
digitalWrite(DIGITAL_POT_SS_PIN, HIGH);
}

//Digital Potentiometer の抵抗値を抵抗値[Ω]の入力で制御する関数
void DigitalPotWriteForResistor(int address, long resistor){
long level = (resistor - DIGITAL_POT_R_W)*256/DIGITAL_POT_R_AB;
DigitalPotWriteFor256Level(address, (int)level);
}

void setup(){
pinMode(DIGITAL_POT_SS_PIN, OUTPUT);
SPI.begin();
DigitalPotWriteFor256Level(0, 255);
//DigitalPotWriteForResistor(0, 10000);
}

void loop(){
}
 
 Sample Code Digital Pot