【M5】束線断線チェッカー(MCP23017)

ソフトウェア開発

5STACKにI/O エキスパンダ MCP23017を接続し、出力するパラレル信号が正常に入力されるかを検出し、束線が断線していないか及び、コネクタへのピン誤挿入を検査する。

構成

プロジェクト名:M5-CableChecker

デバイス:M5STACK

I/O エキスパンダ:MCP2301

回路図

プログラム

//********************************************************
// Project :MCP MCP23017 束線チェッカー
// Device  : M5Stack-Core-ESP32
// Tool    : "ツール"→"pertition scheme"→"no OTA"
// Created :2023.02.28
// Update  :2024.03.14
// Display :320 x 240ピクセル
// 参考サイト
// M5stackにMCP23017をつかってIOを拡張する
// https://shuzo-kino.hateblo.jp/entry/2021/09/21/213734
// 【Arduino】MCP23017を複数使って、デジタルピンを最大128増やす
// https://moyoi-memo.hatenablog.com/entry/2020/03/14/121101 
// https://qazsedcftf.blogspot.com/2018/12/esp32arduinoi2cmcp23017.html
// ESP32/arduino:I2CでMCP23017を接続 
//********************************************************
//========================================================
//ライブラリを追加
//========================================================
//--------------------------------------------------------
//ユーザーフォント用
//--------------------------------------------------------
//M5FontRenderの中でinckudeされているので読み込んではいけない
//#include "M5Core2.h"
//#include <M5Stack.h>
#include "binaryttf.h"
#include "M5FontRender.h" // Include after M5Stack.h / M5Core2.h
//--------------------------------------------------------
//I2C通信ライブラリ
//--------------------------------------------------------
#include "Wire.h"


//========================================================
//変数
//========================================================
//--------------------------------------------------------
// システム
//--------------------------------------------------------
byte outdata=0;
//--------------------------------------------------------
//font
//--------------------------------------------------------
M5FontRender render;
//========================================================
//  初期化処理
//========================================================
void setup() {
  M5.begin();  //Init M5Core.
  M5.Power.begin(); //Init Power module.
  Wire.begin(); // wake up I2C bus
  //------------------------------------------------------
  // シリアル初期化
  //------------------------------------------------------
  //※M5.begin()で呼び出されているので、呼び出してはいけない。
  //Serial.begin(115200); 
  //------------------------------------------------------
  //
  //------------------------------------------------------
  M5.Lcd.fillScreen(BLACK);
  if (!render.loadFont("/ombre.ttf")) {
    #ifdef DEBUG_MODE
    Serial.println("FontFile notexist");
    #endif
    M5.Lcd.setTextSize(3);
    M5.Lcd.setTextColor(ORANGE, BLACK);
    M5.Lcd.println("FontFile Not Exist.");
    while (1)
      ;
  }else{
    #ifdef DEBUG_MODE
    Serial.println("Render initialize OK");
    #endif
    //タイトル
    render.setTextSize(30);
    render.setTextColor(GREEN);
    render.setCursor(110, 9);
    render.printf("Ombre\n");
    render.setTextColor(WHITE);
    render.setCursor(60, 40);
    render.printf("Cable Checker");
  } 
  //------------------------------------------------------
  //I2CでMCP23017を初期化
  //------------------------------------------------------
  // set I/O pins to outputs
  //chip address   I2Caddress
  //    000        0x20
  //    001        0x21
  //    010        0x22
  //    011        0x23
  //    100        0x24
  //    101        0x25
  //    110        0x26
  //    111        0x27
  //方向設定A
  Wire.beginTransmission(0x20);
  Wire.write(0x00); // IODIRB register
  Wire.write(0xff); // set all of port B to outputs
  Wire.endTransmission();
  //方向設定B
  Wire.beginTransmission(0x20);
  Wire.write(0x01); // IODIRB register
  Wire.write(0x00); // set all of port B to outputs
  Wire.endTransmission();
  //プルアップ設定A 有効
  Wire.beginTransmission(0x20);
  Wire.write(0x0C); // IODIRB register
  Wire.write(0xff); // set all of port B to outputs
  Wire.endTransmission();
  //プルアップ設定B 無効
  Wire.beginTransmission(0x20);
  Wire.write(0x0D); // IODIRB register
  Wire.write(0x00); // set all of port B to outputs
  Wire.endTransmission();
  //初期値出力B
  Wire.beginTransmission(0x20);
  Wire.write(0x12); // address bank B
  Wire.write((byte)0x00); // value to send - all HIGH
  Wire.endTransmission();


}
//========================================================
//メイン処理
//========================================================
void loop() {
  byte data = 0 ;
  int i;
  bool okflag;
  M5.update();
  //------------------------------------------------------
  //Aボタン処理
  //------------------------------------------------------
  if (M5.BtnA.wasPressed())
  {
    outdata=0x01;
    okflag=true;
    for(i=0;i<8;i++)
    {
      //テストデータ出力
      Wire.beginTransmission(0x20);
      Wire.write(0x13); // address bank B
      Wire.write((byte)outdata); // value to send - all HIGH
      Wire.endTransmission();
      //データ入力
      Wire.beginTransmission(0x20);         //  transmit to device #TGT
      Wire.write(0x12);                     //  send REG address (REGADR)
      Wire.endTransmission();               //  end transmit
      Wire.requestFrom(0x20, 1);            // request 1 byte from slave device #TGT
      data = Wire.read();                   // receive 1 byte 

      if(data!=outdata){
        //NG
        okflag=false;
        break;
      }    
      outdata=outdata<<1;
    }

    //------------------------------------------------------
    //判定結果表示
    //------------------------------------------------------
    M5.Lcd.fillRect(0, 100, 320-1,240-1, M5.Lcd.color565(0, 0, 0));
    render.setTextSize(80);
    render.setCursor(100, 100);
    if(okflag==true){
      render.setTextColor(GREEN);
      render.printf("OK");
    }else{
      render.setTextColor(RED);
      render.printf("NG");
      render.setTextSize(20);
      render.setCursor(32, 200);
      render.printf("ERR DATA OUT=%02x IN=%02x\n", outdata,data);
    }
  }
}
https://hatenablog-parts.com/embed?url=https%3A%2F%2Fshuzo-kino.hateblo.jp%2Fentry%2F2021%2F09%2F21%2F213734
https://hatenablog-parts.com/embed?url=https%3A%2F%2Fmoyoi-memo.hatenablog.com%2Fentry%2F2020%2F03%2F14%2F121101

コメント