السبت، 15 أبريل 2023

اكتشف انسداد التصريف باستخدام Tiny ML + LoRa

 استخدام مستشعر ذكي خارجي - A1101 لاكتشاف تراكم الأوراق والزهور وغيرها من الحطام لتصريف المياه وتنبيه المستخدم


الأشياء المستخدمة في هذا المشروع

مكونات الأجهزة

 Studio SenseCAP A1101 - مستشعر LoRaWAN Vision AI

ستوديو إيدج إمبلس

قصة

مكتبي به شرفة جميلة.

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

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

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

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

3. لاستخدام في الهواء الطلق ، وانخفاض الصيانة ، وانخفاض استهلاك الطاقة ، لا أريد شحن البطارية كل يوم.

4. أنا سيء حقًا في البرمجة ، فأنا أريد فقط حل بدون رمز.

5. أنا مجرد مبتدئ في TinyML ، لا أعرف الكثير عن نموذج التدريب وبنية الشبكة العصبية.

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

مقدمة سريعة عن Seeed SenseCAP A1101 و Edge Impulse (EI) في حالة الحاجة.

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

مزود بعلبة IP66 وتصميم من الدرجة الصناعية ، يمكن استخدامه في ظروف صعبة مثل الأماكن ذات درجات الحرارة العالية أو التي يصعب الوصول إليها. فهو يجمع بين TinyML و LoRaWAN® لتمكين الاستدلال المحلي والإرسال لمسافات طويلة وهما المتطلبان الرئيسيان من الاستخدام الخارجي.

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

Edge Impulse هي منصة التطوير الرائدة للتعلم الآلي على الأجهزة المتطورة ، وهي تدعم بشكل كامل A1101. بالنسبة لي ، إنها منصة لا تحتوي على رمز واحد ، ويمكنني أخذ عينات من البيانات الأولية ، وبناء النماذج ، ونشر نماذج التعلم الآلي المدربة على A1101 مباشرة من استوديو EI دون الحاجة إلى أي برمجة.

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

هيا بنا نبدأ!!

الخطوة 1 قم بتثبيت EI CLI

يرجى الرجوع إلى هذه الوثائق من EI لتثبيت Python 3 و Node.js و EI CLI.

بعض النصائح التي أود مشاركتها:

1. واجهت المشكلة التالية عندما أقوم بتثبيت CLI - فهذا يعني أنه لم يتم اكتشاف إصدار Xcode أو CLT. لذلك ، أعدت تثبيته باستخدام xcode-select - install.



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


sudo npm install -g edge-impulse-cli –-force

3. تحقق سريعًا لمعرفة ما إذا كنت قد قمت بتثبيت CLI بنجاح. إذا قمت بكتابة ed + tab ، فسيتم سرد جميع الأوامر على النحو التالي.



الخطوة 2 قم بتوصيل A1101 بـ EI studio

1. قم بتوصيل A1101 بجهاز الكمبيوتر المحمول الخاص بك باستخدام كبل من النوع C.




2. قم بتشغيل برنامج edge-impulse-daemon في الجهاز الطرفي (أنا أستخدم MacOS Monterey V12.5.1) ، ثم ستجد A1101 مدرجًا ضمن جهازك مع الضوء الأخضر ، مما يعني أنه متصل بنجاح بواجهة برمجة تطبيقات الإدارة عن بُعد الخاصة بـ EI.







الخطوة 3: الاستعداد لاكتساب البيانات

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





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



الخطوة 4: بدء أخذ العينات

جمعت بعض البتلات والأوراق لمحاكاة مستوى مختلف من الانسداد.



أقوم بتصنيف جميع الصور إلى 3 أسماء ، نظيفة ، محظورة قليلاً ، محظورة.



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



جمعت 196 صورة ، 52 صورة نظيفة ، 67 ممنوعة قليلاً ، 77 ممنوعة. نظرًا لأنه يمكن التعرف على الميزة النظيفة بسهولة ، فقد جمعت عينات أقل منها مقارنة بالميزتين الأخريين.

الخطوة 5: وضع العلامات

انقر فوق Labeling queue.

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







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


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


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


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


الخطوة 6: انقل بعض بيانات التدريب إلى مجموعة الاختبار

تُستخدم مجموعة الاختبار لاختبار دقة نموذجك بعد التدريب. توصي EI بمعدل تقسيم تقريبي 80/20 تدريب / اختبار لبياناتك لكل فصل (أو ملصق) في مجموعة البيانات الخاصة بك. أنا كسول وأريد أن أحاول بأقل.


لذلك ، قمت بنقل 19 إلى اختبار البيانات ، و 4 نظيف ، و 7 محظور قليلاً و 8 محظور.



الخطوة 7: خلق الدافع

في البداية ، قمت بضبط دقة الكاميرا على 160 × 160 ، لكنني الآن بحاجة إلى إعادة ضبطها على 96 × 96. سيؤدي هذا إلى تغيير حجم العينات إلى 96 × 96 ، مما يسمح للنموذج بالتدريب على هذا القرار. سينتج عن ذلك نموذج أصغر وهدفي هو تحقيق سرعة استدلال سريعة على A1101.

تحقق من ميزات الإخراج في لقطة الشاشة أدناه ، فهذا يعني أنه تم تصنيف الاستنزاف المحظور على أنه كائن 0 ، واستنزاف نظيف ككائن 1 ، وتم حظره قليلاً ككائن 2. سيكون الإخراج من AI في شكل احتمالات لكل كائن ، معبرًا عنه كنسب مئوية. على سبيل المثال ، قد يشير الإخراج إلى أن هناك فرصة بنسبة 85٪ أن الصورة عبارة عن كائن 0 (استنزاف مسدود) ، واحتمال بنسبة 10٪ أن تكون كائنًا 1 (استنزاف نظيف) ، واحتمال 5٪ أن تكون كائن 2 ( قليلا محظورة).

أدخل اسمًا ثم انقر فوق Save Impulse



الخطوة 8 إنشاء ميزات الصورة

اضبط عمق اللون على Grayscale.


الخطوة 9 تحقق من جودة عينات الصور

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



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


إذا لاحظت صعوبة فصل البيانات في المستكشف ، فقد تصارع الشبكة العصبية أيضًا.

إذا كنت بحاجة إلى شرح كامل لهذه الأداة ، يمكنك زيارة EI doc.

الخطوة 10 ابدأ التدريب

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

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

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

يحدد حجممموعة التحقق من الصحة عدد الصور التي تم وضع علامة عليها للتحقق من الصحة. الإعداد الافتراضي هو 20٪ ، ولكن في حالتي ، مع وجود أكثر من 100 صورة فقط ، وجدت أن نسبة 10٪ كافية.

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

اخترت استخدام FOMO لتدريب مجموعات البيانات الخاصة بي لأن حجم النموذج صغير.

نتيجة التدريب لأول مرة - ليست جيدة بما يكفي بنسبة 75٪ فقط


بعد عدة جولات من التحسين - يبدو جيدًا الآن بنسبة 97.3٪.


الخطوة 11 اختبار النموذج

انقر فوق نموذج الاختبار.


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



الخطوة 12 النشر

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




الخطوة 13: اسحب البرنامج الثابت الذي تم تنزيله إلى SENSECAP

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




الخطوة 14 افصل الكبل من النوع C. بعد ذلك ، نحتاج إلى تكوين A1101 للاتصال بالسحابة.

يتيح لي هذا التحقق من نتيجة الاستنتاج عبر الهاتف.


1. قم بتنزيل تطبيق SenseCAP Mate



2. اختر خادمًا عالميًا وقم بتسجيل الدخول.


3. اتبع الخطوات أدناه لتهيئة A1101.



4. الإعدادات

النظام الأساسي: SenseCAP لـ TTN.

الخوارزمية: كشف الكائن

خطة التردد: US915

الفاصل الزمني للوصلة الصاعدة: أختار 60 دقيقة ، مما يعني أنني سأتلقى نتيجة مدفوعة كل ساعة.

انقر فوق إرسال


الخطوة 15 تحقق من أداء النموذج

هنا يأتي الجزء الأكثر إثارة !!!!! أنشر صورًا مختلفة بمستوى مختلف من الانسداد على شاشتي وأعرضها على A1101.


تم تصنيف الصرف المحظور على أنه كائن 0 ، وتصريف نظيف ككائن 1 ، وتم حظره قليلاً ككائن 2. عندما عرضت A1101 صورة تصريف نظيفة ، تنبأ بدقة أنه كان 97٪ كائن 1 (نظيف).





الخطوة 16 امسح رمز QR على الجهاز لإضافة A1101 في حسابي

ثم يمكنني التحقق من مستوى انسداد التصريف على SenseCAP Mate.



الخطوة 17: ضع A1101 على مراقبة الصرف


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

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

لا تتردد في استنساخ المشروع هنا 

شرح saeeed

شرح اضافي 






الجمعة، 11 نوفمبر 2022

Arduino تكشف عن Opta ، أول "Micro PLC" لإنترنت الأشياء الصناعي

 بنيت حول STM32H747XI ، عائلة Opta - المتوفرة في متغيرات Ethernet و RS485 و Wi-Fi / Bluetooth - تستهدف المحترفين.




أعلنت شركة Arduino عن ما تسميه "أول جهاز تحكم منطقي قابل للبرمجة (micro PLC) ،" Opta - أداة قوية مصممة مع إنترنت الأشياء الصناعي (IIoT) في المقدمة.


"لقد صممنا [Opta] على وجه التحديد مع وضع مهندسي PLC في الاعتبار ،" يدعي فريق Arduino أنه تم إطلاق أحدث الأجهزة ، ودعم اللغات القياسية بما في ذلك LD (مخطط سلم المنطق) و FBD (مخطط كتلة الوظيفة) ، فهو يتيح للمستخدمين المحترفين توسيع نطاق مشاريع الأتمتة الصناعية والمباني تستفيد من نهجنا المفتوح المصدر ، سهل الاستخدام ، والمانع لتقييد البائعين ".


داخليًا ، يستخدم Opta القابل للتركيب على قضيب DIN - الذي طورته Arduino بالشراكة مع Finder - متحكمًا دقيقًا ثنائي النواة STMicro STM32H747XI ، والذي يتضمن نواة Arm Cortex-M7 عالية الأداء تعمل بسرعة تصل إلى 480 ميجاهرتز و Cortex منخفض الطاقة- يعمل M4 core بسرعة تصل إلى 240 ميجاهرتز جنبًا إلى جنب مع وحدة النقطة العائمة المشتركة (FPU) ، ومسرع Chrom-ART ، ومسرع JPEG للأجهزة ، وفلاش 2 ميجابايت ، وإجمالي 1،056 كيلو بايت من ذاكرة الوصول العشوائي بالإضافة إلى 1،024 بايت و 4 كيلوبايت من ذاكرة الوصول العشوائي الثابتة (SRAM) .

يعتمد ما تستخدمه بالضبط مع Opta على الطراز ، مع إتاحة ثلاثة متغيرات عند الإطلاق: Opta Lite ، والذي يتضمن اتصال Ethernet و USB Type-C للبرمجة ؛ Opta RS485 ، الذي يضيف دعمًا مزدوج الاتجاه RS485 بشكل غير مفاجئ ؛ و Opta WiFi ، والذي يتضمن أجهزة راديو لاتصالات Wi-Fi و Bluetooth منخفضة الطاقة (BLE). تدعم جميع الطرز التحديثات عبر الهواء ، وقد أكد Arduino ، وتتميز بعنصر آمن مخصص لضمانات التشفير ، بالإضافة إلى مرحلات لتبديل أربعة أحمال تصل إلى 2.3 كيلو واط لكل منها



يدعي فريق Arduino أن Opta تفتح فرصًا جديدة للأتمتة الصناعية في متناول الجميع من خلال الاتصال على متن الطائرة وقدرات التعلم الآلي: تصميم وتكرار وتنفيذ أفكار طموحة بشكل متزايد لتصنيع عالي الجودة وزيادة الكفاءة وإنتاجية أفضل و الربحية. إذا كنت تتفق معنا على أن الابتكار موجود هنا لمساعدتنا في مواجهة كل تحدٍ ممكن ، فإننا نتطلع إلى رؤية الحلول التي تقوم بإنشائها للعمل بشكل أفضل مع Opta! "


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



















الجمعة، 28 أكتوبر 2022

5.1 قناة معالج الصوت التناظري

 هذا المشروع عبارة عن معالج صوت تمثيلي 5.1 قناة يعتمد على PT2322 و Arduino Nano.



الأشياء المستخدمة في هذا المشروع
مكونات الأجهزة
PT2322
اردوينو نانو R3
onsemi 2N7002
STMicroelectronics L78M08

تطبيقات البرمجيات والخدمات عبر الإنترنت


قصة
في هذا المشروع ، قمنا بتطوير معالج صوت تناظري 5.1 قناة باستخدام PT2322 IC. PT2322 هو معالج صوتي تناظري رخيص الثمن قدمته شركة Princeton Technology Corporation. يحتوي على مخففات القنوات الفردية المكونة من 6 قنوات ، ونظام التحكم في النغمة ثلاثي الاتجاهات لمكبرات الصوت الأمامية ، ونظام محاكاة الصوت ثلاثي الأبعاد.



في هذا التصميم ، نقوم بدمج PT2322 مع Arduino Nano وربطه بلوحات الكمبيوتر / الكمبيوتر المدمجة من خلال منفذ USB. يوفر تطبيق GTK UI الأصلي للتحكم في جميع وظائف PT2322 IC.

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

لتقليل التكلفة وتقليل حجم ثنائي الفينيل متعدد الكلور ، نستخدم مكونات SMD ومكونات من النوع عبر الفتحة في ثنائي الفينيل متعدد الكلور هذا. أبعاد PCB هي 59 مم × 60 مم. يمكن أن تطلب PCB لهذه الوحدة مباشرة من صفحة مشروع PCBWay. باستخدام خدمة PCBWay ، يمكنك طلب مركبات ثنائي الفينيل متعدد الكلور عالية الجودة بأسعار منخفضة. استخدم أداة عرض الأسعار عبر الإنترنت PCBWay للتسعير والمزيد من التفاصيل.


تم تطوير برنامج Arduino الثابت في هذا المشروع باستخدام PlatformIO. تمت كتابة تطبيق التحكم من جانب المضيف باستخدام GCC C. يمكن تجميع تطبيق واجهة المستخدم هذا وتشغيله على أي لوحة متوافقة مع Linux / GTK مثل أجهزة الكمبيوتر الشخصية و Raspberry Pi و Orange Pi و BeagleBone Black وما إلى ذلك. يتم إجراؤها من خلال واجهة USB UART التي توفرها لوحة Arduino Nano.


في مرحلة النمذجة ، نختبر هذه اللوحة باستخدام بطاقة صوت ASUS Xonar SE 5.1 ونظام مكبر صوت تناظري Creative Inspire T6300 - 5.1. يوفر الإعداد أعلاه إخراجًا صوتيًا نظيفًا دون أي تشويه ملحوظ.

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

يحتوي جهاز PT2322 على نظام تحكم في النغمات ثلاثي الاتجاهات يسمح بالتحكم في الصوت الجهير والمتوسط وثلاثة أضعاف في نطاق من -14 ديسيبل إلى + 14 ديسيبل. يوفر نظام التوهين المكون من 6 قنوات توهينًا يصل إلى 15 ديسيبل لكل قناة. كل هذه الضوابط تنقسم إلى 15 خطوة. يمكن استخدام مفتاح التحكم في مستوى الصوت الرئيسي لضبط التوهين من 79 ديسيبل إلى 0 ديسيبل في 80 خطوة.


وحدة معالجة الصوت هذه هي مشروع أجهزة مفتوح المصدر. جميع ملفات التصميم وأكواد المصدر والثنائيات المترجمة موجودة في مستودع المشروع في github.com.














السبت، 3 سبتمبر 2022

تتبع الأصول الداخلي باستخدام Wi-Fi Triangulation

 قم ببناء حل IoT كامل لتتبع الأصول الداخلية باستخدام Blues Wireless Notecard ، ومضيف ESP32 MCU ، و Notecarrier-F ، و Datacake.






الأشياء المستخدمة في هذا المشروع

Blues Wireless Notecard (Cellular)
Blues Wireless Feather Starter Kit for ESP32
SparkFun Atmospheric Sensor Breakout - BME280
Blues Wireless Notehub.io
Datacake

قصة

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

بالطبع ، يتضمن تتبع الأصول أيضًا مراقبة الموقع في مساحة فعلية. يتم تنفيذ ذلك عادةً باستخدام نظام GNSS / GPS ، وهو أكثر الوسائل ثباتًا وموثوقية للتحقق من موقع مادي في الهواء الطلق.

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

حسنًا ، لدي حل لك اليوم! على الأقل حل إثبات المفهوم 😅.

باستخدام طريقة التثليث الخاصة بأصدقائنا القدامى من علم المثلثات والهندسة ، يمكننا بناء حل لتتبع الأصول الداخلية كامل الوظائف مبني على Blues Wireless Notecard.

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

هل أنت جاهز للغطس؟ لنبدأ بالمتطلبات عالية المستوى لحل التتبع الداخلي هذا.

المتطلبات: بيانات الموقع بدون GPS

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

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





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

المتطلبات: استخدم الارتفاع لتتبع الأرضية

كان تتبع أحد الأصول على خريطة ثنائية الأبعاد في العام الماضي 😊.

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

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

المتطلبات: مضخة بيانات من جهاز إلى سحابة

نحن بحاجة إلى وسيلة لمزامنة بيانات الموقع والارتفاع التي تم جمعها مع السحابة. ونعم ، لقد تخلت بالفعل عن المكون السري الخاص بنا: Blues Wireless Notecard.

تعد Notecard نظامًا خلويًا مدفوعًا مسبقًا على وحدة ، وهي مفيدة بشكل خاص لاتصالات إنترنت الأشياء الخلوية ذات النطاق الترددي المنخفض. يأتي محملاً مسبقًا بـ 500 ميجابايت من البيانات و 10 سنوات من الخدمة الخلوية العالمية ، بدءًا من 49 دولارًا أمريكيًا.



على الرغم من أن Notecard عبارة عن جهاز خلوي ، فلا يلزمك برمجة المودم بأوامر AT قديمة. واجهة برمجة تطبيقات Notecard هي JSON كلها ، طوال الوقت. على سبيل المثال ، لنفترض أنك تريد الاستعلام عن آخر موقع معروف على Notecard ، فأنت تستخدم card.location API:

// Request
{ "req": "card.location" }

// Response
{
"status": "GPS updated (58 sec, 41dB SNR, 9 sats),
"mode": "periodic",
"lat": 42.577600,
"lon": -70.871340,
"time": 1598554399

والأهم من ذلك ، أن الأمان والتكامل السحابي يعد أمرًا جاهزًا. يتصل Notecard "خارج الإنترنت العام" من خلال أنفاق VPN الخاصة ، باستخدام خدمة Blues Wireless السحابية Notehub.

Notehub هو أيضًا الصلصة السرية الخاصة بنا عندما يتعلق الأمر بتوفير بيانات الموقع عبر التثليث. كما سنرى لاحقًا ، عندما نوفر بيانات نقطة وصول Wi-Fi معروفة إلى Notehub ونقوم بتمكين card.triangulate API ، يمكن لـ Notehub بالفعل البحث عن بيانات الموقع الدقيقة بشكل صادم.

الشرط: طاقة منخفضة

يجب أن يكون أي حل IoT يعمل بالبطارية موفرًا للطاقة. لحسن الحظ ، فإن Notecard هي طاقة منخفضة بشكل افتراضي (لتصل إلى ~ 8uA عند الخمول) وتتضمن مقياس تسارع داخلي ، والذي يسمح لنا بحساب موقع الأصل فقط عندما يكتشف الحركة!

مع وضع كل هذه المتطلبات في الاعتبار ، فلنقم بتجميع أجهزتنا.

الأجهزة

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


نظرًا لأنني لست على استعداد للتخلي عن نظام تحديد المواقع العالمي (حتى بالنسبة للنشر الداخلي) ، سأستخدم هوائي GPS صغيرًا نشطًا جنبًا إلى جنب مع هوائي LTE للبيانات الخلوية



لجمع البيانات البيئية وحساب الارتفاع ، أقوم بتضمين جهاز استشعار BME280 الموقر من Bosch.



بالنسبة إلى متحكم مضيف ، ذهبت مع ESP32-S2 Feather. لقد اخترت MCU بشكل أساسي بسبب وحدة Wi-Fi المدمجة الخاصة بها ودعمها لـ CircuitPython. على الرغم من أننا لا نستطيع استخدام Wi-Fi للاتصال (نظرًا لأنه نظام متحرك ولن نتمكن من تسجيل الدخول إلى نقاط وصول Wi-Fi المتغيرة) ، فإننا سنستخدمها لجمع بيانات نقطة وصول Wi-Fi العامة.


إذن كيف نجمع كل القطع معًا؟ هذا هو الغرض من Blues Wireless Notecarrier-F الجديد!

Notecarriers هي لوحات حاملة تتيح لك إنشاء نماذج أولية لحلول إنترنت الأشياء التي تستخدم Notecard بسرعة. يعد Notecarrier-F خيارًا رائعًا لوحدات MCU المتوافقة مع Feather ويوفر منفذين Qwiic لإضافة الأجهزة الطرفية (مثل BME280) وموصلات JST لتوصيل بطاريات LiPo.



وهنا الإعداد النهائي للأجهزة ، كلها متصلة وجاهزة للبرمجة:


البرامج فيرموير

أنا من محبي بايثون بلا حرج ، لذا كان CircuitPython خيارًا سهلاً بالنسبة لي.

لماذا CircuitPython؟ سؤال صحيح! في رأيي المتواضع ، ساعدت CircuitPython في فتح إنترنت الأشياء لسلسلة جديدة من المطورين الذين نشأوا مع Python. مثل MicroPython "الأم" (التي تستند إليها CircuitPython) ، فإن القدرة على استخدام لغة Python المشهورة uber لبرمجة هذه "الأشياء" وربطها بالعالم قد وسع نطاق حلول إنترنت الأشياء ونطاقها.

لذلك دعونا نكتب بعض البرامج الثابتة CircuitPython!

ملاحظة: يتوفر رمز مصدر CircuitPython الكامل لهذا المشروع في مستودع Github هذا.

مكتبات وواردات بايثون

التبعيات الخارجية الوحيدة التي لدينا هي Notecard ومستشعر BME280. يحتوي كلاهما على مكتبات Python المدعومة جيدًا والتي تعمل بشكل رائع مع CircuitPython: note-python و adafruit-circpython-bme280.

تبدو المجموعة النهائية من الواردات كما يلي:

mport board
import busio
import notecard
from adafruit_bme280 import basic as adafruit_bme280
import utils
import keys
import time
from time import sleep

تهيئة الجهاز

نحن بحاجة إلى تهيئة الوصول إلى الأجهزة الطرفية لدينا. تتواصل كل من Notecard و BME280 عبر I2C ، مما يجعل خطوات init بسيطة للغاية:

# initialize the Blues Wireless Notecard (blues.io)
i2c = busio.I2C(board.SCL, board.SDA)
card = notecard.OpenI2C(i2c, 0, 0, debug=True)

# create reference to BME280
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c)

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

في وقت لاحق ، عند استخدام خدمة عن بُعد لجمع بيانات الضغط ، سنحتاج إلى استخدام إحداثيات خطوط الطول / العرض. يمكننا البرمجة في بعض الإعدادات الافتراضية وتحديثها لاحقًا إذا / عندما يصبح GPS متاحًا:

bme280.sea_level_pressure = 1013.25
lat_def = 43.05769554337394
lon_def = -89.5070545945101

بعد ذلك ، نحتاج إلى ربط Notecard بمشروع قائم على السحابة في خدمة Blues Wireless السحابية Notehub. يمكّن هذا Notecard من نقل البيانات بأمان إلى موقع معروف في السحابة:

# associate Notecard with a project on Notehub.io
req = {"req": "hub.set"}
req["product"] = "your-notehub-product-uid"
req["mode"] = "periodic"
rsp = card.Transaction(req)

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

# enable GPS module on Notecard
req = {"req": "card.location.mode"}
req["mode"] = "periodic"
rsp = card.Transaction(req)

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

# enable motion tracking on Notecard
req = {"req": "card.motion.mode"}
req["start"] = True
rsp = card.Transaction(req)

ملاحظة: هل تشعر بالفضول حيال طلبات Notecard API هذه؟ راجع مرجع Notecard API الكامل.

تحقق من وجود الحركة

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

تخبرنا معلمة العد في الاستجابة عن عدد أحداث الحركة التي تم تسجيلها منذ أن تم التحقق منها مؤخرًا:

def check_motion():
""" check for Notecard movement to see if we need to update its location """

req = {"req": "card.motion"}
rsp = card.Transaction(req)

if "count" in rsp and rsp["count"] > 0:
# movement detected since last check!

using_gps = False
using_wifi = False

# attempt to ascertain the current gps location
using_gps = get_gps_location()

if using_gps is False:
# gps location timed out, switch to wi-fi triangulation
using_wifi = set_wifi_triangulation()

# send readings from the sensor to the cloud
send_sensor_data(using_gps, using_wifi)


هناك طريقتان أخريان تعتمدان على الموقع مذكورتان هنا ، get_gps_location و set_wifi_triangulation. دعونا نلقي نظرة سريعة على هذه.

احصل على موقع GPS

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

def get_gps_location():
""" attempt to ascertain the latest gps location """

# get the latest GPS location
req = {"req": "card.location"}
rsp = card.Transaction(req)

if "lat" in rsp and "lon" in rsp:
# got an updated gps location
lat_def = rsp["lat"]
lon_def = rsp["lon"]

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


قم بإعداد Wi-Fi Triangulation

هل تعلم أن هواتفنا الذكية تجمع باستمرار البيانات حول نقاط وصول Wi-Fi المتاحة ، وتجمع هذه البيانات مع إحداثيات خطوط الطول / العرض ، وشحن البيانات إلى Apple و Google؟ مرحبًا بكم في ممارسة خصوصية أخرى مشكوك فيها بواسطة شركة Big Tech!

على الجانب المشرق ، يتيح لنا أيضًا الاستفادة من قدرة Notehub على جمع بيانات تحديد الموقع من نقاط وصول Wi-Fi القريبة.

من خلال توفير قائمة بنقاط وصول Wi-Fi إلى card.triangulate API ، يمكننا إخبار Notehub بحساب بيانات تحديد الموقع لنا (غالبًا مع نتائج دقيقة بشكل صادم).

ملاحظة: أوصي بشدة بقراءة وثائق تثليث برج الخلية / شبكة Wi-Fi. هناك إعدادات إضافية في Notehub قد تحتاج إلى تحديثها بناءً على عدد المرات التي تريد فيها استخدام التثليث.

مرة أخرى ، نظرًا لأننا نستخدم MCU المستندة إلى ESP32 ، يمكننا استخدام مكتبة wifi المدمجة CircuitPython لإنشاء قائمة بنقاط وصول Wi-Fi المرئية. تتوفر الوظيفة المساعدة ، get_wifi_access_points ، في مستودع Github أيضًا.

def set_wifi_triangulation():
""" use the card.triangulate api to set the local wifi access points """

req = {"req": "card.triangulate"}
req["mode"] = "wifi"
rsp = card.Transaction(req)

all_wifi_aps = utils.get_wifi_access_points()

if len(all_wifi_aps) > 0:
req = {"req": "card.triangulate"}
req["text"] = all_wifi_aps + "\n"
rsp = card.Transaction(req)
return True
else:
return False

احصل على ضغط مستوى سطح البحر المحدث

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

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

تسمح واجهات برمجة ت بيقات الويب الخاصة بـ Notecard لـ Notecard بإرسال / استقبال البيانات إلى / من واجهات برمجة تطبيقات RESTful البعيدة. الطريقة أدناه مختصرة للمساحة:

def get_sea_level_pressure(card, lat, lon):
""" get the sea level pressure from openweather api """

# call openweather api to get latest pressure reading
weatherURL = "/weather?lat=" + \
str(lat) + "&lon=" + str(lon) + "&appid=" + keys.WEATHER_API_KEY

req = {"req": "web.get"}
req["route"] = "GetWeather"
req["name"] = weatherURL
rsp = card.Transaction(req)

pressure = 0

if rsp and "body" in rsp and "main" in rsp["body"] and "pressure" in rsp["body"]["main"]:
pressure = rsp["body"]["main"]["pressure"]

return pressure

لاحظ استدعاء سلسلة GetWeather في هذه الطريقة؟ هذا هو اسم مسار Notehub الذي تم تكوينه للاستعلام عن خدمة بعيدة (OpenWeather) وإرجاع بيانات الطقس الحالية لإحداثيات خطوط الطول / العرض المحددة. يبدو هذا المسار الخاص بهذا الشكل في واجهة مستخدم Notehub:



إرسال البيانات إلى السحابة
بمجرد حصولنا على ضغط مستوى سطح البحر المحدث ، يمكننا تحديث مستشعر BME280 بهذه القيمة وأخيرًا إرسال بيانات الاستشعار البيئي إلى Notehub للمزامنة مع لوحة معلومات Datacake التي سيتم إنشاؤها:
def send_sensor_data(using_gps, using_wifi):
""" send sensor data to the cloud with the Notecard """

# first get the updated sea level pressure
sl_pressure = utils.get_sea_level_pressure(card, lat_def, lon_def)

bme280.sea_level_pressure = sl_pressure
sleep(1)

note_body = {}

# get 50 readings from the sensor and use the median values
temp_list = []
humidity_list = []
pressure_list = []
altitude_list = []

for x in range(50):
temp_list.append(bme280.temperature)
humidity_list.append(bme280.relative_humidity)
pressure_list.append(bme280.pressure)
altitude_list.append(bme280.altitude)
sleep(0.1)

med_temp = utils.get_median(temp_list)
med_humidity = utils.get_median(humidity_list)
med_pressure = utils.get_median(pressure_list)
med_altitude = utils.get_median(altitude_list)

note_body["temperature"] = med_temp
note_body["humidity"] = med_humidity
note_body["pressure"] = med_pressure
note_body["altitude"] = med_altitude
note_body["sealevelpressure"] = sl_pressure

# get the battery voltage
req = {"req": "card.voltage"}
rsp = card.Transaction(req)
note_body["voltage"] = rsp["value"]

# get the wireless bars and rssi values
req = {"req": "card.wireless"}
rsp = card.Transaction(req)
note_body["bars"] = rsp["net"]["bars"]
note_body["rssi"] = rsp["net"]["rssi"]

# deliver note to the notecard and sync immediately
req = {"req": "note.add"}
req["sync"] = True
req["file"] = "indoor_tracker.qo"
req["body"] = note_body
rsp = card.Transaction(req)
خذ ملاحظة (نعم ، التورية المقصودة) للطلب النهائي في هذه الطريقة ، note.add. "الملاحظة" هي ببساطة كائن JSON يتضمن بيانات عشوائية تريد إرسالها إلى السحابة.

في هذه الحالة ، نرسل عناصر البيانات التالية في نص ملاحظتنا:

درجة الحرارة
رطوبة
الضغط
ارتفاع
ضغط مستوى سطح البحر
الجهد (من بطارية LiPo المتصلة)
أشرطة و rssi (بيانات جودة الاتصال من المودم الخلوي)
لوحة القيادة السحابية
من خلال كتابة البرامج الثابتة ونشرها في وحدة التحكم الدقيقة ، يمكننا التحقق من Notehub للتأكد من جمع البيانات الصالحة ومزامنتها:

لكن هذه البيانات مفيدة إلى حد ما فقط كونها مرئية في Notehub. ما نحتاج إليه حقًا هو توجيه هذه البيانات إلى لوحة معلومات سحابية لجعلها سهلة الهضم (وجميلة!).

للقيام بذلك ، أنشأت لوحة تحكم كاملة الوظائف باستخدام Datacake:



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


بعد قضاء حوالي 20 دقيقة سيرًا على الأقدام من نهاية إلى نهاية هذا التسوق الداخلي الضخم (من المسلم به أن بعض الأقسام الكبيرة التي تبدأ في الزوايا تم إغلاقها للأسف) تمكنت من جمع بيانات تثليث Wi-Fi للتأكد من مجموعة نقاط موقع دقيقة بشكل صادم:

لقد قمت الآن بعمل كبير حول استخدام بيانات الارتفاع في وقت سابق. بينما لا يمكننا تقديم تصور حقيقي "ثلاثي الأبعاد" لموقعنا على Datacake (أو بصراحة أي لوحة معلومات سحابية أعرفها حتى الآن) ، يمكننا ربط بيانات الموقع على الخريطة ببيانات الارتفاع المقدمة من مستشعر BME280. عند تحديد "ارتفاع خط الأساس" للطابق الأول (أو صفر بالنسبة إلى الأشخاص خارج الولايات المتحدة) ، يمكننا تقريبًا تتبع الأرضية التي نتواجد عليها أيضًا استنادًا إلى الارتفاع النسبي المقاس:


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

ومع ذلك ، إذا لزم الأمر ، فمن الرائع أن يكون لديك خيار مثل Blues Wireless Notecard مع Notehub وقدرات التثليث الخاصة به.

فضولي لمعرفة المزيد؟ احصل على مجموعة المبتدئين Blues Wireless ESP32 اليوم!