عداد الاندفاع على Linux (نحصل على معلومات حول تدفق الغاز من عداد VK-G4)

في عملية الأتمتة المنزلية ، تم اكتشاف أن مقياس تدفق الغاز VK-G4 المتوفر لديه ميزة مثيرة للاهتمام: تم تضمين المغناطيس في التفريغ الصغير ، والذي يمكن أن يغلق مفتاح القصب المركب خارج الجهاز نفسه (أي لا يلزم الإذن لتوصيله شركة الغاز). هذا موضح حتى في جواز السفر على العداد نفسه. صحيح ، من المستحسن استخدام "IN-Z 61 Low Frequency Pulse Generator" ، ولكن في الواقع إنه مجرد مفتاح قصبي مركب على عداد مقابل سعر مجنون. لذلك ، بدلاً من IN-Z 61 ، تقرر استخدام أرخص مستشعر Hall مع إخراج رقمي (أي مع مشغل Schmitt مدمج).

من ما تم أخذه من نوع قاعة استشعار SS441A. وفقًا لورقة البيانات الموجودة على SS44xA ، يتم ترميز حساسيته المغناطيسية في الرقم الثالث ، الذي يحدد الموقع الفعلي لجهاز الاستشعار على عداد الغاز.
كنظام تحكم ، أستخدم كمبيوتر Banana PI أحادي اللوحة يعمل بنظام Linux (vanilla kernel 4.2+). الاتصال المادي لـ SS44xA بسيط للغاية: نقوم
بتوصيل الإخراج (-) بسلك مشترك ؛
الخرج (+) متصل بـ + 5 فولت (وليس + 3.3 فولت) ؛
يتم توصيل الطرف (D) بمنفذ GPIO ويتم سحبه من خلال المقاوم 4.7 كيلو أوم إلى + 3.3 فولت.
ولكن ما كان مفاجأة لي عندما لم أجد برامج تشغيل نواة داخل الشجرة يمكنها فقط حساب عدد النبضات على منفذ GPIO معين! أفهم أن Linux ليس نظام تشغيل في الوقت الفعلي ، ولكنه يحسب فقط النبضات منخفضة التردد ... هل كان عملي حقًا؟
بعد النظر بعناية في أحدث مصادر النواة ، تم اكتشاف حلين وسيطين:
  1. استخدم برنامج تشغيل UIO قياسي. إذا تم فتح مثل هذا الجهاز كملف في برنامج التطبيق وتم كتابة القيمة المقابلة له ، فسيتم تعليق عملية القراءة اللاحقة منه حتى يحدث انقطاع بسبب تغيير في مستوى الإشارة على GPIO المقابلة ؛
  2. gpio_keys. GPIO «» (button) «» (switch), , .

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

شروط مسبقة
  • استخدام الإصدار 4.x من Linux kernel أو إصدار أحدث
  • ملفات رأس Kernel المستخدمة في بنائه (عادة ما تكون موجودة في / usr / include / linux على النظام المستهدف)
  • -
  • Device Tree
  • Device Tree ( dtc)

بالنسبة لعملي ، أستخدم التجميع من Armbian ، وعلى موقعه على الإنترنت ، يمكنك أيضًا أخذ مصادر النواة ، والتي تم على أساسها إعداد التجميع. ولكن ، من حيث المبدأ ، يجب ألا تكون هناك قيود على التجمع المستهدف.
أنا لا أصف تجميع الوحدة الخارجية هنا (وماذا؟ من حيث المبدأ ، هناك الكثير من الموارد مع مثل هذا الوصف) ، لذلك نعتقد أن لديك بالفعل وحدات عدادات جاهزة. kpio-pulse.ko تم تجميعها من أجل نواة الخاص بك. أصف العملية الإضافية باستخدام مثال الموز PI ، ولكن عن طريق القياس يمكن نقلها إلى أي منصة أخرى.

افتح لوحة وصف الموصلعلى اللوحة. نحن مهتمون بموصل CON3 (رؤوس GPIO). نختار أي جهة اتصال نحبها ونحدد وظائفها (على سبيل المثال ، أحببت الطرف 12 على موصل CON3 ، الذي يتصل به منفذ مقبس PH2). نتحقق من ورقة بيانات Allwinner A20 (جدول وظائف تعدد الإرسال GPIO) - يجب أن يدعم المنفذ المحدد توليد المقاطعات (في حالتي هو EINT2 في العمود Multi 6). بعد ذلك ، نحتاج إلى تحديد رقم التعريف الشخصي من حيث GPIO ، الذي يتوافق مع المنفذ المحدد (PH2). كان من الأسهل بالنسبة لي تحديد ذلك مباشرة على جهاز العمل:

# grep '(PH2)' /sys/kernel/debug/pinctrl/1c20800.pinctrl/pinmux-pins
pin 226 (PH2): (MUX UNCLAIMED) (GPIO UNCLAIMED)

في نفس الوقت والتأكد أن هذا المنفذ لا يستخدم حاليًا من قبل أي شيء (MUX و GPIO UNCLAIMED).

الآن يمكنك إنشاء تكوين شجرة الجهاز. توجد أمثلة لبعض الأجهزة في التعليمات البرمجية المصدر الخاصة بنواة Linux في المجلد arch / arm / boot / dts ، وبالنسبة إلى Banana ، يُطلق على ملف PI sun7i-a20-bananapi.dts
حيث نقوم بإجراء التغييرات التالية:
/ {
        model = "Banana Pi BPI-M1";
        compatible = "sinovoip,bpi-m1", "allwinner,sun7i-a20";

...

        counters {
                compatible = "gpio-pulse-counter";
                gas-meter@0 {
                    label = "Gas meter";
                    pinctrl-names = "default";
                    pinctrl-0 = <&ext_counter_bananapi>;
                    /* CON3, pin 12: PH2 - pin 226 (Multi6 function: EINT2) */
                    /* bank: 226 / 32 = 7, pin into the bank 226 % 32 = 2 */
                    gpios = <&pio 7 2 GPIO_ACTIVE_LOW>;
                    interrupt-parent = <&pio>;
                    interrupt-names = "counter-edge-falling";
                    interrupts = <2 IRQ_TYPE_EDGE_FALLING>; /* PH2 / EINT2 */
                };
        };

&pio {
        ...

        /* External counter */
        ext_counter_bananapi: counter_pins@0 {
                allwinner,pins = "PH2";
                allwinner,function = "gpio_in";
                allwinner,drive = <SUN4I_PINCTRL_10_MA>;
                allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
        };
};


يتم حساب معلمة gpios في العقدة على النحو التالي:
  • يأتي أولاً رابطًا لملصق pio ؛
  • التالي هو رقم البنك الذي يحتوي على منفذ GPIO المطلوب. بالنسبة إلى Allwinner A20 ، يحتوي كل بنك على 32 منفذًا ، لذلك يتم تعريف رقم البنك على أنه الجزء الصحيح من قسمة دبوس GPIO على 32 ؛
  • التالي هو الرقم السري داخل البنك. لان يحتوي كل بنك على 32 دبوسًا ، ثم يتم حساب هذه القيمة كباقي قسمة دبوس GPIO على 32 ؛
  • المعلمة الأخيرة هي إشارة إلى مستوى الإشارة الذي يعتبر نشطًا

يتم حساب معلمة المقاطعات في العقدة على النحو التالي:
  • تشير المعلمة الأولى إلى عدد المقاطعة لوحدة تحكم GPIO (بالنسبة إلى EINT2 ستكون 2)
  • المعلمة الثانية هي IRQ_TYPE_EDGE_FALLING ، والتي تسمح بتوليد مقاطعة عندما تنتقل الإشارة من الأعلى إلى المنخفض (لأن لدينا مستشعر جامع مفتوح وسحبنا إلى + VCC)

نقوم بتجميع ملف شجرة الأجهزة المعدل:
dtc -I dts -O dtb sun7i-a20-bananapi.dts > sun7i-a20-bananapi.dtb

مع الناتج sun7i-A20-bananapi.dtb، فإننا الكتابة فوق الملف في /boot/dtb/sun7i-a20-bananapi.dtb نكتب
نواة وحدات counters.ko GPIO-pulse.ko في أي مكان في / ليب / وحدات / $ (-r uname) / نواة / السائقين وتحميل النظام المستهدف. على نظام الهدف المحمل ، نعطي الأمر
depmod -a

وإعادة التشغيل مرة أخرى. بعد ذلك ، نلقي نظرة على إخراج الأمر dmesg:
# dmesg
...
[    4.745570] counters: Class driver loaded.
[    4.749235] gpio_pulse: Device #0 gas-meter: IRQ: 53 GPIO: 226
...

رائع ، يتم تحميل الوحدات وتشغيلها. نتحقق من الوظيفة أولاً برمجياً:
# cat /sys/class/counters/counter0/values/count
0
# echo 1 > /sys/class/counters/counter0/values/pulse
# cat /sys/class/counters/counter0/values/count
1
# echo 1 > /sys/class/counters/counter0/values/pulse
# echo 1 > /sys/class/counters/counter0/values/pulse
# cat /sys/class/counters/counter0/values/count
3

(قلدنا إشارة بالبرمجيات).

الآن نقوم بتوصيل مستشعر Hall والتأكد من قابليته للتشغيل من خلال جلب بعض المغناطيس إليه (على سبيل المثال ، من ملصق مغناطيسي على الثلاجة).

خاتمة


أخيرا ، كان لدي الوقت لنشر الصور. لذا: في

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


ثم نصلح أجهزة الاستشعار مع شريط كهربائي.


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

ثم نصلح هذه القطعة وسلك مع شريط كهربائي.


حسنا وهذا ما حصل كنتيجة


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

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


All Articles