راسبيري باي -الدرس الثامن- التحكم بمحرك السيرفو

في هذا الدرس سوف نشرح كيف نستخدم محرك سيرفو والتحكم به بالبايثون (Python).

sm1

يتم التحكم بمحرك السيرفو عن طريق النبضات الكهربائية من خلال التحكم بطول النبضة في الدورة ، وهذا يتطلب وقت دقيق إلى حدٍ ما ، الرازبيري باي تحتوي على أرجل تولد نبضات مباشرة من القطعة نفسها. (راجع الدرس الرابع)

القطع

لتطبيق الدرس تحتاج للقطع التالية:

راسبيري باي

sm2

وصلة خارجية لتوصيل أرجل GPIO في لوحة الاختبار

sm3

أسلاك توصيل

sm4

لوحة الاختبار

sm5

محرك سيرفو

sm6

علبة بطاريات + 4 بطاريات AA

sm7

محركات السيرفو

التحكم باتجاه حركة محرك السيرفو يكون عن طريق التحكم بطول النبضة أو ما يعرف بـ (Duty Cycle) في PWM ، المحرك يتوقع أن يستقبل نبضة كل 20 ملي ثانية أو كل 50Hz حيث إذا كان طول النبضة 1.5 ملي ثانية فإن المحرك سيتجه للمركز وزاويته 90 درجة ، وإذا قل عن 1.5 ملي ثانية سيتجه للزاوية 0 درجة ، وإذا زاد عن 1.5 سوف يتجه إلى الزاوية 180 درجة.

sm8

التحكم بالمحرك باستخدام مكتبة RPi.GPIO

أول خطوة هي تحديد الرجل التي ستستخدم مع PWM وذلك من خلال الدالة PWM كالتالي:

p = GPIO.PWM(18, 50)

في الحالة السابقة فإن رقم الرجل المراد تفعيل PWM هي 18 وترددها 50Hz والتي تعادل 20 ملي ثانية

لتشغيل أو البدء في إرسال النبضات نستخدم الدالة start:

p.start(dc)

dc هو قيمة (duty cycle) وهي عبارة عن نسبة مئوية وتحسب كالتالي:

dc = L/P

حيث L تساوي طول النبضة و P تساوي طول الدورة.

لتغيير قيمة dc نستخدم الدالة ChangeDutyCycle:

p.ChangeDutyCycle(dc)

 

لإيقاف إرسال النبضات نستخدم الدالة stop:

p.stop()

مثال عملي

أولا التوصيل:

سنتبع التوصيل كما في الصورة التالية:

sm9

للتوضيح:

السلك الأصفر متصل مع الرجل رقم (GPIO 18)

والسلك الأسود من البطارية متصل مع السلك الأسود من المحرك ومع السلك الأزرق الذي بدوره متصل مع الرجل GND

والسلك الأحمر من البطارية متصل مع السلك الأحمر من المحرك

وبالتالي يكون التوصيل النهائي مشابه للصورة التالية:

sm1

ثانيًا الكود البرمجي:

البرنامج التالي سيتحكم بالمحرك من خلال تحريكه للزاوية 90 درجة وينتظر ثانية واحدة ، ثم يحركه إلى الزاوية 0 درجة وينتظر ثانية واحدة ، وفي الأخير يحركه إلى الزاوية 180 درجة ، ثم يستمر بتكرار نفس الخطوات حتى تتم مقاطعته.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)

GPIO.setup(18, GPIO.OUT)

p = GPIO.PWM(18, 50)

p.start(7.5)

try:

        while True:

               p.ChangeDutyCycle(7.5)       # turn towards 90 degree
               time.sleep(1)                            # sleep 1 second
               p.ChangeDutyCycle(2.5)       # turn towards 0 degree
               time.sleep(1)                            # sleep 1 second
               p.ChangeDutyCycle(12.5)     # turn towards 180 degree
               time.sleep(1)                            # sleep 1 second

except KeyboardInterrupt:

        p.stop()
        GPIO.cleanup()

ملاحظة: dc تم حسابها كالتالي:

dc= (0.5/20) ×100= 2.5%

dc= (1.5/20) ×100= 7.5%

dc= (2.5/20) ×100= 12.5%




راسبيري باي -الدرس العاشر- التحكم بالمحرك الخطوي “Stepper”

 المحرك الخطوي  من أشهر و أهم أنواع المحركات، وبعد مهم في مجالات مختلفة مثل الروبوتات،  في هذا الدرس سوف نتعلم برمجة المحرك الخطوي (Stepper Motor) والتحكم باتجاه دوران المحرك باستخدام الراسبيري باي  و الدائرة المتكاملة (L293D) . 

المواد و الأدوات

راسبيري باي

X1 راسبيري باي

محرك خطوي

X1 محرك خطوي

لوحة تجارب

X1لوحة تجارب

دائرة متكاملة L293D

X1 الدائرة المتكاملة (L293D IC)

محول طاقة

X1 محول طاقة 

وحدة توصيل

X1 لوح توصل مع كابل للراسبيرى

شريط توصيل مرن

X1شريط توصيل مرن

اسلاك توصيل

مجموعة أسلاك توصيل (ذكر/ذكر)

توصيل الدائرة

سوف تبدأ توصيل الدائرة بتثبيت لوحة التوصيل الخاصة بالراسبيري باي على لوحة التجارب، ثم يتم توصيل الدائرة كما هو موضح بالصورة ثم تستخدم شريط التوصيل المرن للتوصيل بين الراسبيري باي و لوحة التجارب

توصيل الدائرة

المحرك الخطوي

يتكون المحرك الخطوي المستخدم في هذا الدرس (28BYJ-48) من جزء ثابت وهو عبارة عن 4 ملفات تشكل حلقة حول الدوار وهو الجزء المتحرك ، ومبدأ عمله أنه يحول النبضات الكهربائية إلى دوران ميكانيكي، عند تطبيق الإشارات الكهربائية ،و يدور بزيادات دقيقة وثابتة تُعرف بالخطوات.
توضح الصورة كيفية عمل دوران المحرك.

stepper Motor

يحتوي هذا المحرك على أربع ملفات. يتم توصيل أحد طرفي جميع الملفات بسلك 5 فولت (أحمر) ويتم سحب الطرف الآخر من كل ملف بألوان السلك البرتقالي والوردي والأصفر والأزرق على التوالي

المحرك الخطوي

حساب الخطوات

 لتعيين عدد الخطوات في دورة واحدة للمحرك الخطوي ، تحتاج أن تعود إلى ورقة البيانات الخاصة بالمحرك الذي تستخدمه لتعرف قيمة وضع الخطوة الكاملة، و نسبة تروس التخفيض (Variation Ratio).
في محرك (28BYJ-48) حسب ورقة البيانات عند عمل المحرك في وضع الخطوة الكاملة فإنه بمقدار 11.25درجة إذا يحتاج المحرك إلى 32 خطوة ليكمل دورة بمقدار 360 درجة. (11.25*360)
يجب ضرب نسبة التروس 1/64 في عدد الخطوات لكل دورة (32 * 63.68395 خطوة لكل دورة = 2037.8864 تقريبًا 2038 خطوة).

البرمجة

افتح نافذة SSH الخاصة بالراسبيري باي ثم اكتب الأمر التالي لفتح ملف نصي جديد باسم stepper:

$nano stepper.py

انسخ الكود البرمجي التالي ثم قم بالضغط على CTRL+x ثم إضغط Y لحفظ الملف:

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
 
enable_pin = 18
coil_A_1_pin = 4
coil_A_2_pin = 17
coil_B_1_pin = 23
coil_B_2_pin = 24
 
GPIO.setup(enable_pin, GPIO.OUT)
GPIO.setup(coil_A_1_pin, GPIO.OUT)
GPIO.setup(coil_A_2_pin, GPIO.OUT)
GPIO.setup(coil_B_1_pin, GPIO.OUT)
GPIO.setup(coil_B_2_pin, GPIO.OUT)
 
GPIO.output(enable_pin, 1)

def setStep(w1, w2, w3, w4):
    GPIO.output(coil_A_1_pin, w1)
    GPIO.output(coil_A_2_pin, w2)
    GPIO.output(coil_B_1_pin, w3)
    GPIO.output(coil_B_2_pin, w4)

try:
 
    while True:
 
        #forward
    for i in range(512):
            setStep(1, 0, 1, 0)
            time.sleep(0.05)
            setStep(0, 1, 1, 0)
            time.sleep(0.05)
            setStep(0, 1, 0, 1)
            time.sleep(0.05)
            setStep(1, 0, 0, 1)
            time.sleep(0.05)
 
        time.sleep(1)
        #backwards
    for i in range(512):
            setStep(1, 0, 0, 1)
            time.sleep(0.05)
            setStep(0, 1, 0, 1)
            time.sleep(0.05)
            setStep(0, 1, 1, 0)
            time.sleep(0.05)
            setStep(1, 0, 1, 0)
            time.sleep(0.05)
        
        time.sleep(1)
 
except KeyboardInterrupt:
 
        GPIO.cleanup()

أخيرًا لتشغيل البرنامج قم بكتابة الأمر التالي:

sudo python stepper.py

شرح البرمجة

في البداية نقوم باستدعاء المكتبات المطلوبة و هي مكتبة (GPIO) و مكتبة الوقت

import RPi.GPIO as GPIO 
import time 
GPIO.setmode(GPIO.BCM)

 نعرف المنافذ  التي تم توصيل المحرك معها

enable_pin = 18
coil_A_1_pin = 4
coil_A_2_pin = 17
coil_B_1_pin = 23
coil_B_2_pin = 24
 
GPIO.setup(enable_pin, GPIO.OUT)
GPIO.setup(coil_A_1_pin, GPIO.OUT)
GPIO.setup(coil_A_2_pin, GPIO.OUT)
GPIO.setup(coil_B_1_pin, GPIO.OUT)
GPIO.setup(coil_B_2_pin, GPIO.OUT)
 
GPIO.output(enable_pin, 1)

نعرف دالة لتشغيل المنافذ

def setStep(w1, w2, w3, w4):
    GPIO.output(coil_A_1_pin, w1)
    GPIO.output(coil_A_2_pin, w2)
    GPIO.output(coil_B_1_pin, w3)
    GPIO.output(coil_B_2_pin, w4)

نعطي أمر ليتحرك في إتجاهان مع عقارب الساعة و عكس عقارب الساعة