ESP32를 사용한 I2C 스캐너

4407 단어 ArduinoI2CESP32


I2C 문제 해결



온습도 기압 센서 BME280을 사용하려고 했지만 데이터를 전혀 취할 수 없습니다.
어라 - 이상해-라고 생각해 I2C의 스캔을 걸어 보기로 했습니다.

ESP32에서 I2C



I2C의 디바이스는 3.3V계의 것이 주류의 요즘, 5V계의 Arduino에 접속하려면 무엇인가와 신경을 쓰고 있습니다. 3.3V계의 마이컴 보드라면 불안 요소가 하나 줄어들기 때문에, 트러블 슈팅하기에는 안성맞춤입니다.

ESP32에서 과거에는 I2C는 상태가 나빴던 것 같습니다만 지금은 개선하고 있는 것 같기 때문에 디버그용으로 사용해도 좋을 것 같네요.
또한 작례가 많이 참조하기 쉽고 ESP32는 다양하게 사용하기 쉽기 때문에 이번에는 문제 해결을 위해 I2C 디바이스를 스캔하는 것을 기록해 둡니다.

배선




신호
ESP32 GPIO


SDA
21

SCL
22

(전원/VDD 등)
(3.3V)

(전원/GND)
(GND)


프로그램



Arduino Playground - I2cScanner
htps : // p ぁ yg 똥 d. 아르즈이의. ㄷc/마인/이 2cS 칸에 r/

에 게시된 프로그램을 그대로 ESP32에서도 사용할 수 있습니다.

직렬 연결의 전송 속도 만 ESP32에서 사용하기 쉬운 115200bps로 변경되었습니다.

 // --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    https://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
// 
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(115200);        // for ESP32 (modify by nanbuwks /  original: 9600)
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}



실행 결과



Scanning...
I2C device found at address 0x77  !
done

Scanning...
I2C device found at address 0x77  !
done

검색 결과 주소 0x77에서 장치를 찾았습니다.

어라? 0x76 로 설정하고 있었을 텐데라고 생각해 재검토하면 디바이스측에서는 납땜 실수하고 있었습니다. 이런. 그림에 쓴 것 같은 트러블 슛이었습니다.

I2C란?



2선(+전원선)으로 데이터를 교환하는 간단한 규격입니다.

I2C 외에도 SPI, I2S 등이 비슷한 표준입니다.
I2S는 3선식 음성 신호용 시리얼 전송 규격, SPI는 3선식(단방향 전송) 내지 4선식(양방향 전송) 규격입니다.

I2S, SPI는 전송처가 고정이거나 칩 셀렉트 신호용 하드웨어 배선으로 전송처를 선택합니다.

I2C는 위의 표준과 달리 소프트웨어로 주소를 지정하여 대상을 선택하는 것이 큰 차이입니다.

I2C는 간단합니까?



I2C는 "간단하다"고 썼습니다. 예를 들어 GROVE 핀 호환 모듈도 I2C로 연결할 수 있습니다.
커넥터 1개로 미리 잡아 하면 좋기 때문에, 간단・・・이지만, 역시 신경쓰지 않으면 안 되는 것이 전압. 또, 풀업 저항도 신경쓰지 않으면 안 되거나, 1개의 버스에 복수의 슬레이브를 접속할 때의 조정・・・

전자공작 레벨이라면 이 정도로 어떻게든 상당히 보입니다만, 좀 더 세세하게 추구하면 꽤 고도의 곳까지 가 버려, 꽤 안쪽이 깊을 것 같습니다. 안정성 등을 추구하는 경우는 I2C 보다는 SPI 쪽이 아직 사용 좋다고 하는 소리도 듣습니다. SPI는 SPI로 안쪽이 깊습니다만~.

좋은 웹페이지 즐겨찾기