السبت، 24 أبريل 2021

التحكم في الاتجاه لمحرك DC عبر البلوتوث

 تحكم في سرعة واتجاه محرك التيار المستمر عبر البلوتوث من خلال تطبيق جوال.





الأشياء المستخدمة في هذا المشروع

اردوينو UNO

وحدة بلوتوث HC-06
يمكن استخدام وحدة HC-05 Bluetooth أيضًا
محركات تكساس إنسترومنتس المزدوجة H-Bridge L293D
محرك DC ، 12 فولت

تطبيقات البرمجيات والخدمات عبر الإنترنت
إلكترونيات بلوتوث     Bluetooth Electronics

وجدت هذا التطبيق في متجر Play ، ولكن لا تتردد في تكييف الكود لاستخدام تطبيقات أخرى ، وخيارات التخصيص في هذا التطبيق هي السبب في اختيارنا لاستخدامه.

قصة
الشهيق
كان مشروعنا الأولي هو بناء لوح تزلج كهربائي من الصفر ، يمكننا التحكم فيه باستخدام شريط التمرير في تطبيق على الهاتف. ومع ذلك ، يتطلب هذا أولاً القدرة على إرسال إشارة PWM عبر البلوتوث إلى Arduino ، بالإضافة إلى أمر لعكس اتجاه المحرك. لكوني مبتدئًا في Arduino ، كان علي أولاً البحث في الإنترنت بحثًا عن مشاريع من شأنها أن تكون بمثابة نقطة انطلاق نحو إنشاء مشروعي الخاص ، وذلك لتعلم المفاهيم الأساسية وتطبيقها. هذه نتيجة بضعة أسابيع من تعلم Arduino منذ البداية ، وسيسعدني معرفة ما إذا كان هذا بدوره قد ساعد أي شخص في تعلم شيء أو اثنين!

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

الأجزاء المطلوبة
سوف تحتاج:

اردوينو أونو أو نانو ؛
وحدة Bluetooth منخفضة الطاقة (BLE) ، مثل HC-06 وهو تابع فقط ، أو HC-05 الذي يمكن أن يكون سيدًا أو عبدًا. كلاهما سيعمل لأنه سيتم استخدام الوحدة كعبد. كما أنها تشترك في نفس الدبابيس الأربعة الوسطى ، وهي الوحيدة التي نحتاجها ؛





محرك L293D IC سائق. سيسمح لنا محرك الجسر H المزدوج ذو 16 سنًا بالتحكم في اتجاه الدوران وسرعة المحرك ؛




محرك 12V DC ؛
حزمة بطارية 12 فولت ؛
مصدر طاقة لاردوينو ؛
أسلاك توصيل ولوح.

الدائرة
ستتلقى HC-06 بيانات تسلسلية عند إرسالها من جهاز البلوتوث الرئيسي ، والتي سيتم توصيلها إلى Arduino من خلال دبابيس الاستلام / الإرسال ، RX / TX ، المتصلة بالدبابيس 5 و 4 من اللوحة. سيتم توصيل دبابيس GND و VCC على التوالي بـ GND و + 5V.

سيسمح لنا الجسر H في L293D بالتحكم في اتجاه دوران المحرك ، عن طريق فتح أو إغلاق زوج من المفاتيح ، 4 منها مرتبة على شكل حرف H ، ومن هنا جاء الاسم.





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

لتمكين المحرك ، قم بتوصيل "Enable 1، 2" (pin1) و "Vcc1" (pin 16) to + 5V. قم بتوصيل "Vcc2" (دبوس 8) بإيجابية حزمة بطارية 12V. قم بتوصيل المسامير 4 و 5 و 12 و 13 بـ GND. قم بتوصيل "الإدخال 1" (الطرف 2) بالدبوس 10 من Arduino ، والذي سينقل إشارة pwm2 ، و "الإدخال 2" (الطرف 7) إلى الطرف 9 ، لـ pwm1. سيتيح لنا التبديل بين هذين الاتجاهين تبديل اتجاه الدوران. أخيرًا ، قم بتوصيل محرك التيار المستمر بالمخرجات 1 و 2 (الدبابيس 3 و 6).





إليك صورة لما يجب أن تبدو عليه عند توصيلها بلوح التجارب






البرنامج
تمت إضافة التعليقات للمساعدة في شرح الكود ، ولكن قد تكون هناك حاجة لمزيد من التوضيح.

pwm1 و pwm2 متضادان ، ويسمحان لنا بتبديل اتجاه الدوران. البيانات التسلسلية التي يرسلها التطبيق عبارة عن سلسلة ، c ، حيث ستكون بيانات السرعة والاتجاه. لإنجاز هذا العمل ، توجد السرعة في c [1] و c [2] و c [3] من السلسلة ، ولهذا السبب يجب استلامها كرقم مكون من 3 أرقام. لهذا السبب في التطبيق ، نقوم بتخصيص شريط التمرير لإرسال رقم بين 100 و 255. ويمكن بعد ذلك تعيين هذا على [0: 255] في Arduino تحت متغير سرعة جديد مثل:

new_speed = map(speed_value,100,255,0,255) 
ومع ذلك ، قررنا ببساطة طرح 100 من speed_value ، بحيث تنتمي السرعة إلى الفاصل الزمني [0: 155] ، حيث أن 155 كانت سريعة بما يكفي لنموذجنا الأولي.


#include<SoftwareSerial.h>
SoftwareSerial bt_ser(4,5); //connected to RX and TX pins for serial data communication
char c[6];
int i=0,speed_value=0,send_value;
#define pwm1 9 //input 2
#define pwm2 10 //input 1
boolean motor_dir = 0;
void setup()
{
Serial.begin(9600);
bt_ser.begin(9600);
pinMode(pwm1, OUTPUT);
pinMode(pwm2, OUTPUT);
}
void loop()
{
while(bt_ser.available()) //when data is transmitted
{
if(bt_ser.available()>0)
{
c[i] = bt_ser.read(); //reading the string sent from master device
Serial.print(c[i]);
i++;
}
if(c[i-1]=='N') //if button is pressed
{
motor_dir = !motor_dir; //toggle direction variable
if(motor_dir) //setting direction, pwm1 and pwm2 are opposites
digitalWrite(pwm2, 0);
else
digitalWrite(pwm1, 0);
}
}
speed_value = (c[1]-48)*100+(c[2]-48)*10+(c[3]-48)*1; //interpreting speed from string
if(motor_dir) //for a given direction
{
if(c[i-1]=='#'){ //if data has been transmitted from slider
analogWrite(pwm1, speed_value-100); //-100 so that when slider is on "0" speed is 0
i=0;
}
}
else{ //for opposite direction
if(c[i-1]=='#'){
analogWrite(pwm2, speed_value-100);
i=0;
}
}
}




التطبيق
قررنا استخدام تطبيق يسمى Bluetooth Electronics وجدناه في متجر Play ، لأنه يوفر خيارًا لإنشاء لوحات معلومات بالإضافة إلى تخصيص البيانات التي ترسلها المكونات الموجودة على لوحة القيادة ، أو كيفية تفاعلها مع بعضها البعض.



لإنشاء هذه الواجهة ، ستحتاج إلى تحرير لوحة تحكم جديدة ، ومن قائمة التحرير حدد شريط تمرير وزر ومربع نص.

يجب تحرير شريط التمرير على النحو التالي:

الحد الأدنى للقيمة: 100
القيمة القصوى: 255
إرسال سلسلة عند تغيير شريط التمرير
السلسلة تبدأ بـ: *
السلسلة تنتهي بـ: #
يجب تحرير الزر على هذا النحو (اترك النص فارغًا):

نص صحفي: ن
تحرير النص:
يمكنك بعد ذلك إضافة نص لتوضيح لوحة القيادة.

المخططات





#include<SoftwareSerial.h>
SoftwareSerial bt_ser(4,5); //connected to RX and TX pins for serial data communication
char c[6];
int i=0,speed_value=0,send_value;

#define pwm1     9   //input 2
#define pwm2    10   //input 1
 
boolean motor_dir = 0;

void setup()
{
  Serial.begin(9600);
  bt_ser.begin(9600);
  pinMode(pwm1,   OUTPUT);
  pinMode(pwm2,   OUTPUT);
}

void loop()
{
  
   while(bt_ser.available())   //when data is transmitted
     {
       if(bt_ser.available()>0)
       {
         c[i] = bt_ser.read();   //reading the string sent from master device
         Serial.print(c[i]); 
         i++;  
       }
       if(c[i-1]=='N')    //if button is pressed
        {
          motor_dir = !motor_dir;     //toggle direction variable
          if(motor_dir)               //setting direction, pwm1 and pwm2 are opposites
            digitalWrite(pwm2, 0);
          else
            digitalWrite(pwm1, 0); 
        }
      }
       
       speed_value = (c[1]-48)*100+(c[2]-48)*10+(c[3]-48)*1;  //interpreting speed from string
       if(motor_dir)   //for a given direction
          {
            if(c[i-1]=='#'){   //if data has been transmitted from slider
              
              analogWrite(pwm1, speed_value-100);  //-100 so that when slider is on "0" speed is 0
              i=0;
            }
          }
        else{       //for opposite direction
          if(c[i-1]=='#'){
            
            analogWrite(pwm2, speed_value-100);
            i=0;
          }
          
        }
            
                
}   

ليست هناك تعليقات:

إرسال تعليق