튜토리얼:아두이노와의 SPI bus

이 첫 번째는 두 개의 장에서는 우리가 시작하는 것을 조사하는 SPI 데이터 버스,그리고 어떻게 우리가 할 수 있습 제어 장치를 사용하여 그것은 우리의 아두이노 시스템입니다.

SPI 버스로 보일 수도 있지만 복잡한 인터페이스를 마스터,그러나 몇 가지 간단한 연구의 이 설명과 실제 사례 당신은 곧 당신이가는 버스 마스터! 이를 위해 우리는 필요한 이론을 배우고 다양한 장치를 제어하여 적용합니다. 이 튜토리얼에서는 일이 가능한 한 간단하게 유지됩니다.

그러나 우선,그것은 무엇입니까? 그리고 일부 이론…

SPI 는”직렬 주변 장치 인터페이스”의 약자입니다. 그것은 동기 직렬 데이터 버스 데이터 수 있는 여행지에서 양 방향으로,같은 시간에 반대하는(예를 들어)I2C bus 는 이렇게 할 수 없습니다. 동기식 데이터 전송을 허용하기 위해 SPI 버스는 4 개의 와이어를 사용합니다. 그들은 호출됩니다:

  • MOSI–Master-out,Slave-in. 이 라인은 우리의 Arduino 에서 SPI 제어 장치로 데이터를 전달합니다.
  • MISO–Master-in,Slave out. 이 라인은 SPI 제어 장치의 데이터를 Arduino 로 다시 전달합니다;
  • Ss-Slave-select. 이 라인은 우리가 통신하고자하는 버스의 장치를 알려줍니다. 각 SPI 장치 필요 고유 SS 라인 다시 아두 이노;
  • SCK-직렬 시계.

이 자습서 내에서 우리는 Arduino 보드를 마스터로 간주하고 SPI 장치는 노예로 간주합니다. Arduino Uno 및 호환 보드에 사용되는 핀은 다음과 같습니다.

  • ss–digital10. 당신이 사용할 수 있는 다른 디지털 방식으로 핀,하지만 10 은 일반적으로 기본으로 그것이 다른 옆에 SPI 핀;
  • MOSI–디지털 11;
  • 미소–디지털 12;
  • 스탠다드차타드금융지주–디지털 13;

Arduino Mega users–MISO 는 50,MOSI 는 51,SCK 는 52,ss 는 일반적으로 53 입니다. Arduino Leonardo 를 사용하는 경우 SPI 핀은 ICSP 헤더 핀에 있습니다. 자세한 내용은 여기를 참조하십시오. SPI 버스로 하나 이상의 장치를 제어할 수 있습니다. 예를 들어,하나의 장치에 대한 배선이 될 것이다:

sspiss1

데이터 이동을 따라 앞뒤로 모시고 된장 라인 사이 우리의 아두이노와의 SPI 장치입니다. 이것은 SS 라인이 낮음으로 설정된 경우에만 발생할 수 있습니다. 즉,버스의 특정 SPI 장치와 통신하려면 해당 장치에 대한 SS 회선을 LOW 로 설정 한 다음 통신 한 다음 회선을 HIGH 로 다시 설정합니다. 가 있는 경우에 우리는 두 개 또는 더 SPI 디바이스는,배선은 다음과 같다.

sspiss2

알 수 있는 방법은 두 가지가 있 SS 라인–우리는 하나가 필요한 각 SPI 장치에서 버스입니다. 당신은 Ss 라인으로 아두 이노에 어떤 무료 디지털 출력 핀을 사용할 수 있습니다. 그냥 시간에 사용하고자하는 SPI 장치에 연결된 라인을 제외하고 높은 모든 SS 라인을 가지고 기억.

데이터는 바이트 형태로 SPI 장치로 전송됩니다. 당신은 지금까지 알고 있어야 하는 팔 비트는 바,따라서 대표가 진수 값으로 사이에 영 255.

우리의 SPI 장치와 통신 할 때,우리는 장치가 데이터를 다루는 방법을 알아야합니다–MSB 또는 LSB 먼저. MSB(가장 중요한 비트)는 이진수의 왼쪽이고 LSB(가장 중요한 비트)는 숫자의 오른쪽입니다. 즉,:

binnum

그 외에도에서 보내는 숫자 값에 따라 SPI 버스,이진 숫자를 나타낼 수도 있습니다 명령입니다. 을 나타낼 수 있는 여덟 on/off 를 사용하여 설정을 한 바이트의 데이터 디바이스의 매개 변수를 설정할 수 있습을 전송 바이트의 데이터입니다. 이러한 매개 변수는 각 장치에 따라 다르며 특정 장치의 데이터 시트에 설명되어야합니다. 예를 들어,디지털 포 텐 쇼 미터 IC 여섯 남비:

sdata1

이 장치는 두 바이트를 필요로 합니다. 이 ADDR 바이트는 장치는 여섯 개의 전위차계를 제어(번호 0~5),과 데이터 바이트 값에 대한 전위차계(0~255). 정수를 사용하여이 두 값을 나타낼 수 있습니다. 예를 들어,전위차계 번호 2 를 125 로 설정하려면 2 를 장치에 보낸 다음 125 를 보냅니다.

스케치에서 SPI 장치로 데이터를 어떻게 보냅니 까?우선 SPI 라이브러리를 사용해야합니다. 기본 Arduino IDE 설치에 포함되어 있으므로 스케치 시작 부분에 다음을 넣으십시오.

#include "SPI.h"

next,in void.setup()ss 에 사용될 핀을 선언하고 출력으로 설정하십시오. 예를 들어,

pinMode(ss, OUTPUT);

여기서 ss 는 이전에 값 10 의 정수로 선언되었습니다. 지금을 활성화하는 SPI 버스:

SPI.begin();

그리고 마지막으로 우리에게 필요한 스케치하는 방법으로 데이터를 전송, MSB 또는 데이터베이스를 최신으로 유지하여

SPI.setBitOrder(MSBFIRST);

또는

SPI.setBitOrder(LSBFIRST);

때 그 시간을 보낼 데이터의 아래 SPI 버스는 우리의 장치는,세 가지 일어날 필요가 있다. 먼저 SS 가있는 디지털 핀을 low 로 설정하십시오:

digitalWrite(SS, LOW);

그리고 보낼 데이터 바이트를,한 번에 한 바이트를 이용:

SPI.transfer(value);

값을 수 있는 정수/바이트 사이 제 255. 마지막으로 완료되면 데이터 전송,장치 종료에 의하여 전송 설정 SS 고

digitalWrite(ss, HIGH);

데이터를 전송하는 것은 매우 간단합니다. 일반적으로 가장 어려운 부분에 대한 사람들을 해석하는 장치가 데이터 시트 방법을 이해하는 명령어와 데이터의 구조화를 위한 전송합니다. 그러나 약간의 연습으로 이러한 작은 장애물을 극복 할 수 있습니다.

이제 몇 가지 실용적인 예를 들어!SPI 버스를 타고 일부 장치를 제어 할 시간입니다. 아래 예제를 따르면 SPI 버스 및 장치가 Arduino 보드와 함께 사용할 수있는 방법에 대한 실질적인 이해를 얻어야합니다.

MCP4162 예

우리의 첫번째 예에서 사용한 간단하면서도 흥미로운 부분에–디지털 전위차계(우리는 또한 사용에서 하나 I2C 자). 이번에 우리는 마이크로칩 MCP4162-시리즈 10k 저항기:

digipotss

여기에서 데이터시트를 당신의 열람. 그것을 제어하는 우리는 보낼 필요가 두 바이트의 데이터 첫 번째 바이트는 바이트 제어,그리고 다행히도 이 예제는 그가 항상 제로(같은 주소에 대한 와이퍼 값은 00h). 두 번째 바이트는 저항을 제어하는 와이퍼를 설정하는 값입니다. 그래서를 설정하는 와이퍼를 우리가 해야 할 세 가지에서 스케치에…

첫 번째로 설정합 SS(slave select)라인을 저:

digitalWrite(10, LOW);

를 보낸 다음 두 가지 부전승의 데이터:

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

마지막으로 설정 SS 라인은 높은:

digitalWrite(10, HIGH);

쉽게 할 수 있습니다. 연결 우리의 Arduino 보드은 매우 간단합니다–고려 MCP4162 핀아웃:

mcp4162pinout

Vdd 연결하 5V,Vss GND,CS 디지털 10 스탠다드차타드금융지주는 디지털 13 일 SDI 을 디지털 11SDO 디지털 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); }}

을 보려면 지금 결과의 스케치합니다. 다음 비디오 클립에서 a 우리는 저항 범위를 통해 실행하고 멀티 미터로 rheostat 값을 측정합니다:

앞으로 이동하기 전에는 경우,디지털 전위차계에 새로운 당신을 위해,이 글을 읽고 짧은 가이드에 의해 작성된 마이크로칩의 차이점에 대해 기계 및 디지털 포텐셔미터.

또 다른 예:

이 예제에서,우리가 사용하는 아날로그 장치 AD5204 네 개의 채널 디지털 포텐셔미터(데이터 시트입니다.pdf). 그것은 4 개의 10k 옴 선형 전위차계를 포함하고,각 전위차계는 256 위치 중 하나에 조정 가능합니다.설정이 휘발성이므로 전원이 꺼지면 기억되지 않습니다. 그러므로 힘이 적용될 때 전위차계는 가늠자의 한가운데에 전부 미리 놓입니다. 우리의 보기는 SOIC-24 지상 산 보기입니다,그러나 또한 복각 체재에서 또한 제조됩니다.

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()및 알론()를 사용하여 설정한 전위차계를 최소 및 최대 각각합니다. 우리는 스케치의 시작 부분에 allOff()를 사용하여 Led 를 끕니다. 이것은 파워 업에 와이퍼가 일반적으로 반쯤 설정되어 있기 때문에 필요합니다.

또한 우리는 Blinkall()함수에서 그들을 사용하여 Led 를 깜박입니다. Setpot()함수는 와이퍼 번호(0~3)와 값을 받아 해당 와이퍼(0~255)를 설정합니다. 마지막으로 indfade()함수는 펄스 폭 변조와 매우 유사한 효과를 일으키는 순서대로 각 LED 를 켜고 끄는 좋은 작업을 수행합니다.

마지막으로,그것은 여기에서 동작:

그래서 당신이 그것을 희망을 이해하기 쉽게 소개하는 세계의 SPI 버스와 방법을 제어하는 장치이다. 언제나처럼,이제는 통제 할 무언가를 찾거나 다른 헛소리까지 얻는 것이 당신과 당신의 상상력에 달려 있습니다. 다음 SPI 기사에서는 SPI 버스를 통해 데이터를 읽고 쓰는 것을 살펴볼 것입니다.

이 게시물은 pmdway 에 의해 당신에게 가져 왔습니다.com-전세계 무료 배송 업체 및 전자 제품 애호가를위한 모든 것.

를 최신 상태로 유지 새로운 게시물 tronixstuff.com 시 메일링 리스트 상자에서 오른쪽에,또 follow us on twitter@tronixstuff.다른 사람들과 공유하십시오:

인쇄

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다