フォトマイクロセンサによる原点検知
FA設備をやっている方々にとっては耳なじみの言葉だと思いますが、実際に電子工作レベルでやる時の“用途”や“実装方法”についてメモ程度に纏めていこうと思います。
主にステッピングモーターを題材として進めたいと思いますね。
原点復帰
概要説明
原点復帰とは文字の通り基準となる位置【原点】を出すことにあります。
例えば、サーボモータだとエンコーダーと呼ばれる機械的な位置の変化を電気信号として位置情報を出力する装置を持ち合わせています。なので、自分の絶対的な位置を把握することが出来るのです。(ただ、エンコーダーの中にも”インクリメント型”と”アブソリュート型”があり、前者は回転量に対してパルスを発生させ、発生パルスを読むことで自分の位置を特定するので絶対値が分かるわけではありません)
しかし、ステッピングモーターやDCモーターなどのエンコーダーを持ち合わせていないものに対してはどの様に自分の現在位置を知るのでしょうか?
【ソフト内にカウントを設けてステップ毎にインクリメントする?】確かにステップ毎の距離は正確に出せるので”モーターが進んだ移動量”は出すことが出来ますが、始まりの位置がわからないので絶対的な位置を出すことが不可能です(インクリメント型のエンコーダーと同じ)。
そこで、登場するのが【原点復帰】になります。
始まりを知るすべがないステッピングモーターに対して、外部センサ(フォトマイクロセンサなど)による位置検出を行います。外部センサが検出した位置をゼロ点としてあげれば、あとはソフト内のステップ角のインクリメントで絶対位置を算出することが可能になります。
本記事の構想
本記事ではステッピングモーターと外部センサとしてフォトマイクロセンサによるドグ検出で原点出しを行っていきたいと思います。
フォトマイクロセンサとはフォトカプラのようなもので、LEDとフォトトランジスタで構成されます。今回使用するのはコの字型の形状のフォトマイクロセンサになります。
原理としては、通常時はコの字の間に遮るものが無いのでLEDの光はフォトトランジスタに伝わりフォトトランジスタがON=低抵抗となります。しかし、コの字の間に何かしら物が遮った時にフォトトランジスタに伝わる光が弱くなりOFF=高抵抗になります。
この特性を利用してステッピングモータの回転角の一部分にフォトマイクロセンサを取り付けて、取付場所を原点として実験してみたいと思います。
実装してみる
材料
- ステッピングモーター+モータードライバ
- フォトマイクロセンサ
- 適当なベース板
ステッピングモーターはこのブログでもたびたび登場する28BYJ-48を使用したいと思います。このステッピングモータは1回転2048ステップ(0.176°/step)で動作します。モータードライバは付属しているULN2003を使いますね。
今回は下記のようにステッピングモーターの軸に時計の針のようなものを取り付けこれをフォトマイクロセンサで検出されるドグの役割を担ってもらう感じです。
フォトマイクロセンサはオムロンのEE-SJ5-Bを使用したいと思います。一般的なフォトトランジスタとLEDを使用したセンサになります。
回路図
回路図は以下の通りです。
ステッピングモーターのパルス制御にはM5Stackを使用していますが、Arduinoでも問題ありません(M5Stackをめちゃくちゃ変な使い方してます参考にはなりません)。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
const uint8_t A=18; const uint8_t B=19; const uint8_t C=23; const uint8_t D=2; const uint8_t Pin=36; static uint16_t ADC; int s=1; void setup() { Serial.begin(9600); pinMode(Pin, ANALOG); pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); } //360° 2048ステップ。 void loop() { switch(s){ case 0://待機 break; case 1://原点復帰 ORG(); break; } } uint16_t ORG(){ while(s){ FullStep(); ADC=analogRead(Pin);//フォトマイクロセンサ検知 if(ADC>3000){//フォトマイクロセンサ検知でループ抜け s=0; } Serial.println(ADC); Serial.println(s); } } void FullStep(){ digitalWrite(A, HIGH);digitalWrite(B, LOW);digitalWrite(C, LOW);digitalWrite(D, LOW); delay(10); digitalWrite(A, LOW);digitalWrite(B, HIGH);digitalWrite(C, LOW);digitalWrite(D, LOW); delay(10); digitalWrite(A, LOW);digitalWrite(B, LOW);digitalWrite(C, HIGH);digitalWrite(D, LOW); delay(10); digitalWrite(A, LOW);digitalWrite(B, LOW);digitalWrite(C, LOW);digitalWrite(D, HIGH); delay(10); } |
やっていることは単純でメインループはSwitchで2つの状態を作っておきます。電源を投入したら状態1になりwhileループに入ります。そして、フォトマイクロセンサが検知したら状態を0にしてループから抜けて待機状態に入る感じです。
動作確認
実際に動かしてみたのが以下の動画です。
フォトマイクロセンサをドグで遮光した瞬間にステッピングモーターが停止したことが分かると思います。この停止位置をゼロ点と定めればあとはカウンタによるインクリメントで自分の位置を把握することが可能になるってわけですね。
ちょっとだけ問題があるとすればステッピングモーターには脱調と呼ばれる現象が起こる時があります。
この脱調が起こってしまうとソフト的なカウントによる“なんちゃってインクリメントエンコーダー”では自分の位置がズレてしまします。なので外部のロータリーエンコーダーで監視を行うとなお正確な位置の監視が可能です(普通のFA機器はこれ)。
終わりに
FA機器の起源にして頂点の【原点復帰】いかがだったでしょうか?
んなもんしってるよ!って方が大半だと思いますが基本の”き”としての記事でしたー
バイバイ!
コメント