#include /* デジタルノギスのデータ読み込み(関数のデモ) Pin 6: Clock (Trで反転) Pin 7; Data(Trで反転) 2012/07/08 by Radiopench http://radiopench.blog96.fc2.com/ */ LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // LCD シールドのピンアサイン int clockPin = 6; // クロック入力ピン番号(Trで反転) int dataPin = 7; // データ入力ピン番号(Trで反転) int data; void setup() { Serial.begin(9600); lcd.begin(16, 2); //LCDのサイズ設定 pinMode(clockPin, INPUT); pinMode(dataPin, INPUT); digitalWrite(clockPin, HIGH); digitalWrite( dataPin, HIGH); pinMode(13, OUTPUT); } void loop() { data = ReadCaliper(); // ノギスからデータを読む lcddisp(data); // 液晶に書いて Serial.print(millis()); Serial.print(", "); Serial.println(data); // シリアルに書き出し } int ReadCaliper() { // ノギスからデータ読んで値をinで返す関数 boolean dataStarted = false; unsigned long t0, bitOpr, oprResult; int n, outData; bitOpr = 0x00000001; // ビット操作オペレータ oprResult = 0x00000000; // データ転送開始まで待つ while(dataStarted == false) { t0 = micros(); // タイミングを記録 while(digitalRead(clockPin) == 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(clockPin) == HIGH){ // クロックピンがLOWになるまで待つ } if(digitalRead(dataPin) == LOW){ oprResult = oprResult | bitOpr; // 1(負論理なのでLOW)だったらビットを立てる } if( n != 24 ){ // 最後のビットでなければ bitOpr = bitOpr << 1; // ビット操作オペレータを左にシフト while(digitalRead(clockPin) == LOW){ // クロックがHIGHになるまで待つ } } } // データを取り出しint型に整形 outData = oprResult; // データを16ビットint変数に代入 if( (oprResult & 0x00100000) != 0 ){ // 負の値のフラグ(21ビット目)が立っていたら outData = ( ~ outData ) + 1; // 2の補数形式の負の値に変換 } digitalWrite(13, LOW); return outData; // 値を返して関数終了 } void lcddisp(int x) { // デジタルノギス測定結果のLCD表示 int lcdout; lcd.setCursor(0, 0); 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"); }