الجمعة، 12 نوفمبر 2021

كاميرا حرارية تعمل بالذكاء الاصطناعي للتخييم الآمن

 يمكن لنموذج TinyML الذي يقوم بتشغيل Wio Terminal تحديد ما إذا كان الحيوان أو الإنسان يقترب حتى في الظلام وتنبيه المعسكر.




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


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

Arduino Software (IDE)

Edge Impulse

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

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

الحل هو العربة
تقديم العربة المجهزة بكاميرا Grove MLX90640 IR الحرارية ومحطة Wio من Seeed. يتنبأ نموذج tinyML يعمل على محطة Wio إذا كان هناك أي حيوان أو إنسان يقترب. إذا تم الكشف عنها ، يتم إرسال البيانات إلى موضوع AWS IoT.







لقد قمت ببناء نموذج ML باستخدام Edge Impulse Studio. اعتبارًا من كتابة هذا المشروع (نوفمبر 2021) ، لا يدعم EI تغذية الكاميرا الحرارية لجمع البيانات خارج الصندوق ، لذلك يتم جمع البيانات من محطة Wio وإعادة توجيهها إلى Edge Impulse لبناء النموذج. عملية جمع البيانات مستوحاة من مشروع نافين على الهاكر.

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


جمع البيانات
تحمل الكاميرا الحرارية بالأشعة تحت الحمراء مجموعة 32x24 من المستشعرات الحرارية (MLX90640) ، ويمكنها الكشف عن درجة حرارة الأشياء من على بعد أقدام بدقة ± 1.5 ℃. من أجل الحصول على الصورة الحرارية بسهولة ، يتم استخدام بروتوكول I2C للحصول على صورة منخفضة الدقة من الكاميرا. ستكون البيانات عبارة عن مصفوفة من 32 × 24 وهي 768 قيمة درجة حرارة. MLX90640 متصل بمحطة Wio عبر منفذ I2C وقد أدخلت بطاقة SD لالتقاط القراءات في ملف CSV. تُستخدم الأزرار الثلاثة الموجودة على Wio Terminal لتسمية الفئات الثلاثة

أ- الحيوان ، ب- الإنسان ، ج- الخلفية

استخدم البرنامج WIO_Camper_Data_Collector.ino لجمع البيانات. قم بتحميل هذا البرنامج وابدأ في جمع البيانات.

بعد جمع البيانات ، قم بإزالة بطاقة SD من Wio Terminal وإدخالها في جهاز الكمبيوتر الخاص بك. يجب أن تشاهد ملفات CVS على النحو التالي.


يحتوي ملف ach على 768 قيمة مفصولة بفواصل.



انسخ جميع الملفات إلى الدليل المسمى خام ضمن بيانات المجلد. ثم قم بتشغيل برنامج imager.py الذي سينشئ عرضًا مرئيًا للبيانات ضمن مجلد / data / visual.

python3 imager.py


هذه الخطوة اختيارية. يساعدك على عرض بيانات csv بتنسيق صورة ولكن لا علاقة له بتدريب النموذج.


إعادة توجيه البيانات
هذا حقا جزء مثير للاهتمام. يدعم معيد توجيه البيانات Edge Impulse البيانات الأولية للسلاسل الزمنية فقط. لكن بيانات الكاميرا الحرارية ليست سلسلة زمنية. بدلاً من ذلك ، فهي عبارة عن مصفوفة من 32 × 24 بها 768 قيمة منفصلة. سننظر في هذا على أنه بيانات سلسلة زمنية 768 أحادية القناة بفاصل 1 ميكروثانية. ستساعدك الصورة أدناه على تصور ما أتحدث عنه



ستلاحظ أن صورة واحدة (768 قيمة) يتم تمثيلها على أنها بيانات سلسلة زمنية بفاصل 1 مللي ثانية. أنت تعرف الآن كيف نريد تنسيق بياناتنا قبل تحميلها إلى Edge Impulse. لنفعلها اذا.

افتح data-formatter.py والصق مفتاح HMAC الذي حصلت عليه مسبقًا. ثم قم بتشغيل البرنامج.
python3 data-formatter.py

سيقوم هذا البرنامج بإنشاء ملف json لكل ملف من ملفات cvs وتخزينها في مجلد / data / formatted_data. يمكنك أن ترى أدناه أن القيم يتم تمثيلها على أنها بيانات سلاسل زمنية بفاصل زمني قدره 1 ثانية. فقط قناة بيانات المستشعر هي درجة الحرارة.


نظرًا لأنك أعددت البيانات ، سنستخدم Edge Impulse CLI لتحميل البيانات. تحتاج إلى تثبيت CLI. اتبع هذا البرنامج التعليمي لإعداد CLI.

القرص المضغوط في مجلد formatted_data وتنفيذ الأمر أدناه.
edge-impulse-uploader --category split *.json
يجب أن يؤدي هذا إلى تحميل جميع بيانات json إلى مشروع Edge Impulse الخاص بك ضمن صفحة "الحصول على البيانات".


بناء النموذج

نظرًا لأننا قمنا بجمع البيانات ، فلنقم ببناء نموذجنا وتدريبه. انتقل إلى صفحة "إنشاء الدافع".


انقر فوق "إضافة كتلة إدخال" ، اختر "بيانات السلاسل الزمنية". قم بتعيين كل من حجم النافذة وحجم زيادة النافذة على 768 مللي ثانية. هل تتذكر أن بيانات json الخاصة بنا تحتوي على 768 قيمة بفاصل 1 مللي ثانية؟

بعد ذلك ، انقر فوق "إضافة كتلة معالجة" ، واختر "بيانات أولية".

ثم ، انقر فوق "إضافة كتلة تعلم" ، واختر التصنيف (Keras) واحفظ الدافع.


انتقل إلى صفحة "البيانات الأولية" ، واحتفظ بالإعدادات الافتراضية وانتقل إلى "NN Classifier" ، واضبط دورة التدريب ومعدل التعلم. حاول ألا تفرط في النموذج. إذا كان نموذجك لا يعمل بشكل جيد ، فحاول جمع المزيد من البيانات وإعادة التدريب.

قم بتنزيل مكتبة Arduino
انتقل إلى صفحة "النشر" ، واختر "Arduino" وابني. سيؤدي هذا إلى تنزيل المكتبة كملف مضغوط. قم باستيراد هذه المكتبة إلى Arduino IDE. أفترض أن اسم مشروعك هو "camper" وأن ملف مكتبة arduino الخاص بك يجب أن يكون camper_inferencing.h



قم بإعداد AWS IoT
في المرحلة الأولى من هذا المشروع ، أقوم بإرسال البيانات إلى AWS IoT باستخدام اتصال WiFi. لجعل محطة Wio متصلة بشبكة wifi ، تحتاج إلى تحديث البرامج الثابتة للجهاز. العملية بسيطة للغاية. اتبع هذه التعليمات.

للاتصال بـ AWS ، تحتاج إلى إنشاء "شيء" والاتصال بـ "الشيء" باستخدام الشهادات. كتب Seeed studio برنامج بيثون فائدة سيخلق جميع الموارد من أجلك. اتبع هذا. لدي مشروع آخر شرحت فيه إعداد AWS. يمكنك الرجوع إلى هذا المشروع.

سيخرج create_thing.py الشهادة والمفتاح الخاص على الجهاز. انسخها والصقها في ملف cogfig.h.
#ifndef _CONFIG_H_
#define _CONFIG_H_

// TODO ADD YOUR CONFIGURATION HERE
// WiFi and MQTT configuration
static auto constexpr WIFI_SSID = "";
static auto constexpr WIFI_PASSWORD = "";

// DHCP client id
static auto constexpr CLIENT_ID = "CLIENTID";
// hostname of your MQTT ATS endpoint
static auto constexpr HOST_ADDRESS = "xxxxxxx-ats.iot.us-east-1.amazonaws.com";

static auto constexpr TOPIC_NAME = "camper";
static auto constexpr ALERT_TOPIC_NAME = "camper_alerts";

// "AWS root CA1 and CA2 (RSA)", see
// https://docs.aws.amazon.com/iot/latest/developerguide/managing-device-certs.html#server-authentication

static auto constexpr aws_root_ca_pem = "CA_Root_Certificate";

// certificate and private key for the thing. See README.md for details
// and use the create_thing.py script to create certificate and key.
// "The certificate for this thing"
auto constexpr certificate_pem_crt = "";
auto constexpr private_pem_key= "";
#endif
تحتاج أيضًا إلى إدخال بيانات اعتماد wifi وعنوان مضيف AWS IoT. بعد إجراء التغيير ، قم بتحميل برنامج WIO_Camper_Inference.ino إلى محطة wio.

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


نظرًا لوجود البيانات في AWS ، يمكنك فعل الكثير من هنا. مثل إرسال البيانات إلى dynamodb ، قم بتشغيل بعض التحليلات ، واستخدم Amazon Pinpoint لإرسال إشعار الدفع إلى الهاتف المحمول ، وإرسال رسالة نصية إلى هاتفك.

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

بدلاً من إرسال محطة wio للبيانات مباشرة إلى AWS ، يمكنني إنشاء تطبيق جوال يتصل بمحطة Wio عبر البلوتوث وإرسال البيانات إلى تطبيق الهاتف المحمول. سيقوم تطبيق الهاتف المحمول بعد ذلك بإرسال البيانات إلى AWS باستخدام cognito. لقد فعلت شيئًا مشابهًا في مشروع صديقي.
يمكنني إزالة تبعية wifi أو الاتصال الخلوي تمامًا وإرسال البيانات إلى شبكة LoRa (TTN أو Helium) مباشرةً من الجهاز. ستقوم TTN أو Helium بتفويض الرسالة إلى AWS IoT. لقد أنجزت مشروعًا مشابهًا من قبل





الجمعة، 1 أكتوبر 2021

Arduino تتعاون مع Bosch من أجل لوحة Nicla Sense ME ذات الحواف المعبأة بمستشعرات الذكاء الاصطناعي

 الأحدث في مجموعة Arduino Pro ، تقدم Nicla Sense ME عامل شكل جديدًا بالكامل مع تسريع الذكاء الاصطناعي المتطور.


أطلقت Arduino إدخالًا جديدًا في مجموعة Arduino Pro المصممة للتصنيع ، وهي تجلب معها عامل شكل جديدًا بالكامل: Nicla Sense ME ، الذي تم إنشاؤه بالشراكة مع Bosch.

تم تصميم Arduino Nicla Sense ME ليكون متوافقًا مع كل من ألواح التجارب والتثبيت على السطح على لوحة الناقل ، وقد تم تصميمه حول وحدة Bluetooth ANNA-B112 التي تتميز بنظام Nordic Semi nRF52832 على شريحة مع 64MHz Arm Cortex-M4F متحكم دقيق ، 64 كيلو بايت من ذاكرة الوصول العشوائي الثابتة (SRAM) ، 512 كيلو بايت من وحدة تخزين فلاش بالإضافة إلى 2 ميجا بايت خارجي ، وبلوتوث 5.0 - على الرغم من ذلك ، عند الإطلاق ، سيقتصر أولئك الذين يستخدمون مكدس برامج ArduinoBLE على Bluetooth 4.2.




على جانب الإدخال / الإخراج للأغراض العامة ، تحتوي اللوحة على 17 دبوسًا مصبوبًا لإخراج مدخلين تناظريين وواحد من حافلي SPI و I2C الموجودين على SoC. ومع ذلك ، فإن الشراكة مع Bosch تعني أن العديد من وظائف الاستشعار المشتركة مبنية مباشرة على اللوحة بفضل تكامل العديد من مستشعرات Bosch Sensortec - بما في ذلك المستشعر الذكي BHI260 ، الذي يحزم معالج Synopsys DesignWare ARC EM4 الذي يهدف إلى عمل AI المتطور ، وحدة تحكم micro-DMA بأربع قنوات ووحدة تحكم في ذاكرة التخزين المؤقت ذات اتجاهين ، ووحدة قياس بالقصور الذاتي ذات ستة محاور (IMU) مع مقياس تسارع وجيروسكوب.

علاوة على ذلك ، توفر Bosch للوحة مقياس درجة حرارة BME688 ، ورطوبة ، وضغط ، ومستشعر "eNose" للمركب العضوي المتطاير (VOC) ، ومستشعر ضغط عالي الدقة BMP390 ، ومقياس مغناطيسي ثلاثي المحاور BMM150. تنتهي مجموعة ميزات اللوحة بمصباح RGB LED يمكن للمستخدم توجيهه ، ومنفذ micro-USB للبيانات والطاقة ، وموصل لبطارية ليثيوم اختيارية ، بالإضافة إلى "زعانف" مصممة لتوفير وصول تصحيح الأخطاء إلى أجهزة الاستشعار المختلفة.




عامل الشكل نيكلا الجديد هو الأكثر إحكاما من Arduino حتى الآن ، حيث يبلغ قياسه 22.85 × 22.86 ملم فقط (حوالي 0.9 × 0.9 بوصة) باستثناء موصل micro-USB البارز. ألمحت الشركة أيضًا إلى أن Nicla Sense ME هو الأول فقط في عائلة Nicla ، لكنها لم تعلن بعد عن الجهاز التالي في النطاق.

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







السبت، 24 أبريل 2021

التحكم في الاتجاه لمحرك DC عبر البلوتوث

 تحكم في سرعة واتجاه محرك التيار المستمر عبر البلوتوث من خلال تطبيق جوال.





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

اردوينو UNO

وحدة بلوتوث HC-06
يمكن استخدام وحدة HC-05 Bluetooth أيضًا
محركات تكساس إنسترومنتس المزدوجة H-Bridge L293D
محرك DC ، 12 فولت

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

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

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

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

الأجزاء المطلوبة
سوف تحتاج:

اردوينو أونو أو نانو ؛
وحدة Bluetooth منخفضة الطاقة (BLE) ، مثل HC-06 وهو تابع فقط ، أو HC-05 الذي يمكن أن يكون سيدًا أو عبدًا. كلاهما سيعمل لأنه سيتم استخدام الوحدة كعبد. كما أنها تشترك في نفس الدبابيس الأربعة الوسطى ، وهي الوحيدة التي نحتاجها ؛





محرك L293D IC سائق. سيسمح لنا محرك الجسر H المزدوج ذو 16 سنًا بالتحكم في اتجاه الدوران وسرعة المحرك ؛




محرك 12V DC ؛
حزمة بطارية 12 فولت ؛
مصدر طاقة لاردوينو ؛
أسلاك توصيل ولوح.

الدائرة
ستتلقى HC-06 بيانات تسلسلية عند إرسالها من جهاز البلوتوث الرئيسي ، والتي سيتم توصيلها إلى Arduino من خلال دبابيس الاستلام / الإرسال ، RX / TX ، المتصلة بالدبابيس 5 و 4 من اللوحة. سيتم توصيل دبابيس GND و VCC على التوالي بـ GND و + 5V.

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





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

لتمكين المحرك ، قم بتوصيل "Enable 1، 2" (pin1) و "Vcc1" (pin 16) to + 5V. قم بتوصيل "Vcc2" (دبوس 8) بإيجابية حزمة بطارية 12V. قم بتوصيل المسامير 4 و 5 و 12 و 13 بـ GND. قم بتوصيل "الإدخال 1" (الطرف 2) بالدبوس 10 من Arduino ، والذي سينقل إشارة pwm2 ، و "الإدخال 2" (الطرف 7) إلى الطرف 9 ، لـ pwm1. سيتيح لنا التبديل بين هذين الاتجاهين تبديل اتجاه الدوران. أخيرًا ، قم بتوصيل محرك التيار المستمر بالمخرجات 1 و 2 (الدبابيس 3 و 6).





إليك صورة لما يجب أن تبدو عليه عند توصيلها بلوح التجارب






البرنامج
تمت إضافة التعليقات للمساعدة في شرح الكود ، ولكن قد تكون هناك حاجة لمزيد من التوضيح.

pwm1 و pwm2 متضادان ، ويسمحان لنا بتبديل اتجاه الدوران. البيانات التسلسلية التي يرسلها التطبيق عبارة عن سلسلة ، c ، حيث ستكون بيانات السرعة والاتجاه. لإنجاز هذا العمل ، توجد السرعة في c [1] و c [2] و c [3] من السلسلة ، ولهذا السبب يجب استلامها كرقم مكون من 3 أرقام. لهذا السبب في التطبيق ، نقوم بتخصيص شريط التمرير لإرسال رقم بين 100 و 255. ويمكن بعد ذلك تعيين هذا على [0: 255] في Arduino تحت متغير سرعة جديد مثل:

new_speed = map(speed_value,100,255,0,255) 
ومع ذلك ، قررنا ببساطة طرح 100 من speed_value ، بحيث تنتمي السرعة إلى الفاصل الزمني [0: 155] ، حيث أن 155 كانت سريعة بما يكفي لنموذجنا الأولي.


#include<SoftwareSerial.h>
SoftwareSerial bt_ser(4,5); //connected to RX and TX pins for serial data communication
char c[6];
int i=0,speed_value=0,send_value;
#define pwm1 9 //input 2
#define pwm2 10 //input 1
boolean motor_dir = 0;
void setup()
{
Serial.begin(9600);
bt_ser.begin(9600);
pinMode(pwm1, OUTPUT);
pinMode(pwm2, OUTPUT);
}
void loop()
{
while(bt_ser.available()) //when data is transmitted
{
if(bt_ser.available()>0)
{
c[i] = bt_ser.read(); //reading the string sent from master device
Serial.print(c[i]);
i++;
}
if(c[i-1]=='N') //if button is pressed
{
motor_dir = !motor_dir; //toggle direction variable
if(motor_dir) //setting direction, pwm1 and pwm2 are opposites
digitalWrite(pwm2, 0);
else
digitalWrite(pwm1, 0);
}
}
speed_value = (c[1]-48)*100+(c[2]-48)*10+(c[3]-48)*1; //interpreting speed from string
if(motor_dir) //for a given direction
{
if(c[i-1]=='#'){ //if data has been transmitted from slider
analogWrite(pwm1, speed_value-100); //-100 so that when slider is on "0" speed is 0
i=0;
}
}
else{ //for opposite direction
if(c[i-1]=='#'){
analogWrite(pwm2, speed_value-100);
i=0;
}
}
}




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



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

يجب تحرير شريط التمرير على النحو التالي:

الحد الأدنى للقيمة: 100
القيمة القصوى: 255
إرسال سلسلة عند تغيير شريط التمرير
السلسلة تبدأ بـ: *
السلسلة تنتهي بـ: #
يجب تحرير الزر على هذا النحو (اترك النص فارغًا):

نص صحفي: ن
تحرير النص:
يمكنك بعد ذلك إضافة نص لتوضيح لوحة القيادة.

المخططات





#include<SoftwareSerial.h>
SoftwareSerial bt_ser(4,5); //connected to RX and TX pins for serial data communication
char c[6];
int i=0,speed_value=0,send_value;

#define pwm1     9   //input 2
#define pwm2    10   //input 1
 
boolean motor_dir = 0;

void setup()
{
  Serial.begin(9600);
  bt_ser.begin(9600);
  pinMode(pwm1,   OUTPUT);
  pinMode(pwm2,   OUTPUT);
}

void loop()
{
  
   while(bt_ser.available())   //when data is transmitted
     {
       if(bt_ser.available()>0)
       {
         c[i] = bt_ser.read();   //reading the string sent from master device
         Serial.print(c[i]); 
         i++;  
       }
       if(c[i-1]=='N')    //if button is pressed
        {
          motor_dir = !motor_dir;     //toggle direction variable
          if(motor_dir)               //setting direction, pwm1 and pwm2 are opposites
            digitalWrite(pwm2, 0);
          else
            digitalWrite(pwm1, 0); 
        }
      }
       
       speed_value = (c[1]-48)*100+(c[2]-48)*10+(c[3]-48)*1;  //interpreting speed from string
       if(motor_dir)   //for a given direction
          {
            if(c[i-1]=='#'){   //if data has been transmitted from slider
              
              analogWrite(pwm1, speed_value-100);  //-100 so that when slider is on "0" speed is 0
              i=0;
            }
          }
        else{       //for opposite direction
          if(c[i-1]=='#'){
            
            analogWrite(pwm2, speed_value-100);
            i=0;
          }
          
        }
            
                
}