#include /* デジタルノギスのデータ読み込み(関数のデモ) X-Y二軸 Pin 6: Clock (Trで反転) Pin 7; Data(Trで反転) Pin 8: Clock (Trで反転) Pin 9; Data(Trで反転) 2016/02/23 by Radiopench http://radiopench.blog96.fc2.com/ */ LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // LCD シールドのピンアサイン int clockPinX = 6; // クロック入力ピン番号(Trで反転) int dataPinX = 7; // データ入力ピン番号(Trで反転) int clockPinY = 8; // クロック入力ピン番号(Trで反転) int dataPinY = 9; // データ入力ピン番号(Trで反転) int data; void setup() { Serial.begin(9600); lcd.begin(16, 2); //LCDのサイズ設定 pinMode(clockPinX, INPUT_PULLUP); pinMode(dataPinX, INPUT_PULLUP); pinMode(clockPinY, INPUT_PULLUP); pinMode(dataPinY, INPUT_PULLUP); pinMode(13, OUTPUT); } void loop() { data = ReadCaliperX(); // ノギスからデータを読む lcddispX(data); // 液晶に書いて Serial.print(data); // シリアルに書き出し Serial.print(", "); data = ReadCaliperY(); // ノギスからデータを読む lcddispY(data); // 液晶に書いて Serial.println(data); // シリアルに書き出し } int ReadCaliperX() { // X軸ノギスからデータ読んで値をinで返す関数 boolean dataStarted = false; unsigned long t0, bitOpr, oprResult; int n, outData; bitOpr = 0x00000001; // ビット操作オペレータ oprResult = 0x00000000; // データ転送開始まで待つ while (dataStarted == false) { t0 = micros(); // タイミングを記録 while (digitalRead(clockPinX) == LOW) { // クロックピンがLOWの期間を検出 } if (micros() >= t0 + 1000) { // LOWが1mS以上続いていたらデータ開始とみなす dataStarted = true; // 但し、micros は70分でゼロに戻るのでその時は取りこぼす、ゴメン! } } // クロックがHIGHになりデータ転送が始まる // データのビット列を読み込み digitalWrite(13, HIGH); for (n = 1; n <= 24; n++) { // 24ビット読み出しループ while (digitalRead(clockPinX) == HIGH) { // クロックピンがLOWになるまで待つ } if (digitalRead(dataPinX) == LOW) { oprResult = oprResult | bitOpr; // 1(負論理なのでLOW)だったらビットを立てる } if ( n != 24 ) { // 最後のビットでなければ bitOpr = bitOpr << 1; // ビット操作オペレータを左にシフト while (digitalRead(clockPinX) == LOW) { // クロックがHIGHになるまで待つ } } } // データを取り出しint型に整形 outData = oprResult; // データを16ビットint変数に代入 if ( (oprResult & 0x00100000) != 0 ) { // 負の値のフラグ(21ビット目)が立っていたら outData = ( ~ outData ) + 1; // 2の補数形式の負の値に変換 } digitalWrite(13, LOW); return outData; // 値を返して関数終了 } int ReadCaliperY() { // Y軸ノギスからデータ読んで値をinで返す関数 boolean dataStarted = false; unsigned long t0, bitOpr, oprResult; int n, outData; bitOpr = 0x00000001; // ビット操作オペレータ oprResult = 0x00000000; // データ転送開始まで待つ while (dataStarted == false) { t0 = micros(); // タイミングを記録 while (digitalRead(clockPinY) == LOW) { // クロックピンがLOWの期間を検出 } if (micros() >= t0 + 1000) { // LOWが1mS以上続いていたらデータ開始とみなす dataStarted = true; // 但し、micros は70分でゼロに戻るのでその時は取りこぼす、ゴメン! } } // クロックがHIGHになりデータ転送が始まる // データのビット列を読み込み digitalWrite(13, HIGH); for (n = 1; n <= 24; n++) { // 24ビット読み出しループ while (digitalRead(clockPinY) == HIGH) { // クロックピンがLOWになるまで待つ } if (digitalRead(dataPinY) == LOW) { oprResult = oprResult | bitOpr; // 1(負論理なのでLOW)だったらビットを立てる } if ( n != 24 ) { // 最後のビットでなければ bitOpr = bitOpr << 1; // ビット操作オペレータを左にシフト while (digitalRead(clockPinY) == LOW) { // クロックがHIGHになるまで待つ } } } // データを取り出しint型に整形 outData = oprResult; // データを16ビットint変数に代入 if ( (oprResult & 0x00100000) != 0 ) { // 負の値のフラグ(21ビット目)が立っていたら outData = ( ~ outData ) + 1; // 2の補数形式の負の値に変換 } digitalWrite(13, LOW); return outData; // 値を返して関数終了 } void lcddispX(int x) { // X軸デジタルノギス測定結果のLCD表示 int lcdout; lcd.setCursor(0, 0); lcd.print("X="); if (x < 0) { lcd.print("-"); } // マイナス表示 else { lcd.print(" "); } lcdout = abs(x / 100); if (lcdout >= 100) { lcd.print(lcdout); } else if (lcdout >= 10 ) { lcd.print(" "); // ゼロサプレスひとつ lcd.print(lcdout); } else if (lcdout >= 1 ) { lcd.print(" "); // ゼロサプレス二つ lcd.print(lcdout); } else { lcd.print(" 0"); // 最下位がゼロの場合は0を表示 } lcd.print("."); // 小数点表示 lcdout = abs(x % 100); if (lcdout >= 10) { // 小数点以下1位がゼロでなければそのまま表示 lcd.print(lcdout); } else { lcd.print("0"); // ゼロだったら0を表示 lcd.print(lcdout); } lcd.print("mm"); } void lcddispY(int x) { // Y軸デジタルノギス測定結果のLCD表示 int lcdout; lcd.setCursor(0, 1); lcd.print("Y="); if (x < 0) { lcd.print("-"); } // マイナス表示 else { lcd.print(" "); } lcdout = abs(x / 100); if (lcdout >= 100) { lcd.print(lcdout); } else if (lcdout >= 10 ) { lcd.print(" "); // ゼロサプレスひとつ lcd.print(lcdout); } else if (lcdout >= 1 ) { lcd.print(" "); // ゼロサプレス二つ lcd.print(lcdout); } else { lcd.print(" 0"); // 最下位がゼロの場合は0を表示 } lcd.print("."); // 小数点表示 lcdout = abs(x % 100); if (lcdout >= 10) { // 小数点以下1位がゼロでなければそのまま表示 lcd.print(lcdout); } else { lcd.print("0"); // ゼロだったら0を表示 lcd.print(lcdout); } lcd.print("mm"); }