ESP8266으로 SPI 통신하기

14072 단어 ArduinoESP8266

Arduino core for ESP8266 WiFi chip 그럼 잠시 동안, SPI의 Mode 3(CPOL의 Active Low)을 사용할 수 없었습니다만, 최근에 되어 사용할 수 있게 되었습니다. 여기에서는 ESP8266에서 3축 가속도 센서를 이용한 SPI 통신을 실시합니다.

준비



다음을 준비합니다.
  • ESP8266 ESPr Developer (ESP-WROOM-02 개발 보드) : 스위치 과학



  • 이 개발 보드는 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

    좋은 웹페이지 즐겨찾기