6か月以上にわたり、「デジタルインターフェース」というフレーズが書かれている説明書に、安価な150mmの中国の電子バーを所有しています。 コンピューターに出力する機能はすぐに興味がありましたが、私はこの偉業を達成するのは今だけでした。
当初の動機は「好奇心」だったので、「そうだ!」そして「突然誰かが尋ねますが、私はそれを持っています!」、後で(実際には「判明しました!」)自家製のCNC工作機械を使ったプロジェクトに実際のアプリケーションがありました。
入門
しかし、主人公は、低価格(約8ドル)にもかかわらず、非常に正確なデバイスです。

動作原理:静電容量センサー。
すべてが大きなプレート(バースケール)に沿った小さなプレート(バーの頭)の動きに関連していますが、大きなプレートの充電されていない部分は充電されており、これらのプレートによって形成されるコンデンサを流れる電荷は小さなプレートの動きに比例しているようです。 そのようなもの。
検索する
デジタルインターフェイスに関する情報を最初に検索したところ、多くの人がそれを見て、一部の人はそれを知っていましたが、誰もその使い方を知りませんでした。
ロシア語以外のリソースの詳細な検索により、より生産的な結果が得られました。 最初は、すべてが非常にシンプルで明確で、オシロスコープで噛まれ、YouTubeで撮影されているなどのように見えましたが、最終的な機能する「すぐに」オプションはありませんでした。
そのため、主な問題は情報の検索でした。
2番目の問題は、このコネクタへのプラグの製造でした(これは、一般に、まったくコネクタではなく、ボード上のむき出しのトラックです)。 連絡先は頑固に保持したくありませんでした。 結局、LPTポートから消しゴムの足を突き刺すことになると思いました。 ピースは信頼できないことが判明しましたが、テストには非常に適していました。 将来的には、ボードに直接はんだ付けし、コネクタ(マザーボードからのピンCD-IN)を必ず出力することにしました。
解決策
instructables.comの記事につまずいたので、この偉業を繰り返すことにしました。
最初に、コンパス上の連絡先の位置と接続図とともに、そこから大胆に盗まれた写真を持ち込みます(私は自分自身を再描画するポイントはわかりませんが、私のものとして配ることは一般的に許されません):
ピン:

スキーム:

電圧を一致させるために、推奨どおり200オームの抵抗を使用しました。 10uFにはコンデンサがなく、死んだマザーボードから100uFをはんだ付けしました。
結果
はんだ付けを扱ったので、スケッチを書き始めました。 ちなみに、ブレッドボードがない場合、同じマザーボードからIDEポートから「クリブ」の回路を収集することで状況から抜け出しました。
上記の記事で提供されたスケッチは問題なく機能しましたが、満足は得られませんでした。
コメントからの中国のスケッチは「即座に」機能することを拒否しましたが、より深刻な印象を与え、その結果、深刻な「仕上げ」を受けました。
以下がその理由です(またはArduino UNOの既製のスケッチ、バージョンIDE 0022):
//CyberKot ( ... ! Shadow) // Arduino, COM- // int dataIn = 11; // , int clockIn = 2; // clock, , ( attachInterrupt) int isin = 0; //=1 =0 int isfs = 0; // int index; // unsigned long xData, oData; // ( ) int ledPin = 13; // 13 (, , ) int ledState = LOW; // long previousMillis = 0; // long interval = 500; // long previousGetMillis = 0; long Timeout = 8; // float stringOne; // char charBuf[5]; char charBuf2[8]; void setup(){ digitalWrite (dataIn, 1); digitalWrite (clockIn, 1); pinMode (dataIn, INPUT); // dataIn pinMode (clockIn, INPUT); // clock 2 attachInterrupt(0,getBit,RISING); // clock 2 Serial.begin(9600); delay(500); index = 0; xData = 0; oData = 999; } void loop(){ if ((index !=0) && (millis() - previousGetMillis > Timeout) ) { // index = 0; xData = 0; }; if (index >23) { // if (oData !=xData) { /* , , if (isin==1){ // Serial.print("inch: "); stringOne =xData*5/10000.00000; stringOne *=pow(-1,isfs); Serial.println(floatToString(charBuf2,stringOne,5,5)); }else { // Serial.print("mm: "); stringOne =xData/100.00; stringOne *=pow(-1,isfs); Serial.println(floatToString(charBuf,stringOne,2,5)); }; */ if (isin==1){ // if (isfs==1){ // Serial.print("inch: -"); }else { Serial.print("inch: "); } stringOne =xData*5/10000.00000; Serial.println(floatToString(charBuf2,stringOne,5,5)); }else { // if (isfs==1){ // Serial.print("mm: -"); }else { Serial.print("mm: "); } stringOne =xData/100.00; Serial.println(floatToString(charBuf,stringOne,2,5)); }; }; oData =xData; index=0; xData=0; }; if (millis() - previousMillis > interval) { // previousMillis = millis(); if (ledState == LOW) ledState = HIGH; else ledState = LOW; digitalWrite(ledPin, ledState); } } void getBit(){ // previousGetMillis=millis(); if(index < 20){ if(digitalRead(dataIn)==1){ xData|= 1<<index; } } else { if (index==20) // isfs=digitalRead(dataIn); if (index==23) // isin=digitalRead(dataIn); }; index++; } // float char * floatToString(char * outstr, double val, byte precision, byte widthp){ // , , ( ), char temp[16]; byte i; // double roundingFactor = 0.5; unsigned long mult = 1; for (i = 0; i < precision; i++) { roundingFactor /= 10.0; mult *= 10; } temp[0]='\0'; outstr[0]='\0'; if(val < 0.0){ strcpy(outstr,"-\0"); val = -val; } val += roundingFactor; strcat(outstr, itoa(int(val),temp,10)); // if( precision > 0) { strcat(outstr, ".\0"); // unsigned long frac; unsigned long mult = 1; byte padding = precision -1; while(precision--) mult *=10; if(val >= 0) frac = (val - int(val)) * mult; else frac = (int(val)- val ) * mult; unsigned long frac1 = frac; while(frac1 /= 10) padding--; while(padding--) strcat(outstr,"0\0"); strcat(outstr,itoa(frac,temp,10)); } // ( ) if ((widthp != 0)&&(widthp >= strlen(outstr))){ byte J=0; J = widthp - strlen(outstr); for (i=0; i< J; i++) { temp[i] = ' '; } temp[i++] = '\0'; strcat(temp,outstr); strcpy(outstr,temp); } return outstr; }
まとめ
結果に満足したので、私は最終的な写真を作成し、その効果を「少し」宣伝することにしました。

あとがき
プロトコルの説明には、いくつかの興味深いプラスも含まれているため、「将来のために」バックログにインセンティブがあります
- 高速モード(50Hz、デフォルトモードでは3Hz)
- 「絶対」位置の処理
- ソフトキー「ゼロ」および「モード」
[リンク]