تطوير عداد سرعة للدراجات على أساس شاشة من نوكيا 3310

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

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

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



بصفتي ROM لتسجيل إحصائيات القياس ، قررت وضع ROM كلاسيكي 24XX512 (512 كيلوبت في الثانية) ، والذي يتم التحكم فيه عبر واجهة I2C. لم أزعجني باستخدام بطاقة ذاكرة SD / MMC. وظيفة أخرى مهمة في الجهاز هي الساعة. تعمل على ربط بعض المعلمات المحددة المقاسة (على سبيل المثال ، السرعة القصوى) بالتاريخ والوقت ، وهي ضرورية أيضًا لتسجيل الطوابع الزمنية في الإحصائيات. كساعة ، استخدمت شريحة منفصلة للساعة في الوقت الحقيقي (RTC) من وحدة التحكم الدقيقة ، التي لديها طاقة بطارية مستقلة وتتواصل أيضًا مع وحدة التحكم عبر I2C.

قمت بتطبيق متطلبات ثانوية إضافية في وظائف الجهاز في مرحلة كتابة البرنامج. يشمل ذلك جميع أنواع المشكلات التنظيمية: عدد الأزرار المعنية ، والموقع على شاشة عرض العناصر المختلفة ، والتنقل على الواجهة ، وما إلى ذلك. من حيث التنقل ، قررت مسبقًا عدم تعقيد البرنامج ، على سبيل المثال ، عدم تنفيذ قائمة الإعدادات ، على وجه الخصوص ، إعدادات التاريخ والوقت. تم ضبط الساعة مرة واحدة. الساعة تدق بشكل مستقل في شريحة RTC نفسها ، وذلك بفضل كوارتز 32.768 كيلو هرتز وبطارية تدوم لفترة طويلة. يتم تنفيذ إعدادات التاريخ والوقت من خلال واجهة UART لعداد السرعة ، المتصلة بمنفذ COM للكمبيوتر بنقرة واحدة. من خلال نفس الواجهة ، كان من المفترض قراءة بيانات الإحصاءات من ROM إلى جهاز الكمبيوتر. لكل هذا ، يجب عليك كتابة البرنامج المناسب للكمبيوتر. ومع ذلك ، كما أظهرت ممارسة أخرى ، يجب التخلي عن هذا الأخير. أولاً ، كانت هناك مشكلة تنفيذ استقبال البيانات من جهاز التحكم إلى جهاز الكمبيوتر في مرحلة كتابة برنامج الكمبيوتر. والأهم من ذلك ، زاد حجم برنامج وحدة التحكم. كان أكثر إثارة للاهتمام وضع ROM (في SMIC Housing SOIC-8) على منصة قابلة للإزالة ، تتناسب مع بطاقة SIM ، واستخدام الفتحة المجانية المناسبة على الهاتف المحمول. للقيام بذلك ، من الضروري تصنيع قارئ ROM استنادًا إلى قارئ SIM وفقًا لأحد المخططات المعروفة لمبرمج I2C ROM. كما اتضح لاحقًا ، لم يتسبب هذا القرار في إزعاج غير ضروري.

قضية أخرى مهمة هي إخراج المعلومات الرمزية (بما في ذلك الرقمية) على عرض رسومي. هذا يتطلب معلومات بيانية عن رمز معين. ترتبط هذه المعلومات ارتباطًا وثيقًا بمعلمة مثل حجم الخط المعروض. لعرض المعلمة الرئيسية ، سرعة الحركة ، للحصول على وضوح جيد ، من المستحسن استخدام خط كبير. ومع ذلك ، كما هو موضح لاحقًا ، فإن هذه المعلومات الرسومية حول عشرة أرقام لن تتناسب مع ذاكرة MK ، واستخدام نفس ROM الخارجي الأكثر سعة سيبطئ سرعة رسم الخط. قررت استخدام خط بارتفاع 8 نقاط كخط أكبر. لقد قمت بسحب المعلومات الرسومية لهذا الخط من ملف "8X8.FNT" لبعض البرامج من MS DOS ، بعد أن فككت هيكلها من قبل وأدخلت المزيد من المعالجة.



كما اتضح لاحقًا في الممارسة ، هذا الحجم يكفي تمامًا لوضوح السرعة. كحجم للخط الإضافي ، اخترت الحجم 3x5 ورسمت بشكل مستقل الرسومات لأرقام هذا الحجم. تعرض هذه الأرقام الصغيرة معلمات إضافية: التاريخ / الوقت والمتوسط ​​والسرعة القصوى والمسار.

يتم تخزين المعلومات الرسومية لكلا الخطين في صفائف ثنائية الأبعاد معينة. يشير كل عنصر صفيف ، بحجم بايت واحد ، إلى توزيع البكسل لعمود معين لرقم معين. للطباعة الكبيرة ، يتم تخصيص 8 أعمدة لكل رقم ، و 3 أعمدة 3. للطباعة الصغيرة ، بحجم 3X5 ، الارتفاع الرسمي ليس 5 ، ولكن 8 نقاط (تقريب إلى بايت واحد). هذا يسمح لك بالترتيب المسبق لموقع الخط ذو 5 مواضع داخل منطقة ذات 8 مواضع في الاتجاه العمودي باستخدام إحدى الطرق الأربع الممكنة. يتم عرض هذه الحقائق بشكل جيد في الشكل أدناه ، والذي يوضح نمذجة الرسومات لأول رقمين من هذا الخط. Excel معروف بالنمذجة. البيانات الأولية هي ترتيب "الوحدات" في الحقول المناسبة للرسومات المطلوبة. من بينها ، تحسب الصيغ قيم المصفوفات ، حتى رمز لغة C ، والتي يمكن نسخها لاحقًا في نص البرنامج لوحدة التحكم الدقيقة.



الآن سنتحدث عن ميزات التحكم في الشاشة المستخدمة. هذه الشاشة أحادية اللون وأبعادها 84 × 48 بكسل. يتم التحكم في العرض من MK عبر واجهة SPI. يتم تفسير وحدات البايت المرسلة بواسطة SPI في العرض في وضعين: وحدات البايت للعرض والبايت لأوامر التكوين. يتم ضبط هذه الأوضاع بواسطة MK نفسه لطرف عرض معين (D / C). يتم إعطاء قائمة كاملة بالأوامر في ورقة البيانات على الشاشة. يتم استخدام بعض هذه الأوامر في جهازي ، ويتم استخدامها لتهيئة الشاشة عند تطبيق الطاقة على الجهاز: معامل درجة الحرارة والتباين ووضع الرسم المتسلسل (أفقيًا أو رأسيًا) ، إلخ. ألاحظ على الفور أنه يتم تطبيق وضع الرسم الأفقي. هذا يعني أنه عند نقل بايت في وضع العرض ، يزداد العنوان تلقائيًا سطرًا واحدًا بسطر إلى اليمين. عندما ينتهي السطر ، ينتقل عنوان الموضع إلى بداية السطر التالي. يكفي أولاً إرسال أمر تحديد موقع خاص للعرض إلى صف معين وعمود محدد (الموضع الأولي) ، ثم إرسال وحدات بايت البيانات بالتتابع واحدة تلو الأخرى لعرض الرسومات. تجدر الإشارة إلى ميزة مساحة العنوان وتفسير الرسومات ، اعتمادًا على وحدات البايت التي تتلقاها الشاشة. ألاحظ أنه بالنسبة للرسومات أحادية اللون ، يحتوي البايت الواحد على معلومات حول ثمانية بكسل في آن واحد.

يتم تقسيم الشاشة المعنية عموديا إلى 6 مناطق أفقية مع 8 خطوط لكل (6 * 8 = 48). يتطابق كل عمود في كل منطقة مع بايت محدد يتم إرساله بعنوان العمود المقابل (0 ... 83) ورقم المنطقة (0 ... 5). لا يتم احتساب العنوان من واحد ، من البداية. على سبيل المثال ، إذا قمت بوضع نفسك على العنوان (34 ؛ 2) وأرسلت بايت بيانات 255 (في شكل ثنائي "11111111") ، فستضيء جميع وحدات البكسل الـ 8 من 16 إلى 23 رأسيًا وفي العمود 35 أفقيًا. في رأيي ، فإن أحد العيوب يتبع هذه الميزة: عدم القدرة على التحكم في حالة كل بكسل على حدة على مستوى الأجهزة. البايت هو أصغر جزء من البيانات للرسومات. عندما يتم إرسال بايت إلى العنوان الحالي ، يتم تحديث جميع وحدات البكسل المقابلة الثمانية في المنطقة الحالية. لا تدعم الشاشة قراءة المعلومات الرسومية المعروضة حاليًا نحو وحدة التحكم الدقيقة. لذلك ، إذا لزم الأمر ، فمن الضروري تخزين معلومات الإخراج في مخزن مؤقت مخصص مسبقًا ، وتغيير حالة أي وحدات بكسل (بت) ، وتطبيق أقنعة البت للبايت من هذا المخزن المؤقت ونقلها إلى الشاشة مرة أخرى.

تم إجراء النمذجة والتفكير في موقع معلومات بيانية معينة على الشاشة مع مراعاة الميزات المذكورة أعلاه. تم ذلك لتبسيط الكود عند كتابة البرنامج. وليس من قبيل المصادفة أن حجم الخط تم اعتباره من الفئة 8 ، 16 ، 24 ، أي مضاعف من 8. كما قمت بتقسيم المعلومات الرسومية ، عن طريق القياس مع الشاشة ، إلى 6 مناطق أفقية. في المنطقة الأولى ، يتم عرض قيم RPM المطلقة والحالية (منذ لحظة تشغيل الجهاز) بخط صغير. في المنطقة الثانية ، القيم المطلقة والحالية للمسار (بالكيلومترات مع التقريب إلى المئات). في المنطقة الثالثة - متوسط ​​السرعة. في الرابعة - السرعة القصوى والطباعة الكبيرة - السرعة الحالية. في المنطقة الخامسة ، يتم عرض شريطين للتقدم للإشارة إلى امتلاء ROM وعدد عمليات الكتابة فوقه. في المنطقة السادسة والأخيرة ، التاريخ والوقت. إنها المنطقة الخامسة التي تكون استثناء عندما تكون هناك وحدات بكسل مرتبطة بمعلومات مختلفة في الاتجاه الرأسي لأي عمود مأخوذ. لذلك ، يتم جمع هذه المعلومات باستخدام أقنعة البت في مخزن مؤقت ، ثم يتم عرض محتوياتها في هذه المنطقة الخامسة. أيضًا ، في 3-5 مناطق ، توجد معلومات لرسم إطار حول قيمة السرعة المعروضة. في المنطقة الأخيرة ، يتم تعيين كل بتة (الأقل دلالة) على جميع الأعمدة إلى "1" لرسم خط الفاصل (الصف 40). من أجل هذه المحاكاة والتصور للعناوين ، قمت بتصوير كل ما سبق في خلايا Excel.



هكذا تبدو نافذة العرض الأولى. نافذتان فقط. النافذة الثانية هي إخراج الرسم البياني (الرسم البياني) للحركة. لذلك ، يتم تعيين 5 مناطق (40 صفًا) عموديًا وجميع الأعمدة الـ 84 أفقياً. المنطقة السادسة مع الساعة هي نفسها لكلا النوافذ.

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

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

الآن فكر في الدائرة الكهربائية للجهاز.



تصميم عداد السرعة بسيط نسبيًا. بالإضافة إلى كل ما سبق ، تحتوي الدائرة على عنصر IC5 MAX756 ، والذي يعمل كمحول طاقة من 3 إلى 5 فولت لإمداد طاقة موثوق به من البطارية الأصلية لهاتف Nokia 3310 المحمول. في الوقت الحالي ، لم أحصل على MAX756 بعد ، ولا تزال الدائرة بأكملها تعمل ببطارية Krona خارجية باستخدام منظم LM7805 (ليس الخيار الأفضل تمامًا). يتصل بمقبس سماعة الرأس في الجزء السفلي من الهاتف. مفتاح القصب SF1 ، وهو مستشعر دوران العجلة ، متصل بمنفذ مقاطعة INT0 MK (دبوس 32). يتم توصيله بشكل آمن من أسفل الهاتف بمنفذ الشحن. الأزرار الوظيفية S1-S3 المتصلة بالأزرار "1" و "2" و "3" للهاتف المحمول متصلة بمنافذ عشوائية (الدبابيس 23 و 27 و 28). يتم توصيل دبوس S4 بالطرف 29 من إعادة تعيين MK ، والذي يتزامن مع زر النهاية العليا للتشغيل على الهاتف المحمول. لقد فعلتها هكذا لا يحتوي الجهاز نفسه على وضع الاستعداد ويتم تشغيله بالطاقة. يتم توصيل شاشة IC2 وموصل وميض X1 بمنفذ SPI الخاص بوحدة التحكم (الدبابيس 15-17). مع الموصل ، الذي أردت أن أقوم به على أساس "البقع" الموجودة على اللوحة الأم الأصلية للاقتران مع جهاز كمبيوتر (في نفس المكان) ، حصلت على عقبة صغيرة ، وفي المستقبل سوف أقوم بنقلها إلى مكان آخر. يتم توصيل واجهة UART لاتصال المستخدم بجهاز كمبيوتر بنفس الموصل ، يتم من خلاله تكوين التاريخ والوقت على الجهاز (الدبابيس 30-31 ، RX / TX). يتم توصيل الشاشة بوحدة التحكم من خلال المقسمات على المقاومات ، والتي تعمل على تقليل الجهد ، لأن الشاشة تعمل بجهد 3.3 فولت. MK PB0 و PB1 و PB2 على التوالي (الدبابيس 12-14). يتم تشغيل الشاشة من خلال الثنائيات D1-D3 والمقاوم R6 ، والتي تعمل على تقليل الجهد من 5 إلى 3.3 فولت ، وتجنب استخدام منظم خطي. تم اختيار كوارتز Cr1 الذي تم تسجيله بواسطة MK مع قيمة اسمية 4.5 ميجاهرتز بشكل عشوائي ، ولكن عمدا. لقد سقط للتو في ذراعي ، وقررت استخدامه. يتم توصيل الترانزستورات Q1 و Q2 بمنافذ PD4 و PD5 MK (الدبابيس 2 و 9) ، حيث يتم تحميل مصابيح LED للإضاءة الخلفية للشاشة ولوحة المفاتيح. توفر وحدة التحكم القدرة على التحكم في الإضاءة الخلفية بشكل فردي ، كما يوفر التخطيط الأصلي للهاتف المحمول (كان ذلك على مستوى الأجهزة ، وليس على مستوى المستخدم) ، على الرغم من أن هذا ليس ضروريًا من الناحية العملية. ناقل I2C متصل بمنافذ PC2-PC3 (الدبابيس 25-26) ، وللبساطة ، يتم تنفيذه برمجيًا باستخدام المكتبة المناسبة (على الرغم من أنه متصل بمنافذ TWI للأجهزة). يتم تعليق ذاكرة القراءة فقط IC3 ROM والساعة الحقيقية (RTC) IC4 في الحافلة. قم بالحجز على الفور حتى لا يكون هناك نقد في التعليقات: أعلم أن DS1307 ليس الحل الأفضل ، ولكن في وقت تطوير الدائرة لم أكن أعرف بوجود DS3231. يقع ROM على موصل قابل للإزالة ، على غرار بطاقة SIM. يتم استخدام منفذ إضافي لوحدة تحكم PC1 (دبوس 24) لاستقبال النبضات بتردد 1 هرتز مع RTC ، يتم من خلاله تحديث الوقت على الشاشة. جميع مكونات مجموعة الجسم السلبية - وفقًا لأوراق البيانات لكل مكون نشط.

النظر في الاعتبارات الرياضية لحساب معلمات معينة. كما سبق ذكره في البداية ، يعتمد مبدأ قياس السرعة على حساب فترة ثورة العجلة ، ويتم حساب المسافة على أساس قياس عدد هذه الثورات. يقوم جهاز التحكم بقياس الوقت بين النبض السابق والوارد من مفتاح القصب. يتم تحويل نتيجة القياس إلى قيمة سرعة عن طريق قسمة قيمة محيط العجلة على فترة الثورة ، ويتم تحديث هذه القيمة على الشاشة مع كل نبضة (دوران العجلة). تجدر الإشارة هنا إلى أنه من وجهة نظر الفيزياء ، يتم حساب متوسط ​​سرعة الدراجة على جزء من المسار المقابل لمحيط العجلة. بشكل منفصل ، يتم حساب عدد النبضات ، ثم يتم تحويلها إلى قيمة مسافة. لقياس فترة دوران العجلة ، تستخدم وحدة التحكم المؤقت الخاص بها. يحتوي ATmega8 على مؤقت 8 بت و 16 بت. يعتمد النطاق الديناميكي للقياس على عمق البت للمؤقت. في حالتي ، يتم استخدام مؤقت 16 بت ، لأن 8 بت (256 تعداد التهم) غير كافية بشكل قاطع. تتطابق فترة القياس القصوى (قبل تجاوزات المؤقت) مع الحد الأدنى للسرعة المقاسة. يمكنك إدخال ما يسمى بمؤقت البرنامج ، والذي سيقيس الفترات الكبيرة. ومع ذلك ، لتبسيط البرنامج ، لم أفعل ذلك. مع استخدام الكوارتز 4.5 ميجا هرتز وأقصى قيمة للمقسم 1024 في تكوين المؤقت ، لدينا: (1 / (4500000/1024)) = 0.000227556 ​​ثانية. تتوافق هذه القيمة مع الحد الأدنى لفترة الحساب. والحد الأقصى لمدة الحساب هو 0.000227556 ​​* 65536 = 14.913 ثانية. ستكون السرعة القصوى القابلة للقياس المقابلة للحد الأدنى من الفترة القابلة للقياس حوالي 30،000 كم / ساعة. لم يكن هذا يستحق حتى أن "الاحتياطي من فوق" ضخم بكل بساطة.لكن الحد الأدنى للسرعة المقاسة المقابلة للحد الأقصى للفترة المقاسة سيكون 2.26 / 14.913 / 1000 * 3600 = 0.54 كم / ساعة. هنا 2.26 هو محيط عجلة الدراجة (بالأمتار) في حالتي. أنا سعيد جدًا بهذا الحد الأدنى من القيمة المقاسة. إذا تحركت الدراجة بسرعة أقل من 0.54 كم / ساعة ، فسوف يسجل عداد السرعة للدراجات نقص الحركة (وتجاوز المؤقت). مع واجهة UART الكوارتز 4.5 MHz تعمل بشكل جيد بسرعة 2400 باود مع خطأ مقبول مقبول. هذه السرعة كافية أيضًا ، خاصة وأنني أستخدم UART لإعدادات ساعة لمرة واحدة من جهاز كمبيوتر (لنسخ التاريخ والوقت من جهاز كمبيوتر إلى جهاز). إذا أخذت الكوارتز في تردد أعلى ، فإن الحد الأدنى للسرعة القابلة للقياس سيزداد ، وهو أمر غير مقبول بالنسبة لي ،وستحتاج إلى استخدام مؤقت البرنامج. وإذا أخذتها أدناه ، فإن أداء الجهاز ككل ينخفض. لذلك ، قررت ترك هذا الكوارتز بالذات.

ألاحظ أن قيم الفترة والسرعة متناسبة عكسياً ، ومؤقت متحكم دقيق يقيس الفترة بشكل منفصل. في حالتنا ، تم تحديد نطاق القياس (0.000227556 ​​... 14.913) بالتساوي بنقاط بمبلغ 65535 ، مقسمًا إلى العديد من الفواصل الزمنية المتساوية. وتتوافق هذه النقاط مع جميع أنواع القيم المقاسة. باستخدام تحويل الفترات الزمنية من وقت إلى سرعة ، يتم تحويل هذا النظام من فترات منتظمة إلى تناسبي عكسياً. لذلك ، ينقسم نطاق السرعات المقاسة المختلفة إلى فترات غير متساوية. يزداد طول هذه الفترات بزيادة قيمة السرعة نفسها. بالنظر إلى هذه الحقيقة ، فإن "الاحتياطي من الأعلى" الضخم ، الذي كتبت عنه أعلى قليلاً ، لن يكون خاطئًا. من الناحية العملية ، سيكون كافياً أخذ قيمة 100 كم / ساعة لأقصى سرعة مقاسة للدراجة.هذا فقط لعدم إدخال رقم جديد (المئات) وعدم زيادة عرض المعلمة المعروضة على الشاشة. نحن نحسب ما هو طول الفترة الفاصلة بين القيم المحتملة المجاورة بسرعة في الحي تساوي ، على سبيل المثال ، 90 كم / ساعة. باستخدام الصيغ المعكوسة أو التحديد ، من السهل حساب أنه بالنسبة لقيمة المؤقت 397 (من 65536 ممكن) ، فإن السرعة المقاسة تقابل 90.06 كم / ساعة. وبجهاز ضبط الوقت المجاور 398 - 89.83 كم / ساعة. والفرق بين السرعات هو 0.23 كم / ساعة ، وهو بالفعل أكثر من مقبول. وبسرعات أقل ، سيكون هذا الاختلاف أصغر. تعرض الشاشة قيمة السرعة لأقرب مائة. ومع ذلك ، في الممارسة العملية ، عادة ما يكون التقريب إلى أقرب مجموعة كاملة أو إلى أعشارها كافياً. من ما سبق ، يمكننا أن نستنتج: يمكن تجاهل عدم انتظام "شبكة" السرعات ،لأن خطأ القياس الناتج عنه لا يتجاوز الخطأ المسموح به.

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

الآن حول الميزات الصغيرة للواجهة. يتم استخدام الزر الأول لتبديل الأوضاع (الوضع الرسومي أو وضع عرض القيمة). الزر الثاني - لعرض السرعة القصوى المطلقة (لكل الوقت) بدلاً من قريب عند الضغط عليه. أيضًا ، يتم عرض تاريخ ووقت الوصول إلى هذه السرعة بدلاً من التاريخ والوقت الحاليين. وأيضًا ، يتم عرض قيمة عنوان ROM الحالي بدلاً من قيمة السرعة النسبية (للتحكم). يمكن تقدير هذه القيمة من خلال شريط التقدم الأفقي على الخط 38 من الشاشة. على هذا القرص ، بسعة 65536 بايت (512 كيلو بايت) ، يتم تسجيل المعلمات المقاسة. كما سيقال لاحقًا ، يكفي تسجيل المعلمة المقاسة مبدئيًا (فترة دوران العجلة) مع علامة على الوقت الأولي.يتم حساب جميع المعلمات الأخرى بسهولة بواسطة برنامج كمبيوتر في مرحلة المسح ROM. يتم استخدام الزر الثالث للتحكم في الإضاءة الخلفية. على عكس رسم الشاشة أعلاه ، قمت في وقت لاحق بإزالة الأصفار غير المهمة على المعلمات الثانوية لعرضها بشكل أكثر وضوحًا. في الوضع الرسومي ، يتم رسم رسم بياني لسرعة الحركة من اليسار إلى اليمين ، مما يوضح بوضوح عملية تغيير السرعة على جزء صغير من مسافة 84 دورة للعجلة. قيمة الرسم البياني هي السرعة على مقياس 1 بكسل لكل 1 كم / ساعة. إذا تجاوزت السرعة 40 كم / ساعة ، يتم تصغير الصورة بشكل عمودي بمقدار مرتين لتجنب الخروج عن النطاق. لا يلزم وصف الميزات الكاملة لسلوك الجهاز هنا.أزلت لاحقًا أصفارًا غير مهمة على المعلمات الثانوية لعرضها بشكل أكثر وضوحًا. في الوضع الرسومي ، يتم رسم رسم بياني لسرعة الحركة من اليسار إلى اليمين ، مما يوضح بوضوح عملية تغيير السرعة على جزء صغير من مسافة 84 دورة للعجلة. قيمة الرسم البياني هي السرعة على مقياس 1 بكسل لكل 1 كم / ساعة. إذا تجاوزت السرعة 40 كم / ساعة ، يتم تصغير الصورة بشكل عمودي بمقدار مرتين لتجنب الخروج عن النطاق. لا يلزم وصف الميزات الكاملة لسلوك الجهاز هنا.أزلت لاحقًا أصفارًا غير مهمة على المعلمات الثانوية لعرضها بشكل أكثر وضوحًا. في الوضع الرسومي ، يتم رسم رسم بياني لسرعة الحركة من اليسار إلى اليمين ، مما يوضح بوضوح عملية تغيير السرعة على جزء صغير من مسافة 84 دورة للعجلة. قيمة الرسم البياني هي السرعة على مقياس 1 بكسل لكل 1 كم / ساعة. إذا تجاوزت السرعة 40 كم / ساعة ، يتم تصغير الصورة بشكل عمودي بمقدار مرتين لتجنب الخروج عن النطاق. لا يلزم وصف الميزات الكاملة لسلوك الجهاز هنا.قيمة الرسم البياني هي السرعة على مقياس 1 بكسل لكل 1 كم / ساعة. إذا تجاوزت السرعة 40 كم / ساعة ، يتم تصغير الصورة بشكل عمودي بمقدار مرتين لتجنب الخروج عن النطاق. لا يلزم وصف الميزات الكاملة لسلوك الجهاز هنا.قيمة الرسم البياني هي السرعة على مقياس 1 بكسل لكل 1 كم / ساعة. إذا تجاوزت السرعة 40 كم / ساعة ، يتم تصغير الصورة بشكل عمودي بمقدار مرتين لتجنب الخروج عن النطاق. لا يلزم وصف الميزات الكاملة لسلوك الجهاز هنا.

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

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





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

. , (EEPROM) . EEPROM.

AddressSizeData
04n (for S)
42t_min (for v_max)
66Date of t_min
122Address EEPROM
141EEPROM RW Count
12880Digits 8X8
20830أرقام 3X5
تخزن البايتات الأربعة الأولى المسافة المقطوعة حسب عدد دورات العجلة. اخترت على وجه التحديد نوع العدد الصحيح 32 بت لهذا المتغير ، لأنه في الممارسة العملية تكون قيم المسار المنتقل كبيرة نسبيًا. على سبيل المثال ، يمكن أن يوفر متغير 16 بت عددًا صحيحًا بحد أقصى 65،536 دورة (حوالي 148 كم) ، وهو صغير بشكل طبيعي. يتبع بايتين للحفاظ على السرعة القصوى المطلقة. في الواقع ، يتم توفير الحد الأدنى من وقت دوران العجلة. يشغل المتغير وحدتي بايت ، لأن قيمته هي نتيجة قياس مؤقت 16 بت. البايتات الستة التالية هي التاريخ والوقت الذي تم فيه الوصول إلى السرعة القصوى المذكورة أعلاه. يتم تقديم البيانات تمامًا بالتنسيق الذي تتم قراءته به من شريحة RTC (باستثناء يوم الأسبوع). بعد ذلك ، وحدتي بايت تقومان بتخزين قيمة العنوان الحالي لـ ROM الخارجي. هذا هو نوع من المؤشر ، وهو ضروري لإمكانية الاستمرار في كتابة الإحصائيات على ROM بعد التشغيل التالي. يجب أن يعرف عضو الكنيست موضع مساحة عنوان ROM الخارجية التي توقفها للمرة الأخيرة. من هذا المنصب ، سيواصل MK التسجيل. تم تخصيص هذه القيمة 2 بايت ، لأن مساحة عنوان ROM الخارجية هي 16 بت. ويتبع ذلك من حجم ROM 64 كيلوبايت. التالي هو متغير أحادي البايت يخزن قيمة عدد عمليات الكتابة فوق ROM. الاستبدال هو الحالة التي يصل فيها المؤشر أعلاه إلى القيمة القصوى ويتحول إلى الصفر. في هذه الحالة ، سيبدأ تسجيل المعلومات المستلمة حديثًا على ROM من البداية ، مما يؤدي إلى محو المعلومات القديمة المتوفرة عليه. متغير أحادي البايت قادر على تخزين 256 قيمة كحد أقصى. أذكرك أن قيم مؤشر عنوان ROM وعدد عمليات الكتابة فوقها يتم تحديدها بشكل مرئي من خلال شريطين للتقدم على الشاشة. علاوة على ذلك ، بعد مساحة احتياطية كبيرة لـ EEPROM MK ، بدءًا من العنوان 128 ، يتم تخزين المعلومات الرسومية حول أرقام 8x8. لذلك ، تم تخصيص 80 بايت (8 بايت لكل رقم ، كما ذكرنا سابقًا). وأخيرًا ، بدءًا من العنوان 208 ، يتم تخزين 30 بايت للحصول على معلومات رسومية حول أرقام صغيرة 3 × 5 (ثلاثة بايت لكل رقم).

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

يتيح لك البرنامج الأول نسخ التاريخ والوقت من جهاز كمبيوتر إلى عداد سرعة الدراجة من خلال منفذ COM. يتم توصيل عداد سرعة الدراجة بالكمبيوتر عبر شريحة MAX232. باستخدام WinAPI ، يتلقى البرنامج التاريخ والوقت الحالي في متغير هيكلي خاص من نوع SYSTEMTIME. يتم استخراج اليوم الحالي والشهر والسنة ورقم أيام الأسبوع والساعات والدقائق والثواني بالتنسيق العشري من هذا المتغير. كل هذه الأرقام ، باستثناء السنة ، لا تتجاوز منزلين عشريين (أقل من 100) وتقع ضمن بايت واحد. يتم تحويل قيمة السنة إلى رقم مكون من رقمين بطرح منه رقم 2000 ، قيمة الألفية الحالية. يتم تحويل كل من هذه الأرقام العشرية المكونة من رقمين إلى خاصية التنسيق العشري الثنائي لشريحة RTC. في هذا التنسيق ، يشغل الرقم المكون من رقمين أيضًا وحدة تخزين بايت واحد. يتم تشفير أكبر 4 بتات من رقم العشرات ، والأقل أهمية - عدد الوحدات. في وقت لاحق ، يتم تشكيل طرد 13 بايت من هذه الأرقام ، وفقًا لبروتوكول حددته سابقًا. تمثل وحدات البايت الخمسة الأولى الكلمة "TIME =" وفقًا لترميز ASCII القياسي. ثم اتبع الثواني والدقائق والساعات ويوم الأسبوع واليوم والشهر والسنة. البايت الأخير هو الحرف "#" ، كحرف نهاية الرسالة. يتم إرسال هذه الحزمة من الكمبيوتر إلى الجهاز عبر منفذ COM. يتلقى برنامج وحدة التحكم الدقيقة الحزمة ويتحقق من صحتها ، وفقًا للصيغة أعلاه. إذا كانت البايتات الخمس الأولى هي "TIME =" والأخيرة هي "#" ، فسيتم اعتبار الإرسال صحيحًا ، ويتم تفسير البايتات الداخلية بالترتيب المقابل. بدون تغيير سلسلة البايت هذه ، ترسلها وحدة التحكم إلى شريحة RTC عبر ناقل I2C ، لتكوينها للتاريخ والوقت الحاليين. ألاحظ أن هذه الدائرة الصغيرة تدعم حساب أيام الأسبوع من 1 إلى 7 ، على الرغم من هذا التقويم الذي يحدد مراسلات التاريخ ويوم الأسبوع ، فهو ليس كذلك. لم أقم بعرض معلومات حول يوم الأسبوع في جهازي.

تم تصميم البرنامج الثاني لمعالجة البيانات من محتويات ROM الخارجية. في البداية ، كان من المفترض أن يتم نسخ هذا المحتوى من ROM إلى ملف الصورة باستخدام بعض البرامج المعروفة التي تعمل مع مبرمجي MK و ROM المعروفين (على سبيل المثال ، "icprog"). ومع ذلك ، بعد دراسة مبدأ تشغيل I2C بمزيد من التفصيل ، تمكنت من تنفيذ هذه الوظيفة وأدرجتها في برنامجي. يتم عرض مخطط مبرمج ROM لهذه السلسلة ، الذي استخدمته في الجهاز ، في الشكل أدناه.



يتم توصيل ROM بمنفذ COM للكمبيوتر ، والذي لا يستخدم كوسيلة لتبادل المعلومات عبر RS-232 (حيث يكفي استخدام مخرجات TX و RX و GND) ، ولكن كوسيلة لإدخال وإخراج تعسفي للإشارات المنطقية. من خلال محطة TX ، يتم تشغيل ذاكرة القراءة فقط (ROM) ، والتي يتم تثبيتها حتى 5 فولت بواسطة منظم 78L05. من خلال التحكم في إخراج TX من الكمبيوتر ، يمكننا تشغيل أو إيقاف تشغيل رقاقة ROM. يتركز خط الساعة SCL أحادي الاتجاه على دبوس RTS بمنفذ COM ، ويتركز خط البيانات ثنائي الاتجاه SDA على دبابيس: CTS (استقبال البيانات) و DTR (نقل البيانات). يتم استخدام المقاومات والثنائيات زينر D1 و D2 لتحديد مستوى الإشارة إلى TTL ، الذي يعمل عليه ROM.

لقد صنعت هذا المبرمج القياسي لحالتي الخاصة ، حيث بدلاً من مقبس ROM ، يتم استخدام قارئ SIM من هاتف محمول مكسور.



عن طريق WinAPI ، يصل البرنامج إلى دبابيس منفذ COM للكمبيوتر ، ويعين القيم اللازمة لهم (0 أو 1) ، ويزيل أيضًا القيمة الثنائية الواردة من ROM من طرف CTS. بناءً على مجموعة الأدوات هذه ، تم تنفيذ وظيفة I2C وفقًا للمواصفات ذات الصلة ، والتي لن أخوض في تفاصيلها. يمكن للبرنامج قراءة محتويات ROM في صورة ملف (مثل المبرمج العادي) ، وكذلك معالجة مثل هذا الملف ، أو معالجة المعلومات من ROM مباشرة. تتكون معالجة المعلومات من الحصول على ملفات إحصاءات المخرجات بتنسيق جدولي محدد مسبقًا بناءً على معلومات الإدخال من ROM. يتوافق كل ملف من هذا القبيل مع رحلة واحدة (من لحظة التيار حتى المرة التالية التي يتم فيها تشغيل الجهاز). أولاً ، سأصف بإيجاز تنسيق الإدخال الذي حددته مسبقًا. في كل مرة يتم فيها تشغيل الجهاز ، تتم كتابة وحدتي بايت من الأصفار على العنوان الحالي ، والذي تتم قراءته من EEPROM لوحدة التحكم الدقيقة. عندما تبدأ العجلة في الدوران (عند أول دفعة) بعد انتهاء المهلة أو بعد تشغيل الجهاز ، تتم كتابة التاريخ والوقت الحاليين بتنسيق عشري ثنائي (حيث يتم تخزينها في سجلات شريحة RTC). ثم يتم تسجيل وحدتي بايت من "الوحدات" 0xFF. أثناء دوران العجلة ، لكل نبضة k-th (k = 2،3، ...) ، يتم تسجيل وقت دوران العجلة بين نبضة (k-1) th و k ببايتين (عالي ومنخفض). من الواضح أن هذه المعلومات كافية لربط المسافة الحالية (غير المطلقة) والسرعة حتى التاريخ والوقت. تنسيق الإخراج هو نص وهو جدول جدولي في ملفات * .csv التي يتم فتحها في Excel بالنقر المزدوج فوق الماوس. تتوافق الصفوف في هذا الجدول مع دورات العجلة ، وتظهر قيم العمود أدناه.

ADRقيمة عنوان ROM
DATE / TIMEتاريخ ووقت البدء
ديسمبرقيمة الموقت العشري
الوقتالوقت الحالي
روقت السفر منذ السلطة
vالسرعة
نالسرعة
قالطريق
أالعدد المطلق للثورات (فقط داخل ROM الحالي)
أالمسار المطلق (فقط داخل ROM الحالي)
n_dayعدد الثورات لليوم الحالي
S_dayالمسار لليوم الحالي
v_maxالسرعة القصوى للرحلة الحالية
av_maxالسرعة القصوى المطلقة (فقط داخل ROM الحالي)
v_midمتوسط ​​السرعة للرحلة الحالية
يتم عرض لقطة شاشة لمحتويات مثل هذا الملف في Excel في الشكل أدناه. أيضا ، يتم عرض الرسوم البيانية للتغيرات في السرعة الحالية والمتوسط ​​والحد الأقصى بألوان مختلفة في نظام إحداثيات واحد. الوسيطة (المحور X) - قيم السرعة كبيانات إدخال. يوضح الشكل التغيرات في المعلمات للثورات 730 الأولى. ترتبط المسافة المقطوعة بهذا الاعتماد الخطي المتغير (730 دورة تقابل حوالي 1650 م). لذلك ، يمكننا القول أن الرسوم البيانية تعكس اعتماد السرعات على المسافة (دقيقة إلى المقياس الأفقي) ، على النقيض من الاعتماد التقليدي للسرعة على الوقت ، والذي يجب الانتباه إليه. كما ذكرنا من قبل ، فإن هذه الميزة ترجع إلى أيديولوجية ومبدأ قياس السرعة حسب سرعة العجلة. ولكن بعد كل شيء ، يتم تخصيص لحظة زمنية معينة لكل ثورة للعجلة (لحظة اقتراب المغناطيس ومفتاح القصب). وبطبيعة الحال ، فإن هذا التسلسل الزمني ليس متجانسًا. ومع ذلك ، من أجل الشكليات والراحة ، يتمتع Excel بالقدرة على تحديد مجموعة من قيم الوقت في المسار أو الوقت الحالي كوسيطة للرسوم البيانية. ولكن على الرغم من ذلك ، يجب أن نتذكر أن الاعتماد الحقيقي للسرعة على الوقت (على فترات زمنية موحدة للحالة المنفصلة) كان سيبدو مختلفًا ، مع مقياس أفقي متغير.





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



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

البرنامج الثالث ، في جوهره ، هو نفس البرنامج لوحدة التحكم الدقيقة في البرنامج الثابت. أنا أعمل مع أبسط مبرمج STK 200 متصل بمنفذ LPT للكمبيوتر ، أو بالأحرى ، مع نظيرته ، إذا كان يمكنك تسميته بذلك ، لأنه في أبسط الحالات لا يحتوي المبرمج على أي عناصر نشطة. في الواقع ، يتصل MK من خلال واجهة SPI بدبابيس محددة لمنفذ LPT مباشرة ويعمل كعبد. يقوم البرنامج بتنفيذ بروتوكول لتبادل البيانات مع وحدة تحكم ATmega8 وفقًا لورقة البيانات الخاصة به (ص. 237). يتم تنفيذ الطبقة المادية لـ SPI من خلال إدارة تسجيلات منفذ LPT باستخدام المكتبة الديناميكية المعروفة "inpout32.dll". مكتبتي غير متصلة كمشروع (حيث أنني تجنبت إنشاء مشروع على هذا النحو في "Dev-cpp" من خلال إنشاء "ملف" واحد بسيط) ، ولكن باستخدام وظيفة LoadLibrary باستخدام النوع الهيكلي HINSTANCE. تم تعيين مكتبة "inpout32.dll" لمتغير من هذا النوع ، وبعد ذلك يتم استخراج مؤشرات الدالات من هذه المكتبة إلى متغيرات منفصلة. يحتوي Inpout32.dll على وظيفتين فقط مسؤولتين عن إدخال البيانات وإخراجها. يتم الوصول إلى هذه الوظائف باستخدام المؤشرات المستخرجة مسبقًا. يتم التحكم في دبابيس منافذ LPT بشكل فردي باستخدام أقنعة البت. في حالتي الخاصة ، يعمل البرنامج الذي كتبته مع منطقة EEPROM في وحدة التحكم ، وهو مصمم لقراءة النسخة الاحتياطية للبيانات المخزنة فيها والتي قمت برسمها في وقت سابق وحفظها وكتابتها وتصحيحها واستعادتها. مثل جميع البرامج الأخرى ، يعمل البرنامج من سطر الأوامر. في مثل هذه الحالات ، لتنفيذ الوظائف المتعددة للبرنامج ، يتم استخدام وظائف "حالة التبديل" ومربع حوار مستخدم النص ، على سبيل المثال ، "أدخل" 1 "للعملية رقم 1 ، ... ، أدخل" 0 "للخروج من البرنامج." يتم عرض البيانات بتنسيقات مختلفة مناسبة لي. بالإضافة إلى ما سبق ، يمكن للبرنامج عرض تفريغ كامل لوحدة تحكم EEPROM في 512 بايت على الشاشة. أيضا ، يمكن للبرنامج تسجيل معلومات بيانية عن الخطوط المستخدمة في ذاكرة وحدة التحكم. في حالة الطباعة الصغيرة بحجم 3X5 ، يأخذ البرنامج معلومات من الملف النصي "Fonts 3X5.txt" الموجود في نفس الدليل به. يحتوي الملف على جدول جدولي 30 بايت (3 × 10) مكتوب بتنسيق سداسي عشري. إذا رغبت في ذلك ، يمكن تحريره بسهولة في محرر نص ، وبالتالي تغيير رسومات هذا الخط. كما ذكرنا من قبل ، هذه الطباعة الصغيرة بسيطة للغاية لدرجة أن تغيير رسوماتها لا معنى له. الشيء الوحيد هو أن التحول الرأسي قد يكون مطلوبًا فقط ، نظرًا لوجود مخزون من المساحة بارتفاع 8 بكسل ، والخط بارتفاع يساوي 5. في حالة الخط الكبير ، الحجم 8X8 ، الذي يعرض السرعة الحالية ، قدمت الوظيفة أكثر إثارة للاهتمام. لا يتم تقديم معلومات الرسم حول هذا الخط في ملف نصي كجدول من وحدات البايت ، ولكن في ملفات BMP الرسومية المرئية. كل رقم يتوافق مع ملف واحد من هذا القبيل. المعلمات هي حجم 8X8 ، أحادية اللون مع لوحة سوداء وبيضاء. فيما يلي لقطة شاشة لمحرر الرسوميات المعروف "MS Paint" مع فتح ملف "8.bmp" فيه.



تجريبيا ، درست بنية ملفات BMP أحادية اللون التي تم الحصول عليها من MS Paint "، وعلى هذا الأساس تمكنت من تعلم قراءة كل بكسل لصورة BMP أحادية اللون (باستثناء استخدام الهياكل والمكتبات المساعدة). في مرحلة القراءة الأفقية سطرًا تلو الآخر من الأسفل إلى الأعلى (هذه هي الطريقة التي يتم بها تنظيم هيكل ملف BMP) ، يقوم البرنامج بتحويل المعلومات إلى تنسيق عمودي خاص بالشاشة المستخدمة. تتم هذه العملية في مسار واحد ، حيث يتم استخدام أقنعة البتات وتراكم القيم المتغيرة. أدناه سأعرض هذا القسم من التعليمات البرمجية للرقم الأول ، مع الانتباه إلى بساطة العملية.

for(k=0; k<8; k++){ fnt[i][k] = 0; } for(j=0; j<8; j++){ fseek(f, 62+4*j, SEEK_SET); byte = ~fgetc(f); for(k=0; k<8; k++){ if(byte & pow2(7-k)){ fnt[i][k] += pow2(7-j); } } } 

في الحلقة الأولى ، تتم تهيئة عناصر صفيف fnt إلى أصفار. علاوة على ذلك ، سيحمل كل عنصر k-th من هذا الصفيف (k = 0 ... 7) للرقم i (th = 0 ... 9) معلومات بيانية حول كل عمود مقابل لكل رقم مناظر. الدورة التالية هي الجري على غرار صورة ملف BMP. باستخدام عامل التشغيل fseek ، نضع أنفسنا في وحدات البايت عند الإزاحة 62 + 4 * j لملف BMP المحدد مسبقًا f. يتم تحديد خصوصية الصيغة التي يتم من خلالها حساب الإزاحة اعتمادًا على رقم السطر j من خلال بنية ملف BMP. في المتغير المتوسط ​​البايت ، نحصل على قيمة البايت عند الإزاحة أعلاه. يخزن هذا البايت معلومات حول جميع وحدات البكسل الثماني لصورة أحادية اللون في السطر الحالي j. يقوم عامل التشغيل "~" بعكس اتجاه البت للبايت ، مما يؤدي إلى عكس اللون لكل بكسل. ويرجع ذلك إلى حقيقة أن بكسل أسود في لوحة ملف BMP أحادي اللون يتوافق مع "0" منطقي والأبيض - "1". في العرض التطبيقي ، على العكس. في حلقة متداخلة ، يحدث تحليل البايت للبايت وفي نفس الوقت ، يتم تجميع المعلومات في صفيف إخراج fnt. الوظيفة pow2 - رفع اثنين إلى قوة عددية غير سلبية ، مكتوبة بشكل مستقل. بدلاً من هذه الوظيفة ، يمكنك استخدام عامل تشغيل نقل البتات الأكثر كفاءة "<<" ، ولكن في وقت كتابة هذا البرنامج لم أكن أستخدمه.

بالإضافة إلى ذلك ، يوفر البرنامج القدرة على الكتابة إلى ذاكرة MK أحد الخيارات الرسومية العديدة لهذا الخط من اختياري. يتم تنفيذ هذه الخيارات باستخدام الدلائل (المجلدات) باسم النموذج "v1" و "v2" و "v3" وما إلى ذلك ، والتي تقع في مجلد "Fonts 8X8" في نفس الدليل مثل البرنامج. وبالفعل في هذه المجلدات هي ملفات BMP اللازمة. بفضل الوظائف المذكورة أعلاه ، من الممكن تصحيح أو رسم أرقام من "ورقة فارغة" في محرر الرسوم البيانية ، وحفظها وتوزيعها بين الدلائل. لدي ثلاثة خيارات للخط. الخيار الأول هو الأصل. والثاني - مثل الأصل ، ولكن مع شطب صفر ووحدة معدلة (بدون تسطير سفلي). والثالث هو خط بحد مستطيل.

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







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

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







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



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





لقد قمت أيضًا بتصحيح تصميم الجهاز بشكل طفيف ، وهو معروض في الشكل أدناه.



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

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



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

Source: https://habr.com/ru/post/ar414281/


All Articles