المشفر المحوري ROTARY ENCODER

تعريف بالمشفّر المحوري:

المشفّر المحوريّ هو حسّاس لقراءة الموضع، يقوم بتحويل الموضع الزّاوي إلى إشارات خرج يمكن من خلالها تحديد اتّجاه الدّوران وزاوية الدّوران وكذلك السّرعة.
تختلف استخدامات هذا الحسّاس اعتماداً على دقّة قياسه، فنجد منه ما يناسب الاستعمالات المخبريّة والتعليميّة (دقّة منخفضة) ومنه ما يكون مناسباً للاستعمال في التّطبيقات الرّوبوتيّة العمليّة وآلات التّشغيل المؤتمة CNC (دقّة عالية).

  • للمشفّرات نوعين:

1- مشفّر مطلق: يعطي موضع المقبض بدقّة.

2- مشفّر تزايدي: يعطي إشارات خرج يمكن من خلالها  استنتاج جهة الدّوران، وبعمليّات حسابيّة بسيطة يمكن إيجاد السّرعة والموضع.

  • تتميّز المشفّرات المحوريّة عن المقاومات المتغيّرة المستخدمة في قياس الانتقال الزّاوي، أنّ المشفرات تتمتّع بحريّة حركة 360 درجة بشكل مستمرّ بالإضافة إلى دقّة المشفّرات المرتفعة مقارنة بالمقاومات المتغيّرة.

الية عمل الحساس :

  • مكوّنات الحسّاس:
    يتألّف الحسّاس من الدّاخل من قرص مدرّج (أو مسنّن) متّصل بالأرضي، وعلى سطحه نقطتا اتّصال A,B.
    تعتمد دقّة المشفّر المحوري على عدد تدريجات أو أسنان القرص الدّاخلي.
    أمّا خارج الحسّاس فلدينا المحور الدوّار (والّذي يستخدم كزر أيضاً) بالإضافة إلى منافذ التّوصيل.
  • تحديد جهة الدّوران:
    عند تحريك المقبض يتحرك المشفر ليلامس النقطتين A ,B بالترتيب بناءاً على اتجاه دورانه، فعندما ندير المقبض باتجاه عقارب الساعة ، تتصل النّقطة A أولاً وتليها B، والعكس صحيح.
  • إيجاد الموضع الزّاوي:
    يمكن إيجاد الموضع اعتماداً على دقّة المشفر والّتي تعطى بشكل n نبضة في الدّورة، فبعد الحصول على إشارة الخرج نستطيع حساب الموضع كالتّالي:
    Position=n*numOfPulses/360
  • إيجاد السّرعة:
    نقوم بعدّ النّبضات على فترة زمنيّة معيّنة t (تحدّد اختياريّاً)، ثمّ نحسب السّرعة الزّاوية كالتّالي:
    w=2pi *N/nt 
    حيث N عدد النّبضات، وn دقّة المشفّر.
rotary-encoder-output-pulses-in-anticlockwise-rotation
حركة بعكس اتّجاه عقارب السّاعة (A متأخر عن B)
rotary-encoder-output-pulses-in-clockwise-rotation
حركة باتّجاه عقارب السّاعة (B متأخر عن A)

المواصفات التّقنيّة

  • جهد التّغذية: 5v.
  • الدّقة: 20 نبضة لكل دورة (360 درجة).
  • الخرج مرمّز على 2bit gray code.
  • الزّاوية الميكانيكيّة: 3360 درجة مستمرّة.
  • يتوافق مع متحكّمات الأردوينو وراسبيري باي.
    المنافذ وعملها:
    1- منفذ CLK: وهو مرتبط مباشرة مع نقطة الاتصال A الموجودة على القرص، يعطي على خرجه الإشارة النّاجمة عن النّقطة A.
    2- منفذ DT: متصل مع النّقطة B، يعطي على خرجه الإشارة النّاجمة عن النّقطة B.
    3- منفذ SW: يعطي إشارة تحدّد فيما إذا كان المحور مضغوطاً أم لا.
    4- منفذ +: هو منفذ التّغذية.
    5- منفذ GND: نقطة الأرضي.

التّعامل مع المشفّر باستخدام المتحكّمات

  • يمكن استخدام  الأردوينو لقراءة قيم خرج الحسّاس ومعالجتها للحصول على القراءات المرغوبة.
  • التّعامل مع الحسّاس باستخدام أردوينو يمكن أن يتمّ باستخدام المكتبات والتّعليمات الأساسيّة، أو يمكن تضمين المكتبة Encoder.h.
    يمكن تنزيلها من الرّابط  encoder.h، طريقة التّثبيت مشروحة عبر Library manager.
  • توصيل الحسّاس يتمّ بسهولة كما هو موضّح في الشّكل المجاور، حيث نقوم بتوصيل بنّات الخرج CLK,DT مع بنّات رقميّة في الأردوينو، ونصل منفذ التّغذية مع منفذ 5v من أردوينو، والأرضي مع الأرضي.
    ملاحظة: لا نحتاج لوصل المنفذ SW فمهمته منفصلة عن قراءة إشارات الخرج.
المشفر المحوري ROTARY ENCODER
التّوصيل مع أردوينو

مثال استخدام مع أردوينو

الكود الموضّح جانباً هو من الأمثلة الأساسية في أردوينو للتّعامل مع المشفّر المحوري. تطبيق هذا الكود يؤدي إلى عرض عدد النّبضات النّاجمة عن المشفّر على شاشة Serial Monitor.

  • في البداية يجب تضمين المكتبة كما في السّطر 7.
  • ثمّ تعريف متحوّل من النّمط Encoder وربطه مع البنّات الموافقة (السّطر 13) لنتمكّن من التّعامل معه باستخدام التّعليمات المتاحة في المكتبة.
    تجد عبر الرّابط مشروع لبرمجة المشفّر المحوري مع محرّك خطوي باستخدام أردوينو.
				
					/* Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */

#include <Encoder.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder myEnc(2, 3);
//   avoid using pins with LEDs attached

void setup() {
  Serial.begin(9600);
  Serial.println("Basic Encoder Test:");
}

long oldPosition  = -999;

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }
}
				
			

مثال استخدام مع أردوينو بدون تضمين المكتبة

لكي يعمل المشفر بشكل صحيح فإن علينا مراقبة اشارات المنافذ DT , CLK بشكل مستمر ولمعرفة فيما اذا كانت قد حدثت حركة ام لا فإن علينا دائمة تسجيل قراءات هذين المنفذين.

ولكن هذا الحل لا يعتبر مثالياً للأسباب التالية :

  • اشغال المتحكم بالمراقبة الدائمة حتى في حال عد حدوث تغيرات وهذا مايضيع علينا الكثير من موارد المتحكم.
  • سيكون هنالك تأخير بين حدوث التغير وزمن توصيل الاشارة وهذا ما سيعيق القيام بالوظائف الحرجة للوقت.
  • احتمالية فقدان اشارة تغير كاملة في حال كان هذا التغير لحظي.

ولذلك يجب أن نلجأ لتطبيق ألية المقاطعة بحيث ان القراءة ستتم عند حدوث التغيير فقط مما يسمح للأردوينو بالقيام بمهام اخرى .

ملاحظة : في توصيل الدائرة المعتمدة على المقاطعة فإننا لانحتاج لتوصيل المنفذ SW ولذلك يتم فصله .

				
					#define CLK 2
#define DT 3
int counter = 0;
int currentStateCLK;
int lastStateCLK;
String currentDir ="";
void setup() {
	pinMode(CLK,INPUT);
	pinMode(DT,INPUT);
	Serial.begin(9600);
	lastStateCLK digitalRead(CLK);
	attachInterrupt(0, updateEncoder, CHANGE);
	attachInterrupt(1, updateEncoder, CHANGE); }
void loop() { }
void updateEncoder(){
	currentStateCLK = digitalRead(CLK);
	if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){
		if (digitalRead(DT) != currentStateCLK) {
			counter --;
			currentDir ="CCW";
		} else {
			counter ++;
			currentDir ="CW";		}
		Serial.print("Direction: ");
		Serial.print(currentDir);
		Serial.print(" | Counter: ");
		Serial.println(counter);	}
	lastStateCLK = currentStateCLK; }
				
			

انتقل إلى المتجر

مشفر محوري | ENCODER

20.00 ر.س

اردوينو اونو | ARDUINO UNO

50.00 ر.س

أسلاك توصيل M-F

15.00 ر.س

لوحة تجارب 400 نقطة

15.00 ر.س
انتقال إلى الأعلى