ATmega16 + DS18B20 + LED + Matlab / Simulink = AR

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


دارة


الدوائر بسيطة للغاية. القلب هو ATmega16. جميع أجهزة استشعار DS18B20 معلقة على دبوس واحد (في حالتي ، على PB0 من منفذ PORTB). يتم سحب الدبوس نفسه إلى جهد الإمداد من خلال المقاوم 4.7 كيلو أوم. المخطط قابل للتطوير. الصورة قابلة للنقر.



يتم توصيل جميع مصابيح LED بمنفذ PORTA عبر مقاومات الإنهاء. يعني المضلع الرمادي أن مصباح LED متصل فعليًا بكاميرا DS18B20. يتم سحب دبوس إعادة الضبط عاليًا من خلال المقاوم 10 كيلو أوم لتجنب إعادة التعيين العرضي بسبب التداخل. يتم التحكم في الميكروكونترولر عند 16 ميجا هرتز كوارتز. اقترب من الاستنتاجات قدر الإمكان. تستخدم خزانات التحميل داخليا. تكوين عبر الصمامات. إخراج موصلات ICP بشكل منفصل (لتحميل البرامج الثابتة) و UART من أجل "الاتصال". السعات C1 (المنحل بالكهرباء 10 μF) و C2 (الخزف 100 nF). ضع أقرب ما يمكن من دبابيس وحدة التحكم الدقيقة. يستخدم لتجنب التفريغ العرضي أثناء نقل الحمولة.

تجميع الدائرة

ما هو المضلع الرمادي؟

البرامج الثابتة + خوارزمية العمل


تمت كتابة البرامج الثابتة في C في Atmel Studio 7 IDE. يتم نشر المصادر على جيثب . تم توثيق الرمز إلى أقصى حد.
ينقسم المشروع إلى عدة مستويات من التجريد:
  • الأجهزة - أدنى مستوى ، الحد الأقصى للربط بالأجهزة. العمل مع محيط وحدة التحكم الدقيقة.
  • الوسيطة هي الوسط بين الأجهزة والسائقين. على سبيل المثال ، تنفيذ بروتوكول 1-Wire.
  • السائقين - مستوى السائق. على سبيل المثال ، العمل مع شريحة DS18B20.
  • التطبيق - أعلى مستوى من التجريد. على سبيل المثال ، استقبال وإرسال درجة الحرارة عبر UART.

نظرة سريعة من خلال الوظيفة الرئيسية. يأتي أولاً جدول عناوين ROM. من الضروري أن يكون عنوان المستشعر المتصل فعليًا بمصباح LED صفر (المعلق على PA0 لمنفذ PORTA) في وضع الصفر ، إلخ. للحصول على ROM ، هناك وظيفة sendROMToUART . تحتاج فقط إلى تذكر أن المستشعر يجب أن يكون في الحافلة وحدها ، وإلا فسيكون هناك تصادم في العناوين.
الرئيسية
int main(void)
{	
	const uint8_t ROM[][sizeof(ROM_T)] = /* ROM array */
	{
		{0x26, 0x00, 0x00, 0x04, 0x4B, 0x15, 0x89, 0x28}, // 0
		{0x71, 0x00, 0x00, 0x04, 0x4A, 0xC0, 0x65, 0x28}, // 1
		{0xA5, 0x00, 0x00, 0x04, 0x4A, 0xCB, 0xCE, 0x28}, // 2
		{0x41, 0x00, 0x00, 0x04, 0x4A, 0xAC, 0x65, 0x28}, // 3
		{0x22, 0x00, 0x00, 0x04, 0x4B, 0x06, 0x0D, 0x28}, // 4
		{0x86, 0x00, 0x00, 0x04, 0x4A, 0xF6, 0x46, 0x28}  // 5
	};
	
	uint8_t nDevices = sizeof(ROM) / sizeof(ROM_T); /* Number of DS18B20 devices */
	
	initUART(MYUBRR); /* Initialization of UART with appropriate baudrate */
	initTimer0(); /* Initialization of Timer/counter0 */
	initLED(nDevices); /* Initialization of LEDs */
	
	{ /* DS18B20s initialization */
		uint8_t nDevices = sizeof(ROM) / sizeof(ROM_T); /* Number of DS18B20 devices */
		ROM_T *pROM = (ROM_T *)&ROM; /* Pointer to ROM array */
		
		initDQ(); /* Initialization of DQ pin */
		
		while (nDevices--) /* For all DS18B20 */
			initDS18B20(pROM++, RESOLUTION_11BIT); /* Initialization of DS18B20 with appropriate resolution */
	}
	
	sei(); /* Global enable interrupts */
	
	while (1) /* Infinite loop */
	{
		sendTemperatureToUART((ROM_T *)&ROM, nDevices); /* Execute function routine */
	}
}

التالي هو تهيئة الأجهزة الطرفية و DS-ok نفسها مع الدقة المناسبة. فترة أخذ عينات الحرارة تعتمد عليها. بالنسبة إلى 11 بتة ، تبلغ 375 مللي ثانية. في حلقة لا نهائية ، يقرأ البرنامج باستمرار درجة الحرارة من كل مستشعر ويرسلها عبر UART.

يعتمد العمل باستخدام مصابيح LED على المقاطعات. بواسطة UART ، يأتي معرف LED مرتين على التوالي في إطار متساوي وغريب. في البداية ، يضيء LED. ينطفئ الموقت بعد وقت معين (في حالتي ، 15 مللي ثانية). يتم تجاهل المرة الثانية ببساطة. تم تكوين المؤقت في وضع CTC بحيث يحدث مقاطعة مرة واحدة كل 1 مللي ثانية.
كود
volatile uint8_t ledID = 0; /* Current ledID value */
volatile uint8_t ledID_prev = 255;  /* Previous ledID value */
volatile uint8_t duration = FLASH_DURATION; /* Flash duration value */

ISR(USART_RXC_vect) /* UART interrupt handler */
{
	ledID = UDR; /* Assign ledID to receive via UART value */
	if (ledID != ledID_prev) /* If current ledID equal to previous value */
	{
		turnOnLED(ledID); /* Turn on the ledID LED */
		timer0Start(); /* Start Timer0 */
		ledID_prev = ledID; /* Previous ledID assign to current */
		duration = FLASH_DURATION; /* Update LED flash duration */
	}
}

ISR(TIMER0_COMP_vect) /* Timer0 compare interrupt handler */
{
	if (--duration == 0) /* Decrement Duration value each 1ms and if it reach to 0 */
	{
		timer0Stop(); /* Stop Timer0 */
		turnOffAllLED(); /* Turn off all LEDs */
		timer0Clear(); /* Clear Timer0 counter register */
	}
}

يتم لف أقسام الكود الحساسة للوقت ، والتي هي إشارات ذات سلك واحد ، في بنية ATOMIC_BLOCK . جميع الإعدادات الأساسية في العالم . h . تعمل UART بسرعة 250000. سريع وخالي من الأخطاء للكوارتز 16 ميجاهرتز. يحتوي برنامج التشغيل DS18B20 على الحد الأدنى من الوظائف اللازمة لهذا المشروع. الباقي - انظر الرمز. ستكون هناك أسئلة - اسأل ، لا تخجل. أود أيضًا أن أذكرك بإعدادات الصمامات. من الضروري ضبط قدرة تسجيل الوقت من الكوارتز الخارجي فيها ، وإلا فسيكون من المولد الداخلي (وهو بحد أقصى 8 ميجا هرتز وليس مستقرًا جدًا). حسنًا ، قم ببرمجة بت CKOPT ، وإلا فلن يبدأ تشغيل الكوارتز فوق 8 ميجاهرتز. لدي مصهر عالي = 0xD9 ، مصهر منخفض = 0xFF .

نموذج Simulink + خوارزمية التشغيل


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

وحدة WebCamTemp


تشير الكتل الصفراء إلى كتل منفذ COM. جهاز إرسال واستقبال وتكوين منفصل. يجب أن تتطابق إعدادات المنفذ تمامًا مع إعدادات وحدة التحكم الدقيقة (السرعة والتكافؤ وعدد البتات وما إلى ذلك). يأخذ جهاز الاستقبال درجة الحرارة عن طريق تجميعها في صفيف أحادي البعد من الحجم [n 1] من النوع int16 ، حيث n هو عدد DS18B20 (لدي 6). كل عنصر من هذه المجموعة مقسوم على 16 . هذا من ورقة البيانات في الصفحة 6. يرسل جهاز الإرسال قيمة العداد الحالية إلى العداد . إنه يضيء فقط مصباح LED معين. الانتقال من 0 إلى n. عينات الفترة 2. يتم تجميع الكتل المسؤولة عن عرض / حفظ دفق الفيديو باللون الأزرق. كتل خضراء لتلقي معلومات الفيديو. في الواقع كاميرا الويب نفسها. هناك الكثير من الإعدادات ، مختلفة ، اعتمادًا على الشركة المصنعة. يتم عرض الصورة بألوان رمادية. مثير جدا للاهتمام. تجعل كتلة Diff الفرق بين الإطارات السابقة والحالية. تسلط كتلة Downsample الفردية الضوء على الفرق المضاء فقط - وليس LED مضاء ، ولكن ليس العكس. حتى أن نموذج Downsample يحظر الإطارات فقط حيث يكون مصباح LED مطفأ.

فرق الصورة
, — . ( ). , . 0.25.



صورة رمادية
, — , . , . .



يعرض معدل عرض الإطارات FPS الحالي. جميع المعالجة في الصمامات كتلة . سننظر فيه على النحو التالي.

وحدة المصابيح


جمعت البنفسج كتل من الحصول على 2D Gaussians . نحتاج اثنين: التدخل و التعتيم . تختلف في سيجما. يقع مركزهم عند الحد الأقصى (حيث كان LED قيد التشغيل). تقع الإحداثيات في الكتلة القصوى . بدلاً من توليد مثل هؤلاء الغاوسين باستمرار (والأُس عملية رياضية تستغرق وقتًا طويلاً) ، تقرر قطعها. للقيام بذلك، في م-الملفات التي تم إنشاؤها من قبل اثنين من كثافة العمليات و أب أحجام في 2 مرات أكثر من مركز في منتصف التي، علاوة على ذلك، ببساطة خربش التواريخ، وحدات التدخل المحاصيل و المحاصيل التعتيم .

مثال العمل
— . — . — . — . 0.25.



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


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

مثال
, — 8- . ( ) .



وحدات الذاكرة


تدخل الذاكرة و التعتيم ذاكرة تخزين مجموعات من 2D التمويه، ذاكرة نقط - إحداثيات لكل LED.

تداخل الذاكرة وعتامة الذاكرة
. Address . . . Delay LEDs ( , ). . Enable . , ( Maximum Threshold LEDs). — . . [H W n], HxW — -, n — /.

نقاط الذاكرة
. . Permute Matrix , [Y X], [X Y].

لتلوين الوحدة


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


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

ملف م


يتم تنفيذه في البداية ، قبل المحاكاة ، مع إدخال المتغيرات في مساحة العمل.
كود
H = 480; % Height of image
W = 640; % Width of image
minT = 20; % Min temperature
maxT = 25; % Max temperature
sigmaInt = 40; % Sigma interference
sigmaOp = 80; % Sigma opacity
gain = 1.0; % Gain value
T = 0.3; % Threshold value
nAvr = 8; % number of means
% ------------------------------------------------------
[M,N] = meshgrid(-W:W, -H:H); % Meshgrid function

R = sqrt(M.^2 + N.^2); % Distance from the center

Int = normpdf(R, 0, sigmaInt); % 2D gaussian for interference
Op = normpdf(R, 0, sigmaOp); % 2D gaussian for opacity

Int = Int/max(max(Int)); % Normalization of interference gaussian
Op = Op/max(max(Op)); % Normalization of opacity gaussian

clear M N R sigmaInt sigmaOp % Delete unused variables from memory

load('MyColormaps','mycmap'); % Load colormap


يحتوي على متغيرات التحكم الرئيسية ومنها:
  • H — .
  • W — .
  • minT — .
  • maxT — .
  • sigmaInt — Interference.
  • sigmaOp — Opacity.
  • gain — Factor.
  • T — .
  • nAvr — .

يجب أن يتطابق H و W مع التيار في كتلة WebCamera. النعناع و maxT تؤثر على خريطة ملونة في وضع درجة الحرارة المطلقة. يتم تعيين T من 0 إلى 1. في بعض الأحيان يكون منفذ COM وكاميرا الويب خارج المزامنة. يمكن أن تتغير مرحلة الصورة التفاضلية بمقدار 180 درجة. وحيث يجب أن يكون هناك حد أقصى - هناك حد أدنى. ويمكن للنظام اختيار تنسيق تعسفي لا يتوافق مع الواقع. لهذا ، هناك نظام العتبة. nAvr هو عدد المتوسطات في المتوسط ​​المتحرك. كلما كان أكبر ، كلما كانت التحولات أكثر سلاسة ، ولكن تم فقدان الصلة (يظهر تحول زمني). لفهم تأثير المتغيرات المتبقية ، لا يمكن للمرء معرفة ذلك بدون أمثلة توضيحية.

تأثير سيجماينت
. , , . — .



تأثير SigmaOp
.



اكتساب تأثير
- . «» « » .



التجارب


فيما يلي بعض التجارب.

افتح النافذة


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



النافذة


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



هل هو أكثر دفئا على القمة؟


يقولون أن القمة أكثر دفئًا. هذه التجربة هي تأكيد كامل لذلك. في الثانية العاشرة ، تفتح النافذة ، عند الثلاثين - تغلق.



الخلاصة


لن يحل هذا المخطط محل التصوير الحراري الكامل. لكنه غير قادر على رؤية انتشار الكتل الهوائية. وبسعر أقل هذا التصميم لا يضاهى. يمكنك استخدام خريطة ألوان مختلفة فيه. يمكنك القيام بوظائف أخرى بدلاً من Gaussians. يمكنك حتى تغيير قوانين البناء. أو أعد الكتابة إلى OpenCV + QT من أجل السرعة والراحة. ولكن هذا ما تصوره - لقد حققت. فقط للمتعة فقط .

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


All Articles