ATmega16 + DS18B20 + LED + Matlab / Simulink = AR

J'ai pensé à jouer avec les capteurs DS18B20 . Oui, non seulement pour obtenir les valeurs de température (ce que tout le monde peut faire), mais aussi pour les visualiser. Il y avait une idée simple. Nous avons mis la webcam. Nous allumons la lumiÚre sur un cadre pair, sur un cadre impair nous l'éteignons. Soustrayez l'image - il ne reste que le flash. Sur celui-ci, nous recherchons l'emplacement du capteur, qui est physiquement attaché à la LED dans l'espace. Et puis le traitement mathématique. Eh bien, tout cela dans simulinka. Sous katom, il est décrit comment recevoir de belles images. Et pour ceux qui ne veulent pas comprendre, je suggÚre de regarder les expériences à la fin de l'article.


Circuits


Le circuit est extrĂȘmement simple. Le cƓur est l'ATmega16. Tous les capteurs DS18B20 sont accrochĂ©s Ă  une broche (dans mon cas, sur PB0 du port PORTB). La broche elle-mĂȘme est tirĂ©e Ă  la tension d'alimentation via une rĂ©sistance de 4,7 kΩ. Le schĂ©ma est Ă©volutif. L'image est cliquable.



Toutes les LED sont connectĂ©es au port PORTA via des rĂ©sistances de terminaison. Un polygone gris signifie que cette LED est physiquement connectĂ©e au DS18B20. La broche de rĂ©initialisation est tirĂ©e haut Ă  travers une rĂ©sistance de 10 kΩ pour Ă©viter une rĂ©initialisation accidentelle due Ă  des interfĂ©rences. Le microcontrĂŽleur est cadencĂ© Ă  quartz 16 MHz. Mettez le plus prĂšs possible des conclusions. Les rĂ©servoirs de charge sont utilisĂ©s en interne. ConfigurĂ© via un fusible. Connecter sĂ©parĂ©ment les connecteurs ICP (pour tĂ©lĂ©charger le firmware) et UART pour la "communication". CapacitĂ©s C1 (Ă©lectrolyte 10 ÎŒF) et C2 (cĂ©ramique 100 nF). Rapprochez-vous le plus possible des broches d'alimentation du microcontrĂŽleur. UtilisĂ© pour Ă©viter les dĂ©charges accidentelles pendant le transfert de charge.

Ensemble de circuits

Qu'est-ce qu'un polygone gris?

Firmware + algorithme de travail


Le firmware a été écrit en C dans Atmel Studio 7 IDE. Les sources sont publiées sur GitHub . Le code est documenté au maximum.
Le projet est divisé en plusieurs niveaux d'abstraction:
  • MatĂ©riel - niveau le plus bas, liaison maximale au matĂ©riel. Travaillez avec la pĂ©riphĂ©rie du microcontrĂŽleur.
  • Le middleware est le juste milieu entre le matĂ©riel et les pilotes. Par exemple, la mise en Ɠuvre du protocole 1-Wire.
  • Pilotes - niveau pilote. Par exemple, travailler avec la puce DS18B20.
  • Application - le plus haut niveau d'abstraction. Par exemple, recevoir et transmettre la tempĂ©rature via UART.

Un coup d'Ɠil rapide sur la fonction principale. Vient d'abord le tableau des adresses ROM. Il est nĂ©cessaire que l'adresse du capteur physiquement connectĂ©e Ă  la LED zĂ©ro (accrochĂ©e au PA0 du port PORTA) soit en position zĂ©ro, etc. Pour obtenir la ROM, il existe une fonction sendROMToUART . Vous devez juste vous rappeler que le capteur doit ĂȘtre sur le bus seul, sinon il y aura une collision d'adresses.
principal
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 */
	}
}

Vient ensuite l'initialisation des pĂ©riphĂ©riques et du DS-ok eux-mĂȘmes avec la rĂ©solution appropriĂ©e. La pĂ©riode d'Ă©chantillonnage de la tempĂ©rature en dĂ©pend. Pour 11 bits, cela correspond Ă  375 ms. Dans une boucle infinie, le programme lit en continu la tempĂ©rature de chaque capteur et l'envoie via UART.

Le travail avec les LED est basé sur des interruptions. Par UART, l'ID LED vient 2 fois de suite sur un cadre pair et impair. Au début, la LED s'allume. La minuterie s'éteint aprÚs un certain temps (dans mon cas, 15 ms). La deuxiÚme fois est simplement ignorée. Le temporisateur est configuré en mode CTC de sorte qu'une interruption se produit toutes les 1 ms.
code
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 */
	}
}

Les sections de code sensibles au temps, qui sont des signaux 1-Wire, sont enveloppées dans une construction ATOMIC_BLOCK . Tous les paramÚtres de base sont définis dans global.h . L'UART fonctionne à une vitesse de 250 000. Rapide et sans erreur pour le quartz 16 MHz. Le pilote DS18B20 dispose des fonctionnalités minimales nécessaires à ce projet. Le reste - voir le code. Il y aura des questions - demandez, ne soyez pas timide. Je voudrais également vous rappeler les réglages des fusibles. Ils doivent régler la capacité de synchronisation à partir du quartz externe, sinon ce sera du générateur interne (et il est à un maximum de 8 MHz et pas trÚs stable). Eh bien, programmez le bit CKOPT, sinon le quartz au-dessus de 8 MHz ne démarre pas. J'ai un fusible haut = 0xD9 , un fusible bas = 0xFF .

ModĂšle Simulink + algorithme de fonctionnement


Version de Matlab R2015b . En plus de la bibliothÚque intégrée, Simulink a principalement utilisé la boßte à outils du systÚme de vision par ordinateur et la boßte à outils d'acquisition d'images . Le modÚle complet et les fichiers associés sont téléchargés sur GitHub . Vous trouverez ci-dessous une description détaillée avec des exemples illustratifs. Toutes les photos sont cliquables.

Module WebCamTemp


Les blocs jaunes indiquent les blocs de port COM. Émetteur, rĂ©cepteur et configurateur sĂ©parĂ©s. Les paramĂštres du port doivent correspondre exactement Ă  ceux du microcontrĂŽleur (vitesse, paritĂ©, nombre de bits, etc.). Le rĂ©cepteur prend la tempĂ©rature en la regroupant dans un tableau unidimensionnel de taille [n 1] de type int16 , oĂč n est le nombre de DS18B20 (j'en ai 6). Chaque Ă©lĂ©ment de ce tableau est divisĂ© par 16 . Cela provient de la fiche technique Ă  la page 6. L'Ă©metteur envoie la valeur actuelle du compteur au compteur . Il allume simplement une LED particuliĂšre. Cochez de 0 Ă  n. Échantillons de la pĂ©riode 2. Les blocs responsables de l'affichage / sauvegarde du flux vidĂ©o sont regroupĂ©s en bleu. Vert - blocs pour recevoir des informations vidĂ©o. En fait, la webcam elle-mĂȘme. Il existe de nombreux paramĂštres, diffĂ©rents selon le fabricant. L'image est affichĂ©e dans des tons gris. Tellement intĂ©ressant. Le bloc Diff fait la diffĂ©rence entre les images prĂ©cĂ©dentes et actuelles. Le bloc impair du sous-Ă©chantillon ne met en Ă©vidence que la diffĂ©rence allumĂ©e - pas une LED allumĂ©e, mais pas l'inverse. Le bloc Downsample mĂȘme ne saute que les images oĂč la LED est Ă©teinte.

Img diff
, — . ( ). , . 0.25.



Img gris
, — , . , . .



L'affichage de la fréquence d'images affiche le FPS actuel. Tout le traitement est dans les LED de bloc . Nous allons l'examiner comme suit.

Module LEDs


Violet a regroupĂ© des blocs d'obtention de gaussiens 2D . Nous en avons besoin de deux: l' interfĂ©rence et l' opacitĂ© . Ils diffĂšrent par leur sigma. Leur centre est au point maximum (oĂč la LED Ă©tait allumĂ©e). Les coordonnĂ©es sont situĂ©es dans le bloc Maximum . Au lieu de gĂ©nĂ©rer constamment de tels gaussiens (et l'exposant est une opĂ©ration mathĂ©matique trĂšs longue), il a Ă©tĂ© dĂ©cidĂ© de les supprimer. Pour ce faire, dans le m-fichier gĂ©nĂ©rĂ© par deux Int et Op tailles en 2 fois plus que le centre au milieu duquel, plus loin, griffonnĂ© simplement les dates, les unitĂ©s interfĂ©rence des cultures et la culture de l'opacitĂ© .

Exemple de travail
— . — . — . — . 0.25.



Les blocs de mémoire sont entourés de vert. Leur but est de stocker les coordonnées et les gaussiennes pour chaque LED. Nous considérons plus en détail ci-dessous. Le bloc de couleur To est destiné à créer une distribution de température et une carte de couleurs. Sera également discuté ci-dessous. unité de composition de signal Compositing mélanges des deux images Image1 et Image2 de la maniÚre suivante:


Le bloc InsĂ©rer du texte impose du texte formatĂ© (dans ce cas, la tempĂ©rature) Ă  l'image. Il accepte n variables et coordonnĂ©es au format [XY] . Vous pouvez sĂ©lectionner la police et sa taille. Les blocs Ă  l'intĂ©rieur du rectangle rouge implĂ©mentent l'algorithme de moyenne mobile . Les transitions deviennent moins nerveuses, ce qui prĂ©serve les nerfs et plaĂźt Ă  l'Ɠil.

Exemple
, — 8- . ( ) .



Modules de mémoire


Les interférences de mémoire et l' opacité de la mémoire stockent des ensembles gaussiens 2D, des points de mémoire - coordonnées pour chaque LED.

Interférence mémoire et opacité mémoire
. Address . . . Delay LEDs ( , ). . Enable . , ( Maximum Threshold LEDs). — . . [H W n], HxW — -, n — /.

Points mémoire
. . Permute Matrix , [Y X], [X Y].

Pour colorier le module


Vert - Traitement de l' opacitĂ© . RĂ©sumez le tableau d'entrĂ©e dans la troisiĂšme dimension. Nous le normalisons au maximum. Multipliez par la valeur de gain (de 0 Ă  1) (1) . Au total, nous avons un tableau avec des Gaussiens superposĂ©s et un gain maximum . UtilisĂ© comme facteur de mĂ©lange d'images. Rouge - recevoir une carte en couleur des tempĂ©ratures. Voici des mathĂ©matiques un peu diffĂ©rentes, toutes les mĂȘmes gaussiennes. Il est dĂ©crit par la formule (2) . En gros, la tempĂ©rature Ă  un point arbitraire est la moyenne pondĂ©rĂ©e de tous les capteurs. Mais l'influence de chaque capteur dans un rapport en pourcentage est proportionnelle Ă  la valeur du gaussien qu'il contient. La somme de tous est considĂ©rĂ©e comme 100%.


Reste Ă  voir comment la distribution des tempĂ©ratures se transforme en carte couleur. Ce qui est entourĂ© en bleu transforme la tempĂ©rature spĂ©cifique en une valeur comprise entre 0 et 1. Dans la zone rouge, le bloc Prelookup calcule l'indice par lequel la valeur du rouge, du vert et du bleu est recherchĂ©e. Le tableau de couleurs contient 64 valeurs. Les intermĂ©diaires sont calculĂ©s par interpolation. Parmi les fonctionnalitĂ©s, il existe deux modes: relatif et absolu. À l'endroit le plus froid et le plus chaud, le minimum et le maximum du tableau d'entrĂ©e correspondent. En absolu, il existe des valeurs constantes. Dans le premier, il est plus pratique de regarder le profil de distribution de tempĂ©rature. Dans l'autre, ses changements absolus.

fichier m


Il est exécuté au début, avant la simulation, en introduisant des variables dans l'espace de travail.
code
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


Contient les principales variables de contrĂŽle parmi lesquelles:
  • H — .
  • W — .
  • minT — .
  • maxT — .
  • sigmaInt — Interference.
  • sigmaOp — Opacity.
  • gain — Factor.
  • T — .
  • nAvr — .

H et W doivent correspondre au courant dans le bloc WebCamera. minT et maxT affectent la carte des couleurs en mode de tempĂ©rature absolue. T est rĂ©glĂ© de 0 Ă  1. Parfois, le port COM et la webcam ne sont pas synchronisĂ©s. La phase de l'image diffĂ©rentielle peut changer de 180 °. Et lĂ  oĂč il devrait y avoir un maximum - il y a un minimum. Et le systĂšme peut choisir une coordonnĂ©e arbitraire qui ne correspond pas Ă  la rĂ©alitĂ©. Pour cela, il existe un systĂšme de seuil. nAvr est le nombre de moyennes dans la moyenne mobile. Plus il est grand, plus les transitions sont fluides, mais la pertinence est perdue (un dĂ©calage temporel apparaĂźt). Pour comprendre l'effet des variables restantes, on ne peut pas le comprendre sans exemples illustratifs.

Effet SigmaInt
. , , . — .



Effet SigmaOp
.



Effet gain
- . «» « » .



Les expériences


Voici quelques expériences.

FenĂȘtre ouverte


Des capteurs sont dispersĂ©s sur le lit par la fenĂȘtre. La fenĂȘtre s'ouvre et se ferme aprĂšs un certain temps. Un bon exemple de la diffĂ©rence entre les modes relatif (gauche) et absolu (droite). En utilisant le premier, il est commode de considĂ©rer la distribution, et le second, comment le froid est distribuĂ© ou la chaleur est rĂ©tablie.



Appui de fenĂȘtre


Les capteurs sont situĂ©s le long du rebord de la fenĂȘtre. La fenĂȘtre s'ouvre - le profil change. Les zones les plus froides et les plus chaudes sont clairement visibles.



Est-il plus chaud sur le dessus?


Ils disent que le haut est plus chaud. Cette expĂ©rience en est une confirmation complĂšte. À la 10e seconde, la fenĂȘtre s'ouvre, Ă  la 30e - elle se ferme.



Conclusion


Un tel schĂ©ma ne remplacera pas un imageur thermique Ă  part entiĂšre. Mais il n'est pas en mesure de voir la propagation des masses d'air. Et Ă  un prix ce design est incomparablement plus bas. Vous pouvez utiliser une carte de couleurs diffĂ©rente. Vous pouvez prendre d'autres fonctions Ă  la place des gaussiens. Vous pouvez mĂȘme changer les lois de la construction. Ou rĂ©Ă©crivez sur OpenCV + QT pour plus de rapiditĂ© et de commoditĂ©. Mais c'est ce que j'ai conçu - j'ai rĂ©alisĂ©. Juste pour le plaisir .

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


All Articles