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



コメント