ESP8266으로 SPI 통신하기
Arduino core for ESP8266 WiFi chip 그럼 잠시 동안, SPI의 Mode 3(CPOL의 Active Low)을 사용할 수 없었습니다만, 최근에 되어 사용할 수 있게 되었습니다. 여기에서는 ESP8266에서 3축 가속도 센서를 이용한 SPI 통신을 실시합니다.
준비
다음을 준비합니다.
이 개발 보드는 ESP8266의 Boot 모드(Flash Boot/UART Download) 전환을 자동으로 해 줍니다. 모듈 단독으로 사는 것보다 높게 붙습니다만 그 밖에도 USB 시리얼 통신, 3.3 V전원, 리셋 회로 기능의 탑재를 생각하면 ESP8266의 개발에서는 추천입니다.
3축 가속도 센서 모듈 ADXL345 : 아키즈키 전자
ADXL345는 I2C에서도 통신할 수 있지만, SPI로 통신하는 경우에는 앞서 설명한 모드 3에 의한 통신 제어가 필요합니다.
배선
ESP8266과 ADXL345를 다음과 같이 배선한다.
ESP8266의 핀 배치는 다음과 같습니다. 이미지는 매우 알기 쉬운 ESP-WROOM-02를 사용해보십시오 : Eleclog. 씨로부터 빌렸습니다.
그림은 ESP8266(ESP-WROOM-02) 모듈 단체의 핀 배치입니다만, 스위치 사이언스사의 ESPr Developer도 대략 비슷한 배치가 되어 있습니다. 주의해야 할 것은 이번 프로그램에서는 CS의 핀을 IO15가 아니라 IO5에 할당하고 있다는 점입니다.
Arduino core for ESP8266 WiFi chip은 기본적으로 위 그림과 같이 핀 기능이 할당되어 있지만 ESP8266은 원래 IO 핀에 임의의 기능을 할당 할 수 있습니다. 따라서 ESP8266과 관련된 다양한 기사에서 핀 배치가 다르지만 작동 할 수있는 이유는 여기에 있습니다.
조금 혼란스러워 버릴지도 모릅니다만, WEB를 참고로 ESP8266을 개발할 때는 소스 코드를 확인하면서 배선의 체크를 실시하면 좋을 것입니다.
SPI 기능
기본 핀
이번 설정 핀
ADXL345
CLK
IO14
IO14
SCL
미소
IO12
IO12
SDIO
MOSI
IO13
IO13
SDA
CS
IO15
IO5
CS
또한 CS 기능 할당을 IO15에서 IO5로 변경하는 이유는 IO15가 모드 전환 기능을 담당하기 때문에 ADXL345를 연결할 때 모드 전환이 정상적으로 수행되지 않을 가능성을 피하기 때문입니다. . (실제로 접속했는데 로그가 정상적으로 출력되지 않아 잘 움직이지 않았습니다)
프로그램
다음 프로그램을 작성합니다. 202. ADXL345 - Fab 창고 Docs 님의 코드를 유용했습니다. 32bit CPU의 ESP8266에 맞추어 변수의 형태를 바꾸고 있습니다. 쓰기 파라미터는 다음을 참고하십시오.
품목
값
보드
Generic ESP8266 Module
플래시 모드
QIO
Flash Frequency
80MHz
CPU Frequency
80MHz
Flash Size
4M(1M SPIFFS)
디버그 포트
Serial
Debug Level
없음
Reset Method
nodemcu
Upload Speed
115200
ADXL345_SPI.ino#include <SPI.h>
//ADXL345 レジスタアドレス
#define BW_RATE 0x2C //Data rate and power mode control
#define POWER_CTL 0x2D //Power Control Register
#define DATA_FORMAT 0x31 //Data format control
#define DATAX0 0x32 //X-Axis Data 0
#define SS 5 //デフォルトから設定を変更して再定義(IO15 -> IO5)
char values[10];
int16_t x,y,z;
float xg, yg, zg;
void setup() {
SPI.begin();
SPI.setDataMode(SPI_MODE3);
SPI.setBitOrder(MSBFIRST);
Serial.begin(115200);
// SSをHightに
pinMode(SS, OUTPUT);
digitalWrite(SS, HIGH);
// ADXL345初期化
writeRegister(DATA_FORMAT, 0x03); // ±16g 10bit
writeRegister(POWER_CTL, 0x08); // 測定モード
}
void loop() {
// DATAX0レジスタから6バイトを取得
readRegister(DATAX0, 6, values);
// 2Byteのデータを再構成
x = ((int16_t)values[1]<<8)|(int16_t)values[0];
y = ((int16_t)values[3]<<8)|(int16_t)values[2];
z = ((int16_t)values[5]<<8)|(int16_t)values[4];
// 0.03125 = (16*2)/(2^10)
xg = x * 0.03125;
yg = y * 0.03125;
zg = z * 0.03125;
// ログ出力
Serial.print(xg);
Serial.print("\t");
Serial.print(yg);
Serial.print("\t");
Serial.println(zg);
}
void writeRegister(char registerAddress, char value) {
// SPI開始時にSSをLOWにする
digitalWrite(SS, LOW);
// レジスタアドレス送信
SPI.transfer(registerAddress);
// レジスタに設定する値送信
SPI.transfer(value);
// SPI終了時にCSをHIGHにする
digitalWrite(SS, HIGH);
}
void readRegister(char registerAddress, int16_t numBytes, char * values) {
// 書き込みフラグを立てる
char address = 0x80 | registerAddress;
// 複数バイトフラグを立てる
if(numBytes > 1)address = address | 0x40;
// SPI開始時にSSをLOWにする
digitalWrite(SS, LOW);
// 読み出し先レジスタのアドレスを送信
SPI.transfer(address);
// 値の読み出し
for(int16_t i=0; i<numBytes; i++) {
values[i] = SPI.transfer(0x00);
}
// SPI終了時にCSをHIGHにする
digitalWrite(SS, HIGH);
}
결과
시리얼 모니터로 확인하면 정상적으로 동작하고 있으면 다음과 같이 됩니다. 기판을 기울이면 값이 변경됩니다. 전송 속도는 115200bps이어야 합니다. 만약, 문자 깨지는 경우는 한번 리셋 버튼을 누릅니다. 1열은 X축, 2열은 Y축, 3열은 Z축의 값입니다.
(보충) SPI 통신 모드에 대해
IO14(CLK) 핀의 출력 파형을 오실로스코프로 확인해 보았습니다. 지금까지는 CPOL의 제어를 할 수 없고 Mode 1(Mode 2)의 Active High 밖에 할 수 없었습니다.
모드 1
그러나 최근 라이브러리가 수정되어 Mode 3(Mode 4)을 지정하면 정상적으로 Active Low의 파형이 출력되게 되었습니다.
모드 3
Reference
이 문제에 관하여(ESP8266으로 SPI 통신하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hikoalpha/items/f735662e2e0d75699675
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
다음 프로그램을 작성합니다. 202. ADXL345 - Fab 창고 Docs 님의 코드를 유용했습니다. 32bit CPU의 ESP8266에 맞추어 변수의 형태를 바꾸고 있습니다. 쓰기 파라미터는 다음을 참고하십시오.
품목
값
보드
Generic ESP8266 Module
플래시 모드
QIO
Flash Frequency
80MHz
CPU Frequency
80MHz
Flash Size
4M(1M SPIFFS)
디버그 포트
Serial
Debug Level
없음
Reset Method
nodemcu
Upload Speed
115200
ADXL345_SPI.ino
#include <SPI.h>
//ADXL345 レジスタアドレス
#define BW_RATE 0x2C //Data rate and power mode control
#define POWER_CTL 0x2D //Power Control Register
#define DATA_FORMAT 0x31 //Data format control
#define DATAX0 0x32 //X-Axis Data 0
#define SS 5 //デフォルトから設定を変更して再定義(IO15 -> IO5)
char values[10];
int16_t x,y,z;
float xg, yg, zg;
void setup() {
SPI.begin();
SPI.setDataMode(SPI_MODE3);
SPI.setBitOrder(MSBFIRST);
Serial.begin(115200);
// SSをHightに
pinMode(SS, OUTPUT);
digitalWrite(SS, HIGH);
// ADXL345初期化
writeRegister(DATA_FORMAT, 0x03); // ±16g 10bit
writeRegister(POWER_CTL, 0x08); // 測定モード
}
void loop() {
// DATAX0レジスタから6バイトを取得
readRegister(DATAX0, 6, values);
// 2Byteのデータを再構成
x = ((int16_t)values[1]<<8)|(int16_t)values[0];
y = ((int16_t)values[3]<<8)|(int16_t)values[2];
z = ((int16_t)values[5]<<8)|(int16_t)values[4];
// 0.03125 = (16*2)/(2^10)
xg = x * 0.03125;
yg = y * 0.03125;
zg = z * 0.03125;
// ログ出力
Serial.print(xg);
Serial.print("\t");
Serial.print(yg);
Serial.print("\t");
Serial.println(zg);
}
void writeRegister(char registerAddress, char value) {
// SPI開始時にSSをLOWにする
digitalWrite(SS, LOW);
// レジスタアドレス送信
SPI.transfer(registerAddress);
// レジスタに設定する値送信
SPI.transfer(value);
// SPI終了時にCSをHIGHにする
digitalWrite(SS, HIGH);
}
void readRegister(char registerAddress, int16_t numBytes, char * values) {
// 書き込みフラグを立てる
char address = 0x80 | registerAddress;
// 複数バイトフラグを立てる
if(numBytes > 1)address = address | 0x40;
// SPI開始時にSSをLOWにする
digitalWrite(SS, LOW);
// 読み出し先レジスタのアドレスを送信
SPI.transfer(address);
// 値の読み出し
for(int16_t i=0; i<numBytes; i++) {
values[i] = SPI.transfer(0x00);
}
// SPI終了時にCSをHIGHにする
digitalWrite(SS, HIGH);
}
결과
시리얼 모니터로 확인하면 정상적으로 동작하고 있으면 다음과 같이 됩니다. 기판을 기울이면 값이 변경됩니다. 전송 속도는 115200bps이어야 합니다. 만약, 문자 깨지는 경우는 한번 리셋 버튼을 누릅니다. 1열은 X축, 2열은 Y축, 3열은 Z축의 값입니다.
(보충) SPI 통신 모드에 대해
IO14(CLK) 핀의 출력 파형을 오실로스코프로 확인해 보았습니다. 지금까지는 CPOL의 제어를 할 수 없고 Mode 1(Mode 2)의 Active High 밖에 할 수 없었습니다.
모드 1
그러나 최근 라이브러리가 수정되어 Mode 3(Mode 4)을 지정하면 정상적으로 Active Low의 파형이 출력되게 되었습니다.
모드 3
Reference
이 문제에 관하여(ESP8266으로 SPI 통신하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hikoalpha/items/f735662e2e0d75699675
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
IO14(CLK) 핀의 출력 파형을 오실로스코프로 확인해 보았습니다. 지금까지는 CPOL의 제어를 할 수 없고 Mode 1(Mode 2)의 Active High 밖에 할 수 없었습니다.
모드 1
그러나 최근 라이브러리가 수정되어 Mode 3(Mode 4)을 지정하면 정상적으로 Active Low의 파형이 출력되게 되었습니다.
모드 3
Reference
이 문제에 관하여(ESP8266으로 SPI 통신하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hikoalpha/items/f735662e2e0d75699675텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)