تحكم في سرعة واتجاه محرك التيار المستمر عبر البلوتوث من خلال تطبيق جوال.
الأشياء المستخدمة في هذا المشروع
اردوينو 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 communicationchar c[6];int i=0,speed_value=0,send_value;#define pwm1 9 //input 2#define pwm2 10 //input 1boolean 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;
}
}
}