توصيل لوحة المفاتيح بالاردوينو اونو إضافة طريقة إدخال إلى اردوينو

03.05.2019

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

لوحات المفاتيح الأكثر استخدامًا في Arduino هي:

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

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

نقوم بتوصيل لوحة المفاتيح بأي منافذ إدخال / إخراج.

سنرسل الإشارات إلى المنافذ الحمراء، ونستقبلها من المنافذ الزرقاء. في كثير من الأحيان يتم توصيل مقاومات السحب بالأسلاك الزرقاء، لكننا سنقوم بتوصيلها داخل متحكم Arduino.

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

Int PinOut(5, 4, 3, 2); // مخرجات الدبابيس int PinIn (9، 8، 7، 6)؛ // دبابيس الإدخال int val = 0; قيمة الحرف الثابت ( ("1"، "4"، "7"، "*")، ("2"، "5"، "8"، "0")، ("3"، "6"، " 9"، "#")، ("أ"، "ب"، "ج"، "د"))؛ // مصفوفة مزدوجة تشير إلى الزر int b = 0; // المتغير حيث يتم وضع رقم من المصفوفة (رقم الزر) الإعداد الفارغ () (pinMode (2، OUTPUT)؛ // تهيئة منافذ الإخراج (توريد الأصفار إلى الأعمدة) pinMode (3، OUTPUT)؛ pinMode (4) ، OUTPUT) ؛ pinMode (5، OUTPUT)؛ pinMode (6، INPUT)؛ ؛ الكتابة الرقمية (8، عالية)؛ الكتابة الرقمية (9، عالية)؛ // فتح المنفذ التسلسلي) مصفوفة باطلة () // إنشاء وظيفة لأزرار القراءة (لـ (int i = 1؛ i<= 4; i++) // цикл, передающий 0 по всем столбцам { digitalWrite(PinOut, LOW); // если i меньше 4 , то отправляем 0 на ножку for (int j = 1; j <= 4; j++) // цикл, принимающих 0 по строкам { if (digitalRead(PinIn) == LOW) // если один из указанных портов входа равен 0, то.. { Serial.println(value); // то b равно значению из двойного массива delay(175); } } digitalWrite(PinOut, HIGH); // подаём обратно высокий уровень } } void loop() { matrix(); // используем функцию опроса матричной клавиатуры }

باستخدام المكتبة، يتم تبسيط قراءة البيانات من لوحة المفاتيح الرقمية.

#يشمل صفوف البايت الثابتة = 4 ؛ بايت ثابت COLS = 3؛ مفاتيح الحرف = (("1"، "2"، "3")، ("4"، "5"، "6")، ("7"، "8"، "9")، ("#" "0"،"*"))؛ دبابيس صف البايت = (5، 4، 3، 2)؛ بايت colPins = (8، 7، 6)؛ Keypad keypad = Keypad(makeKeymap(keys),rowPins, colPins, ROWS, COLS); إعداد باطلة())( Serial.begin(9600); ) حلقة باطلة())( مفتاح char = keypad.getKey(); إذا (مفتاح != NO_KEY)( Serial.println(key); ) )

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


في الواقع لوحة مفاتيح مصفوفة.


مخطط.


كل شيء بسيط للغاية. إذا لم يتم الضغط على أي زر، فلن يكون هناك اتصال بين الخطوط العمودية (1، 2، 3، 4) والخطوط الأفقية (5، 6، 7، 8). يؤدي الضغط على الزر إلى حدوث تماس بين أحد الخطوط العمودية (1، 2، 3، 4) وأحد الخطوط الأفقية (5، 6، 7، 8). على سبيل المثال، يؤدي الضغط على الزر S1 إلى حدوث اتصال بين الخطين 4 و5.


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

كيفية استخدام لوحة المفاتيح هذه؟ أول فكرة تتبادر إلى ذهنك هي تكوين أطراف Arduino التي تتصل بها الخطوط 1 و 2 و 3 و 4 كمدخل مع تشغيل مقاومة السحب. وقم بتكوين منافذ Arduino التي تتصل بها الخطوط 5 و 6 و 7 و 8 كمخرجات وقم بتعيين صفر منطقي عليها. أثناء عدم الضغط على أي من الأزرار، فإن أطراف Arduino المرتبطة بالخطوط 1 و2 و3 و4 سيكون لها طرف منطقي. إذا تم الضغط على الزر، سيتم تعيين صفر منطقي عند أحد أطراف Arduino المتصلة بالخط 1 أو 2 أو 3 أو 4. لكن أيًا من هذه الخطوط يرتبط بأربعة أزرار في وقت واحد. لمعرفة الزر المحدد الذي تم الضغط عليه، تحتاج إلى تغيير الإعدادات. يجب تكوين منافذ Arduino التي تتصل بها الخطوط 1 و 2 و 3 و 4 كمخرج ويجب تعيين الصفر المنطقي عليها. ويجب تكوين منافذ Arduino التي تتصل بها الخطوط 5 و 6 و 7 و 8 كمدخل مع تشغيل مقاومة السحب. الآن سيكون الصفر المنطقي على أحد أطراف Arduino المتصلة بالخط 5 أو 6 أو 7 أو 8. كما يتم توصيل أربعة أزرار أيضًا بكل من هذه الخطوط مرة واحدة. ومع ذلك، يحتوي كل سطر 5 و6 و7 و8 على زر واحد فقط مشترك مع كل سطر 1 و2 و3 و4. يقع الزر الذي يتم الضغط عليه عند تقاطع الأسطر التي تتم عندها قراءة الصفر المنطقي. خيارات الإعدادات الأولى والثانية.

من أجل الوضوح، سأصف كيف سيعمل كل هذا عند الضغط على الزر S2. يتم تكوين منافذ Arduino التي تتصل بها الخطوط 1 و 2 و 3 و 4 كمدخل مع تمكين مقاومة السحب. يتم تكوين منافذ Arduino التي تتصل بها الخطوط 5 و 6 و 7 و 8 كمخرج ويتم تعيين صفر منطقي عليها. ستتم قراءة قراءة منطقية عند أطراف Arduino المتصلة بالخطوط 1 و 2 و 4. ستتم قراءة الصفر المنطقي عند طرف Arduino المتصل بالسطر 3. يمكن القيام بذلك عن طريق الضغط على أحد الأزرار S2 وS6 وS10 وS14. الآن تتغير الإعدادات. يتم تكوين منافذ Arduino التي تتصل بها الخطوط 1 و 2 و 3 و 4 كمخرج ويتم تعيين الصفر المنطقي عليها. يتم تكوين منافذ Arduino التي تتصل بها الخطوط 5 و6 و7 و8 كمدخل مع تمكين مقاومة السحب. ستتم قراءة قراءة منطقية عند أطراف Arduino المتصلة بالخطوط 6 و 7 و 8. ستتم قراءة الصفر المنطقي عند طرف Arduino المتصل بالخط 5. يكون ذلك ممكنًا بالضغط على أحد الأزرار S1 أو S2 أو S3 أو S4. يحتوي الخطان 3 و5 على زر مشترك واحد فقط. هذا هو الزر S2. الزر المضغوط موجود عند تقاطع الخطين 3 و 5.

برنامج.

/////////////////////// // اردوينو أونو // ////////////////// / ///// // // رسم: لوحة مفاتيح المصفوفة // // لوحة المفاتيح --- Arduino Uno // // 1 --- D11 // 2 --- D10 // 3 --- D9 // 4 - -- D8 // 5 --- A0 (D14) // 6 --- A1 (D15) // 7 --- A2 (D16) // 8 --- A3 (D17) #include الإعداد الفارغ () ( DDRB = 0b00000000؛ PORTB = 0b00000000؛ DDRC = 0b00000000؛ PORTC = 0b00000000؛ DDRD = 0b00000000؛ PORTD = 0b00000000؛ Serial.begin(9600);) حلقة باطلة() (حرف غير موقع x = 4، ص = 4; DDRB = 0b00000000; PORTB = 0b00001111; // انتظر 10 لنا DDRC = 0b00000000; x = 1; if ((PINB & 0b00000100) == 2; PORTC = 0b00001111; ((PINC & 0b00000010) == 0) y = 1; if ((PINC & 0b00000100) == 0) y = 2; if ((PINC & 0b00001000) == 3; Serial.println(((y*4)+x+1)); _delay_ms(1000); // انتظر 1000 مللي ثانية) // // النهاية // ///////// /////////
يمكن ملاحظة نتيجة البرنامج في شاشة منفذ Arduino IDE.


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

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

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

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

ما هي لوحة المفاتيح المصفوفة؟

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

ولهذا السبب توصلنا إلى لوحة المفاتيح هذه لتسهيل توصيل المزيد من الأزرار. توجد مثل هذه الأجهزة في كل مكان - في لوحات مفاتيح الكمبيوتر والآلات الحاسبة وما إلى ذلك.

يجب أن تكون متصلة باللوحة بواسطة 8 منافذ، كل منها يقرأ القيم من صفوف وأعمدة معينة. يجب أن تكون متصلة بالدبابيس الموجودة على اللوحة الرقمية. سأقوم بالاتصال، على سبيل المثال، بالدبابيس من 2 إلى 9 ضمنًا. ليس من المستحسن لمس الصفر والأول، حيث أنهما مخصصان لواجهة UART (على سبيل المثال، لتوصيل وحدة Bluetooth). ومن الأكثر عقلانية أن نتركهم أحرارا.

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

بعد تثبيته في المكتبة، يمكنك الذهاب إلى Arduino IDE (برنامج من موقع Arduino) وإلقاء نظرة على أمثلة للرسومات.

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

#يشمل // قم بتوصيل مكتبتنا




{"2","5","8","0"},
{"3","6","9","#"},
("ا ب ت ث")
};




الإعداد باطل())(
Serial.begin(9600);
}
حلقة فارغة()

إذا (مفتاح مخصص)(
Serial.println(customKey);
}
}

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

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

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

الدائرة مع العرض ولوحة المفاتيح المصفوفة

دعونا نعرض البيانات.

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

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

#يشمل // قم بتوصيل مكتبتنا
#يشمل
LiquidCrystal_I2C شاشات الكريستال السائل (0x27، 16، 2)؛
صفوف البايت الثابتة = 4 ؛ // عدد الأسطر على لوحة المفاتيح لدينا
بايت ثابت COLS = 4؛ // عدد الأعمدة للوحة المفاتيح لدينا
مفاتيح شار السداسية = (
("S"، "4"، "7"، "*")، // هنا نضع أسماء مفاتيحنا، كما هو الحال على لوحة المفاتيح، لسهولة الاستخدام
("O"، "5"، "8"، "0")،
("S"، "6"، "9"، "#")،
("أنا"، "ب"، "ج"، "د")
};
دبابيس صف البايت = (5، 4، 3، 2)؛ // بأي دبابيس نربط التحكم في الخط
بايت colPins = (9، 8، 7، 6)؛ // بأي دبابيس نربط التحكم في العمود
// تهيئة مثيل للفئة NewKeypad
Keypad customKeypad = Keypad(makeKeymap(hexaKeys),rowPins, colPins, ROWS, COLS);
الإعداد باطل())(
Serial.begin(9600);
شاشات الكريستال السائل. تبدأ ()؛ // تهيئة الشاشة
اضاءه خلفيه ال سى دى()؛
}
حلقة فارغة()
char customKey = customKeypad.getKey();
إذا (مفتاح مخصص)(
Serial.println(customKey);
شاشات الكريستال السائل.setCursor(1,4); // اضبط المؤشر
شاشة LCD.print(customKey);
}
}

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

وبما أن الشاشة تعمل عبر واجهة I2C، فإننا نقوم بتوصيلها بالمنافذ التناظرية. نقوم بتوصيل مخرجات SDA وSCL بـ A4 وA5، على التوالي، والمخرجان المتبقيان هما بالفعل الطاقة والأرض.

كما ترون، من خلال النقر على أي رمز، نرى عرضه على الشاشة.

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

ربط لوحة المفاتيح بالاردوينو والتحكم في العمل

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

دعنا نحاول تشغيل أو إيقاف تشغيل مؤشر LED عند الضغط على مفتاح معين. إضافته إلى الرسم البياني.

اتصال الصمام

سأستخدم اللوح والمقاوم (ويفضل أن يكون بين 150 و 220 أوم). سوف أقوم بإغلاق الدائرة باستخدام وصلتين، وربطهما بمنافذ الطاقة والأرضية الموجودة على لوحة Arduino.

ستعمل الدائرة على النحو التالي: عندما تضغط على الرقم 1، يضيء مؤشر LED، وعندما تضغط على الرقم 2، ينطفئ.

يتم توصيل مؤشر LED الموجود في المثال بالطرف 8 الموجود على لوحة Arduino.

#يشمل
صفوف البايت الثابتة = 4 ؛ // أربعة صفوف
بايت ثابت COLS = 4؛ // ثلاثة أعمدة
مفاتيح char = (// تحديد Keymap
("1"، "4"، "7"، "*")، // هنا نضع أسماء مفاتيحنا، كما هو الحال على لوحة المفاتيح، لسهولة الاستخدام
{"2","5","8","0"},
{"3","6","9","#"},
("ا ب ت ث")
};
byte RowPins = ( 5, 4, 3, 2 ); // قم بتوصيل لوحة المفاتيح ROW0 و ROW1 و ROW2 و ROW3 إلى أطراف Arduino هذه.
بايت colPins = (9, 8, 7,6); // قم بتوصيل لوحة المفاتيح COL0 وCOL1 وCOL2 بمنفذي Arduino.
Keypad kpd = Keypad(makeKeymap(keys),rowPins, colPins, ROWS, COLS);
#تعريف ليدبين 8
الإعداد باطل()
{
pinMode(ledpin,OUTPUT);
Serial.begin(9600);
}
حلقة فارغة()
{
مفتاح الحرف = kpd.getKey();
إذا (مفتاح) // التحقق من وجود مفتاح صالح.
{
التبديل (المفتاح)
{
حالة 1":
الكتابة الرقمية (ledpin، HIGH)؛
استراحة؛
الحالة "2":
الكتابة الرقمية (ledpin، LOW)؛
استراحة؛
}
}
}

دعونا نلقي نظرة على الرسم.

لنأخذ الرسم الأول للدرس ونضيف إليه ببساطة. في البداية مع وظيفة مفيدة يُعرِّفقم بتعيين اسم لمصباح LED المتصل بالدبوس 8 com.ledpin. فى مهمة الإعداد باطلحدد الإشارة من LED كمخرج.

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

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

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

الجزء الأول – نظري

هناك عدة طرق لتوصيل لوحة المفاتيح بالاردوينو:
  • لوحات مفاتيح المصفوفة العادية التي تتصل مباشرة بالمنافذ (البرنامج التعليمي للوحة المفاتيح). العيب - يستهلك الكثير من منافذ الإدخال والإخراج ويحتوي على عدد قليل من الأزرار.
  • لوحات مفاتيح مصفوفية متصلة عبر I2C (موسع منفذ I2C ولوحات المفاتيح). المزايا - يستغرق الأمر منفذين فقط، ويسمح لك باستخدام عدة أجهزة على نفس الناقل. العيوب - تحتاج إلى تضمين مكتبة للعمل مع I2C في المشروع، وعدد قليل من الأزرار
  • لوحة مفاتيح PS/2 عادية (لوحة مفاتيح PS2). المزايا - قاعدة أجهزة كبيرة، والعديد من الأزرار لكل ذوق، وتشغل عددًا قليلاً من المسامير. العيوب - تحتاج إلى مكتبة لتحويل رموز المسح الضوئي والحجم - لا تختلف لوحات المفاتيح PS/2 في أحجام الأجهزة المحمولة
بعد أن رفضت كل هذه الأساليب بسبب قلة عدد الأزرار أو حجمها الكبير، تذكرت أنه كان لدي لوحة مفاتيح مصغرة للهاتف الخليوي في الميزانين الخاص بي لمدة عشر سنوات - Ericsson Chatboard:


تم تصميم هذا الطراز بالتحديد CHA-01 بقوة 5 فولت ويبدو أنه هاتف... مودم!
يوجد أيضًا طراز CHA-10، والذي يُستخدم مع الهواتف الأحدث (إذا كان بإمكانك قول ذلك بالنسبة للأجهزة التي يتراوح عمرها بين خمس إلى سبع سنوات) ويعمل بجهد 3.3 فولت. من السهل شراء كلا الطرازين على موقع EBay مقابل 12 دولارًا تقريبًا مع الشحن.

يمكنك قصر نفسك على نسخة غير معدلة من لوحة المفاتيح. ابحث عن موصل من هاتف قديم للاتصال. قم بتطوير مكتبة يمكنها تحليل إدخال لوحة المفاتيح والاستمتاع بالحياة.
ومع ذلك، لن تتمكن من الابتهاج لفترة طويلة - فالبروتوكول به حمل كبير (الضغط على المفتاح 0 يؤدي، على سبيل المثال، "AT*EKSE=0"، وwww - "AT*EAPP=0.5,"WWW: "، "WWW") وتمكين الإدخال فقط بعد الضغط على زر الرسائل القصيرة لا يوفر سهولة الاستخدام.

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

الجزء الثاني - عملي

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


في الداخل، لوحة المفاتيح عبارة عن لوحة مفاتيح مصفوفية قياسية مقاس 7 × 7 وتشغل 14 دبوسًا لوحدة التحكم الدقيقة. يتم توفير المعلومات خارجيًا عبر UART.

باستخدام المعلومات المقدمة كأساس، نقوم ببناء خطة التحول:
- استبدال المتحكم الدقيق بـ mega162 (3 دولارات في السوق)
- استبدل الموصل بموصل "مشترك".
- إضافة القدرة على تغيير البرنامج وقتما تشاء (لحسن الحظ، يمكن القيام بذلك عبر أداة تحميل التشغيل)
- إعداد بيئة تطوير متكاملة (IDE) عادية للعمل مع AVR/Arduino (للتخلص من مكتبات C++/غير الضرورية)
- كتابة برنامج بسيط لاختبار الوظيفة (التحقق من إعدادات IDE والتعرف على لغة C لـ AVR)

مسلحين بمحطة لحام، نقوم بإزالة المكونات غير الضرورية:

يمكن العثور على دبوس الموصل الأصلي لـ CHA-01:

1.5 - فولت سي +5 فولت
2 - خروج تسلسلي للدردشة
3 - جي إن دي
4 - لوحة الدردشة التسلسلية في

نحن نلحم قطع الغيار لدينا:

على عكس مؤلف المقال أعلاه، اخترت خط PBS-08 القياسي كموصل - فهو يتناسب تمامًا مع العلبة بدون ملف بل ويتناسب مع الأماكن الصحيحة على اللوحة. وقررت عدم التبديل إلى مرنان خارجي.
تم إخراج RX وTX وGND وVcc وMOSI وMISO وSCK وRST إلى الموصل. وبهذه الطريقة سنتمكن من إعادة برمجة الجهاز في المستقبل دون إزالته من العلبة.
يبدو أن كل شيء جاهز ويمكن توصيله بالمبرمج (لقد استخدمت USBASP، لكن يمكنك أيضًا استخدام Arduino لبرمجة أجهزة AVR أخرى - ArduinoISP)


لكن avrdude يرفض تمامًا رؤية المتحكم الدقيق. نظرًا لأنه لم يكن لدي أي خبرة في مثل هذه التعديلات من قبل، فقد اضطررت إلى اللجوء إلى رفاق أكثر خبرة للتشخيص. بدأت المدفعية الثقيلة مع راسم الذبذبات والمولد في العمل. وبعد بعض القتال تم إرسالي... RTFM.
اتضح أن USBASP يعمل مع وحدات التحكم الدقيقة السريعة (أكثر من 4 ميجاهرتز)، ويتضمن Mega162 بشكل افتراضي "مقسم على 8" ويعمل من مذبذب داخلي بتردد 1 ميجاهرتز. نظرًا لأن تردد 1 ميجاهرتز أكثر من كافٍ للوحة المفاتيح (والاستهلاك أقل)، فقد قررت عدم تغييره بل البحث عن طريقة للخروج من الموقف. تم العثور على حل بسرعة كبيرة - يحتوي USBASP على وصلة عبور تقلل من "تردد الاتصال" مع وحدة التحكم الدقيقة (أو هناك خيار -B من avrdude، والذي يقوم بذلك برمجيًا، وقد ساعدني -B 3).

الآن بعد أن رأى avrdude البلورة، يبدو أنه يجب علينا إعادة تحميلها ونسيانها :) لكن تجربة RTFM الأولى أهدأتني قليلاً وقررت تشغيل البرنامج أولاً على محاكي (كما اتضح فيما بعد، ليس بلا فائدة). لهذا الغرض، تم تجميع دائرة لوحة المفاتيح على بروتيوس من الرفاق ذوي الخبرة. وتمت كتابة برنامج ثابت يقوم باستقصاء لوحة المفاتيح وعرض الحرف المطلوب في UART. وهكذا، يتم تجميع كل شيء، وتحميله في المحاكي، ويتم ضبط معلمات المحطة الافتراضية على 9600.8n1. ولكن لسبب ما تظهر المحطة القمامة عندما أضغط على المفتاح. أظهر وضع تصحيح USART في المحاكي أن سعر الصرف مضبوط على 10200 وليس 9600... مرة أخرى RTFM - يعتمد معدل الباود على تردد البلورة وعند 1 ميجاهرتز، يتيح لك الإعداد القياسي تحقيق سرعة 4800 ( بخطأ 0.2٪) بينما بسرعة 9600 يكون الخطأ 7٪ بالفعل! تعرض ورقة البيانات أيضًا جدول الأخطاء لمختلف معدل الباود/ميجاهيرتز - والذي يوضح أنه عند تردد 1 ميجاهرتز، يمكنك تحقيق خطأ بنسبة 0.2% فقط عن طريق ضبط معدل USART المزدوج. في C يبدو مثل هذا:
#define F_CPU 1000000UL #define BAUD_RATE 9600UL // Init serial UBRR0L = (uint8_t)(F_CPU/(BAUD_RATE*8L)-1); UBRR0H = ((F_CPU/(BAUD_RATE*8L)-1) >> 8); UCSR0A = _BV(U2X0); // ضبط السرعة المزدوجة لوحدة المعالجة المركزية ذات التكرار المنخفض UCSR0B = _BV(TXEN0)|_BV(RXEN0); // تمكين TX، تمكين RX UCSR0C = _BV(URSEL0)|_BV(UCSZ00)|_BV(UCSZ01); // 8n1 غير متزامن
حسنًا، يعمل الكود الخاص بنا بشكل رائع في المحاكي - فهو يعرض جميع ضغطات المفاتيح، ومقابض الضغط على Shift، وما إلى ذلك.

دعنا ننتقل إلى تحميل البرنامج على لوحة المفاتيح. لقد أخذت أداة تحميل التشغيل من الرابط الأول (stk500boot.zip). نظرًا لأنه يعمل أيضًا عبر USART، فقد قمت بتغيير التهيئة والسرعة إلى 9600 في الكود المصدري.
يتم تحميل أداة تحميل التشغيل عبر USBASP باستخدام الأمر التالي:
avrdude -c usbasp -p m162 -B 3 -U flash:w:stk500boot.hex:i -U hfuse:w:0x98:m

يعد تغيير hfuse ضروريًا لتغيير ناقل إعادة التعيين - بحيث يبدأ وحدة التحكم الدقيقة في التحميل من أداة تحميل التشغيل.
يمكن إجراء المزيد من الاتصال بلوحة المفاتيح عبر UART، ولا نحتاج إلى USBASP.
لقد اخترت محول USB-UART (تسلسلي) يعتمد على FTDI - نظرًا لأن Arduino نفسه مبني على نفس الشريحة، لذلك لدي بالفعل برامج تشغيل في نظامي.

بالصدفة، كان موصل المحول ولوحة المفاتيح متطابقين تمامًا، لذلك قمت بتوصيله مباشرة:

على الرغم من التصريح بأن أداة تحميل التشغيل هذه متوافقة مع STK500 - لم يرغب avrdude في العمل معها من خلال نوع المبرمج stk500v1 - فقد أقسم أن معرف الجهاز غير صحيح. كان واضحًا من الكود المصدري أن أداة تحميل التشغيل يمكنها قراءة معرف الجهاز وإعادته، لذا وجدت بالقوة الغاشمة أنه يعمل بشكل رائع إذا حددت نوع اردوينو.
أمر تحميل البرامج الثابتة عبر UART:
avrdude -c arduino -p m162 -b 9600 -P /dev/tty.usbserial-00001004 -U flash:w:chatboard.hex:i

أظهر التحقق من خلال المحطة أنه لم يتم الضغط على جميع الأزرار، كما أن الميزة الرئيسية لمحمل التشغيل، وهي التبديل إلى وضع تحديث البرنامج عن طريق الضغط على الزر "نعم"، لا تعمل أيضًا. أصبح من المستحيل إعادة تحميل ملفات لوحة المفاتيح عبر UART. أظهرت دراسة أكثر تفصيلاً أن ثلاثة أعمدة من الأزرار من مصفوفة 7x7 لا تعمل. يعود كل شيء مرة أخرى إلى RTFM... تحتوي المسامير الثلاثة التي نستخدمها لاستقصاء لوحة المفاتيح أيضًا على وظيفة بديلة (JTAG) ممكّنة افتراضيًا. من خلال إيقاف تشغيل JTAG (إعادة كتابة hfuse إلى 0xD8) نحصل على لوحة مفاتيح كاملة الوظائف:

حان الوقت للاتصال باردوينو. لقد اخترت MiniUSB غير قياسي كموصل للواجهة، حتى لا أقوم بتوصيل شيء غير مناسب عن طريق الخطأ. كان المتبرع بالسلك عبارة عن فأرة قديمة (في أي مكان آخر يمكنك إزالة جهاز التشفير). الاتصال بلوحة المفاتيح هو موصل دبوس قياسي.
تم تجميع محول miniUSB - UART لتثبيت UART على SensorShield (لا تحتوي لوحة التجارب الخاصة بي حتى الآن على دبوس قياسي لـ UART).

نتائج

  • لوحة المفاتيح صغيرة بما يكفي لتحملها في جيبك.
  • يتيح لك استقصاء لوحة المفاتيح عبر UART العمل بها دون أي مكتبات خارجية (يوفر مساحة في الفلاش)
  • سيسمح لك استخدام UART بتوصيل لوحة المفاتيح لاسلكيًا لاحقًا عبر Bluetooth-serial أو XBee-serial
ملاحظة. يبلغ حجم البرنامج الثابت الذي تم تجميعه في Eclipse + avr-gcc 600 بايت فقط. على الرغم من أنني لم أر ثنائيًا أصغر من 3 كيلو بايت في Arduino IDE.
P.S. يمكن العثور على المصادر والبرامج الثابتة هنا:

تسمح لوحات المفاتيح للمستخدمين بإدخال البيانات أثناء تشغيل البرنامج. توضح لك هذه المقالة كيفية توصيل لوحة مفاتيح مكونة من 12 مفتاحًا بـ Arduino، وكيفية استخدام مكتبة Keypad.h.

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

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

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

تجربة

في هذه التجربة سوف نوضح العمل مع مكتبة "keypad.h" لاردوينو. عندما يضغط المستخدم على زر على لوحة المفاتيح، يعرض البرنامج القيمة المقابلة في شاشة المنفذ التسلسلي.

المكونات المطلوبة

  • لاعبا (اختياري)؛
  • اللوح (اختياري).

مخطط الاتصال

قم بتوصيل لوحة المفاتيح بلوحة Arduino كما هو موضح في الصورة أدناه.

شفرة

/* رمز مثال لبرنامج تعليمي حول استخدام لوحة مفاتيح مصفوفة 3x4 مع لوحة Arduino. يعرض هذا الرمز قيمة الزر الذي تم الضغط عليه على لوحة المفاتيح إلى شاشة المنفذ التسلسلي. */ #include "Keypad.h" const byte Rows= 4; // عدد الأسطر على لوحة المفاتيح، 4 const byte Cols= 3; // عدد الأعمدة على لوحة المفاتيح، 3 // تحديد مصفوفة من الأحرف المقابلة لتوزيع الأزرار على لوحة المفاتيح: char keymap= (("1"، "2"، "3")، ("4"، "5"، "6")، ("7"، "8"، "9")، ("*"، "0"، "#"))؛ // يتم تعيين اتصالات لوحة المفاتيح إلى أطراف Arduino على النحو التالي: byte rPins= (A6,A5,A4,A3); // الأسطر من 0 إلى 3 بايت cPins= (A2,A1,A0); // الأعمدة من 0 إلى 2 // أمر مكتبة لوحة المفاتيح // تهيئة مثيل لفئة لوحة المفاتيح Keypad kpd= Keypad(makeKeymap(keymap), rPins, cPins, Rows, Cols); إعداد الفراغ () (Serial.begin (9600)؛ // تهيئة الشاشة التسلسلية) // إذا تم الضغط على زر، فسيتم تخزين الزر في المتغير الذي تم الضغط عليه. // إذا كان الضغط على المفتاح لا يساوي NO_KEY، فقم بإخراج القيمة إلى المنفذ التسلسلي. حلقة باطلة () (شار keypressed = kpd.getKey()؛ إذا (تم الضغط عليه!= NO_KEY) (Serial.println(keypressed); ) )

خاتمة

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