آلة تسيطر عليها اردوينو. السيارة على اردوينو: كيفية التحكم في الراديو بيديك

آلة تسيطر عليها اردوينو.  السيارة على اردوينو: كيفية التحكم في الراديو بيديك
آلة تسيطر عليها اردوينو. السيارة على اردوينو: كيفية التحكم في الراديو بيديك

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

هذا ما حصلت عليه في النهاية: هيكل مقبول، يمكن التحكم فيه - TA-DA!!! - من هاتفي الذكي الذي يعمل بنظام Android.


"أنا مستقيم، أنا جانبي،
مع دوران وقفزة ،
سواء من الركض أو على الفور ،
وقدمين معا..."

اليوم سوف نبني سيارة مضحكة مع جهاز تحكم عن بعد عبر البلوتوث. مصادر برنامج التحكم للاندرويد متضمنة.

مثال لائق للعبة

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

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


وهنا لعبة المنشار

ما الذي أتحدث عنه؟ أوه نعم، عن الهندسة المعمارية! ما أعنيه هو أنه إذا أردت، يمكنك صنع لعبة ممتازة. وهناك شيء لنتطلع إليه.

دعونا نبني سيارة بجهاز تحكم عن بعد!

تعتبر الألعاب التي يتم التحكم فيها عن طريق الراديو ذات أهمية عملية وتقنية. ومع ذلك، لن يحصل الطفل الذي يتراوح عمره بين 4 و6 سنوات على ألعاب ذات تحكم نسبي "للبالغين". على الأرجح، سيتم كسر اللعبة وسيتم إهدار المال.
ونتيجة لذلك، فإنهم عادة ما يقدمون شيئًا غير مكلف. من بين كل هذا - "غير مكلفة" - السيارات إما سريعة جدًا أو بطيئة؛ الدبابات ضعيفة. وغيرها من النواقص الظاهرة والخفية. وبالتأكيد لا توجد سيطرة نسبية.

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

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

دون تأخير صندوق طويلفكرة عن سيارتي، ذهبت مرة أخرى لاختيار الأساس - هيكل السيارة المستقبلية. هناك هيكل مختلف ل النقل البري: مجنزرة، ذات عجلات، ذات عجلتين، ثلاث، أربع عجلات، إلخ.

كيف اخترت الهيكل

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


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

مستنقع الأفكار والاختصاصات

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

ماذا نحتاج لتجميع الجهاز؟

.


لا توجد عجلات دوارة، مما يعني أن التحكم في الدوران سيكون مثل التحكم في مركبة مجنزرة. أي أنه بالنسبة للحركة للأمام/الخلف، يدور الجانب الأيمن والأيسر من محركات الأقراص بنفس السرعة. ولعمل دورة، يجب أن تكون سرعة الدوران على أحد الجانبين أقل أو أكثر.


ل جهاز التحكميستخدم الجهاز قناة البلوتوث. وحدة "HC-06" عبارة عن جسر بلوتوث، وهي واجهة تسلسلية تسمح بنقل البيانات في كلا الاتجاهين. يحتوي الإدخال على إشارات الواجهة التسلسلية TTL "RxD" و"TxD" للاتصال بوحدة التحكم الدقيقة (لوحة الهدف).
سيكون بمثابة جهاز التحكم عن بعد هاتف محمولمن أندرويد. دعونا نكتب برنامجنا الخاص!



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


تم اختيار هذا المجلس بسبب كان مستلقيًا في درج المكتب وهو مناسب تمامًا لغرضنا. توجد مدخلات/مخرجات منفصلة، ​​ويتم إخراج إشارات MK "RxD" و"TxD"، حيث سيتم توصيل "HC-06".
بالنظر إلى المستقبل، سأقول إن منتج Olimex MOD-IO يعد مبالغة كبيرة. سيكون من الرائع استخدام المعتاد، كما سنتحدث عنه في تكملة القصة!

المجموع:الهيكل + لوحة التحكم + وحدة بلوتوث + برنامج التحكم لنظام Android.

مخطط الاتصال العام

ليس مخططًا في شكله النقي، بل مخطط اتصال، نظرًا لأن جميع اللوحات جاهزة بالفعل، ولم يتبق سوى توصيلها معًا.

مخطط في بروتيوس


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

برنامج ميكروكنترولر

يمكن لبرنامج MK تلقي الأوامر عبر الواجهة التسلسلية من وحدة Bluetooth.
ووفقًا للأوامر، يمكنك التحكم في زوج محركات الأقراص الأيمن والأيسر. يعمل التحكم العكسي والسرعة باستخدام PWM.

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

لقد قمت بوضع وظائف المخزن المؤقت الحلقي في مكتبة منفصلة تتكون من:
الملف الاساسي Ring_buffer.hوملف تنفيذ الوظيفة Ring_buffer.c
لاستخدام المكتبة، يجب عليك تضمينها في main.c
#تتضمن "ring_buffer.h"

التالي، في الملف الاساسيتحتاج إلى تكوين المكتبة. للتكوين، تحتاج إلى تحديد أربعة توجيهات فقط:
#define RX_PACKET_SIZE 7 // حجم حزمة RxD #define BUFFER_SIZE 16 // تلقي حجم المخزن المؤقت. يجب أن يكون ضعف حجم RX_PACKET_SIZE #define START_BYTE "s" // بداية البايت #define STOP_BYTE "e" // إيقاف البايت

في الواقع، لا يوجد شيء أكثر لتكوينه.

باستخدام الكودفي main.c نقوم بتكوين USART للمتحكم الدقيق.
استدعاء وظيفة تكوين USART
USART_Init(MYUBRR);

#define BAUD 9600 #define MYUBRR F_CPU/16/BAUD-1 void USART_Init(unsigned int ubrr) ( /* ضبط معدل الباود */ UBRRH = (unsigned char)(ubrr >> 8); UBRRL = (unsigned char)ubrr; /* تمكين جهاز الاستقبال وجهاز الإرسال */ UCSRB = (1<< TXCIE) | (1 << RXCIE)| (1 << TXEN) | (1 << RXEN); /* Set frame format: 8data, 2stop bit */ UCSRC = (1 << URSEL) | (0 << USBS) | (3 << UCSZ0); }

استلام حزمة البيانات

في وظيفة معالج مقاطعة استقبال البايت USART، نحتاج فقط إلى وضع البايت المستلم في المخزن المؤقت الحلقي. سنقوم بتحليل الحزمة في وقت لاحق.
ISR(USART_RXC_vect) ( uint8_t Data = UDR; RB_push_char(Data); // أضف البايت المستلم إلى المخزن المؤقت الحلقي)
نعم، لقد أهملت جميع عمليات التحقق من الإطارات في الوقت الحالي.

الآن كل ما يتعين علينا القيام به هو التحقق من المخزن المؤقت لدينا من وقت لآخر. للقيام بذلك، قمت ببدء مؤقت حيث قمت بتعيين علامة تسمح بفحص المخزن المؤقت للحلقة
ISR(TIMER0_OVF_vect) ( TCNT0 = 0x64; ReadRingBuffer = 1; )

في الحلقة الرئيسية نضيف شرطًا للتحقق من العلم.
إذا (ReadRingBuffer) ( if (RB_read_buffer((uint8_t*)&RxPacket) == 1) قراءة المخزن المؤقت ( // تحليل الحزمة، افعل شيئًا ) ReadRingBuffer = 0; )

وظيفة RB_read_bufferيتحقق من المخزن المؤقت للحلقة، إذا كان حجم الحزمة، ووحدات البايت الخاصة بالبدء والإيقاف في مكانها الصحيح - تعتبر الحزمة صالحة، وترجع الدالة "1" كوسيطة، وتأخذ الدالة مؤشرًا حيث تريد إضافة الحزمة المستلمة.
لمزيد من الموثوقية، يمكن تجهيز الحزمة بمجموع اختباري؛ في أحد مشاريعي التجارية فعلت ذلك. أي أنه بالإضافة إلى التحقق من الحجم وبايتات البدء/الإيقاف، تتم أيضًا إضافة فحص المجموع الاختباري. لكن في الوقت الحالي سنستغني عنه.

كيف يمكنني تفكيك الحزمة

الآن الجزء المثير للاهتمام هو كيفية تفكيك الحزمة. يمكن للحزمة إرسال بيانات أكبر من البايت أو البيانات الموقعة أو بيانات الفاصلة العائمة.
سأشرح باستخدام مثال الحزمة للتحكم في الهيكل. بالإضافة إلى وحدات البايت الخاصة بالبدء والإيقاف، أحتاج في الحزمة الخاصة بي إلى إرسال أمر واحد وقيمتي PWM للجانبين الأيمن والأيسر من محركات الأقراص. بالنسبة للأمر، بايت واحد يكفي بالنسبة لي، ولكل قيمة PWM أقوم بالإرسال int16- 16 بت، نوع موقّع. أي أنني لا أقوم بإرسال إشارة الاتجاه (بايت/علامة). لتغيير الاتجاه، أقوم بتمرير قيمة PWM موجبة أو سالبة.

يتم تنظيم حزمة الاستقبال الخاصة بي على شكل هيكل.
struct RxPacket ( uint8_t StartByte; uint8_t Command; int16_t Left_PWM; int16_t Right_PWM; uint8_t StopByte; ) RxPacket;

استدعاء وظيفة RB_read_buffer ((uint8_t*)&RxPacket )، كوسيطة نقوم بتمرير مؤشر إلى بنية الحزمة المتلقية. أي أنه عند استلام الحزمة، سيتم فرز كل شيء في أماكنه الخاصة في بنية RxPacket. ثم كل ما تبقى هو قراءة هذه البيانات من البنية، على سبيل المثال مثل هذا:
lCmd = RxPacket.Command; lLPWM = RxPacket.Left_PWM; lRPWM = RxPacket.Right_PWM;

نقل حزمة البيانات

على الرغم من عدم استخدام الإرسال بعد في برنامجي، إلا أنه تم تنفيذ إمكانية الإرسال. نقل البيانات أسهل. بنفس الطريقة المتبعة مع الحزمة المتلقية، لنقم بإنشاء البنية:
struct TxPacket ( uint8_t StartByte; uint8_t Rc5System; uint8_t Rc5Command; uint8_t StopByte; ) TxPacket;

حيث يوجد بايت البداية والتوقف وجزء المعلومات. لقد قمنا بالفعل بتهيئة جهاز استقبال USART.
لبدء إرسال الحزمة، قم باستدعاء الدالة
باطلة send_packet () (/ اكتب بايت البداية لتسجيل UDR UDR = START_BYTE;)
في هذا المثال، في هذه الوظيفة، أكتب فقط بايت البداية إلى سجل UDR. لا يبدو الأمر كثيرًا، ولكن في نفس الوظيفة يمكنك تنفيذ إعداد الحزمة أو أي شيء آخر مفيد. وهذا في رأيي أكثر منطقية. إنه منطقي من حيث كود التوثيق الذاتي. وهذا يعني أنه إذا كنت في الكود، فأنا ببساطة أكتب قيمة في سجل UDR، ويمكن إدراك ذلك على أنه نقل بايت واحد فقط، واستدعاء وظيفة تتحدث ذاتيًا send_packet()- أتحدث عن حقيقة أنني أرسل حزمة بيانات.

بعد ذلك، عندما يرسل مرسل USART البايت بالكامل من سجل UDR، سيتم استدعاء معالج مقاطعة الإرسال.
ISR(USART_TXC_vect) (حرف غير موقع *مؤشر = (حرف غير موقع *)&(TxPacket); حرف ثابت غير موقع TxIndex = 1; إذا (TxIndex< sizeof(TxPacket)) { UDR = *(Pointer + TxIndex); TxIndex++; } else TxIndex = 1; }

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

الحالة إذا (TxIndex< sizeof(TxPacket)) проверяет, что индекс меньше чем размер пакета. Если условие верно, то записываем байт в регистр UDR: UDR = *(Pointer + TxIndex);
زيادة TxIndex. عندما يرسل USART البايت التالي، سندخل مرة أخرى إلى المعالج، ولكن سيتم إرسال البايت التالي من البنية، وبالتالي سيتم إرسال جميع بايتات البنية. عندما يكون TxIndex أكبر من حجم البنية، لن يكون الشرط صحيحًا وسينتهي بنا الأمر إلى TxIndex = 1; حيث ستتم تهيئة TxIndex، ولكن لن يتم كتابة أي شيء في سجل UDR، لذلك لن يتم استدعاء المعالج بعد الآن حتى بدء إرسال الحزمة التالية. وبالتالي، فإن عملية النقل تتم تلقائيًا بالكامل، وحتى إذا قمنا بتغيير بنية الحزمة، فلن يلزم إعادة كتابة المعالج.

كجزء من وصف برنامج MK، يبقى الحديث عن تنفيذ إدارة السائق. يتم التحكم في السائق من خلال ثلاث إشارات: A1 (B1)، A2 (B2) وPWMA (PWMB). تم تصميم A1 وA2 لتشغيل/إيقاف تشغيل المحرك وتغيير قطبية الإخراج. يتم توفير إشارة PWM من MK إلى مدخل PWMA - يمكنك التحكم في سرعة الدوران. بالنسبة لإشارة PWM، استخدمت جهازي توقيت PWM 1.
#define _WGM13 0 #define _WGM12 1 #define _WGM11 0 #define _WGM10 1 // Timer 1 init TCCR1A = (1<< COM1A1) | (0 << COM1A0) | (1 << COM1B1) | (0 << COM1B0) | (_WGM11 << WGM11) | (_WGM10 << WGM10); TCCR1B = (0 << CS12) | (0 << CS11) | (1 << CS10) | (_WGM13 << WGM13) | (_WGM12 << WGM12); TCNT1 =0x0000; OCR1A = 0; OCR1B = 0;

المؤقت هو 16 بت، ولكن تتم تهيئة PWM إلى 8 بت. وكما لاحظت بالفعل، لدي في حزمة الاستقبال قيمتان لإعداد PWM، لمحركات الأقراص اليمنى واليسرى، على التوالي. المتغيرات الموقعة هي 16 بت.
سأشرح لماذا فعلت هذا.

أولاً، لقد جاء من برنامج لنظام Android. الحقيقة هي أنه لا توجد أنواع موقعة في Java وقد صعدت بالفعل على هذه أشعل النار. ولإرسال الأرقام من 0 إلى 255، كان علي أن أتهرب بطريقة أو بأخرى. قررت أن أسلك طريقًا أبسط - أرسل رقمًا موقّعًا مكونًا من 16 بت. في الوقت نفسه، 16 بت من النوع الموقع هو من -32786 إلى 32768، وهو ما يكفي بالنسبة لنا.

ثانيًافي رأيي، إنه أكثر شفافية - يتم وصف سرعة الدوران والاتجاه بمتغير واحد فقط.

وثالثا، مهما كان القول، لأغراضنا فمن المستحيل الاحتفاظ بها في أقل من ثلاث بايت. دعونا نضحي بايت آخر، ولكن كل شيء يصبح واضحا: قيمة PWM الإيجابية تعني الدوران الأمامي، والقيمة السالبة تعني الدوران العكسي.

للسيطرة على محركات الأقراص كتبت وظيفة محرك الأقراص (int leftPWM، int rightPWM)؛.
محرك الفراغ (int leftPWM، int rightPWM) ( // تحريك العجلة اليسرى للأمام if (leftPWM > 0)( ClearBit(A2_PORT, A2_PIN); SetBit(A1_PORT, A1_PIN);) // تحريك العجلة اليسرى للخلف if (leftPWM)< 0){ ClearBit(A1_PORT, A1_PIN); SetBit(A2_PORT, A2_PIN); } // Движение ВПЕРЁД правое колесо if (rightPWM >0)( ClearBit(B2_PORT, B2_PIN); SetBit(B1_PORT, B1_PIN);) // حرك العجلة اليمنى للخلف إذا (rightPWM)< 0){ ClearBit(B1_PORT, B1_PIN); SetBit(B2_PORT, B2_PIN); } // Остановка if (leftPWM == 0){ ClearBit(A1_PORT, A1_PIN); ClearBit(A2_PORT, A2_PIN); } // Остановка if (rightPWM == 0){ ClearBit(B1_PORT, B1_PIN); ClearBit(B2_PORT, B2_PIN); } set_PWM((uint8_t)(abs(leftPWM)), (uint8_t)(abs(rightPWM))); }
وفقًا لقيمة PWM، يتم التحكم في الإشارات A1 ​​(B1) وA2 (B2) ويتم ضبط قيمة PWM عن طريق استدعاء الوظيفة set_PWM(يسارPWM، يمينPWM).

اوف انا انقطعت انفاسي...
للتلخيص: تم استلام الحزمة وتحليلها وتمرير قيمة PWM إلى الوظيفة يقود.

تطبيق اندرويد للسيارات

لا، لن أخوض في تفاصيل كثيرة مثل برنامج MK. ما زلت جديدًا في مجال تطوير برامج Android ولست مستعدًا للتحدث بكفاءة وعمق كافٍ.

الوظيفة الرئيسية للبرنامج- نقل البيانات إلى وحدة HC-06 عبر البلوتوث. البرنامج له واجهة بسيطة.

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

بعد ذلك، يقوم زر "إيقاف" بتشغيل/إيقاف الاتصال مع "HC-06". أدناه من اليسار إلى اليمين: قيمة PWM المرسلة للقناة اليسرى، ونوع المستشعر، وقيمة القناة اليمنى. يوجد أدناه شريطان تمريران لضبط السرعة وحساسية الدوران.

ينفذ البرنامج نوعين من التحكم في الماكينة. لتبديل نوع المستشعر، يلزمك لمس اسم المستشعر: "Tilt" أو "Shuffle".

1. التحكم في الجهاز عن طريق إمالة الهاتف.الوضع الصفري للهاتف أفقي. عند إمالة الهاتف للأمام، تزداد قيمة PWM بما يتناسب مع الميل في النطاق من 0 إلى 255. عند إمالة الهاتف للخلف، تنخفض قيمة PWM بما يتناسب مع الإمالة في النطاق من 0 إلى -255


للانعطاف إلى اليسار أو اليمين، تحتاج إلى إمالة الهاتف للأمام أو للخلف، وفي نفس الوقت، لليسار أو لليمين، على التوالي. نعم، كما هو الحال في السيارة الحقيقية، فهي لا تدور إلا عندما تضغط على دواسة الوقود.

2. التحكم باللمس.اسمي التجاري لهذا النوع من التحكم هو "خلط ورق اللعب".


يمكن اعتبارها بمثابة لوحة اللمس. عندما تلمس مربعًا رماديًا، تزيد/تقل قيمة PWM اعتمادًا على موقع اللمس؛ كلما ابتعدت عن المركز لأسفل أو لأعلى، زادت/انخفضت القيمة.

لا توجد أجراس وصفارات. يبدو أن هذا كل شيء.

ذبابة صغيرة في المرهم على "الزلاجات"

هناك مشكلة في هاتفي. نعم، هاتف "التزلج" هو LG G2 mini. لا ينشئ اتصال Bluetooth مناسبًا. يتم إنشاء الاتصال بشكل طبيعي فقط في حالة تشغيل Bluetooth مباشرة قبل تشغيل التطبيق.
لقد فعلت ذلك: عند بدء تشغيل التطبيق، أتحقق مما إذا كان Bluetooth قيد التشغيل، وإذا تم إيقاف تشغيله، فأنا أطلب تشغيله. وعندما أقوم بتصغير التطبيق أو إغلاقه، أقوم بإيقاف تشغيل البلوتوث بالقوة.
وهناك شيء آخر، عندما تقوم بتغيير اتجاه الشاشة، يتم إيقاف تشغيل Bluetooth ويُطلب منك مرة أخرى تشغيله، وسيتعين عليك إيقاف تشغيل التبديل التلقائي لتدوير الشاشة.

ملخص

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

لا يزال هناك مجال للنشاط، وهناك مجال للنمو. يمكنك تخصيص الهيكل، ويمكنك ترقية وتحسين البرنامج الخاص بهاتفك.
وسيكون هناك استمرار لهذا!

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

قليلا عن المستوى والمؤلف والتحذيرات

أنا المؤلف، صبي يبلغ من العمر 16-17 عامًا من قرية بالقرب من موسكو، متخصص في كتابة تطبيقات Android (وحرق شيء ما هناك أكثر صعوبة)، لذلك أعفي نفسي من المسؤولية عن النهج الأمثل لحل المشكلات.

مهمة

أسهل مهمة هي صنع سيارة يتم التحكم فيها بواسطة محرك Arduino واستبدال جهاز التحكم عن بعد بجهاز android. ولكن في أغلب الحالات كان علينا أن نعيد اختراع العجلة، لأنه لم يتم العثور على حل مناسب على شبكة الإنترنت.

سوف تحتاج

  1. اردوينو
  2. درع المحرك (في حالتي الثانية)
  3. بلوتوث
  4. ذكري المظهر
  5. الأسلاك عادية

أساس تصميم

تم أخذ سيارة Lego Outdoor Challenger كأساس (في الواقع تبدو أقل طنانة). كل ما تبقى منه هو الجسم (تمت إزالة جميع العناصر الزخرفية) وثلاثة محركات.

كان للآلة لوحة خاصة بها، لكن إحدى المهام كانت تنطوي على تعدد الاستخدامات: لقد فعلت ذلك، ويمكن للآخرين القيام بذلك. لقد أخرجت عقلي وقمت بتثبيت Arduino Uno.

تركيب الاردوينو

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

لقد قمت على الفور بتثبيت درعين للمحرك أعلى اللوحة، وهذا هو ما يفترض أن يكون. للتحكم في السلك الثاني، سيتعين عليك توصيل سلك واحد من أي منفذ رقمي إلى H1 (الاتجاه) والثاني من دبوس مزود بدعم الرقائق (مميز بعلامة "~"، عادة 10، 11) إلى E1 (السرعة) .

تحديد زاوية الدوران

والمثير للدهشة أن محرك المؤازرة ليس هو المسؤول عن تدوير السيارة، بل المحرك العادي. هناك مشكلة: سيكون من الجيد عدم حرقها، لأن زاوية الدوران محدودة، ويمكن للمحرك أن يدور بقدر ما يريد.

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

حل المشكلة هو تتبع الزاوية من خلال الإغلاق. تُظهر الصورة شيئًا صغيرًا متصلًا بالقرب من آلية الدوران. يتم توصيل مشط ذو ملامسات حديدية بالجزء الذي يدور مع العجلات إلى اليسار / اليمين بجوار المحرك.

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

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

اتصال الزاوية والرمز

لكل مستوى، تم اختيار لون مختلف: الأسفل أخضر، الأول من الأسفل أحمر، الثاني أسود، الثالث أبيض. في المرحلة الأولية، تم استخدام اللوح ومصابيح LED لتصحيح الأخطاء البصرية.

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

يتم إعطاء الكود مع التعليقات. نقوم بتوصيل الدبابيس واستطلاعها عبر digitarRead (). إذا كان هناك الجهد، سيتم إرجاع صحيح. بعد ذلك، ننظر إلى ما إذا كانت النتيجة تعني أن العجلات في المواضع المتطرفة، فإننا نحظر المزيد من الدوران في هذا الاتجاه.

خدعة صغيرة: بما أنه ستكون هناك حاجة إلى مخرجات 5 فولت و3.3 فولت في المستقبل، يمكنك وضع علامة زائد على أحد الأطراف الرقمية. قبل كل فحص زاوية، قم بإخراج التيار من خلال الكتابة الرقمية (whitePin)، ثم تحقق من الزاوية وقم بإزالة التيار.

إنت سبيدتورن = 180؛ // سرعة الدوران، من 0 إلى 255 // دبابيس لتحديد الدوران int pinRed = A0; int pinWhite = A1; int pinBlack = A2; int pinAngleStop = 12; // يخرج التيار إلى مؤشر LED إذا تم الوصول إلى الحد الأقصى للزاوية، // مطلوب فقط لتصحيح أخطاء إعداد الفراغ () ( // دبابيس الدوران لقراءة pinMode (pinRed، INPUT)؛ pinMode (pinBlack، INPUT)؛ pinMode (pinWhite، INPUT) ); // LED pinMode(pinAngleStop, OUTPUT); // دبابيس محرك المحرك والاتجاه والسرعة pinMode(angleDirection, OUTPUT); pinMode(angleSpeed, OUTPUT); دورة باطلة (زاوية int) (digitalWrite (pinAngleStop، HIGH)؛ // نصدر التيار للسلك المتصل بالتأخير الموجب (5)؛ // ننتظر قليلاً حتى يتوفر للتيار الوقت للوصول if (angle > 149 ) ( if(digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinBlack) == LOW) ( // إذا تم الوصول إلى أقصى الموضع الأيمن، فاخرج من الوظيفة دون تطبيق التيار، حتى لا // حرق عودة المحرك) // إذا لم تكن الزاوية هي الحد الأقصى، قم بتدوير الكتابة الرقمية (angleDirection، HIGH)؛< 31) { if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) { //если достигнуто крайне левого положение, выйти из функции не подавая ток, чтобы не //сжечь мотор return; } //если угол не максимальный, поворачиваем digitalWrite(angleDirection, LOW); analogWrite(angleSpeed, speedTurn); } digitalWrite(pinAngleStop, LOW); //убираем ток с определителя угла delay(5); }

توازي عجلات التشغيل

في البداية، يتم توصيل محركين للدفع معًا. لقد قمت بفصلها لسببين: يكون الدوران أكثر كفاءة إذا كانت العجلات تدور في اتجاهات مختلفة، ولا يمكن للوحة واحدة أن تدعم محركين قويين.

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

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

الحل لكلتا المشكلتين: قم بتوصيل محرك واحد بدرع محرك واحد، والثاني بالآخر. ومن الغريب أنه ساعد. انخفضت درجة الحرارة ولم يعد هناك ارتفاع في درجة الحرارة. كان من الممكن تركيب المبرد، ولكن كان من الصعب إرفاقه.

اتصال بلوتوث

لقد استخدمت طراز HC-05، والذي كان مزحة قاتلة. يتم توصيل جميع أجهزة البلوتوث بنفس الطريقة: سلك واحد إلى 3.3 فولت (في بعض الأحيان يبدأ العمل فقط من 5 فولت)، والثاني إلى ناقص، واثنين آخرين إلى المنفذ 0 و 1 (القراءة والإرسال، على التوالي). يتم توصيل السلك المسمى RXD للبلوتوث بـ TXD الخاص بـ Arduino، و TXD بـ RXD (إذا قمت بخلطه، فلن ترى البيانات).

هناك تحذير: يتم استخدام المنفذين 0 و1 بشكل افتراضي بواسطة Serial، والذي يتم من خلاله تحميل الرسم. أي أنه طالما تم توصيل البلوتوث، فلن يتم تحميل الرسم. هناك خياران: إزالة البلوتوث أثناء ملء أو إعادة تعيين مدخلات ومخرجات البلوتوث. يتم تنفيذ الخيار الثاني في سطرين

#يشمل \\توصيل مكتبة SoftwareSerial BTSerial(8, 9); \\قم بتثبيت الأطراف 8 و9 بدلاً من 0 و1
كان المأزق الذي قضى على أيام عملي الثلاثة هو سرعة الاتصال. من باب العادة، قمت بتثبيت 9600 وذهبت للمحاولة. إما أن البيانات لم تصل، أو أنها كانت عبارة عن فوضى من الرموز. وفي النهاية الجواب هو أن موديل HC-05 يتصل على 38400! لاحظ بقوة أنه في Setup() سأفعل BTSerial.begin(39400) على الرغم من Serial.begin(9600).

نظام إرسال الأوامر

المقالة طويلة جدًا، لذا سأغطي كود Arduino وAndroid في جزء ثانٍ منفصل، ولكن الآن سأصف المبدأ.

يحتوي جهاز Android على عصا تحكم (دائرة تمت مناقشة تنفيذها أيضًا في الجزء الثاني). يقرأ Android القراءات منه ويحولها إلى أرقام مناسبة لـ Arduino: تتحول السرعة من البكسل إلى قيمة من -255 إلى 255 (سلبي - عكسي)، ويحدد أيضًا الزاوية. لقد أعطيت هذه المهمة عمدا للهاتف، لأنه أقوى بكثير ويمكنه بسهولة التعامل مع حساب عدة مئات من القيم في الثانية.

بمجرد تثبيت المقبس، يتم إرسال البيانات بالتنسيق التالي: @speed#*angle#. @ - يشير إلى أن الأرقام التالية تحتوي على السرعة، # - يشير إلى نهاية قيمة السرعة، * - بداية قيمة الزاوية، # - ينهي تسجيل الزاوية. الدورة لا نهاية لها، ويتم إرسال الأوامر كل 100 مللي ثانية (تم تحديد العدد الأمثل). إذا لم يتم الضغط على أي شيء على Android، فلن يتم إرسال أي شيء.

يتم وصف خوارزمية استقبال البيانات بالتفصيل في كود الرسم. تمت إعادة كتابته أكثر من مرة، وبالنسبة لي، فهو يعمل بشكل مثالي.

خاتمة الجزء الأول

حاولت في هذه المقالة الكشف عن كل ما يتعلق بالجزء المادي من الجهاز. على الأرجح، فاتني شيء ما، لذا تأكد من السؤال.

لكن الشيء الأكثر إثارة للاهتمام بالنسبة لي بقي للثاني - برنامج Arduino وتطبيق Android، حيث يحدث السحر الحقيقي، على الأقل بالنسبة للشباب.

إذا لم تجد إجابة لجزء ما وتريد أن تلاحقني على عيوبي شخصيًا، فأنا في الانتظار - [البريد الإلكتروني محمي], .

محدث: الجزء الثاني قد صدر بالفعل -

في هذه المقالة سننظر في توصيل Arduino والتحكم فيه عبر البلوتوث.

سيتم استخدام HC-06 المستخدم على نطاق واسع كوحدة بلوتوث.

في مشروعنا سنقوم بتشغيل وإيقاف تشغيل مؤشر LED المتصل بالمنفذ 13 عبر البلوتوث.

لنبدأ بكتابة تطبيق لهاتف ذكي يعمل بنظام Android. سيتم كتابة التطبيق في بيئة برمجة مريحة وبسيطة، App Inventor. سيتم تجميع البرامج عبر الإنترنت.

اتبع الرابط http://ai2.appinventor.mit.edu/. هناك سيُطلب منك تسجيل الدخول إلى حساب Google، والذي سيتعين عليك إنشاؤه إذا لم يكن لديك حساب بالفعل.

بعد تسجيل الدخول، سيتم نقلك إلى البرنامج حيث يمكنك إنشاء مشروع من خلال النقر على "بدء مشروع جديد". سوف تحتاج إلى إدخال اسم المشروع. دعنا نسميها led_control.

سيتم فتح نافذة تطبيق فارغة.

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

بالنسبة لمكون ListPicker في النافذة الموجودة على اليمين، ابحث عن خاصية النص، وقم بتغيير "Text for ListPicker1" إلى "Select a BT".

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

دعونا نغير الملصقات الموجودة على الأزرار: أول واحد سيقول LED ON، والثاني سيقول LED OFF.

أدناه سنضيف تسمية ونمسح نصها.

يبقى إضافة مكون ينظم نقل البيانات عبر البلوتوث. افتح علامة التبويب "الاتصال" ثم ضع BluetoothClient في المشروع. ولن يظهر هذا المكون على شاشة الهاتف، بل أسفلها، لأنه انها ليست بصرية.

الآن يمكنك البدء في كتابة البرنامج. في الجزء العلوي الأيمن من البرنامج، حدد وضع الكتل.

هنا سيتم تجميع البرنامج من الكتل الرسومية. على اليسار، انقر فوق مكون ListPicker1 وحدد ListPicker1.BeforePicking.

انقر فوق ListPicker1 مرة أخرى وحدد تعيين ListPicker1.Elements على

ضعه كما في لقطة الشاشة.

وهذا يعطينا قائمة بأجهزة البلوتوث المقترنة. الآن دعنا نتصل بالجهاز المحدد. اكتب الكتلة كما في لقطة الشاشة أدناه.

الكتلة الوردية المسماة "متصل" هي الكتلة الأولى في علامة التبويب "نص". أدخل متصل في المربع الفارغ.

الآن دعونا نكتب معالج الزر. عند الضغط على الزر الأول، سيتم إرسال النص “led_on”، وعند الضغط على الثاني، سيتم إرسال النص “led_off”. سوف يتغير أيضًا النقش الموجود في Label1.

كل ما تبقى هو تنزيل المشروع على هاتفك الذكي. انقر فوق "إنشاء" وحدد طريقة التنزيل.

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

في الخيار الثاني، سيتم حفظ المشروع بتنسيق .apk على جهاز الكمبيوتر الخاص بك ويمكنك تنزيله على هاتفك الذكي بأي طريقة مناسبة (على سبيل المثال عبر USB).

لنبدأ الآن ببرنامج الاردوينو.

يتم استقبال البيانات ونقلها عبر منفذ COM، لذلك سنستخدم Serial. سوف نتلقى إشارات حرفًا بحرف، ونشكل سلسلة ثم نقارن السلسلة التي تم إنشاؤها بأوامر led_on وled_off.

اردوينو

سلسلة فال = ""؛ إعداد باطلة () (Serial.begin (9600)؛ pinMode (13، OUTPUT)؛) حلقة باطلة () (بينما (Serial.available ()) ( // أثناء وصول البيانات char c = Serial.read ()؛ // اقرأها val += c; // وقم بتكوين سلسلة تأخير(3); if (val != "") ( Serial.println(val); ) if (val == "led_on") (digitalWrite(13, HIGH ); else if (val == "led_off") (digitalWrite(13, LOW); ) val = "" ) ؛

سلسلة فال = "" ؛

الإعداد باطل() (

مسلسل. تبدأ (9600)؛

pinMode(13, OUTPUT);

حلقة فارغة() (

بينما (المسلسل . متاح () ) ( // أثناء وصول البيانات

شار ج = مسلسل . يقرأ()؛ //اقرأهم

فال += ج ; // وإنشاء سلسلة

تأخير (3)؛

}

قم بتحميل الكود إلى Arduino.

يمكنك الآن توصيل وحدة Bluetooth HC-06. إنه يتصل بكل بساطة:

Vcc 5 فولت (3.3 فولت ممكن)

إذا حاولت تحميل البرنامج إلى اردوينو مع الوحدة المتصلة، فسيظهر خطأ، لأنه يستخدم كل من الوحدة وتحميل البرنامج منافذ RX وTX!

تطبيق الطاقة على اردوينو. يجب أن يومض مؤشر LED الموجود على وحدة Bluetooth، وهذا يعني أنه في انتظار الاتصال. خذ هاتفك الذكي، وابحث عن البلوتوث في الإعدادات، وقم بتشغيله وابدأ في البحث. ابحث عن الجهاز المسمى hc-06 واتصل به. قد لا ينجح الأمر في المرة الأولى. بعد الاقتران الناجح مرة واحدة، يمكنك تشغيل البرنامج على هاتفك الذكي.

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

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

في كثير من الأحيان تكون هناك حاجة في مشاريعك للتحكم عن بعد أو نقل البيانات من أدوات الهاتف الخاصة بك.

إحدى الطرق الأكثر شهرة وانتشارًا لتبادل البيانات عبر البلوتوث .

سنلقي اليوم نظرة على أمثلة بسيطة لكيفية توصيل البلوتوث وحدة إلى Arduino وتكوين جهاز التحكم عن بعد من هاتفك.

سنحتاج إلى:

  • مجموعة من أسلاك MALE-MAMA
  • HC-06 بلوتوث

قم بتوصيل البلوتوث تعتبر وحدة التحكم الدقيقة Arduino أكثر ملاءمة باستخدام أسلاك MALE-MAMALE.

اردوينو بلوتوث
الدبوس 1 (تكساس) آر إكس دي
الدبوس 0 (آر إكس) TXD
أرض أرض
5 فولت VCC

كن حذرا، تحتاج إلى الاتصال تكساس -> آر إكس دي ,آر إكس -> TXD .

أنت الآن بحاجة إلى كتابة رمز الاختبار للبرنامج:

عند تحميل المخطط، من الضروري فصل وحدة Bluetooth عن متحكم Arduino. وإلا فلن يتم تسجيل الرسم بسبب الاتصال بالبلوتوث تتصل الوحدة عبر نفس منافذ RX وTX مثل USB.

إنت فال؛ إنت ليد = 13؛ إعداد باطلة () (Serial.begin (9600)؛ pinMode (LED، OUTPUT)؛ digitalWrite (LED، HIGH)؛) حلقة باطلة () (إذا (Serial.available ()) (val = Serial.read ()؛ / / عندما يكون الحرف "1"، قم بتشغيل مؤشر LED if (val == "1") ( digitalWrite(LED, HIGH);) // عندما يكون الحرف "0"، قم بإيقاف تشغيل مؤشر LED if (val == "0") ( الكتابة الرقمية (LED، LOW )؛ ) ) )

بعد أن يتم تسجيل الرسم وبلوتوث الوحدة متصلة بـ Arduino، يمكنك الانتقال إلى الخطوة التالية.

توصيل البلوتوث بهاتفك

يُنصح باستخدام ليس USB كمصدر طاقة لاردوينو، ولكن مصدر طاقة خارجي 9 فولت.

  1. قم بتشغيل Bluetooth على هاتفك وابحث عن أجهزة جديدة
  2. نجد في قائمة الاضطرابات " HC-06" والاتصال به.
  3. سيطلب الهاتف رمز PIN. يجب عليك إدخال " 1234 " أو " 0000 "
  4. مرحا. الجهاز متصل.

أنت الآن بحاجة إلى تنزيل محطة البلوتوث على هاتفك. سننظر إلى مثال منصة Android.



يمكنك تثبيت محطات بلوتوث مختلفة، كقاعدة عامة، تختلف فقط في التصميمات المختلفة، ولا تتغير الوظيفة. يمكنك أيضًا العثور على محطة لمنتجات iOS.

بعد أن قمنا بتثبيت الجهاز، نقوم بتشغيله، ونختار وحدة البلوتوث HC-06 الخاصة بنا ونتصل بها.

لقد حان الوقت لتجربة المشروع في العمل. نكتب الرقم "0" في الجهاز ونرسله. يجب أن ينطفئ مؤشر LED L الموجود على لوحة Arduino بجوار الدبوس 13. نرسل الآن الرقم "1" عبر الجهاز ويجب أن يضيء مؤشر L LED.

مظاهرة العمل:


العمل في المنزل:

  • قم بتغيير الرسم بحيث يضيء مؤشر LED وينطفئ باستخدام نفس الأمر، على سبيل المثال "G".
  • أكمل الرسم وقم بتعليمه كيفية تحويل البيانات النصية الواردة عبر البلوتوث إلى بيانات رقمية وتنفيذ أداة خافتة وإضاءة مصباح LED باستخدام PWM، عند سطوع معين من 0 إلى 254 عبر البلوتوث.

أتاحت التكلفة الواسعة والمنخفضة لمنصة Arduino والمنصات الآلية المختلفة للهواة إنشاء سيارات يتم التحكم فيها عن طريق الراديو لتناسب جميع الأذواق. وقد أتاح الاستخدام الواسع النطاق للهواتف الذكية إمكانية استخدامها كوحدات تحكم لهذه الأجهزة. المشكلة الرئيسية للعديد من عشاق Arduino هي قلة الخبرة في البرمجة لنظام Android. سأخبرك اليوم بكيفية حل هذه المشكلة بسهولة باستخدام بيئة التطوير المرئية App Inventor 2 لتطبيقات Android.



يجب أن يبدأ بناء أي جهاز بالمكونات الصلبة، لذا سأصف بإيجاز ما استخدمته لجهازي:
اردوينو نانو
وحدة بلوتوث HC-05
درع مستشعر المحرك Z-Mini L293D
هيكل محرك ثنائي الدفع
لا يلعب تكوين الأجهزة دورًا كبيرًا في هذا المشروع، لذلك يمكن استبدال الهيكل والدرع وArduino نفسه بأي نظائرها.

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

الآن كل ما تبقى هو تجميع التطبيق من خلال النقر على زر "إنشاء".

أعتقد أن عشاق Arduino لن يواجهوا أي مشكلة في كتابة رسم تخطيطي، سأقول فقط أنه يمكنك الاختيار من بين الرسومات الجاهزة، حيث يتم التحكم في الجهاز من جهاز كمبيوتر عبر منفذ sireal. لقد استخدمت هذا واحد

رسم

كثافة العمليات فال؛
كثافة العمليات IN1 = 4؛
كثافة العمليات IN2 = 7؛
كثافة العمليات EN1 = 6؛
كثافة العمليات EN2 = 5؛

الإعداد باطل()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(EN1, OUTPUT);
pinMode(EN2, OUTPUT);

}
حلقة فارغة()
{
إذا (Serial.available ())
{
فال = Serial.read();

// ضبط الحركة إلى الأمام
إذا (val == "W") // عند الضغط على المفتاح "W".
{
// يتم تكوين الدبابيس وفقًا لتشغيل Motor Shield
// المحركات تدور للأمام
الكتابة الرقمية (EN1، عالية)؛
الكتابة الرقمية (EN2، عالية)؛
الكتابة الرقمية (IN1، عالية)؛
الكتابة الرقمية (IN2، عالية)؛
}

// اضبط الحركة للخلف
إذا (فال == "S")
{
الكتابة الرقمية (EN1، عالية)؛
الكتابة الرقمية (EN2، عالية)؛
الكتابة الرقمية (IN1، LOW)؛
الكتابة الرقمية (IN2، LOW)؛
}

// اضبط الحركة على اليمين
إذا (فال == "د")
{
الكتابة الرقمية (EN1، عالية)؛
الكتابة الرقمية (EN2، عالية)؛
الكتابة الرقمية (IN1، عالية)؛
الكتابة الرقمية (IN2، LOW)؛
}

// اضبط الحركة على اليسار
إذا (فال == "أ")
{
الكتابة الرقمية (EN1، عالية)؛
الكتابة الرقمية (EN2، عالية)؛
الكتابة الرقمية (IN1، LOW)؛
الكتابة الرقمية (IN2، عالية)؛
}

// وضع التوقف
// عند تحرير المفاتيح في البرنامج، يتم إرسال "T" إلى المنفذ
إذا (val == "T") // عند الضغط على المفتاح "T".
{
// يتم سحب دبابيس التمكين إلى ناقص، والمحركات لا تعمل
الكتابة الرقمية (EN1، LOW)؛
الكتابة الرقمية (EN2، LOW)؛
}
}
}


إذن هذا هو الجهاز الذي حصلت عليه:

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

ملاحظة. بالنسبة لأولئك الذين لم يواجهوا تطوير التطبيقات في App Inventor 2، فقد قمت بإعداد دليل أكثر تفصيلاً حول تطوير هذا التطبيق (تحتاج إلى الذهاب إلى YouTube لمشاهدته).

P.S. مجموعة من أكثر من 100 مادة تعليمية عن الاردوينو للمبتدئين والمحترفين