ربط المرمز الدوار مع الآردوينو

شارك عبر:

تم نسخ الرابط

ربط المرمز الدوار مع الآردوينو

شرح لكيفية ربط المرمز الدوار (Rotary Encoder) مع الآردوينو.


يستخدم المرمز الدوار لتحويل الحركة الميكانيكية الدورانية إلى موجات كهربائية تمثل الإزاحة الزاوية و اتجاه الدوران لتلك الحركة. يمكنك زيارة شرح المرمز الدوار Rotary Encoder لمعرفة تفاصيل اكثر.
توجد اكثر من طريقة لربط المرمز الدوار إلى الآردوينو منها استخدم Interrupts لحساب عدد خطوات المرمز و اتجاه دورانه, في المثال التالي سنعتمد طريقة بسيطة جدا لكن دقيقة في نفس الوقت لزيادة أو تقليل قيمة عداد حسب اتجاه الدوران و عدد النبضات المستلمة من المرمز وذلك لفهم مبدأ عمل المرمز الدوار بسهولة. المرمز المستخدم في المثال من نوع Keyes KY-040 حيث يحتوي على مفتاح تحت المقبض الدوار. سيتم ربط هذا المفتاح إلى الآردوينو حيث سيقوم هذا المفتاح بتصفير العداد (جعل قيمة العداد تساوي صفر) عن طريق Interrupt على الحافة المرتفعة (Rising edge). لذلك فإن الضغط مطولا على المفتاح لن يؤثر على قيمة العداد و لن يتم تصفيره إلا بعد رفع الضغط عن المفتاح. هذا النوع أيضاً لا يحتوي على مقاومة رفع (Pullup Resistor) للمفتاح لذلك يجب ربط مقاومة بين نقطة ارتباط المفتاح مع الآردوينو و مصدر الفولتية. تربط النقطة CLK إلى المدخل رقم 4 في الآردوينو و النقطة DT إلى المدخل رقم 3 في الآردوينو و النقطة SW (المفتاح) إلى المدخل رقم 2 في الآردوينو. يربط مصدر الفولتية إلى المرمز أيضاً أو يمكن ربط القطب السالب فقط و استخدام مقاومات رفع خارجية.

برنامج الآردوينو:
كما ذكرنا في شرح المرمز الدوار Rotary Encoder, لمعرفة اتجاه دوران المرمز, يجب علينا معرفة أي من نقطتي الترميز تتغير قيمتها أولاً. لذلك سنقوم بمراقبة احدى النقطتين لحين تغيرها ثم نقارن النقطة الأخرى في تلك اللحظة, إذا كانت قيمة النقطة الثانية لم تتغير بعد, يعني هذا إن اتجاه الدوران باتجاه عقارب الساعة (قد يكون الاتجاه عكس عقارب الساعة حسب الربط) أما إذا كانت قيمة النقطة الثانية قد تغيرت قبل هذه النقطة يعني إن اتجاه الدوران معاكس للحالة الأولى (أي عكس عقارب الساعة بالنسبة لهذا المثال).
لاستخدام متغير معين (العداد) في اكثر من جزء في البرنامج (الجزء الرئيسي و الجزء الخاص بتصفير العداد باستخدام Interrupt) يجب علينا إعلان هذا المتغير في بداية البرنامج باستخدام volatile. ثم نقوم بتعريف المدخلات 3 و 4 في void setup. كما نقوم في هذا الجزء أيضاً بتحديد جزء البرنامج الخاص بتصفير العداد عند الضغط على المفتاح عن طريق Interrupt فقط عند مرور حافة مرتفعة. كما نقوم بتعريف سرعة Baud rate وتجهيز المنفذ لإرسال البيانات إلى الحاسوب.

volatile int Cntr = 0;
void setup() {
pinMode(4,INPUT);
pinMode(3,INPUT);
attachInterrupt(0,Swt,RISING);
Serial.begin(9600);
}

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

while (digitalRead(4) == A1)
{

}

تلاحظ هنا إن البرنامج لن يقوم بتنفيذ أي أمر لكون القيمة ثابتة و لم تتغير حيث يستخدم المتغير A1 لخزن القيمة القديمة للمدخل رقم 4.

في حال تغير القيمة لهذا المدخل تتم مقارنة قيمته القديمة مع المدخل رقم 3, في حال تساوت القيمة القديمة مع القيمة الحالية للمدخل رقم 3 يعني إن المدخل رقم 3 قد تغيرت قيمته أولاً. أما إذا كانت قيمة المدخل رقم 4 مختلفة عن القيمة القديمة للمدخل رقم 3 يعني إن المدخل رقم 4 قد تغيرت قيمته أولاً. حسب هذه المقارنة يمكن أن نحدد اتجاه الدوران و بذلك نحدد زيادة أو نقصان العداد.

if (digitalRead(3)==A1)
{
Cntr = Cntr 1;
}
else
{
Cntr = Cntr-1;
}
A1 = digitalRead(4);
Serial.println(Cntr, DEC);
}

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

void Swt()
{
Cntr = 0;
Serial.println(Cntr, DEC);
}

سيقوم هذا الجزء بتصفير العداد و طبعاته. يمكنك نسخ البرنامج التالي و تنفيذه.

volatile int Cntr = 0;
void setup() {
pinMode(4,INPUT);
pinMode(3,INPUT);
attachInterrupt(0,Swt,RISING);
Serial.begin(9600);
}

void loop() {
int A1 = digitalRead(4);
while (true)
{
while (digitalRead(4) == A1)
{

}
if (digitalRead(3)==A1)
{
Cntr = Cntr 1;
}
else
{
Cntr = Cntr-1;
}
A1 = digitalRead(4);
Serial.println(Cntr, DEC);
}
}
void Swt()
{
if (Cntr !=0)
{
Cntr = 0;
Serial.println(Cntr, DEC);
}
}

 

 

حول الموقع اتصل بنا سياسة الخصوصية