ابدأ بقياس العالم من حولك من خلال هذا المشروع العملي والشامل.
الماخذ الرئيسية
- يفتقر Raspberry Pi إلى المدخلات التناظرية، ولكن يمكنك إضافة ADCs خارجية لتحويل الفولتية من العالم الحقيقي إلى شكل رقمي للتسجيل والمعالجة والتحكم.
- تتضمن خيارات ADC الشائعة MCP3004/MCP3008 لمبادلة السرعة والدقة أو ADS111x لقراءات 16 بت بمعدل عينة أبطأ.
- يعد ADS1115 من Adafruit خيارًا بسيطًا مع مضخم الكسب القابل للبرمجة (PGA) الذي يسمح لك باكتشاف اختلافات الجهد الصغيرة وضبط الكسب أثناء البرنامج. يعد توصيل الأسلاك مع Raspberry Pi باستخدام I2C أمرًا بسيطًا.
خارج الصندوق، يفتقر Raspberry Pi إلى مدخلات تناظرية. وهذا يضعها في وضع غير مؤاتٍ مقارنة باللوحات المعتمدة على المتحكم الدقيق مثل Arduino.
لكن لا تيأس: هناك الكثير من الخيارات التي يجب مراعاتها. ابدأ العمل مع Raspberry Pi وADC خارجي.
لماذا إضافة المدخلات؟
العالم الحقيقي مليء بالظواهر التي، إذا كان لديك الدوائر الصحيحة، يمكن وصفها بسهولة باستخدام الجهد. قم بتحويل هذه الفولتية إلى شكل رقمي، ويمكنك تسجيلها ومعالجتها واستخدامها للتحكم في المعلمات والأجهزة الأخرى.
ربما تتطلع إلى مراقبة رطوبة تربتك، أو درجة حرارة الدفيئة، أو وزن الهامستر. قد تتطلع إلى إضافة عنصر تحكم في مستوى الصوت إلى جهاز Pi الخاص بك، أو إنشاء بنك كامل من الخافتات، أو تصميم عصا تحكم من الصفر. الاحتمالات، أكثر أو أقل، لا حدود لها.
خيارات ADC
إذًا، ما هو ADC الأفضل للمبتدئين؟
من بين الخيارات الأكثر شعبية ومباشرة هي MCP3004 (و MCP3008) رقائق من Microchip. ستحصل على أربع (أو ثماني) قنوات كل منها 10 بت، والتي يمكنها قراءة ما يصل إلى 200 كيلو إس بي إس. ومن ناحية أخرى، هناك أجهزة ADS111x من شركة Texas Instruments، والتي تقرأ 16 بت بمعدل 860 SPS. لذلك، هناك مقايضة بين السرعة والدقة (وبطبيعة الحال، السعر).
العديد من وحدات التحكم الدقيقة تأتي مع ADCs مدمجة. ATMega الذي تجده في Arduino العادي ستقدم عدة قنوات 10 بت، بالإضافة إلى كل شيء آخر. هذا هو ما يسمح لـ Arduino بتوفير مدخلات تناظرية حيث لا يستطيع Raspberry Pi ذلك. إذا كان لديك بالفعل Arduino مشاركًا في الإعداد الخاص بك، وكانت 10 بتات كافية للدقة، فقد تكون هذه هي الطريقة الأسهل بالفعل.
هنا، سنبقي الأمر بسيطًا، مع ADS1115 من Adafruit.
ما هو مضخم الكسب القابل للبرمجة؟
تأتي هذه الشريحة مع بعض الميزات المثيرة للاهتمام، بما في ذلك مضخم الكسب القابل للبرمجة (PGA). سيتيح لك ذلك ضبط النطاق المطلوب من القيم رقميًا، وصولاً إلى جزء صغير من الفولت. مع عدد القيم التي يمكن أن تمثلها 16 بت، سيسمح لك ذلك باكتشاف الاختلافات التي لا تتجاوز بضعة ميكروفولت.
الميزة هنا هي أنه يمكنك تغيير الكسب في منتصف البرنامج. وتتخذ الرقائق الأخرى، مثل MCP3004، نهجًا مختلفًا؛ أنها تأتي مع دبوس إضافي، والذي يمكنك توفير الجهد المرجعي له.
ماذا عن تعدد الإرسال؟
معدد الإرسال (أو mux) هو مفتاح يتيح لك قراءة العديد من المدخلات باستخدام ADC واحد. إذا كانت شريحة ADC لديك تحتوي على العديد من منافذ الإدخال، فهذا يعني حدوث بعض عمليات الإرسال المتعدد الداخلية. يسمح mux الخاص بـ ADS1115 بأربعة مدخلات، والتي يمكنك تحديدها عبر السجلات الداخلية.
التعامل مع السجلات
يوفر ADS1115 هذه الخيارات، بالإضافة إلى عدد قليل من الخيارات الأخرى. يمكنك التعامل مع معدد الإرسال، وضبط الكسب، وتنشيط المقارنة المضمنة، وتغيير معدل العينة، ووضع الجهاز في وضع السكون منخفض الطاقة، كل ذلك عن طريق النقر على بعض المفاتيح.
ولكن أين تلك المفاتيح؟ إنها موجودة داخل الحزمة، على شكل أجزاء صغيرة جدًا من الذاكرة تسمى السجلات. لتنشيط ميزة معينة، ما عليك سوى تعيين البت ذي الصلة على 1، بدلاً من 0.
انظر الى ورقة بيانات ADS111xستجد أن هذه النماذج تأتي مع أربعة سجلات، بما في ذلك سجلات التكوين التي تحكم سلوك الجهاز.
على سبيل المثال، تتحكم البتات من 14 إلى 12 في معدد الإرسال. باستخدام هذه البتات الثلاث، يمكنك الاختيار من بين ثمانية تكوينات. الرقم الذي تريده هنا هو "100"، والذي سيعطي الفرق بين الإدخال صفر والأرض. ومن ناحية أخرى، تتحكم البتات من 7 إلى 5 في معدل العينة. إذا كنت تريد الحد الأقصى وهو 860 عينة في الثانية، فيمكنك ضبطها على "111".
بمجرد معرفة الخيارات التي تريد تعيينها، سيكون لديك وحدتي بايت لإرسالهما إلى ADC. إذا أردت لاحقًا تعيين بت واحد هنا أو هناك، فيمكنك التعامل معهم بشكل فردي باستخدام معاملات البت.
هنا قد يكون الأمر مربكًا. في هذه الحالة، لا يمثل الثنائي قيمة، بل يمثل قيم المحولات الفردية. يمكنك التعبير عن هذه المتغيرات كرقم واحد كبير، بالنظام العشري أو بالنظام الست عشري. ولكن إذا كنت تريد تجنب الصداع، فيجب عليك الالتزام بالإصدار الثنائي، وهو أسهل في القراءة.
توصيل الأسلاك
يمكنك توصيل هذا الجهاز مباشرة باللوحة. سوف يقبل مدخلات الجهد الموجب ما بين 2 إلى 5.5 فولت، مما يعني أن السكة 3.3 فولت الموجودة على Raspberry Pi ستعمل بشكل جيد.
قم بتوصيل مدخلات SDA وSCL إلى نظيراتها على RPi، وقم بنفس الأشياء مع الأرض و3.3 فولت. احصل على مقياس الجهد بين خطوط الأرض والجهد، ثم ضع السلك الأوسط في المدخل الأول لـ ADC. هذا كل ما تحتاجه للبدء!
التعامل مع I2C
تعمل ADCs المختلفة عبر بروتوكولات مختلفة. في حالة ADS1115 لدينا، سنستخدم I2C.
سوف يتفاعل المثال التالي مع ADC باستخدام Python. ولكن قبل أن تفعل ذلك، سوف تحتاج إلى إعداده. لقد جعلت الإصدارات الأخيرة من Raspberry Pi OS هذا الأمر بسيطًا للغاية. رئيس ل التفضيلات> تكوين Raspberry Pi. ثم من واجهات علامة التبويب، التبديل I2C على.
للتحقق من أن كل شيء يعمل، افتح الوحدة الطرفية وقم بتشغيل:
sudo i2cdetect -y 1
سيؤدي هذا الأمر إلى إخراج شبكة. على افتراض أن كل شيء يعمل، وقمت بتوصيله بشكل صحيح، سترى قيمة جديدة تظهر في الشبكة. هذا هو عنوان ADC الخاص بك. ضع في اعتبارك هنا أنها قيمة سداسية عشرية، لذا عليك أن تبدأها بـ "0x" عند استخدامه في الكود أدناه. هذا هو 0x48:
بمجرد حصولك على العنوان، يمكنك استخدام مكتبة SMBus لإرسال أوامر I2C. سوف تتعامل مع طريقتين هنا. الأول هو write_word_data()، والذي يقبل ثلاث وسائط: عنوان الجهاز، والسجل الذي تكتب إليه، والقيمة التي تريد كتابتها.
والثاني هو read_word_data()، والذي يقبل فقط عنوان الجهاز والتسجيل. سوف يقوم ADC بقراءة الفولتية بشكل مستمر وتخزين النتيجة في سجل التحويل. باستخدام هذه الطريقة، يمكنك استرداد محتويات هذا السجل.
يمكنك تجميل النتيجة قليلاً، ومن ثم طباعتها. قبل العودة إلى بداية الحلقة، قم بإجراء مهلة قصيرة. سيضمن هذا عدم إرهاقك بالبيانات.
from smbus import SMBus
import time
addr = 0x48
bus = SMBus(1)# set the registers for reading
CONFIGREG = 1
CONVERSIONREG = 0# set the address register to point to the config register
# write to the config registers
bus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010))# define the top of the range
TOP = 26300whileTrue:
# read the register
b = bus.read_word_data(addr, CONVERSIONREG)# swap the two bytes
b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF)
# subtract half the range to set ground to zero
b -= 0x8000# divide the result by the range to give us a value between zero and one
b /= TOP# cap at one
b = min(b, 1)# bottom is zero
b = max(b, 0)
# two decimal places
b = round(b, 2)
print(b)
time.sleep(.01)
أنت على وشك الانتهاء. قم بتعيين نطاق القيم التي تحصل عليها إلى القيمة التي تفضلها، ثم قم باقتطاعها إلى العدد المطلوب من المنازل العشرية. يمكنك تخصيص وظيفة الطباعة بحيث لا تطبع قيمة جديدة إلا عندما تكون مختلفة عن القيمة الأخيرة. إذا كنت غير متأكد الأعلى, دقيقة، و دائري، أنت تستطيع تحقق من قائمتنا التي تضم أهم 20 وظيفة في لغة بايثون!
التعامل مع الضوضاء
الآن، ما لم يكن الإعداد الخاص بك رائعًا وأنيقًا ومرتبًا للغاية، ستلاحظ بعض الضوضاء. هذا هو الجانب السلبي المتأصل في استخدام 16 بت بدلاً من عشرة بتات فقط: هذا القدر الضئيل من الضوضاء سيكون أكثر وضوحًا.
من خلال ربط الإدخال المجاور (الإدخال 1) بالأرض، وتبديل الوضع بحيث تقارن المدخلين الأول والثاني، يمكنك الحصول على نتائج أكثر استقرارًا. يمكنك أيضًا استبدال كابلات التوصيل الطويلة التي تجمع الضوضاء بأخرى صغيرة، وإضافة عدد قليل من المكثفات أثناء وجودك فيها. يمكن لقيمة مقياس الجهد الخاص بك أن تحدث فرقًا أيضًا.
هناك أيضًا خيارات برمجية. يمكنك إنشاء متوسط متداول، أو ببساطة تجاهل التغييرات الصغيرة. الجانب السلبي هو أن الكود الإضافي سيفرض تكلفة حسابية. إذا كنت تكتب عبارات شرطية بلغة عالية المستوى مثل بايثون، وتأخذ آلاف العينات كل ثانية، فسوف تتضاعف هذه التكاليف بسرعة.
المضي قدمًا مع العديد من الخطوات التالية المحتملة
يعد أخذ القراءات عبر I2C أمرًا بسيطًا جدًا وينطبق الشيء نفسه إلى حد كبير على الطرق الأخرى، مثل SPI. على الرغم من أنه قد يبدو أن هناك اختلافات كبيرة بين خيارات ADC المتاحة، إلا أن الحقيقة هي أنه بمجرد تشغيل أحدها، فمن السهل تطبيق المعرفة على الخيارات الأخرى.
فلماذا لا نأخذ الأمور إلى أبعد من ذلك؟ اربط عدة مقاييس جهد معًا، أو حاول قراءة الضوء أو الصوت أو درجة الحرارة. قم بتوسيع وحدة التحكم التي قمت بإنشائها للتو، وقم بإنشاء إعداد Raspberry Pi الذي يعد عمليًا حقًا!