مرحبا بالجميع! هناك اعتقاد خاطئ على الإنترنت بأنه للتحكم في جهاز الكمبيوتر باستخدام الإلكترونيات المنزلية ، هناك حاجة فقط إلى لوحات خاصة يمكن التعرف عليها كأجهزة USB HID. وفيما يتعلق ب Arduino ، الجميع يتحدث فقط عن
Arduino Leanardo . والمكتبات الشائعة مثل
لوحة المفاتيح والماوس ، والتي تسمح لك بإنشاء مضاهاة للماوس أو لوحة المفاتيح باستخدام متحكم ، مخصصة فقط لزوج من لوحات Arduino ، Leonardo ، من بينها.
سأتحدث عن كيفية توصيل أي متحكم Arduino (على سبيل المثال ،
Arduino Uno ) وبرنامج المعالجة الخاص به. بعد أن أضفت إلى كل شيء آخر معرفة Java ، التي تعتمد عليها المعالجة ، سيكون من الممكن إضافة مشروع تحت سيطرة الكمبيوتر بأكمله ، وليس فقط تطبيقه الخاص. موضوع التحكم في برنامج كمبيوتر في Java ليس شيئًا سريًا ، google وستجد كل شيء ، أؤكد لك.
تنزيل بيئة التطوير (IDE)
هناك العديد من بيئات التطوير المتكاملة لبرمجة ميكروكنترولر في C. النقي من هذه ، يمكن ملاحظة الأكثر ملاءمة: Atollic ، Eclipse ، Keil.
ومع ذلك ، من أجل بساطة هذا الدليل وإمكانية الوصول إليه ، سأستخدم محرر Arduino IDE وأكتب في Arduino C. يمكنك تنزيل هذا المحرر من
موقع Arduino الرسمي .
يمكن أيضًا تنزيل بيئة التطوير للبرمجة على Procrssing من
الموقع الرسمي .
تجدر الإشارة ، من أجل الحشمة ، أن بيانات IDE متشابهة للغاية ، لأنها مكتوبة على نفس المحرك. وعندما تم إنشاء Arduino ، حاول المؤسسون تبسيط محرر الكود الخاص بهم قدر الإمكان ، كما حدث في محرر المعالجة.
اردوينو. نحن تجميع الدوائر وكتابة الرمز
في هذا المثال ، سأستخدم Arduino Uno. سيتم توصيل زر ، مقياس قوة و LED. وفقًا لذلك ، يمكنني إخراج منطقي 0 أو 1. قراءة منطقية 0 أو 1. وإجراء
تحويل رقمي تناظري (ADC أو ADC) ، والحصول على أرقام من 0 إلى 1023 (في Arduino Uno 10 بت من ADC) ، اعتمادًا على موضع مقياس الجهد. لا تحتاج أكثر من ذلك على سبيل المثال ، لأن هذه هي الوظائف الرئيسية التي يمكن أن يقوم بها المتحكم الدقيق.
مخطط الأسلاك:

في الرسم التخطيطي ، يتم توصيل الصمام الأنود إلى 5V من خلال المقاوم الحد (على الأقل 220 أوم ، ويفضل 500 أوم) ، من خلال الكاثود دبوس D11. يغلق الزر الأرض ويعلقون D2. التغييرات الجهد المحتملة على دبوس A1.
تتمثل مهمة المتحكم الدقيق كما يلي: إذا وصلت الرسالة "LED - H" على الواجهة التسلسلية (منفذ COM التسلسلي) - قم بإضاءة مؤشر LED. إذا وصلت الرسالة "LED - L" ، أطفأ LED. كل 250 مللي ثانية ترسل رسالة إلى المنفذ التسلسلي (في هذه الحالة ، إلى شاشة الكمبيوتر) الرسالة "Pot -" والرقم الذي تم استلامه عن طريق القراءة التمثيلية للرقم A1. عند الضغط على زر ، أرسل رسالة "يتم الضغط على زر!" مرة واحدة.
إليكم اقتراحي لحل هذه المشكلة (وليس مثالًا يجب اتباعه):
البرامج الثابتة لاردوينو أونو #define pinPot A1 #define pinLed 11 #define pinBtn 2 void setup() { pinMode(pinPot, INPUT); pinMode(pinLed, OUTPUT); pinMode(pinBtn, INPUT_PULLUP); Serial.begin(9600); Serial.println("The program starts.\n\n"); } void loop() { /* INITIAL VARIABLES. Segment 1 */ static char potMes[] = "Pot - "; static char btnMes[] = "Button is pressed!"; static char passLight[] = "Led - "; static int passLength = sizeof(passLight) - 1; static int sizepm = sizeof(potMes) - 1; static int sizebtn = sizeof(btnMes) - 1; static bool flagLedState = LOW; static bool flagBtnPress = false; static long int curTime = 0; static const int period = 200; static bool flagEnableRead = false; /* INITIAL VARIABLES. Segment 1 */ /* FUNCTIONS CALL. Segment 2 */ /* * Led is attached to HIGH voltage from one side * And to pin on the other side * By that the inverting logic */ ReadSerialForLed(passLight, passLength, &flagLedState); digitalWrite(pinLed, !flagLedState); /* * Button pin always is pulled to the HIGH voltage * And only when button is pressed - Voltage on pin goes to GROUND * So it is need to invert logic when read pins */ if(!Bounce(pinBtn) && flagBtnPress == false){ for(int i = 0; i < sizebtn; i++){ Serial.write(btnMes[i]); } Serial.print("\n"); flagBtnPress = true; if(!flagEnableRead){ curTime = millis(); flagEnableRead = true; } }else if(Bounce(pinBtn)){ flagBtnPress = false; } /* * Read and send Info "Pot - " + var Only after first press on button * Every 'period'ms */ if(millis() - curTime > period && flagEnableRead){ SendData(pinPot, potMes, sizepm); curTime = millis(); } /* FUNCTIONS CALL. Segment 2 */ } /* * Pot - pin with potentiometer * pMes - Array with message before Pot value * sp - size of potentiometer message */ void SendData(int Pot, char* pMes, int sp){ static int varP[2]; varP[0] = analogRead(Pot); varP[1] = varP[0]/256; // 0 - 3 (256 - 1024) varP[0] = varP[0]%256; // 0 - 255 //Send Message for(int i = 0; i < sp; i++){ Serial.write(char(pMes[i])); } //Send 2 bits of data //Serial.write(varP[0]); //Serial.write(varP[1]); Serial.print(analogRead(Pot)); Serial.print("\n"); } /* * Function, which is reads button pin with the bounce */ bool Bounce(int btn){ if(digitalRead(btn) == true){ delay(15); if(digitalRead(btn) == true){ return true; }else{ return false; } }else{ return false; } } /* * If Message from Serial port, which you read will be the same to passLight * So look at the next symbol after Pass Message. If it is symbol 'H' - make LED to light * If it is 'L' - make LED off. */ void ReadSerialForLed(char *passLight_f, int passLength_f, bool* flagLedState_f){ static char sym; static int cntPass = 0; static bool readyGetLed = LOW; while (Serial.available() > 0) { sym = Serial.read(); if(sym == passLight_f[cntPass] && !readyGetLed){ cntPass++; }else if (!readyGetLed){ cntPass = 0; }else if(readyGetLed){ if(sym == 'H'){ *flagLedState_f = HIGH; }else if(sym == 'L'){ *flagLedState_f = LOW; } } if(cntPass == passLength_f){ readyGetLed = HIGH; } } }
تعليق: يتم توصيل الصمام لامدادات الطاقة عن طريق الأنود. هذا عكس منطق حالة الصمام ولم تعد الفوائد. لا يتم ربط الزر بمقاوم سحب لأعلى لأسباب تتعلق بالاقتصاد ، حيث يحتوي Arduino Uno على مقاومات سحب مدمجة مضمّنة في الدائرة عند تهيئة السنج لوضع INPUT_PULLUP.
أيضًا في البرامج الثابتة ، يتم إرسال رسائل حول القيمة المأخوذة من مقياس الجهد فقط بعد الضغط لأول مرة على زر!لملء البرامج الثابتة في اللوحة ، لا تنس تحديد المنفذ واللوحة.

إذا كنت لا تعرف أي منفذ COM لديك من أجل لوحة Arduino ، ثم على Windows ، انتقل إلى
لوحة التحكم -> إدارة الأجهزة وانقر فوق علامة التبويب "منافذ COM"

إذا لم يكن منفذ COM موقّعًا على أنه منفذ لي ، فيمكنك دائمًا فصل Arduino ومعرفة أي منفذ ذهب. ولكن إذا لم يختف أحد ولم يتعرف الكمبيوتر على Arduin على الإطلاق ، فقد حان الوقت للبحث عن حل على الإنترنت. لكن ابدأ بتحديث برامج التشغيل أو تغيير اللوحة.
عندما يعمل كل شيء ، حاول فتح شاشة المنفذ وإدخال "Led-H" و "Led-L" ، واضغط على الزر ، وقم بإدارة مقياس الجهد وانظر إلى الشاشة لمعرفة ما إذا كان كل شيء معروضاً بشكل صحيح.
لعبت بما فيه الكفاية - تغيير طفيف الرمز.
استبدل السطر الأخير بالكود من التعليق.
الآن لن تبدو القيم من الجهد قابلة للقراءة ، ولكن هذه المناورة مطلوبة لبرنامج المعالجة.
تجهيز. نكتب البرنامج الذي يتفاعل مع متحكم
إن جوهر التواصل بين برنامج المعالجة و متحكم بسيط للغاية. هناك مكتبة تسلسلية لهذه اللغة البرمجة ، والتي تتيح لك تلقي الرسائل المرسلة كـ
Serial.write();
ويتيح لك أيضًا إرسال رسائل كـ
Serial.print();
. من المهم الإشارة إلى أنه مع إرسال هذه الرسالة ، سيتم كتابتها إلى المخزن المؤقت للمنفذ ، مما يعني أنه سيتم قراءتها بواسطة المتحكم الدقيق. لذلك علينا فقط الاتصال بالمنفذ التسلسلي المطلوب واستقبال / إرسال الرسائل إليه.
سيقوم البرنامج التالي بتوصيل المكتبة التسلسلية وكتابة في وحدة تحكم المحرر قائمة بجميع منافذ COM التي يمكنك الاتصال بها.
import processing.serial.*; void setup() { String[] port = Serial.list(); for(int i = 0; i < port.length; i++){ print("Port number #" + i + " "); println(Serial.list()[0]); } } void draw() {}
عند كتابة الرمز إلى المحرر والنقر فوق الزر "ابدأ" (السهم 1 في الصورة) ، ستظهر نافذة التطبيق (2) وستظهر قائمة منافذ COM في وحدة التحكم (3).

لدي واحد فقط مثل منفذ COM وفي الورقة ، كما في الصفيف ، سيكون في رقم 0. لهذه الأسباب ، وجوه الفئة
Serial port;
:
Serial port;
عند إنشائه ، سيتم تحديد العنصر الأول من منفذ قائمة
port = new Serial(this, Serial.list()[0], 9600);
صب في اردوين أحدث البرامج الثابتة لدينا مع التغيير. ثم اكتب هذا البرنامج وقم بتشغيله. في كل 500 ميلي ثانية يتم إرسال رسالة إلى منفذ COM لإطفاء أو إضاءة المصباح. وإذا تم كل شيء بشكل صحيح ، ثم بعد بدء تشغيل التطبيق يجب أن تومض LED.
import processing.serial.*; Serial port;
أو هنا مثال آخر. سيغير المصباح حالته بعد أي نقرة على نافذة التطبيق (تبلغ أبعادها 800 × 800 بكسل) باستخدام زر الماوس.
import processing.serial.*; Serial port;
تجهيز. ميزة مثال غني التطبيق
يحاكي هذا التطبيق الأولي "رحلة في الفضاء" ، إذا كان يمكنك تسمية ذلك. القيمة من الجهد تغير سرعة الطيران ، والضغط على الزر يغير اتجاه الرحلة. وأي نقرة على زر الماوس في نافذة التطبيق تغير حالة المصباح (نعم ، لم أتوصل إلى شيء أصلي).
الكود الخاص بي بعيد عن الكمال ، لا تعتبره مثالًا جيدًا. هذا مجرد مثال يعمل. ها هو ذا.
مثال برنامج متعدد الوظائف import processing.serial.*; Serial port;
استنتاج
أعتقد أنه من الضروري أن أكتب أنني التقطت فكرة البرنامج الأخير من أحد المبرمجين -
دانيال شيفمان ، الذي يصور مقاطع فيديو مفهومة حتى للأطفال حول البرمجة حول المعالجة (
تم حل أكثر من 140 مهمة مرئية ).
عندما حاولت معرفة ما وكيف أقوم بإجراء اتصالات المعالجة و Arduino بنفسي ، ساعدتني هذه المواقع حقًا:
- developer.alexanderklimov.ru/arduino/processing.php
- arduino-diy.com/arduino-processing-osnovi