[Arduino] 모든 디바이스를 I2C화

2787 단어 ArduinoI2C

처음에



Arduino에 여러 장치와 센서를 연결하여 사용하고 싶을 때 핀 수가 부족하거나, 타격 등이 없습니까?
또한 사용중인 I2C 센서를 프로그램을 다시 쓰지 않고 다른 센서로 대체하고 싶지 않을까요?

이번에는
· 여러 I2C 디바이스
· 소프트웨어 시리얼
・전자 릴레이
등으로 복수 핀이 사용되고 있는 Arduino에 대해서, 한층 더 액정 모듈을 장착하고 싶다고 하는 요구를 위해서 액정 모듈을 I2C화했습니다.


경위



처음에는 I2C 16x2 문자 흑백 LCD을 사용했지만,
· 좀 더 크게 표시하고 싶습니다.
· 프로그램을 변경하지 않고 LCD 만 교체하고 싶습니다.
라는 요구가 있어 SPI 연결 1.8인치 TFT LCD 모듈I2C 16x2 문자 흑백 LCD 와 커멘드 호환으로 Arduino와 I2C로 접속할 수 있도록 하기로 했습니다.

구조



SPI 연결 1.8인치 TFT LCD 모듈을 I2C 모듈화하기 위해,
・TFT 액정을 다른 Arduino로 제어
・메인의 Arduino와 I2C로 접속(TFT 액정측을 슬레이브로 한다)
· 메인 Arduino에서 I2C로 명령을 보내 슬레이브 측 Arduino에서 표시
했다.

이렇게 하면 Arduino의 핀을 새롭게 소비하지 않고 액정을 추가할 수 있습니다.

Arduino 간의 I2C



Arduino를 I2C로 연결하는 방법은
Arduino간에 I2C 통신하는 방법
에 자세히 설명되어 있지만 매우 간단합니다.
이번은, 지금까지 사용하고 있던 I2C 16x2 문자 흑백 LCD 와 주소 호환, 커멘드 호환이 되도록(듯이) 했습니다.

흑백 액정에서는 커맨드(문자 출력, 커서 위치 변경 등)와 데이터(위치, 문자 등)를 0x40의 부호로 판단하고 있었으므로,
  Wire.beginTransmission(m_addr);
  Wire.write(_isData ? 0x40 : 0x00);
  Wire.write(_command[i]);
  Wire.endTransmission();

슬레이브측의 Arduino에서도 거기에 맞춘 사양으로 받도록 했습니다.
  if(isData==0){ // !0x40
    if((v_data&0x80)==0x80){ // 0x80はカーソルセットコマンド
      int x = (v_data&0x3f);
      int y = ((v_data>>6)&0x1);
      emu->SetCursor(x,y); // 16x2行を8x4行に 
    }
  }else if(isData==0x40){ // 0x40は文字表示コマンド
      emu->WriteCharReq(v_data);
  }
  else if(isData==0x10){ // 0x10は色変えコマンド(拡張)
    emu->SetPalette(v_data); // 0xfront|back
  }

요약



기존 디바이스를 I2C화하여 동작시킬 수 있었습니다.
그래픽 액정을 고속 표시하는 용도에는 적합하지 않지만,
· I2C 연결된 센서/장치를 사양을 변경하지 않고 다른 것으로 교체하고 싶습니다.
· 장치를 가능한 한 모듈화하고 싶습니다.
같은 용도에 적합하지 않을까 생각합니다.

좋은 웹페이지 즐겨찾기