<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Eletronica.org</title>
	<atom:link href="http://www3.eletronica.org/feed" rel="self" type="application/rss+xml" />
	<link>http://www3.eletronica.org</link>
	<description>Eletrônica, Robótica e afins, para hobbystas, estudantes e profissionais</description>
	<lastBuildDate>Mon, 23 Jan 2017 13:57:54 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.13</generator>
	<item>
		<title>Programando em C: Boas Práticas</title>
		<link>http://www3.eletronica.org/artigos/programando-em-c-boas-praticas</link>
		<comments>http://www3.eletronica.org/artigos/programando-em-c-boas-praticas#comments</comments>
		<pubDate>Tue, 27 Dec 2016 16:11:01 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[sistemas embarcados]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=50</guid>
		<description><![CDATA[<p>Em 1972 o funcionário da AT&#38;T Dennis Ritchie iniciou o desenvolvimento de uma linguagem de programação que simplificasse a sua tarefa diária de programador nos laboratórios Bell. Chamou-a simplesmente de &#8220;C&#8221;, em referência clara à uma linguagem anterior, escrita por Ken Thompson, conhecida como &#8220;B&#8221;. Após estar madura o suficiente para substituir o assembly no...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/artigos/programando-em-c-boas-praticas">Programando em C: Boas Práticas</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p><img class="alignright" src="https://upload.wikimedia.org/wikipedia/commons/9/95/The_C_Programming_Language,_First_Edition_Cover_(2).svg" alt="The C Programming Language" width="252" height="354" /></p>
<div>Em 1972 o funcionário da AT&amp;T <strong>Dennis Ritchie</strong> iniciou o desenvolvimento de uma linguagem de programação que simplificasse a sua tarefa diária de programador nos laboratórios Bell. Chamou-a simplesmente de &#8220;C&#8221;, em referência clara à uma linguagem anterior, escrita por Ken Thompson, conhecida como &#8220;B&#8221;. Após estar madura o suficiente para substituir o assembly no kernel do sistema Unix em 1973, a linguagem ganhou o mundo, evoluindo com o tempo e tornando-se referência, mas sem perder as principais características que a fizeram ocupar uma posição de destaque.</div>
<div></div>
<div>
<p>Este artigo pretende conversar diretamente com o programador, revelando algumas boas práticas que podem auxiliá-los no desenvolvimento e manutenção do código. Apesar de genérico à linguagem C, os tópicos abordados são frutos da experiência como desenvolvedor de sistemas embarcados, sendo estes o nosso foco principal.</p>
<p>&nbsp;</p>
<h2>Mantendo Bonito</h2>
<p>A linguagem C, por definição, não exige que você escreva o programa seguindo regras que o tornem esteticamente agradável de ver (e ler). Nada impede você de escrever algo como:</p>
<pre>/*#define ppp xp</pre>
<pre> * /## define */#define x =
 #define zim void
 /*\**\*\***//*/ #denife $/*/
 #define p ()
 #define iu for(
 /*\**\*\***//*/ #defie $##def x^3printdf/*/
 #define xyz &lt;
 /*/*  8/ *******/ #define o ;}
 #define v "\na l o   m u n d o "
 int s (zim) { char b x 1; iu b x 9;\
 b xyz 21; b++){ printf( v ) o /*}}}*/}
 zim main( zim ) { s p o</pre>
<p>Exceto, claro, o bom senso. De uma maneira geral, o código bonito e organizado é sempre mais fácil de ler.</p>
<p>&nbsp;</p>
<h2>Indentação &amp; Espaços</h2>
<p>Utilizar indentação no código é algo essencial para a legibilidade. O tamanho do espaçamento pode variar, mas o importante é sempre manter blocos aninhados respeitando os níveis de indentação das estruturas condicionais e laços de repetição. De uma forma geral, o nível de indentação muda sempre após o início de uma função, estrutura condicional ou laço:</p>
<pre>void exemplo ( void ) {
    if ( a &gt; 5 ) {
        b += 3;
        for ( i=0; i&lt;5; i++ ) {
          z++;
          x--;
        }
     }
 }</pre>
<p>No exemplo acima foram utilizados quatro espaços entres os blocos. Você pode configurar o seu editor de texto preferido para que a tecla TAB substitua o caracter invisível de tabulação por estes espaços, é bastante útil. Evite espaçamentos muito curtos, como apenas um espaço, ou muito longos.</p>
<p>Além da indentação, que você já deve estar habituado, outro recurso que facilita a legibilidade é a utilização de espaços horizontais e verticais. Aumentar o número de linhas e espaços não vai, obviamente, aumentar o tamanho do binário compilado. Ao invés de escrever uma sentença condicional como:</p>
<p>if (a&lt;20 &amp;&amp;(c==5||d==6)) { }</p>
<p>prefira algo assim:</p>
<p>if (  (a &lt; 20)   &amp;&amp;   ( (c==5) || (d==6) )  ) { }</p>
<p>que é visivelmente mais agradável de avaliar. Separar as sentenças por parênteses também evita algum erro de precedência que você possa cometer ao digitar as expressões, reduzindo o tempo de depuração no futuro.</p>
<p>Laços complexos também podem ser quebrados em várias linhas, com o mesmo objetivo:</p>
<pre>for ( cont = 0, aux = 3;
   cont &lt; 100;
   cont++, aux+=2 ) {</pre>
<pre>     a = c + b;
     d = e - f;
 }</pre>
<p>Quando falo em legibilidade do código, lembro-me que existe um operador na linguagem C, o ternário, que utilizado em excesso pode tornar as expressões pouco legíveis aos olhos menos treinados. De uma forma geral eu evito utilizar o operador ternário, mesmo em sentenças simples. A operação</p>
<pre>aux = ( cont &lt; aux ) ? cont : cont * -1;</pre>
<p>poderia ser escrita, sem nenhum prejuízo, como:</p>
<pre>if ( cont &lt; aux )
     aux = cont;
 else
     aux = cont * -1;</pre>
<p>Mas se você gosta do operador ternário, uma opção para melhorar a legibilidade é separar as sentenças por linhas indentadas. A mesma expressão poderia ser escrita assim:</p>
<pre>aux = ( cont &lt; aux )
 ? cont
 : cont * -1;</pre>
<pre>Isto será especialmente útil caso você utilize o operador ternário de forma encadeada. Este código:</pre>
<pre>a = ( b &lt; z )
 ? x
 : ( i &gt; x )
     ? i
     : ++i;</pre>
<p>é certamente mais legível que este:</p>
<pre>a = ( b &lt; z ) ? x : ( i &gt; x ) ? i : ++i;</pre>
<pre></pre>
<h2>&#8211; ++ e &#8212;</h2>
<p>Evite agregar mais de um ++ ou &#8212; na mesma sentença. Com o mesmo intuito, evite atribuir ao resultado da operação operadores que utilizaram o incremento ou decremento na expressão.</p>
<p>Portando, expressões como:</p>
<pre>z = a++ + ++b;</pre>
<p>ou</p>
<pre>a[b] = b++;</pre>
<p>devem ser evitadas e substituidas por cláusulas que inibam, ou pelo menos minimizem, interpretações errôneas.</p>
<p>&nbsp;</p>
<h2>Números Mágicos</h2>
<p>As constantes são suas amigas, e os &#8220;#define&#8221; uma das mais ricas formas de melhorar a legibilidade do código. &#8220;Números Mágicos&#8221; são valores, inteiros ou não, que aparecem no código e que são constantes, mas não foram declarados como tais. Fazer isso prejudica a organização e dificulta a manutenção.</p>
<p>Ao invés de ter condições como:</p>
<pre>while ( tensao_bateria &lt; 30 ) {
    if ( potencia_transmissor &gt; 50 )
        diminua_potencia();
    else {
        desliga_radio();
        while ( tensao_bateria &lt; 30 ) { /* espera bateria carregar */ }
        liga_radio();
    }
 }</pre>
<p>substitua os inteiros por constantes com nomes adequados, como LIMITE_BATERIA_CRITICA e POTENCIA_MINIMA_TRANSMISSOR. Além de melhorar a organização facilita a manutenção, em caso de alterações nestas constantes.</p>
<p>&nbsp;</p>
<h2>Loops &#8220;Parados&#8221;</h2>
<p>Utilizando o exemplo anterior, observe que escrevemos</p>
<pre>while ( tensao_bateria &lt; 30 ) { /* espera bateria carregar */ }</pre>
<p>ao invés de simplesmente</p>
<pre>while ( tensao_bateria &lt; 30 );</pre>
<p>A primeira forma deixa explícita a nossa intenção, ao contrário da segunda, que poderia ser confundida com um erro do programador ou causar problemas posteriormente, caso o &#8220;;&#8221; fosse erroneamente removido (possivelmente sem erro na compilação).</p>
<p>&nbsp;</p>
<h2>Convenções</h2>
<p>Não importa exatamente quais convenções você utiliza, o importante é que você defina uma (própria ou não) e siga-a da forma mais rigorosa possível. Preferencialmente estas convenções devem ser descritas em um documento simples, que permita consultas rápidas sempre que necessário. Exemplificarei algumas abaixo que são bastante populares, mas você deve adaptá-las às suas necessidades.</p>
<pre>- Constantes: para as constantes utilize sempre letras maiúsculas. Desta forma será fácil distingui-la entre as variáveis.
 Ex.:
 #define LIMITE_TEMPERATURA 40
 #define BATERIA_BAIXA 30</pre>
<p>&#8211; Variáveis: mais importante que as convenções, uma regra básica: utilize nomes claros para as variáveis, abreviando apenas o que é bastante conhecido ou óbvio. Programadores são, em sua maioria, ágeis no teclado. Portanto, abreviar pressaoMotorEsquerdo para preMotE provavemente não vai economizar muito do seu tempo durante o desenvolvimento e certamente dificultará a leitura do código.</p>
<p>Existem algumas convenções mais antigas como a <a href="http://pt.wikipedia.org/wiki/Nota%C3%A7%C3%A3o_H%C3%BAngara" target="_self">Notação Húngara</a> ou mais modernas, como a <a href="http://pt.wikipedia.org/wiki/CamelCase" target="_self">Notação Camelo</a>, muito utilizada na programação orientada a objetos. Usualmente, em C, é bastante comum todas as variáveis serem escritas com letras minúsculas e/ou com o &#8220;_&#8221; como separador de palavras. Sendo assim, variáveis como velocidademaxima ou velocidade_maxima são bastante comuns, sendo esta última forma mais freqüente.</p>
<p>&#8211; Tipos de Variáveis: uma das grandes vantagens da linguagem C é a portabilidade entre arquiteturas. No entanto, alguns tipos de variáveis possuem comprimento variável dependendo da arquitetura e compilador, o que pode ocasionar problemas no software, como overflow ou erros de conversões. Por exemplo, o tipo inteiro (int) normalmente representa o tamanho da palavra do processador, nos processadores modernos de 32 e 64 bit e compiladores como o GCC. Mas isso não é necessariamente uma regra; no compilador HITECH para microcontroladores PIC de 8 bit, por exemplo, o inteiro possui 16 bit.<br />
Sendo assim, defina tipos claros e utilize-os, como uint8 para inteiros não sinalizados de 8 bit ou int16 para inteiros sinalizados de 16 bit.</p>
<p>Também seja atencioso ao declarar ponteiros. Uma declaração como:</p>
<pre>char*   s, t, u;</pre>
<p>não está errada, mas provavelmente não é o que você deseja, já que t e u não serão declarados como ponteiros. Sendo assim, prefira esta forma para declarar os ponteiros sem margem para erros:</p>
<pre>char   *s, *t, *u;</pre>
<pre></pre>
<h1>Conclusão</h1>
<p>Nossa intenção neste artigo foi abordar algumas técnicas que podem ajudá-lo a melhorar a legibilidade do seu código. Apesar de existirem vários outros pontos que podem ser abordados neste tópico, de uma forma geral, escrevendo um código organizado, bonito e bem comentado existe uma grande probabilidade do seu código tornar-se bastante legível, quesito que traduz-se em agilidade e produtividade em todas as fases do ciclo de vida do software.</p>
<p>&nbsp;</p>
<p>Roberto Alcântara<br />
roberto@eletronica.org</p>
</div>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/artigos/programando-em-c-boas-praticas">Programando em C: Boas Práticas</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/programando-em-c-boas-praticas/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FT232 RL Breakout &#8211; Conversor USB Serial TTL</title>
		<link>http://www3.eletronica.org/projetos/ft232-rl-breakout-conversor-usb-serial-ttl</link>
		<comments>http://www3.eletronica.org/projetos/ft232-rl-breakout-conversor-usb-serial-ttl#comments</comments>
		<pubDate>Mon, 24 Oct 2016 15:50:57 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Projetos]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=30</guid>
		<description><![CDATA[<p>O conversor é tipicamente utilizado na conexão de microcontroladores ao PC, via USB. Adicionando-se um conversor TTL-RS232 (MAX 232, por exemplo) facilmente obtem-se um conversor RS232-USB. Outros arquivos (GERBER, SCH e BRD) podem ser baixados aqui: FT232RL Breakout Básico &#8211; Esquema.sch FT232RL Breakout Básico &#8211; PCI.brd FT232RL Breakout Básico &#8211; Esquema PDF.pdf FT232RL Breakout Básico...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/projetos/ft232-rl-breakout-conversor-usb-serial-ttl">FT232 RL Breakout &#8211; Conversor USB Serial TTL</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>O conversor é tipicamente utilizado na conexão de microcontroladores ao PC, via USB. Adicionando-se um conversor TTL-RS232 (MAX 232, por exemplo) facilmente obtem-se um conversor RS232-USB.</p>
<p><center><br />
<img alt="" src="http://www3.eletronica.org/wp-content/uploads/2011/10/image_mini.png" /> <img alt="" src="http://www3.eletronica.org/wp-content/uploads/2011/10/image_mini-2.png" /> <img alt="" src="http://www3.eletronica.org/wp-content/uploads/2011/10/image_mini-3.png" /></center><img class="aligncenter size-full wp-image-1148" alt="image_preview" src="http://www3.eletronica.org/wp-content/uploads/2011/10/image_preview.jpeg" width="400" height="371" /></p>
<p><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/image_preview.png"><img class="aligncenter size-full wp-image-1149" alt="Esquemático" src="http://www3.eletronica.org/wp-content/uploads/2011/10/image_preview.png" width="400" height="298" /></a></p>
<p>Outros arquivos (GERBER, SCH e BRD) podem ser baixados aqui:</p>
<ul>
<li><a title="" href="http://www2.eletronica.org/projetos/ft232rl-breakout-conversor-ttl-usb/ft232rl-breakout-basico.sch">FT232RL Breakout Básico &#8211; Esquema.sch</a></li>
<li><a title="" href="http://www2.eletronica.org/projetos/ft232rl-breakout-conversor-ttl-usb/ft232rl-breakout-basico.brd">FT232RL Breakout Básico &#8211; PCI.brd</a></li>
<li><a title="" href="http://www2.eletronica.org/projetos/ft232rl-breakout-conversor-ttl-usb/ft232rl-breakout-basico-esquema.pdf">FT232RL Breakout Básico &#8211; Esquema PDF.pdf</a></li>
<li><a title="" href="http://www2.eletronica.org/projetos/ft232rl-breakout-conversor-ttl-usb/ft232rl-breakout-basico-gerber.zip">FT232RL Breakout Básico &#8211; GE</a></li>
</ul>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/projetos/ft232-rl-breakout-conversor-usb-serial-ttl">FT232 RL Breakout &#8211; Conversor USB Serial TTL</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/projetos/ft232-rl-breakout-conversor-usb-serial-ttl/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Simulação baseada em software livre de um sistema robótico fuzzy</title>
		<link>http://www3.eletronica.org/artigos/simulacao-baseada-em-software-livre-de-um-sistema-robotico-fuzzy</link>
		<comments>http://www3.eletronica.org/artigos/simulacao-baseada-em-software-livre-de-um-sistema-robotico-fuzzy#comments</comments>
		<pubDate>Mon, 20 Feb 2012 20:43:28 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[fuzzy]]></category>
		<category><![CDATA[robótica]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=352</guid>
		<description><![CDATA[<p>Resumo Sistemas robóticos podem ser compreendidos como sistemas concebidos de liberdade de movimentos para realizarem tarefas de forma autônoma, suas aplicações estendem-se por um amplo espectro de áreas, tais como: automação industrial; medicina; exploração espacial e outros. O presente artigo utiliza ferramentas de software livre para simular um sistema de navegação nebuloso para um agente...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/artigos/simulacao-baseada-em-software-livre-de-um-sistema-robotico-fuzzy">Simulação baseada em software livre de um sistema robótico fuzzy</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<h1 style="text-align: left;">Resumo</h1>
<p>Sistemas robóticos podem ser compreendidos como sistemas concebidos de liberdade de movimentos para realizarem tarefas de forma autônoma, suas aplicações estendem-se por um amplo espectro de áreas, tais como: automação industrial; medicina; exploração espacial e outros. O presente artigo utiliza ferramentas de software livre para simular um sistema de navegação nebuloso para um agente robótico. O software Simbad, em conjunto com a biblioteca jFuzzyLogic, foram aplicados para realizar esta simulação, cujos resultados demonstram que o agente robótico é capaz de percorrer o trajeto proposto, ao mesmo tempo em que desvia dos obstáculos.</p>
<p>Palavras-chave: robótica móvel, lógica nebulosa, software livre</p>
<h1>1. Introdução</h1>
<p>O emprego de robôs para a realização de diversas tarefas tem sido cada vez mais comum, facilitando, dessa forma, o desempenho de inúmeras atividades, inclusive as mais perigosas, nas quais seria inviável ou impossível a realização delas pelo homem. Algumas vantagens proporcionadas pela utilização de robôs são: aumento de produtividade na indústria; maior precisão e velocidade na fabricação e montagem dos produtos e afastamento da mão de obra humana dos locais inóspitos. Dessa maneira, o incentivo ao desenvolvimento da robótica torna-se cada vez mais crucial para a melhoria da qualidade de vida e desenvolvimento da sociedade.</p>
<p>Sistemas robóticos podem ser compreendidos como sistemas concebidos de liberdade de movimentos para realizarem tarefas com certo nível de autonomia de decisão, suas aplicações estendem-se por um amplo espectro de áreas, como: automação industrial (FILHO et al., 2010); medicina (PREISING et al., 1991); exploração espacial (HIRZING et al., 1994) e outros.</p>
<p>O avanço da robótica também é percebido no ramo educacional, onde diversos robôs têm sido empregados para o ensino, para o provimento da multidisciplinaridade e interdisciplinaridade, fornecimento de conhecimento tecnológico e principalmente para disseminar conceitos da mecânica, eletrônica, engenharia e computação (SOLIS et al., 2009). Dessa forma, a utilização de robôs autônomos proporciona inúmeras vantagens e possui grande empregabilidade em inúmeras áreas de atuação.</p>
<p>A utilização de softwares livres, da mesma maneira, tem se mostrado cada vez mais notória em iniciativas governamentais e privadas. As vantagens oriundas desses softwares vão além do custo econômico, a possibilidade de modificar o código-fonte do software fornece uma grande liberdade e flexibilidade para os sistemas computacionais (STALLMAN, 1999). As características existentes no software livre contribuem para elaboração de ferramentas de simulação de sistemas robóticos, auxiliando na resolução de diversos problemas nessa área.</p>
<p>O objetivo deste artigo é realizar a simulação de um sistema de navegação robótica através da utilização de softwares livres. Para isso, foi utilizado o simulador Simbad (HUGUES e BREDECHE, 2006) escrito em Java, o mesmo fornece um ambiente de simulação contendo um ou mais robôs, que podem ser equipados com câmeras e sensores e um cenário contendo obstáculos e vários outros recursos adicionais. Foi utilizado também um pacote, o jFuzzyLogic (CINGOLANI, 2011), para implementar o paradigma reativo para o desvio de obstáculos através da utilização da lógica fuzzy, proporcionando ao sistema uma metodologia para representar a percepção baseada em ações. Estas duas ferramentas de software livre foram aplicadas para realizar essa simulação, cujos resultados demonstram que o agente robótico é capaz de percorrer a sequência de coordenadas especificadas, ao mesmo tempo em que desvia dos obstáculos do ambiente.</p>
<p>O restante do trabalho está dividido em seis seções. A seção 2 traz conceitos de robótica móvel e as dificuldades existentes na navegação robótica. A seção 3 do artigo discorre sobre a lógica fuzzy. A seção 4 detalha as ferramentas utilizadas na simulação. A seção 5 mostra como foi implementado o sistema robótico. A seção 6 exibe os resultados da simulação. Finalmente, a última seção mostra as considerações finais obtidas com a conclusão desse trabalho.</p>
<h1>2. Robótica Móvel</h1>
<p>A robótica móvel engloba todos aqueles dispositivos automatizados capazes de se locomoverem em um determinado ambiente. A movimentação pode ser controlada através da intervenção humana, onde temos o uso de controle remoto, por exemplo, ou através de inteligência computacional, onde os robôs podem tomar decisões sobre a rota a ser seguida através da leitura do ambiente. Existe uma grande variedade de ferramentas para a locomoção de robôs, cada uma atendendo a características específicas do ambiente. Por exemplo, robôs podem atuar em solos rochosos ou arenosos, em ambientes aquáticos ou até mesmo em céu aberto. Cada ambiente requer equipamento e controles especiais para atenderem suas especificidades.</p>
<p>Os paradigmas da robótica móvel são mostrados na Figura 1. A escolha de qual paradigma empregado no projeto depende da necessidade e da complexidade da tarefa a ser executada.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig1.png"><img class="alignnone size-full wp-image-357" title="fig1" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig1.png" alt="" width="580" height="381" /></a></p>
<p style="text-align: center;">Figura 1 &#8211; Paradigmas na robótica: (i) hierárquico, (ii) reativo, (iii) híbrido (SIMÕES et al., 2006).</p>
<p style="text-align: left;">Para projetos mais complexos, nos quais o ambiente apresenta uma grande quantidade de informações, o paradigma hierárquico é mais adequado porque o robô pode tomar decisões baseadas no grau de dificuldade obtida, permitindo um domínio maior da situação. Por sua vez, o paradigma reativo procura diminuir a complexidade gerada pelo paradigma hierárquico, pois com o decorrer dos anos a etapa de planejamento se tornou demasiadamente complexa. Com o intuito de mesclar as vantagens dos dois paradigmas apresentados, surge o paradigma híbrido. Assim, uma tarefa pode ser decomposta em sub-tarefas para que o robô possa escolher qual a ação mais adequada para executá-las (SIMÕES et al., 2006).</p>
<p>A navegação robótica torna-se um obstáculo encontrado no desenvolvimento da robótica móvel. Inúmeros fatores podem torná-la mais complicada uma vez que é necessária a leitura e a interpretação do ambiente para que as decisões sejam tomadas, visando permitir ações rápidas que evitem colisões e garantindo que a trajetória seja percorrida com sucesso (FRACASSO et al., 2005).</p>
<p>A percepção territorial realizada pelo robô pode ser feita através de diversos métodos, dependendo do terreno onde o mesmo se encontra. Pode-se utilizar sonares em ambientes em que a informação é pouca ou nenhuma (OTTONI et al., 2003) ou o rastreamento pode ser feito através da visão (MOTTA et al., 2008). As informações captadas passam por um estágio de processamento, onde muitas vezes são filtradas para que sejam interpretadas com maior precisão. A partir daí, os resultados obtidos pela etapa de processamento são usados para realizar a ação do robô, onde os comandos são enviados para os atuadores.</p>
<p>Estudos têm buscado diminuir várias dificuldades encontradas na navegação de um robô (BATISTA et al., 2010). Nosso trabalho tem como objetivo realizar uma simulação de um sistema robótico móvel e nebuloso, o qual será descrito nas seções seguintes, utilizando ferramentas de software livre.</p>
<h1>3. Lógica Fuzzy</h1>
<p>A lógica fuzzy ou lógica nebulosa é uma forma de realizar a interface entre processos inerentemente analógicos, que se movem através de uma faixa contínua de valores, para o universo digital, onde os valores são definidos como discretos. Foi inicialmente proposta por Lotfi A. Zadeh (PERRY, 1995) na Universidade da Califórnia em Berkeley em um artigo datado de 1965.</p>
<p>As implementações da lógica nebulosa permitem que estados indeterminados possam ser tratados por dispositivos de controle. Desse modo, é possível avaliar conceitos não quantificáveis. A lógica fuzzy deve ser vista mais como uma área de pesquisa sobre tratamento da incerteza, ou uma família de modelos matemáticos dedicados ao tratamento da incerteza, do que uma lógica propriamente dita. A lógica nebulosa normalmente está associada ao uso da teoria de conjuntos fuzzy.</p>
<p>A lógica fuzzy pode ser empregada no ramo industrial, possibilitando automatizar diversas tarefas. Tal fato pode encorajar a utilização da lógica fuzzy na robótica móvel, possibilitando desta forma a navegação robótica de uma maneira mais simplificada. Alguns trabalhos que seguem tal linha de pesquisa podem ser encontrados em Joshi e Zaveri (2009) e Raguraman et. al (2009), por exemplo. A lógica fuzzy também pode ser aplicada em outras funcionalidades existentes no robô.</p>
<p>Em um sistema de controle fuzzy, possuímos variáveis de entrada que representam os valores que podem ser obtidos através de sensores. Tais valores podem ser categorizados em faixas: muito longe, longe, normal, perto, muito perto. Esses estados são conhecidos como estados fuzzy e não possuem um limiar definido de um para outro. As variáveis de entrada podem pertencer a vários estados com diferentes níveis de pertinência. A Figura 2 apresenta um exemplo de funções de pertinência de uma variável fuzzy.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig2.png"><img class="alignnone size-full wp-image-358" title="fig2" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig2.png" alt="" width="447" height="189" /></a></p>
<p style="text-align: center;">Figura 2 &#8211; Note que a um dado instante, a distância será um grau de pertinência com respeito a dois conjuntos fuzzy: 0.3 Muito Longe e 0.7 Longe, 0.4 Normal e 0.6 Perto, assim por diante.</p>
<p>Os valores de entrada, conhecidos como crisp, são convertidos para valores fuzzy em um processo conhecido como “fuzzificação”, utilizando as funções de pertinência dos termos fuzzy de entrada. O grau de participação de uma grandeza de entrada é dado em função dos termos primários definidos como o “Universo do Discurso” de entrada. Assim, cada valor de entrada tem um grau de pertinência para cada termo primário definido. A arquitetura fuzzy pode ser observada na Figura 3.</p>
<p>Dados “mapeamentos” das variáveis de entrada para as funções de pertinência e valores verdade, um micro-controlador pode então tomar decisões sobre a ação a ser executada baseada em um conjunto de regras, da forma:</p>
<p>“Se a distância frontal é muito perto e a velocidade é muito rápida então gire acentuadamente à esquerda”</p>
<p>É possível perceber que, neste exemplo, a variável de saída é também definida como um conjunto fuzzy que pode assumir os valores como “acentuadamente à esquerda”, “levemente à direita” e assim por diante. Existe uma ampla gama de funções que podem ser utilizadas, como: NÃO-fuzzy, E-fuzzy e OU-fuzzy.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig3.gif"><img class="alignnone size-full wp-image-359" title="fig3" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig3.gif" alt="" width="598" height="201" /></a></p>
<p style="text-align: center;">Figura 3 &#8211; Arquitetura de um controlador fuzzy.</p>
<p>Os valores obtidos por todas as regras de inferência que foram acionadas são “defuzzificados” para valores exatos por meio de um dentre vários métodos possíveis. Por exemplo, o método do centróide retorna o centro de massa do resultado como valor exato. Por sua vez, o método da altura retorna o maior valor. A Figura 4 apresenta um exemplo de um sistema de inferência nebuloso que utiliza o método do centróide para realizar a defuzzificação.</p>
<p style="text-align: center;"> <a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig4.gif"><img class="alignnone size-full wp-image-360" title="fig4" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig4.gif" alt="" width="478" height="275" /></a></p>
<p style="text-align: center;">Figura 4 &#8211; Exemplo de ativação das regras em um sistema de inferência nebuloso e o processo de defuzzificação pelo cálculo do centroide.</p>
<h1> 4. Ferramentas de software livre</h1>
<p>Esta seção apresenta as ferramentas de software livre utilizadas para simular o sistema nebuloso de navegação proposto neste trabalho.</p>
<h2>4.1 Simulador Simbad</h2>
<p>O Simbad é um simulador de sistemas robóticos utilizado para fins científicos e educacionais. Esta ferramenta é principalmente dedicada a pesquisadores/programadores que querem uma base simples para estudar Inteligência Computacional (IC), aprendizado de máquina e outros algoritmos IC no contexto da robótica autônoma e agentes autônomos. O projeto Simbad está hospedado no SourceForge, este projeto é livre para ser usado e modificado sob as condições da Licença Pública Geral GNU.</p>
<p>O emprego de um simulador de sistemas robóticos traz inúmeras vantagens. Uma destas vantagens é a sua utilização no desenvolvimento da programação offline (programas elaborados em um computador e carregados posteriormente no robô, possibilitando que o mesmo não seja retirado das funções de produção e ocupado com a tarefa de programação), permitindo que sejam feitos testes dos programas antes de executá-los no robô real (REDEL e HOUNSELL, 2004). Outra vantagem é a possibilidade de seu uso para o ensino, pois permite que cada aluno se familiarize com o robô de forma individual, mesmo sem a existência física do mesmo, fazendo com que estes alunos adquiram os conhecimentos básicos necessários antes de utilizarem o robô real.</p>
<p>O simulador Simbad possui sensores de visão, sensores de alcance (com sonares e infravermelho) e sensores de contato. O uso destes sensores permite a interação do robô com o ambiente que o rodeia de uma forma flexível. Existem vários tipos de sensores e cada um se adapta a uma função específica. Estes são adicionados no sentido anti-horário em cada robô e retornam o alcance, o ângulo e informam se houve colisão.</p>
<p>O Simbad possui uma interface que permite a manipulação e a visualização dos eventos da simulação. Durante a execução do programa, aparecerá uma janela dividida em três setores, como mostra a Figura 5. A janela World exibe o mundo da simulação descrito pelo usuário ou algum dos exemplos presentes no Simbad. Na parte lateral situada à esquerda são exibidas as informações do robô e de seus acessórios, como o nome do robô, alcance dos sensores, velocidade translacional e rotacional, visão da câmera, colisão, tempo de vida do robô, entre outras, que podem variar de acordo com o projeto. A terceira janela é a Control, esta é dividida em três abas. As abas View From e a Follow são responsáveis pela visualização da simulação. A aba Simulator permite rodar, pausar, reiniciar ou passar cada etapa da simulação manualmente, além de alterar a velocidade da simulação na opção Time Factor.</p>
<p style="text-align: center;"> <a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig5.jpg"><img class="alignnone size-full wp-image-361" title="fig5" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig5.jpg" alt="" width="599" height="503" /></a></p>
<p style="text-align: center;">Figura 5 &#8211; Visão geral do simulador Simbad.</p>
<h2>4.2 jFuzzyLogic</h2>
<p>O jFuzzyLogic é um pacote de lógica fuzzy escrito em Java, disponível pela licença &#8220;LGPLv3&#8221;, este pacote implementa uma Linguagem de Controle Fuzzy (FCL). A FCL é um padrão para a programação de Controle Difuso, publicado pela Comissão Electrotécnica Internacional (IEC). As especificações para a sintaxe FCL podem ser encontradas no documento IEC 61131-7. Esta linguagem é uma linguagem de programação de domínio específico, ou seja, possui características diretamente relacionadas com a lógica fuzzy. Dessa forma, o FCL permite ao programador especificar conjuntos fuzzy, que são listas de pontos em um gráfico, bem como o conjunto de regras do sistema de inferência e o método de defuzzificação.</p>
<h1>5. Sistema Robótico móvel e nebuloso</h1>
<p>O sistema robótico móvel e nebuloso proposto neste trabalho objetiva controlar os movimentos do agente robótico de forma que este seja capaz de alcançar uma sequência especificada de coordenadas no ambiente, ao mesmo tempo em que desvia dos obstáculos. Neste modelo, o agente robótico é ciente de sua localização no ambiente, bem como das coordenadas que devem ser alcançadas para completar sua trajetória.</p>
<p style="text-align: center;"> <a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig6_1.png"><img class="alignnone size-full wp-image-362" title="fig6_1" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig6_1.png" alt="" width="707" height="200" /></a></p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig6_2.png"><img class="alignnone size-full wp-image-363" title="fig6_2" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig6_2.png" alt="" width="242" height="229" /></a></p>
<p style="text-align: center;">Figura 6 &#8211; Módulo de navegação e diferença de direção, adaptado de Fracasso (2005).</p>
<p>A postura do robô é determinada pela sua orientação no ambiente (x, z, ξ), na qual x e z representam suas coordenadas no plano bi-dimensional e o ângulo ξ representa a direção do seu movimento. Durante a navegação, a postura atual, a próxima postura e o ângulo atual são utilizados para calcular o ângulo de rotação necessário para o robô alcançar o objetivo, como ilustrado na Figura 6. Os sonares frontais indicam a distância dos obstáculos que possam existir no caminho. O controlador nebuloso utiliza as informações sobre a diferença angular das posturas e da distância dos obstáculos para definir o ângulo de rotação. A velocidade de translação do robô é mantida fixa para simplificar a modelagem.</p>
<h2>5.1 Variáveis linguísticas</h2>
<p>Neste sistema nebuloso, são utilizadas três variáveis linguísticas de entrada. As variáveis esquerda e direita indicam a distância dos obstáculos obtida pela leitura dos pares de sonares existentes. A última variável linguística é o ânguloє1, queé obtida pela diferença dos ângulos de orientação das posturas inicial e final. Além disso, existe apenas uma variável linguística de saída: o ângulo de rotaçãoє2.</p>
<p>As funções de pertinência das variáveis linguísticas são apresentadas na Figura 7. Pode-se observar que o universo do discurso dos sonares varia de 0 à 1.5m, com os valores linguísticos: Perto e Longe, simplificando o projeto para que o robô apenas evite as colisões. Por outro lado, o universo do discurso dos ângulos de entrada є1 e de saída є2 varia de -30º à +30º, ambos possuem doze variáveis linguísticas, Ângulo Muito Pequeno (AMP), Ângulo Pequeno (AP), Ângulo Médio (AM), Ângulo Médio Zero (AMZ), Ângulo Grande (AG), Ângulo Muito Grande (AMG), que podem ser positivos ou negativos.</p>
<p style="text-align: center;"> <a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig7.png"><img class="alignnone size-full wp-image-364" title="fig7" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig7.png" alt="" width="870" height="238" /></a></p>
<p style="text-align: center;">Figura 7 &#8211; Funções de pertinência das variáveis de entrada: direita/esquerda e ângulo. A função de pertinência para o ângulo de saída é a mesma da função que representa o ângulo de entrada.</p>
<h2>5.2 Regras, sistema de inferência e defuzzificação</h2>
<p>As regras de inferência são colocadas no arquivo navigation.fcl, tendo um objetivo com duas premissas: fazer o robô desviar dos obstáculos, se os mesmos estiverem próximos, ou fazer simplesmente o robô continuar a sua trajetória quando o caminho está livre. A Figura 8 apresenta algumas das regras utilizadas. O sistema utilizado foi o método dos mínimos de Mamdani. No processo de defuzzificação, os valores obtidos pelas regras acionadas foram defuzzificados através do método de máximo mais à esquerda.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig8.png"><img class="alignnone size-full wp-image-365" title="fig8" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig8.png" alt="" width="685" height="168" /></a></p>
<p style="text-align: center;">Figura 8 &#8211; Exemplo de algumas regras utilizadas na simulação.</p>
<h2>6. Resultados</h2>
<p>Após a implementação dos sistemas de fuzzificação, motor de inferência e defuzzificação, bem como a implantação do conjunto de regras elaboradas, iniciou-se a etapa de simulação. O código-fonte do simulador Simbad foi modificado para que a rota realizada pelo robô seja exibida em tempo de simulação. Possibilitando, dessa forma, a visualização do percurso realizado.</p>
<p>A avaliação do sistema proposto utiliza dois ambientes de simulação. Nos quais foram criados obstáculos no intuito de bloquear a trajetória do robô através das coordenadas inseridas, representadas pelas esferas vermelhas no cenário, testando assim, a lógica nebulosa para desvio de obstáculos. Para o primeiro ambiente, foi modelado um cenário simples, com dois obstáculos do tipo parede, o qual é ilustrado na Figura 9. Através da utilização da lógica fuzzy, a navegação do robô foi realizada com êxito. A Figura 9 demonstra também como o robô consegue seguir as coordenadas estipuladas e, ao mesmo tempo, desviar dos obstáculos dispostos no ambiente.</p>
<p style="text-align: center;"> <a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig9_1.png"><img class="alignnone size-full wp-image-366" title="fig9_1" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig9_1.png" alt="" width="404" height="404" /></a><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig9_2.png"><img class="alignnone size-full wp-image-367" title="fig9_2" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig9_2.png" alt="" width="403" height="404" /></a></p>
<p style="text-align: center;">Figura 9 &#8211; Rota realizada pelo robô antes e após a simulação.</p>
<p>Em uma segunda simulação, foi utilizado um ambiente com mais obstáculos. A Figura 10 demonstra o ambiente antes do início da simulação e o percurso realizado pelo robô com tais obstáculos. Durante essa simulação, o robô consegue novamente percorrer com êxito as coordenadas definidas.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig10_1.png"><img class="alignnone size-full wp-image-368" title="fig10_1" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig10_1.png" alt="" width="378" height="379" /></a><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig10_2.png"><img class="alignnone size-full wp-image-369" title="fig10_2" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig10_2.png" alt="" width="378" height="379" /></a></p>
<p style="text-align: center;">Figura 10 &#8211; Rota realizada pelo robô em um segundo ambiente de simulação.</p>
<p>Como foi visto, a lógica nebulosa para o desvio de obstáculos funcionou perfeitamente para os dois ambientes de simulação propostos. O robô apresentou como saída os movimentos giratórios para esquerda ou direita, fazendo com que o mesmo consiga evitar as colisões validando, dessa forma, o sistema fuzzy proposto.</p>
<p>7. Considerações finais</p>
<p>Este artigo apresenta o modelo e a simulação de um sistema robótico móvel e nebuloso baseado nas ferramentas de software livre: Simbad e jFuzzyLogic. Os resultados demonstram que o agente robótico consegue não só desviar dos obstáculos, mas percorrer a trajetória designada nos dois ambientes de simulação propostos. Contudo, o modelo apresentado não é capaz de percorrer trajetos em um ambiente mais complexo e com muitos obstáculos, nesse caso é necessário modificar as regras e tornar o sistema mais robusto. Assim, surgem duas motivações principais para um futuro trabalho: adicionar e melhorar as regras existentes, com o objetivo de deixar o sistema mais tolerante a falhas, e realizar a implementação desse projeto em um ambiente com elementos reais.</p>
<h1>Referências</h1>
<p>BATISTA, I. J. L. et al. Navegação de Robôs Móveis com Ênfase em Planejamento e Supervisão de Trajetórias. In: XVIII Congresso Brasileiro de Automática, 1., 2010, Bonito. Anais&#8230; Bonito: UNESP-MS. 1 CD-ROM.<br />
CINGOLANI, P. jFuzzyLogic. Disponível em: &lt;http://jFuzzyLogic.sourceforge.net&gt; Acesso em: 20 jul. 2011.<br />
FILHO, F. A. R. et al. Development of Robots for the Pipeline Industry… 2010.Trabalhoapresentadoao41st International Symposium (ISR) on and 2010 6th German Conference on Robotics (ROBOTIK), Munique, 2010.<br />
FRACASSO, P. T.; REALI COSTA, A. H. Navegação reativa de robôs móveis autônomos utilizando lógica nebulosa com regras ponderadas. In: IEEE LATIN-AMERICAN ROBOTICS SYMPOSIUM. São Luis, MA, 2005. SBAI IEEE LARS. São Luis: IEEE, 2005. pp. 1-7.<br />
FUZZY INFERENCE SYSTEMS. Disponível em: &lt;http://www.mathworks.com/help/toolbox/fuzzy/fp351dup8.html&gt;. Acessado em: 21 jul. 2011.<br />
GOEBEL, G. A Introduction To Fuzzy Control Systems. Disponível em: &lt;http://www.faqs.org/docs/fuzzy/&gt; Acesso em: 19 jul. 2011.<br />
HIRZINGER, G. et al. ROTEX-the first remotely controlled robot in space.In: Proc. IEEE Conf. on Robotics and Automation. Anais Proceedings San Diego: IEEE, 1994. pp. 2604-2611.<br />
HUGUES, L.; BREDECHE, N. Simbad: An Autonomous Robot Simulation Package for Education and Research. In: Proceedings of SAB&#8217;2006. pp.831~842<br />
JOSHI, M.M.; ZAVERI, M.A.; Fuzzy Based Autonomous Robot Navigation System. Proceedings of the India Conference (INDICON), 2009 Annual IEEE, ISBN: 978-1-4244-4858-6, DOI: 10.1109/INDCON.2009.5409419, pp. 1-4, Gujarat, India, 18-20 Dec. 2009.<br />
MOTTA, J. M. S. T.; TOURINO, S. R. G. Sistema de Rastreamento por Visão em Robôs Móveis com Otimização por Projeto Fatorial. Revista Iberoamericana de Ingeniería Mecánica. Vol. 12, N° 1, pp. 25-34, jan. 2008.<br />
OTTONI, G. L.; LAGES, W. F. Navegação de robôs móveis em ambientes desconhecidos utilizando sonares de ultra-som. Sba Controle &amp; Automação [online]. 2003, vol.14, n.4, pp. 402-411.<br />
PERRY, T.S. Lotfi A. Zadeh [fuzzy logic inventor biography]. Ieee Spectrum. Disponível em: &lt;http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=387136&gt; Acesso em: 21 jul. 2011.<br />
PREISING, B.; HSIA, T. C.; MITTELSTADT, B. A literature review: robots in medicine. IEEE Engineering in Medicine and Biology Magazine. Vol. 10, N° 2, pp. 13-22, jun. 1991.<br />
REDEL, R.; HOUNSELL, M.S. Implementação de Simuladores de Robôs com o Uso da Tecnologia de Realidade Virtual. In: IV Congresso Brasileiro de Computação, Itajaí – SC. IVCBCOMP, v. 1, 2004, pp. 398-401.<br />
RAGURAMAN, S.M.; TAMILSELVI, D.; SHIVAKUMAR, N. Mobile robot navigation using Fuzzy logic controller. In: International Conference on Control, Automation, Communication and Energy Conservation, Perundurai &#8211; 638052, Erode, Tamilnadu, Índia – INCACEC 2009. pp. 1-5.<br />
SIMBAD PROJECT HOME. Disponível em: &lt;http://simbad.sourceforge.net/&gt; Acesso em: 21 jun. 2011.<br />
SIMÕES, A. S.; MARTINS, A. C. G.; CARRION, R. Robôs móveis autônomos na missão marte: projetando um sistema reativo com transição sequencial de comportamentos. In: Anais do XXVI Congresso da Sociedade Brasileira de Computação (SBC). ENRI&#8217;06: Encontro de Robótica Inteligente. Campo Grande, 17-20 de julho de 2006.<br />
SOLIS, J.; TAKANISHI, A. Practical Issues on Robotic Education and Challenges Towards RoboEthics Education. In: 18th IEEE International Symposium on Robot and Human Interactive Communication, 3., 2009, Toyama. IEEE Press, 2009 pp. 561-565.<br />
STALLMAN, R. Open Source: Voices from the Open Source Revolution. 1. ed. Sebastopol: O&#8217;Reilly &amp; Associates. 1999.</p>
<p>&nbsp;</p>
<h1>Autores</h1>
<p>Jardel Rodrigues &lt;jardel.ifce@gmail.com&gt; &#8211; Aluno de graduação em Ciência da Computação, IFCE Campus Maracanaú.</p>
<p>Leandro Bezerra &lt;leandrobezerramarinho@gmail.com&gt; &#8211; Aluno de graduação em Ciência da Computação, IFCE Campus Maracanaú.</p>
<p>MSc. Otávio A. de Lima Jr. &lt;otavio@ifce.edu.br&gt; &#8211; Professor, IFCE Campus Maracanaú.</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/artigos/simulacao-baseada-em-software-livre-de-um-sistema-robotico-fuzzy">Simulação baseada em software livre de um sistema robótico fuzzy</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/simulacao-baseada-em-software-livre-de-um-sistema-robotico-fuzzy/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Desacoplando Através de Exemplos</title>
		<link>http://www3.eletronica.org/artigos/desacoplando-atraves-de-exemplos</link>
		<comments>http://www3.eletronica.org/artigos/desacoplando-atraves-de-exemplos#comments</comments>
		<pubDate>Wed, 09 Nov 2011 00:41:44 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[capacitor]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[pci]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=241</guid>
		<description><![CDATA[<p>Enquanto eu desfrutava os projetos do Concurso 7400 me ocorreu que muitos dos projetos lógicos submetidos não tinham um dos elementos de segurança mais básicos para garantir um bom resultado. O  aspecto mais desconsiderado foi a falta de capacitores de bypass. Então, após ler um artigo sobre a Lei de Murphy que referenciava um outro application...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/artigos/desacoplando-atraves-de-exemplos">Desacoplando Através de Exemplos</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Enquanto eu desfrutava os projetos do Concurso 7400 me ocorreu que muitos dos projetos lógicos submetidos não tinham um dos elementos de segurança mais básicos para garantir um bom resultado.</p>
<p>O  aspecto mais desconsiderado foi a falta de capacitores de <em>bypass</em>. Então, após ler um <a>artigo sobre a Lei de Murphy</a> que referenciava um outro <a>application note da Maxim</a>, eu decidi escrever um pouco sobre capacitores de desacoplamento e <em>bypass</em>.</p>
<p>Como uma pessoa que pode ser considerada velha neste trabalho, eu já experimentei os problemas da ausência de desacoplamento em primera mão. Meu primeiro projeto em alta velocidade foi como aprendiz em meados dos anos oitenta em uma grande empresa de eletrônica. O projeto que eu estava construindo, um medidor de frequência digital, usava portas lógicas 74Fxx a uma velocidade de 11MHz (que era muito rápido para a época). Ele estava feito em &#8220;wire-up&#8221; em uma placa do tamanho de uma <a href="http://en.wikipedia.org/wiki/Eurocard_(printed_circuit_board)">placa euro-card</a> dupla e usava em torno de 40 CIs. Quando chegou a hora de ligar, eu notei que ele não funcionava como o esperado e todo o tipo de coisa apareceu em todos os lugares. Depois de verificar a montagem várias vezes eu conversei com o meu supervisor sobre o problema e ele me disse: &#8220;Não existem capacitores de bypass; monte-os em todos os chips, junto à alimentação, e nós conversaremos novamente&#8221;. Completamente desorientado eu fiz o que ele disse e, como um milagre, tudo simplesmente funcionou. Porque a aparente inerte capacitância da fonte de alimentação não faz as coisas simplesmente funcionarem?</p>
<p>Meu supervirsor então me falou sobre correntes de chaveamento/surto, indutância dos fios e sobre o conto do desacoplamento. Eu admito que somente alguns anos depois eu <em>realmente</em> entendi o que ele falava, mas a lição estava aprendida: sempre coloque capacitores na alimentação de CIs lógicos.</p>
<p>Os termos &#8220;capacitor de <em>bypass</em>&#8221; e &#8220;desacoplamento&#8221; não são simplesmente palavras aleatórias, elas possuem um significado específico neste contexto:<br />
&#8211; desacoplamento (<em>decoupling</em>): o ato de separar (parcialmente) a fonte de energia do CI da fonte principal de alimentação.<br />
&#8211; capacitor de <em>bypass</em>: o capacitor montado desta forma atua como bypass da fonte principal de alimentação e funciona (temporariamente) como uma fonte de energia local.</p>
<p>Mas porque isso é tão importante? Bom, deixe-me te mostrar uma imagem:</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura1.jpg" alt="" /></p>
<p>Figura 1: Ausência de capacitor de bypass</p>
<p>Isso parece com algum sinal digital? Isso é o que você tem <strong>sem</strong> capacitores de bypass.</p>
<p>Por favor atente ao fato que a <span style="text-decoration: underline;">frequência principal de operação é irrelevante</span>. O problema são as bordas de subida e descida das saídas. Então sistemas com o clock 1Hz, 20kHz ou 50MHz necessitam das mesmas considerações. O uso das frequências nos exemplos abaixo foi escolhida apenas para tornar fácil a visualização no osciloscópio.<br />
Deve-se destacar que projetos com alta frequência irão falhar mais rápido porque o número de transições é significamente maior que em projetos de baixa frequência. No entanto, isto não significa que projetos de baixa frequência são imunes. Longe disso, eles falham tão facilmente quanto Murphy nos ensinou. Há&#8230; você imaginou agora aquele seu pequeno microcontrolador rodando a 16Mhz ou talvez aquele controlador de LEDs, usado para o show de luzes?</p>
<h1>Medindo correntes de surto</h1>
<p>Para ver o que está acontecendo nós precisamos medir a corrente que flui. Um circuito de teste simples foi criado para ilustrar.</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/decoupling-2.png" alt="" /></p>
<p>Figura 2: Circuito Inversor</p>
<p>&nbsp;</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/decoupling-3.png" alt="" /></p>
<p>Figura 3: Medição de Corrente</p>
<p>Um gerador de pulso é conectado a um inversor 74HC04 e um capacitor de 10pF de capacitância é colocado como carga. A saída, TP1, é mostrada no traço superior do osciloscópio. A fonte de alimentação é conectada nos pinos 14 e 7 com um resistor de 10 ohm para o GND. A corrente de alimentação do 74HC04 é medida em TP2 e visualizada no traço inferior do osciloscópio. O capacitor de bypass é montado e desmontado como indicado no texto.</p>
<p>As pontas do osciloscópio usadas são do tipo 1:10, então todos os valores no eixo Y da imagem do osciloscópio devem ser multiplicados por um fator de 10. Todos os pinos não utilizados do 74HC04 são conectados ao GND. A configuração se parece com isso:</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/breadboard-4.jpg" alt="" /></p>
<p>Figura 4: Montagem na <em>breadboard</em></p>
<p>A Figura 5 ilustra o problema em baixas e altas frequências de entrada. As imagens da esquerda são <strong>sem</strong> os capacitores e os da direita são <strong>com</strong> os capacitores montados:</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura5.jpg" alt="" /></p>
<p>Figura 5: Saída e corrente sem (esquerda) e com (direita) capacitores de bypass</p>
<p>Algumas observações sobre a figura 5:</p>
<p>&#8211; A corrente medida é somente a que flui entrando e saindo através do GND da fonte de alimentação e o pino do 74HC04 e pelo capacitor de bypass, quando montado. Isto não representa toda a corrente que entra e sai da saída do inversor. É difícil medir correntes que fluem nos dois sentidos pelo Vcc e GND simultanetamente (com o osciloscópio no modo DC). No entanto, a corrente de GND é suficiente para ilustrar o problema do circuito.</p>
<p>&#8211; &#8220;Ruído&#8221; de alta frequência no nível alto da saída. Esta &#8220;oscilação&#8221; é de mais de 2V pico-a-pico e supera a fonte de alimentação (5V) significativamente. Adicionando os capacitores de bypass esta &#8220;oscilação&#8221; é reduzida a um nível virtualmente inexistente. Ainda existe este <em>overshoot</em>, mas ele é suprimido muito mais eficientemente.</p>
<p>&#8211; &#8220;<em>Spikes</em>&#8221; (picos) de corrente nas transições. Adicionar um capacitor de bypass reduz os spikes e torna-os simétricos nas transições de subida e descida. Os picos de corrente vão de -22 a +45mA sem o capacitor de bypass e de -32 a +36mA com o capacitor.</p>
<p>&#8211; A simetria da corrente nas imagens <strong>com</strong> o capacitor de bypass montado mostra que a energia é tando recuperada como armazenada. Isso é um fator muito importante.</p>
<p>&#8211; O ruído residual de altíssima frequência depende bastante da posição das ponteiras (não mostradas), o que indica que existem significativas antenas de RF no circuito (circuitos LC indesejados). O layout da <em>breadboard</em> (matriz de contatos) e a posição dos fios de conexão possuem impacto significativo na amplitude e frequência. Isso não pode ser eliminado mas pode ser bastante reduzido em um bom layout de PCI (placa de circuito impresso).</p>
<p>Olhando as transições em mais detalhes:</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura6.jpg" alt="" /></p>
<p>Figura 6: Detalhes da borda de saída e da corrente sem (esquerda) e com (direita) o capacitor de bypass</p>
<h1>As correntes que fluem</h1>
<p>O 74HC04 é um projeto de chip totalmente CMOS. Isso significa que a corrente estática drenada é próxima de zero. A corrente é desenhada nas transições de alto para baixo e de baixo para alto. Nas transições é que todas as cargas, parasitas ou não, precisam ser (des)carregadas. O circuito de teste da figura 2 possui um capacitor de 10pF como carga. O pino &#8211; e sua capacitância devem ser adicionadas, o que nós dá algo na ordem de 5pF+2pF. A ponteira do osciloscópio também possui sua capacitância, que adiciona outros 10pF. A capacitância total da carga na saída é, então, da ordem de 27pF.<br />
Considerando somente essa capacitância de saída, nós estamos (des)carregando a carga com 5V a cada 4,3ns. Se assumirmos a medida da corrente constante (tornando os cálculos mais fáceis) nós podemos estimar a corrente através dos parâmetros acima, utilizando a <a href="http://pt.wikipedia.org/wiki/Coulomb">equação da carga</a>:</p>
<pre>Q = I • t  =  C • U I = 5 • 27 • 10 -12 4.3 • 10 -9 ≅ 31.4mA</pre>
<p>Isto significa que uma <strong>enorme</strong> corrente está fluindo em ambas direções para equilibrar a corrente em todas as direções. De onde vem todo este poder? Bom, da fonte de alimentação. Isso pode ser visto claramente na figura 6, onde temos que a corrente não é instantânea; ela acumula-se a um nível específico e depois cai de novo. Este comportamento indica claramente um elemento indutivo.</p>
<p>Isto pode ser visto melhor nas duas imagens da direita na figura 6 (<strong>com</strong> o capacitor de bypass), quando a corrente (o traço inferior) dá um pico no momento que a saída (traço superior) vai a zero. A corrente então cai, derrubando a saída com ela.</p>
<p>A corrente calculada comparada com as medições estão bem compatíveis, considerando que o nosso cálculo foi uma simples estimativa.</p>
<h1>Então, para que o capacitor de bypass?</h1>
<p>Dê outra olhada de perto nas duas imagens inferiores da figura 6. A esquerda não atinge o nível dos 5V na saída por algum tempo, enquanto a da direita não tem nenhum problema neste aspecto. Não há energia suficiente sem o capacitor de bypass para suportar a borda de subida e ela trava em 4V por algum tempo. Adicionar o capacitor de bypass supre o 74HC04 com potência instantânea neste período.</p>
<p>O capacitor de bypass é cerca de 4000 vezes maior que a capacitância da carga, o que significa que a queda de tensão esperada é cerca de 4000 vezes menor (na faixa de 1 a 2mV) para dar suporte à transição.</p>
<p>Quando a transição é no sentido contrário, como na parte superior das duas imagens da figura 6, então o capacitor de bypass funciona como um reservatório para receber a energia liberada. A capacitância da carga precisa ser descarregada e então a corrente quer fluir para o GND. No entanto, a energia não pode se mover facilmente para a fonte de alimentação principal e então o capacitor armazena-a temporariamente.</p>
<h1>Fonte de alimentação sem potência</h1>
<p>A fonte de alimentação principal não pode prover o chip lógico com toda a energia necessária por causa da indutância. Todo fio possui indutância (parasita) e isso dificulta as variações de corrente. A <a href="http://en.wikipedia.org/wiki/Inductance">equação básica</a> na eletrônica para indutância é:</p>
<pre> U = L dI dt ⇒ dI = U • dt L</pre>
<p>A partir desta equação pode ser visualizado que a mudança na corrente dI é inversamente proporcional a L (indutância). Em outras palavras, quando a indutância aumenta torna-se mais difícil alterar a corrente em determinado período de tempo, se todos os outros parâmetros permanecerem os mesmos. Além disso, uma mudança na corrente atual significa que há uma queda de tensão sobre a indutância. Um fio longo (ou uma trilha na PCI) tem indutância maior e, portanto, atua contra as mudanças rápidas de corrente provocando uma queda de tensão grande.<br />
O capacitor de bypass é uma fonte local de energia. Ele precisa ser montado bem perto dos pinos de alimentação do CI, reduzindo assim a indutância entre o CI e o capacitor ao mínimo. Esta configuração <strong>desacopla</strong> a fonte principal do fornecimento de energia do chip.</p>
<h1>Stress no inversor</h1>
<p>Existem seis inversores no encapsulamento, então o circuito de teste foi modificado para consumir mais corrente:</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura7.png" alt="" /></p>
<p>Figura 7: Circuito de teste com carga adicional</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura8.jpg" alt="" /></p>
<p>Figura 8: Alta carga na saída e corrente sem (esquerda) e com (direita) o capacitor de bypass; note a mudança na escala da corrente</p>
<p>A corrente no pino de GND agora atinge pico de cerca de 70mA quando o capacitor de bypass não está instalado. Uma imagem simétrica é novamente visualizada <strong>com</strong> o capacitor de bypass instalado, mostrando +/-50mA, dependendo da borda, se subindo ou descendo.<br />
Note que as transições, como mostrado na imagem inferior esquerda da figura 8, são significativamente mais irregulares. O 74HC04 simplesmente não possui energia para suportar a transição. Adicionando o capacitor de bypass (imagem da direita) a transição volta novamente a um nível aceitável.</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura9.jpg" alt="" /></p>
<p>Figura 9: Detalhe da borda alta <strong>com</strong> o capacitor de bypass; note a mudança na escala da corrente</p>
<p>O detalhe da borda revela uma alongado consumo de corrente, que é causado por uma demanda de energia muito mais alta. A carga no chip é seis vezes maior (o primeiro inversor tem uma carga 5 vezes ~5pF da capacitância dos inversores secundários).</p>
<p>Este foi só um exemplo com um CI de portas inversoras. Agora, extrapole a idéia para CIs lógicos complexos, que possuem muitas portas internamente com muitas transições. Existem muitas capacitâncias parasitas nas portas que precisam ser (des)carregados toda vez que uma entrada muda. Ou pense sobre microcontroladores, com milhares de portas lógicas lá dentro.</p>
<h1>Aterramento</h1>
<p>Apartir dessa explanação e visualização dos dados, deve ficar claro que o capacitor de bypass é um elemento importante com uma função bem definida. Ele armazena energia e libera quando necessário, além de recebê-la quando há excesso.</p>
<p>Esta fonte local está sempre sendo suprida pela fonte de alimentação principal através da conexão de Vcc. No entanto, o excesso de energia precisa ser devolvida para a fonte principal através da conexão de GND. Receber esta energia no capacitor de bypass eleva a tensão e, efetivamente, cria temporariamente uma ilha com um potencial diferente. Remover este desequilíbrio é muito importante e isto é feito através das conexões de GND.</p>
<p>Projeto de PCIs (Placas de Circuito Impresso) oferecem <a href="http://en.wikipedia.org/wiki/Ground_plane#Printed_circuit_boards">planos de aterramento</a> que fazem conexões muito eficientes com a fonte principal. Um bom projeto de plano de GND é essencial para liberar a energia excessiva. Mas seja cauteloso, pois um simples plano de aterramento também pode induzir<a href="http://pt.wikipedia.org/wiki/Corrente_de_Foucault"> correntes parasitas (Foucault)</a><a> </a>e múltiplas conexões ao GND podem introduzir <a>loops</a>.</p>
<p><strong>Sempre</strong> é uma boa idéia conversar com aquele experiente amigo projetista de PCIs. A maioria dos erros já foram cometidos e não há necessidade que sejam repetidos por nós <em>ad infinitum</em>.</p>
<p>&nbsp;</p>
<p><strong>Bertho Stultiens</strong></p>
<p>Este artigo foi adaptado para o Eletronica.org a partir do original, em inglês, disponível em <a href="http://www.vagrearg.org/?p=decoupling">http://www.vagrearg.org/?p=decoupling</a>, com autorização do autor.</p>
<p><em><strong>Obra sob Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)</strong></em><br />
<em>Você tem a liberdade de:</em></p>
<ul>
<li><em>    Compartilhar — copiar, distribuir e transmitir a obra.</em></li>
<li><em>    Remixar — criar obras derivadas.</em></li>
<li><em>    fazer uso comercial da obra</em></li>
</ul>
<p><em>Sob as seguintes condições:</em></p>
<ul>
<li><em>    Atribuição — Você deve creditar a obra da forma especificada pelo autor ou licenciante (mas não de maneira que sugira que estes concedem qualquer aval a você ou ao seu uso da obra).</em></li>
<li><em>    Compartilhamento pela mesma licença — Se você alterar, transformar ou criar em cima desta obra, você poderá distribuir a obra resultante apenas sob a mesma licença, ou sob uma licença similar à presente.</em></li>
</ul>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/artigos/desacoplando-atraves-de-exemplos">Desacoplando Através de Exemplos</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/desacoplando-atraves-de-exemplos/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Estação de Solda Hakko FX 951</title>
		<link>http://www3.eletronica.org/reviews/estacao-de-solda-hakko-fx-951</link>
		<comments>http://www3.eletronica.org/reviews/estacao-de-solda-hakko-fx-951#comments</comments>
		<pubDate>Sun, 30 Oct 2011 00:17:57 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[equipamento]]></category>
		<category><![CDATA[solda]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=211</guid>
		<description><![CDATA[<p>Nos últimos 2 anos este equipamento tem sido a estação de solda utilizada no laboratório  Eletronica.org. Com um design bonito e compacto, sua coloração azul com amarelo não fica despercebida em nenhuma bancada. O equipamento vem acondicionado em uma embalagem bem desenhada que traz o manual de instruções em várias linguas (mas não o português),...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/estacao-de-solda-hakko-fx-951">Estação de Solda Hakko FX 951</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Nos últimos 2 anos este equipamento tem sido a estação de solda utilizada no laboratório  Eletronica.org. Com um design bonito e compacto, sua coloração azul com amarelo não fica despercebida em nenhuma bancada.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/products_hakko_fx951_img.jpg"><img class="size-full wp-image-212 aligncenter" title="products_hakko_fx951_img" src="http://www3.eletronica.org/wp-content/uploads/2011/10/products_hakko_fx951_img.jpg" alt="" width="236" height="194" /></a></p>
<p>O equipamento vem acondicionado em uma embalagem bem desenhada que traz o manual de instruções em várias linguas (mas não o português), a própria estação de solda, seu ferro com ponta destacável (modelo FM-2028) e suporte para o ferro com sensor de posição. Além disso acompanha uma espuma para água (limpeza da ponta), chave para programação e uma placa de material resiste ao calor para a movimentação das pontas à quente.</p>
<p>Duas características deste equipamento se destacam no dia-a-dia: o ferro de solda <strong>extremamente</strong> leve e a resistência incorporada à ponta. Estes dois fatores, além das 85  pontas disponibilizadas pela Hakko para este modelo, tornam o conjunto imbatível em qualidade e conforto para a soldagem. O ferro, com a minha ponta  preferida (T2L 0,2mm),  pesa não muito mais que uma caneta &#8220;gordinha&#8221;  (e isso faz toda a diferença).</p>
<p>O suporte para o ferro de solda é conectado através de um jack simples para determinar se o ferro encontra-se em repouso. Nesta condição a temperatura é alterada, de forma a economizar energia e salvar a ponta de desgaste excessivo em altas temperaturas. Ao contrário do que parece a primeira vista,  isto não dificulta em nada a utilização pois a curva de subida da temperatura é extremamente elevada. O simples tempo de retirar o ferro do suporte e dirigir para o local da soldagem é suficiente para recuperar a temperatura setada digitalmente, com precisão de 1ºC, até o limite de 450ºC. Outro detalhe do suporte é o movimento articular que o coloca em uma posição ideal &#8211; e diferente &#8211; para colocação e remoção do ferro de solda.</p>
<p><img class="alignleft" title="FX951" src="http://www.hakko.com/english/products/imgs/other/951_05.jpg" alt="" width="180" height="135" /><img class="alignleft" title="FX950" src="http://www.hakko.com/english/products/imgs/other/fx950_04.jpg" alt="" width="140" height="160" /><img class="alignleft" title="fx951_2028.jpg" src="http://www.hakko.com/english/products/imgs/other/fx951_2028.jpg" alt="Ferro FM-2028 Hakko FX951" width="213" height="32" /></p>
<p><img class="alignleft" title="TIP FX950" src="http://www.hakko.com/english/products/imgs/other/fx950/tip_illust.gif" alt="" width="178" height="49" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>A chave para programação é util para evitar mudanças incorretas nas temperaturas e ajustes do ferro. Quanto este chave (plástica, azul) não está inserida no equipamento a mudança de temperatura fica bloqueada.</p>
<p>Importante ressaltar que praticamente todos os itens, ferro, suporte e pontas, possuem algumas outras versões disponíveis para compras adicionais junto à Hakko, permitindo personalizar a estação para cada nicho específico.</p>
<p>Infelizmente, por tratar-se de um produto importado, o custo não é dos mais baixos aqui no Brasil. Comumente encontra-se em alguns distribuidores nacionais com preços variando entre R$1250,00 e R$1500,00. Por possuir um preço alto, esta estação é indicada para quem a utiliza de forma profissional e frequente, com necessidade de reposição de pontas e extrema precisão na soldagem.</p>
<p>Mais informações sobre este produto podem ser encontradas na <a href="http://www.hakko.com/english/products/hakko_fx951.html">página do fabricante</a>.</p>
<p>&nbsp;</p>
<p>Por Roberto Alcântara (roberto@eletronica.org)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/estacao-de-solda-hakko-fx-951">Estação de Solda Hakko FX 951</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/reviews/estacao-de-solda-hakko-fx-951/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Programming Embedded Systems, Second Edition</title>
		<link>http://www3.eletronica.org/reviews/programming-embedded-systems-second-edition</link>
		<comments>http://www3.eletronica.org/reviews/programming-embedded-systems-second-edition#respond</comments>
		<pubDate>Sat, 29 Oct 2011 16:55:09 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[sistemas embarcados]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=201</guid>
		<description><![CDATA[<p>Recentemente recebi gratuitamente uma encomenda com 4 livros da editora O’Reilly para que eu fizesse as resenhas desses livros. Antes de tudo eu devo avisar que essa resenha não pertence à série de resenhas que eu vinha fazendo, e que devo continuar em breve, à qual eu dei o nome de “Leitura Obrigatória”. O livro de hoje...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/programming-embedded-systems-second-edition">Programming Embedded Systems, Second Edition</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Recentemente recebi gratuitamente uma encomenda com 4 livros da editora <a href="http://www.oreilly.com/">O’Reilly</a> para que eu fizesse as resenhas desses livros.</p>
<p>Antes de tudo eu devo avisar que essa resenha não pertence à série de resenhas que eu vinha fazendo, e que devo continuar em breve, à qual eu dei o nome de “Leitura Obrigatória”.</p>
<p>O livro de hoje é o <strong><a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=4092&amp;tipo=2&amp;isbn=0596009836">Programming Embedded Systems, Second Edition</a></strong>. Eu já estou quase terminando a leitura deste livro e já me sinto à vontade para recomendá-lo por aqui porque eu realmente me empolguei com o material.</p>
<p>Como muitos já sabem eu voltei a praticar o antigo <em>hobby</em> de montar dispositivos eletrônicos, e desde que eu havia parado de brincar com essas coisas muita coisa mudou. Hoje em dia é muito comum encontrar microprocessadores e microcontroladores em vários projetos, e trabalhar com esses componentes exige um conhecimento que mora entre a eletrônica “pura” e a informática.</p>
<div style="width: 384px" class="wp-caption aligncenter"><img class="size-full" src="https://images-na.ssl-images-amazon.com/images/I/51-VfiRCWrL._SX372_BO1,204,203,200_.jpg" width="374" height="499" /><p class="wp-caption-text">Programming Embedded Systems</p></div>
<p>Como eu já tenho bons conhecimentos de informática e meus conhecimentos de eletrônica “pura” estavam evoluindo com a prática do meu antigo <em>hobby</em>, estava faltando construir a ponte que iria unir essas duas áreas do conhecimento.</p>
<p>Na mesma época recebi uma proposta da O’Reilly para fazer resenhas dos livros de Python deles e aproveitei para pedir alguns títulos que tratavam de dispositivos embarcados. Recebi este livro juntamente com outros 3 de Python (aguardem resenhas) e comecei a lê-lo.</p>
<p>O livro tem foco prático como em quase todos os títulos da editora O’Reilly. Os autores realmente irão desenvolver o assunto em cima de uma <a href="http://www.arcom.com/oreilly.htm">plataforma real</a> de desenvolvimento que usa um processador ARM XScale e irão conduzir o leitor desde o ponto onde a gente faz um LED piscar até o momento onde desenvolvemos aplicações reais com RTOS e Linux.</p>
<p>O livro fala sobre <em>device drivers</em>, interrupções, registradores, memória e sobre como gerenciar e desenvolver software em C (gcc) para usar todas essas funcionalidades.</p>
<p>Vale destacar que esse livro fica exatamente na fronteira entre um livro de nível básico e um livro avançado, ou seja, se você não entende nada de eletrônica e muito pouco de informática esse livro não irá lhe servir. Se você também já é um especialista no assunto pode achar o livro massante demais na primeira parte que trata de assuntos mais básicos.</p>
<p>O próximo passo agora é adquirir um kit de desenvolvimento parecido com esse que foi proposto no livro e começar a brincar. Eu tenho certeza que eu vou me divertir muito com esse tipo de coisa depois de ler este livro.</p>
<p>Para comprar: <a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=4092&amp;tipo=2&amp;isbn=0596009836">Programming Embedded Systems, Second Edition</a></p>
<p><em>Por <strong>Osvaldo Santana</strong><br />
Veja esta resenha também em <a href="http://pythonologia.org/2006/11/17/programming-embedded-systems-second-edition/" target="_self">www.pythonologia.org</a></em></p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/programming-embedded-systems-second-edition">Programming Embedded Systems, Second Edition</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/reviews/programming-embedded-systems-second-edition/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Designing Embedded Hardware 2nd Edition</title>
		<link>http://www3.eletronica.org/reviews/designing-embedded-hardware-2nd-edition</link>
		<comments>http://www3.eletronica.org/reviews/designing-embedded-hardware-2nd-edition#respond</comments>
		<pubDate>Sat, 29 Oct 2011 16:52:58 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[sistemas embarcados]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=198</guid>
		<description><![CDATA[<p>Com foco exclusivo no hardware, John Catsoulis inicia o seu livro com conceitos básicos dos elementos da arquitetura de computadores como memórias, I/O, DMA, etc., antes de falar um pouco sobre software. A sua abordagem do tema é bastante simplória e antecede uma revisão sobre os conceitos básicos da eletricidade, como tensão e corrente, para...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/designing-embedded-hardware-2nd-edition">Designing Embedded Hardware 2nd Edition</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Com foco exclusivo no hardware, John Catsoulis inicia o seu livro com conceitos básicos dos elementos da arquitetura de computadores como memórias, I/O, DMA, etc., antes de falar um pouco sobre software. A sua abordagem do tema é bastante simplória e antecede uma revisão sobre os conceitos básicos da eletricidade, como tensão e corrente, para posteriormente fazer uma breve passagem sobre os componentes básicos dos circuitos eletrônicos, como diodos, cristais, capacitores, circuitos RC, indutores, etc. Esta seção, sobre eletrônica básica, é perfeitamente descartável para usuários com um pouco de experiência no assunto.</p>
<p>Em seguida o autor dedica capítulos específicos que abordam áreas importantes dos projetos de sistemas embarcados, iniciando com as fontes de alimentação. Baseado na sua própria experiência, algumas dicas básicas sobre redução de ruídos e interferências são mostradas após descrever e exemplificar, através de circuitos, meia dúzia de componentes específicos para a regulação da alimentação, em 5Vcc e em 3.3Vcc.</p>
<p><img class="aligncenter" src="http://akamaicovers.oreilly.com/images/9780596003623/cat.gif" alt="designingembeddedhardware.jpg" /></p>
<p>No sexto capítulo nós temos uma série de dicas sobre ferramentas, soldagem e prototipagem de circuitos impressos para em seguida, no sétimo capítulo, iniciar uma abordagem mais detalhada sobre alguns protocolos de comunicação utilizados como SPI, I2C, portas seriais, IRDA, USB, CAN e Ethernet. Algumas dessas abordagens são mais resumidas que outras, mantendo o foco do autor principalmente nos protocolos que ele posteriormente vem a utilizar quando trata, no capítulo &#8220;Analógico&#8221;, sobre diversos sensores e circuitos de conversores analógicos digitais. Neste ponto vê-se mais uma vez o uso da experiência do autor ao selecionar sensores que estão presente de forma bastante ativa nos projetos de sistemas embarcados tradicionais.</p>
<p>Os últimos seis capítulos do livro são dedicados aos microcontroladores. Nestas mais de 100 páginas o autor não foca exclusivamente em um fabricante ou arquitetura. Ele prefere abordar  algumas arquiteturas mais utilizadas no mercado para que o estudante possa adquirir uma bagagem de conhecimento que lhe seja útil para escolher o componente que melhor se adequa ao seu projeto. Os microcontroladores citados são os PIC e AVR, contando em seguida com textos sobre o 68HC11, MAXQ, 68k e DSPs. Neste espaço o autor detalha diversos parâmetros envolvidos nos projetos, como temporizações de clock, conexões de barramentos, lógica de decodificação de memórias, entre outros, sempre com a utilização de exemplo de circuitos reais que facilitam a absorção do conteúdo.</p>
<p>Muito dos conceitos descritos no decorrer do livro podem frustrar os mais experientes pela simplicidade, mas a abordagem é ideal para quem está tendo o primeiro contato com este mundo. Vale ressaltar também que, por não ser o foco do livro, muito pouco sobre software é abordado, obrigando os estudantes a procurarem outra referência sobre o tema.  Enfim, Designing Embedded Hardware é um livro ideal para quem está começando no mundo dos projetos de sistemas embarcados, mas não recomendado para usuários que já desenvolveram projetos de médio porte.<br />
Para comprar (30% de desconto para os membros Eletronica.org): <a href="http://www.oreilly.com/catalog/dbhardware2/" target="_self">Loja Internacional da O&#8217;Reilly</a>. Para comprar no Brasil: <a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=813684" target="_self">Livraria Cultura</a>.</p>
<p>Não existe, até o momento, edição em português deste livro.</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/designing-embedded-hardware-2nd-edition">Designing Embedded Hardware 2nd Edition</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/reviews/designing-embedded-hardware-2nd-edition/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Math Toolkit for Real-Time Programming</title>
		<link>http://www3.eletronica.org/reviews/math-toolkit-for-real-time-programming</link>
		<comments>http://www3.eletronica.org/reviews/math-toolkit-for-real-time-programming#respond</comments>
		<pubDate>Sat, 29 Oct 2011 16:51:39 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[sistemas embarcados]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=196</guid>
		<description><![CDATA[<p>Jack W. Crenshaw, especialista em desenvolvimento de sistemas industriais e aeroespaciais, consegue em seu livro Math Toolkit for Real-Time Programming, de forma muito clara e objetiva, apresentar alguns dos fundamentos matemáticos essenciais para qualquer desenvolvedor de sistemas, em especial aqueles que trabalham com sistemas embarcados em tempo real. Eu iria além: se os seus processadores...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/math-toolkit-for-real-time-programming">Math Toolkit for Real-Time Programming</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Jack W. Crenshaw, especialista em desenvolvimento de sistemas industriais e aeroespaciais, consegue em seu livro Math Toolkit for Real-Time Programming, de forma muito clara e objetiva, apresentar alguns dos fundamentos matemáticos essenciais para qualquer desenvolvedor de sistemas, em especial aqueles que trabalham com sistemas embarcados em tempo real. Eu iria além: se os seus processadores possuem recursos limitados, leia este livro.</p>
<p>Elementos matemáticos fundamentais, como raiz quadrada, exponenciais, logarítmos, seno, cosseno, tangente e suas variantes, e os fundamentos do cálculo numérico são revisados teoricamente e analisados através de uma abordagem prática, com exemplos de algorítmos com diferentes estratégias de cálculos, priorizando precisão e velocidade.</p>
<p>&nbsp;</p>
<p><img class="aligncenter" alt="" src="https://images-na.ssl-images-amazon.com/images/I/51dwOzmaeGL._SX346_BO1,204,203,200_.jpg" width="348" height="499" /></p>
<p>&nbsp;</p>
<p>Outros temas, como ponto flutuante, constantes, erros, série de Taylor, transformada Z, são tratados em capítulos dedicados ou como subtema em um capítulo maior.</p>
<p>No final do livro, uma pequena biblioteca em C++ com funções estudadas no livro e um CD-ROM contendo as bibliotecas e todos os exemplos utilizados ajudam ainda mais o desenvolvedor em seus estudos.</p>
<p>Enfim, leitura fortemente recomendada se você se encaixa no perfil descrito no início ou se é um entusiasta da área. Como diz o autor, &#8220;Se você está procurando um livro sobre os últimos métodos para escrever Applets Java ou aprender como criar seus próprios controles VBx, devolva o livro e pegue o seu dinheiro de volta&#8221;.</p>
<p>Infelismente não existe uma versão em português do livro. Dois locais onde você pode encontrá-lo: <a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=1183700&amp;sid=20112117481210608267677874&amp;k5=3A434E64&amp;uid=" target="_self">Livraria Cultura</a> e <a href="http://www.amazon.com/Math-Toolkit-Real-Time-Programming-Crenshaw/dp/1929629095" target="_self">Amazon</a>.</p>
<p>Por Roberto Alcântara</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/math-toolkit-for-real-time-programming">Math Toolkit for Real-Time Programming</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/reviews/math-toolkit-for-real-time-programming/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building Embedded Systems Devices</title>
		<link>http://www3.eletronica.org/reviews/building-embedded-systems-devices</link>
		<comments>http://www3.eletronica.org/reviews/building-embedded-systems-devices#respond</comments>
		<pubDate>Sat, 29 Oct 2011 16:47:47 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sistemas embarcados]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=194</guid>
		<description><![CDATA[<p>Não sendo um livro introdutório sobre Linux ou sistemas embarcados, Building Embedded Linux Systems é voltado para desenvolvedores que já possuem alguma familiaridade com sistemas Linux, mas que desejam se aprofundar nos detalhes necessários para o desenvolvimento de aplicações embarcadas ou distribuições extremamente personalizadas. Os tópicos abordados vão desde conceitos básicos sobre os tipos de hosts e...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/building-embedded-systems-devices">Building Embedded Systems Devices</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Não sendo um livro introdutório sobre Linux ou sistemas embarcados, <strong>Building Embedded Linux Systems</strong> é voltado para desenvolvedores que já possuem alguma familiaridade com sistemas Linux, mas que desejam se aprofundar nos detalhes necessários para o desenvolvimento de aplicações embarcadas ou distribuições extremamente personalizadas. Os tópicos abordados vão desde conceitos básicos sobre os tipos de hosts e arquiteturas suportadas até o ajuste do bootloader, rede e ferramentas de debug.</p>
<p>Os capítulos que tratam da preparação do kernel, das bibliotecas, dos utilitários e dos compiladores são bastante práticos, com uma vasta lista de comandos necessários em cada etapa para construir os binários, o que facilita bastante para os desenvolvedores que não estão habituados com estes procedimentos de compilação. São estes tópicos os mais numerosos, mas sempre que algum detalhe da estrutura do kernel é necessária para o entendimento do texto este é devidamente tratado como, por exemplo, o capítulo sobre dispositivos de armazenamento precedendo a configuração e ajuste do sistema de arquivos.</p>
<p>Em suma, este livro é voltado para o desenvolvedor que pretende conhecer como selecionar, configurar e empacotar um sistema Linux para uma plataforma específica, criando um sistema de arquivos completo voltado para as suas necessidades, fazendo-o iniciar corretamente e depurá-lo. Porém, não é intenção do autor abordar detalhes da estrutura do kernel, teóricas ou práticas, que permitam ao desenvolvedor intervir nas estruturas de baixo nível do sistema para, por exemplo, portar o sistema para uma nova arquitetura. Se este é o seu foco, esta não é a literatura correta, mas se o seu objetivo é condizente com o do livro esta é uma obra bastante recomendada pela riqueza de detalhes e qualidade do texto.</p>
<table>
<tbody>
<tr>
<td><img class="aligncenter" alt="" src="http://akamaicovers.oreilly.com/images/9780596002220/cat.gif" width="180" height="236" /></td>
<td>Building Embedded Linux SystemsKarim Yaghmour</p>
<p>ISBN 0-596-00222-X</p>
<p><strong>416 Páginas &#8211; Editora O&#8217;Reilly</strong></p>
<p>Você pode encontrá-lo na <a title="Loja Internacional da O'Reilly" href="http://www.oreilly.com/catalog/belinuxsys/">Loja Internacional da O&#8217;Reilly</a> (com desconto¹ de 35% para membros do Eletronica.org) e também na <a title="Livraria Tempo Real" href="http://www.temporeal.com.br/produtos.php?id=169456">Livraria Tempo Real</a> e<a title="Livraria Cultura" href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=693834&amp;sid=201980121978554936309325&amp;k5=368B2E07&amp;uid=">Livraria Cultura</a>.</p>
<p><sub>¹ Para verificar como proceder <a title="clique aqui" href="http://www2.eletronica.org/login_form">clique aqui.</a></sub></td>
</tr>
</tbody>
</table>
<p>Roberto Alcântara<br />
roberto@eletronica.org</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/building-embedded-systems-devices">Building Embedded Systems Devices</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/reviews/building-embedded-systems-devices/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protocolo de Comunicação I²C</title>
		<link>http://www3.eletronica.org/artigos/protocolo-de-comunicacao-i%c2%b2c</link>
		<comments>http://www3.eletronica.org/artigos/protocolo-de-comunicacao-i%c2%b2c#respond</comments>
		<pubDate>Sat, 29 Oct 2011 16:30:57 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[microcontrolador]]></category>
		<category><![CDATA[serial]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=180</guid>
		<description><![CDATA[<p>Para explorar todos os benefícios dos sistemas e dispositivos eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e minimizar a complexidade dos circuitos. 1. Introdução Para explorar todos os benefícios dos sistemas e dispositivos eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e minimizar a complexidade dos circuitos. Para...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/artigos/protocolo-de-comunicacao-i%c2%b2c">Protocolo de Comunicação I²C</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Para explorar todos os benefícios dos sistemas e dispositivos eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e minimizar a complexidade dos circuitos.</p>
<p><strong>1. Introdução</strong></p>
<div>
<p>Para explorar todos os benefícios dos sistemas e dispositivos eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e minimizar a complexidade dos circuitos.</p>
<p>Para facilitar esta árdua tarefa surgiu o protocolo de comunicação I2C.</p>
<p>O protocolo de comunicação em 2 sinais I2C foi originalmente desenvolvido pela Philips em meados de 1996. Atualmente este protocolo está amplamente difundido e interconecta uma ampla gama de dispositivos eletrônicos. Dentre estes encontramos vários dispositivos de controle inteligente, normalmente microcontroladores e microprocessadores assim como outros circuitos de uso geral, como drivers LCD, portas de I/O, memórias RAM e EEPROM ou conversores de dados.</p>
<p>Muitas vantagens podem ser atribuídas ao protocolo I2C. Destacam-se entre elas:</p>
<p>&#8211; Organização funcional em blocos, providenciando um simples diagrama esquemático final.<br />
&#8211; Não há necessidade dos projetistas desenvolverem interfaces. Todos os dispositivos integram as interfaces &#8220;on-chip&#8221;, o que aumenta a agilidade no desenvolvimento.<br />
&#8211; Endereçamento e protocolo de transferência de dados totalmente definido via software.<br />
&#8211; Possibilidade de inclusão ou exclusão de dispositivos no barramente sem afeta-lo ou outros dispositivos conectados a este.<br />
&#8211; Diagnóstico de falhas extremamente simples. O mal funcionamento é imediatamente detectado.<br />
&#8211; Desenvolvimento simplificado do software através do uso de bibliotecas e módulos de software reutilizáveis.<br />
&#8211; Facilidade no desenvolvimento de placas de circuito impresso, devido a quantidade de interconexões.</p>
<p>Adicionalmente, utilizando as vantagens da tecnologia CMOS na fabricação dos dispositivos, temos:<br />
&#8211; Baixíssimo consumo de corrente.<br />
&#8211; Alta imunidade à ruidos.<br />
&#8211; Ampla faixa de tensões p/ alimentação.<br />
&#8211; Ampla faixa de temperatura p/ operação.</p>
<p><strong>2. Características Gerais do Barramento I2C:</strong></p>
<p>&#8211; Suporta qualquer tecnologia de produção.<br />
&#8211; Duas vias de comunicação: serial data (SDA) e serial clock (SCL), ambas bidirecionais, conectadas ao positivo da fonte de alimentação através de um resistor de pull-up. Enquanto o barramento está livre ambas as linhas ficam em nível lógico alto.<br />
&#8211; A taxa de transferência máxima é de 100kbit/s no modo padrão (standart), ou 400kbit/s no modo rápido (fastmode).<br />
&#8211; Informação de carry entre dispositivos conectados.<br />
&#8211; Todo dispositivo possui um endereço único no barramento, independente de sua natureza.<br />
&#8211; Qualquer dispositivo conectado pode operar com transmissor ou receptor. Claro que isso depende da natureza do dispositivo &#8211; um LCD não vai operar como transmissor, assim como um teclado não operará como receptor. Independente disto, qualquer dispositivo <em>endereçado</em> é chamado de escravo (slave).<br />
&#8211; O número de interfaces conectadas fica dependente da capacitância máxima do barramento, que é de 400pF.</p>
<p><strong>3. Definições:</strong><br />
&#8211; Transimiter (Transmissor): dispositivo que envia dados através do barramento.<br />
&#8211; Receive (Receptor): dispositivo que recebe dados através do barramento.<br />
&#8211; Master: dispositivo que inicia a comunicação, gera o sinal de clock e encerra a comunicação.<br />
&#8211; Multi-master: vários dispositivos podem controlar o barramento, mesmo sem comprometer a mensagem. Quando isto ocorre temos vários dispositivos operando em modo maste<br />
&#8211; Arbitrarion (Arbitrariedade) : procedimento p/ o controle do barramento em modo multi-master. Visa não corromper a transmissão dos dados e perder a sincrioia do clock.<br />
&#8211; Sincronização: procedimento p/ sincronizar o clock de um ou mais dispositivos.</p>
<p><strong>4. Comunicação:</strong></p>
<p>4.1 Níveis lógicos<br />
Como o protocolo de comunicação i2c aceita uma ampla gama de métodos de fabricação para os seus dispositivos (CMOS,NMOS,Bipolar,etc.) os níveis lógicos alto e baixo não possuem valores pré-estabelecidos, dependendo diretamente da tenção Vcc de alimentação.</p>
<p>4.2 Validação dos dados<br />
O dado na linha SDA precisa ser estável durante o período ALTO do clock. A mudança entre os níveis lógicos alto e baixo só podem ser feitas enquanto a sinal de clock estiver BAIXO.</p>
<p>4.3 Condições Iniciais e Finais<br />
Durante todo o processo apenas dois sinais são caracterizados como condições de START e STOP.</p>
<p>4.4 O procedimento de comunicação do protocolo I2C é extremamente simples. Basicamente temos 6 itens para análise:<br />
&#8211; 1. O dispositivo master ajusta a condição inicial.<br />
&#8211; 2. O dispositivo master envia 7 bis de endereçamento.<br />
&#8211; 3. O dispositivo master envia o 8o bit, RW/<br />
&#8211; 4. O dispositivo slave envia o sinal de ACK (Acknowledge)<br />
&#8211; 5. O dispositivo master (ou slave) envia pacotes de 8 bits de dados, sempre seguidos de um sinal ACK enviado pelo dispositivo slave (ou master) confirmando a recepção.<br />
&#8211; 6. O dispositivo master encerra a comunicação.</p>
<p><strong>Sinais de de dados e clock em um exemplo de comunicação prática:</strong></p>
<p><img class="aligncenter" src="http://www.eletronica.org/img_artigos/ciclo_i2c.gif" alt="" /><br />
É importante fazer algumas observações:<br />
1. O endereçamento default é feito com 7 bits, mas existe o modo extendido que possibilita o uso de 10 bits de endereçamento (1024 dispositivos).<br />
2. A quantidade de pacotes de transmissão é controlada pelo dispositivo master, não possuindo um valor máximo definido. Este é um ponto importante a ser observado, pois como os dados sao transmitidos serialmente, na utilização de memórias, perde-se os limites de endereçamento que existem nos dispositivos paralelos.<br />
3. A comunicação pode ser suspensa, simplesmente travando-se o sinal de clock. Isto pode ser útil para efetuar o tratamento de interrupções ou derivados, sem, no entanto, corromper os dados transmitidos.</p>
<p><strong>5. Conclusão</strong><br />
Este pequeno artigo visou fazer um apanhado geral sobre o protocolo de comunicação I2C, tentando demonstrar de modo rápido e didático como funciona este método de transeferência de dados. Documentos com características técnicas mais apuradas podem ser encontrados no site da Philips Instruments ( <a href="http://www.philips.com/">www.philips.com</a> ).<br />
Aos que já conhecem e utilizaram o protocolo, já estão por dentro das<br />
facilidades. Para os que nunca utilizaram, não deixem de experimentar. Vocês se surpreenderão com as facilidades e agilidades proporcionadas.</p>
<p>Sugestões ou correções no texto acima, contacte-nos através do nosso <a href="mailto:rpfilho@mailbr.com.br">e-mail</a> .</p>
<p>Roberto Paulo Dias A. Filho<br />
roberto@eletronica.org</p>
</div>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/artigos/protocolo-de-comunicacao-i%c2%b2c">Protocolo de Comunicação I²C</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/protocolo-de-comunicacao-i%c2%b2c/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conectando 6 LEDs com Apenas 3 Pinos do Microcontrolador</title>
		<link>http://www3.eletronica.org/dicas-e-hacks/conectando-6-leds-com-apenas-3-pinos-do-microcontrolador</link>
		<comments>http://www3.eletronica.org/dicas-e-hacks/conectando-6-leds-com-apenas-3-pinos-do-microcontrolador#respond</comments>
		<pubDate>Sat, 29 Oct 2011 16:23:31 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Dicas e Hacks]]></category>
		<category><![CDATA[microcontrolador]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=178</guid>
		<description><![CDATA[<p>Algumas vezes você precisa de mais do que o que tem. Eeu estou falando sobre os pinos do microcontrolador. Veja bem: você tem que conectar 6 LEDs mas possui apenas três pinos do microcontrolador disponíveis. Utilizar outro microcontrolador não é sempre uma opção e outros circuitos decodificadores também não. Esta é uma dica simples de...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/dicas-e-hacks/conectando-6-leds-com-apenas-3-pinos-do-microcontrolador">Conectando 6 LEDs com Apenas 3 Pinos do Microcontrolador</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Algumas vezes você precisa de mais do que o que tem. Eeu estou falando sobre os pinos do microcontrolador.</p>
<p>Veja bem: você tem que conectar 6 LEDs mas possui apenas três pinos do microcontrolador disponíveis. Utilizar outro microcontrolador não é sempre uma opção e outros circuitos decodificadores também não.</p>
<div>Esta é uma dica simples de como fazer isso. Conecte os diodos LED ao microcontrolador dessa forma:</div>
<div>
<p>&nbsp;</p>
<p>Agora veja: se você setar o pino um para &#8220;1&#8221; e o segundo para &#8220;0&#8221; (deixando o pino 3 no estado de alta impedância, como entrada) então você somente vai acender um LED. Você pode ligar dois leds ao mesmo tempo setando o terceiro pino para o estado &#8220;1&#8221; ou &#8220;0&#8221;, dependendo de qual LED adicional você pretende acender.<br />
Se você precisar ligar todos os LEDs ao mesmo tempo, precisará mudar o estado dos pinos em uma freqüência mais alta para evitar a sensação dos LEDs piscando.</p>
<p>Com esse método você pode ligar até doze LEDs com apenas 4 pinos. Este é um método conveniente para ser utilizado com LEDs bicolores, quando dois LEDs são colocados no mesmo encapsulamento, mas em diferentes direções.</p>
<p>Este é um exemplo de código em C para o ARV-GCC de como controlar os LEDs. No exemplo, os LEDs estão conectados na porta B, entre os pinos 0 e 2.</p>
<p>Fragmento da função de controle:</p>
<pre></pre>
<pre>unsigned char leds;           // Os bits são os estados dos leds
void LEDs_refresh(void)
{
static unsigned char state;   // Taxa de atualização atual
OFF();                      // Coloca todos os pinos em alta impedância (entrada)
switch (state)
{
   default:
      CLR_0();                  // Coloca o pino 0 baixo
        if (leds &amp;  1) {SET_1();} // Coloca o pino 1 alto para o led 1
        if (leds &amp;  2) {SET_2();} // Coloca o pino 2 alto para o led 2
        state=1;                  // próximo estado
       break;
  case 1:
       CLR_1();                  // Coloca o pino 0 baixo
        if (leds &amp;  4) {SET_0();} // Coloca o pino 0 alto para o led 3
        if (leds &amp;  8 ) {SET_2();} // Coloca o pino 2 alto para o led 4
       state=2;                  //próximo estado
       break;
    case 2:
       CLR_2();                  // Coloca o pino 2 em nível baixo
       if (leds &amp; 16) {SET_0();} // Coloca o pino 0 alto para o LED 5
       if (leds &amp; 32) {SET_1();} // Coloca o pino 1 alto para o LED 6
       state=0;                 // Próximo estado
       break;
}//end switch
}
<span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">Esta função deve ser chamada com freqüência para evitar deixar visível a piscada dos LEDs. O melhor é utilizar a interrupção do timer.</span></pre>
<p>O código completo do projeto está na caixa abaixo para download.</p>
</div>
<fieldset id="attachmentsBox">
<legend>Anexos</legend>
<ul>
<li><a title="" href="http://www2.eletronica.org/hack-s-dicas/conectando-6-leds-com-apenas-3-pinos-do-microcontrolador/6leds.zip">6leds.zip</a></li>
</ul>
</fieldset>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/dicas-e-hacks/conectando-6-leds-com-apenas-3-pinos-do-microcontrolador">Conectando 6 LEDs com Apenas 3 Pinos do Microcontrolador</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/dicas-e-hacks/conectando-6-leds-com-apenas-3-pinos-do-microcontrolador/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alternativas de Baixo Custo ao MAX232</title>
		<link>http://www3.eletronica.org/dicas-e-hacks/alternativas-de-baixo-custo-ao-max232</link>
		<comments>http://www3.eletronica.org/dicas-e-hacks/alternativas-de-baixo-custo-ao-max232#respond</comments>
		<pubDate>Sat, 29 Oct 2011 16:16:39 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Dicas e Hacks]]></category>
		<category><![CDATA[rs232]]></category>
		<category><![CDATA[serial]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=171</guid>
		<description><![CDATA[<p>Algumas vezes os projetos eletrônicos possuem orçamento apertado e você não pode gastar com um conversor MAX 232. Aqui estão algumas alternativas. Normalmente nós usamos um circuito com MAX 232 como esse: O MAX 232 é um circuito integrado conversor de nível, que converte sinais TTL em RS232 e virse-versa. Ele fornece uma ótima rejeição...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/dicas-e-hacks/alternativas-de-baixo-custo-ao-max232">Alternativas de Baixo Custo ao MAX232</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Algumas vezes os projetos eletrônicos possuem orçamento apertado e você não pode gastar com um conversor MAX 232. Aqui estão algumas alternativas.</p>
<div>
<p>Normalmente nós usamos um circuito com MAX 232 como esse:</p>
<p><img title="RS232_adapter.PNG" src="http://www.scienceprog.com/wp-content/uploads/2006i/RS232_ALT/RS232_adapter.PNG" alt="RS232_adapter.PNG" width="441" height="478" /><br />
O MAX 232 é um circuito integrado conversor de nível, que converte sinais TTL em RS232 e virse-versa. Ele fornece uma ótima rejeição de ruído e é mais robusto à descargas e curtos. Se o seu projeto for mais avançado, você deve utilizar um CI especializado para esta tarefa. No entanto, soluções especializadas são mais caras que as outras.<br />
Este é um exemplo de circuito com transistor para executar a tarefa de conversão:</p>
<p><img title="interface_schematic.gif" src="http://www.scienceprog.com/wp-content/uploads/2006i/RS232_ALT/interface_schematic.gif" alt="interface_schematic.gif" width="390" height="264" /></p>
<div>Os transistores podem ser todos de uso geral. Este circuito é muito simples e trabalhar sem problemas. É a solução mais barata, pois requer apenas um par de transistor e quatro resistores. Os dois transistores executam um truque para ter a tensão negativa necessária por alguns PCs. Quando o PC não transmite dados, seu pino TX está com uma tensão negativa. A tensão negativa presente é então trazida através do resistor R3 ao pino RD (recepção) do PC.</p>
<p>Alternativamente, RS232 pode ser conseguido utilizando portas lógicas. Isto é acessível quando sua aplicação já está utilizando elementos lógicos e há portas sobreando em algum CI. Como alguns PCs trabalhar bem apenas com tensões positivas, tudo que nós precisamos é inverter a lógica do sinal e para isso utilizamos as portas lógicas. Por exemplo, utilizando o CI CMOS CD4066B:</p>
</div>
<p><img title="interface_4066.gif" src="http://www.scienceprog.com/wp-content/uploads/2006i/RS232_ALT/interface_4066.gif" alt="interface_4066.gif" width="456" height="224" /></p>
<p>E, é claro, utilizando circuitos NAND e NOR:</p>
<p><img title="interface_4001.gif" src="http://www.scienceprog.com/wp-content/uploads/2006i/RS232_ALT/interface_4001.gif" alt="interface_4001.gif" width="450" height="226" /></p>
<p><img title="interface_4011.gif" src="http://www.scienceprog.com/wp-content/uploads/2006i/RS232_ALT/interface_4011.gif" alt="interface_4011.gif" width="456" height="225" /></p>
<p>&nbsp;</p>
<p>E não se esqueça de alimentar os CI&#8217;s com 5V.</p>
<p>&nbsp;</p>
<p><sub>Versão em português por Eletronica.org.<br />
Adaptado com autorização, do original em <a href="http://www.scienceprog.com/alternatives-of-max232-in-low-budget-projects/" target="_self">Science Prog.</a></sub></div>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/dicas-e-hacks/alternativas-de-baixo-custo-ao-max232">Alternativas de Baixo Custo ao MAX232</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/dicas-e-hacks/alternativas-de-baixo-custo-ao-max232/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Valores Comerciais de Resistores, Capacitores, Indutores e Fusíveis</title>
		<link>http://www3.eletronica.org/dicas-e-hacks/valores-comerciais-de-resistores-capacitores-indutores-e-fusiveis</link>
		<comments>http://www3.eletronica.org/dicas-e-hacks/valores-comerciais-de-resistores-capacitores-indutores-e-fusiveis#respond</comments>
		<pubDate>Tue, 25 Oct 2011 13:10:04 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Dicas e Hacks]]></category>
		<category><![CDATA[capacitor]]></category>
		<category><![CDATA[fusível]]></category>
		<category><![CDATA[indutor]]></category>
		<category><![CDATA[resistor]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=141</guid>
		<description><![CDATA[<p>Breve tabela contendo os valores comerciais destes componentes. Resistores Comerciais 1.0ohm 1.1ohm 1.2ohm 1.3ohm 1.5ohm 1.6ohm 1.8ohm 2.0ohm 2.2ohm 2.4ohm 2.7ohm 3.0ohm 3.3ohm 3.6ohm 3.9ohm 4.3ohm 4.7ohm 5.1ohm 5.6ohm 6.2ohm 6.8ohm 7.5ohm 8.2ohm 9.1ohm Para obter os demais valores basta multiplicar por: 10, 102, 103, 104, 105, 106, Capacitores Comerciais 1.0F 1.1F 1.2F 1.3F 1.5F 1.6F 1.8F 2.0F 2.2F 2.4F 2.7F 3.0F...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/dicas-e-hacks/valores-comerciais-de-resistores-capacitores-indutores-e-fusiveis">Valores Comerciais de Resistores, Capacitores, Indutores e Fusíveis</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Breve tabela contendo os valores comerciais destes componentes.</p>
<div><span class="Apple-style-span" style="font-size: 20px; font-weight: bold;">Resistores Comerciais</span></div>
<div>
<table>
<tbody>
<tr>
<td>1.0ohm</td>
<td>1.1ohm</td>
<td>1.2ohm</td>
<td>1.3ohm</td>
</tr>
</tbody>
<tbody>
<tr>
<td>1.5ohm</td>
<td>1.6ohm</td>
<td>1.8ohm</td>
<td>2.0ohm</td>
</tr>
<tr>
<td>2.2ohm</td>
<td>2.4ohm</td>
<td>2.7ohm</td>
<td>3.0ohm</td>
</tr>
<tr>
<td>3.3ohm</td>
<td>3.6ohm</td>
<td>3.9ohm</td>
<td>4.3ohm</td>
</tr>
<tr>
<td>4.7ohm</td>
<td>5.1ohm</td>
<td>5.6ohm</td>
<td>6.2ohm</td>
</tr>
<tr>
<td>6.8ohm</td>
<td>7.5ohm</td>
<td>8.2ohm</td>
<td>9.1ohm</td>
</tr>
</tbody>
</table>
<p>Para obter os demais valores basta multiplicar por: 10, 10<sup>2</sup>, 10<sup>3</sup>, 10<sup>4</sup>, 10<sup>5</sup>, 10<sup>6</sup>,</p>
<p><span class="Apple-style-span" style="font-size: 20px; font-weight: bold;">Capacitores Comerciais</span></p>
<table>
<tbody>
<tr>
<td>1.0F</td>
<td>1.1F</td>
<td>1.2F</td>
<td>1.3F</td>
</tr>
</tbody>
<tbody>
<tr>
<td>1.5F</td>
<td>1.6F</td>
<td>1.8F</td>
<td>2.0F</td>
</tr>
<tr>
<td>2.2F</td>
<td>2.4F</td>
<td>2.7F</td>
<td>3.0F</td>
</tr>
<tr>
<td>3.3F</td>
<td>3.6F</td>
<td>3.9F</td>
<td>4.3F</td>
</tr>
<tr>
<td>4.7F</td>
<td>5.1F</td>
<td>5.6F</td>
<td>6.2F</td>
</tr>
<tr>
<td>6.8F</td>
<td>7.5F</td>
<td>8.2F</td>
<td>9.1F</td>
</tr>
</tbody>
</table>
<p>Para obter os demais valores multiplique pelos seus submultiplos: mili, micro, nano e pico.</p>
<h2>Indutores Comerciais</h2>
<table>
<tbody>
<tr>
<td>1.0H</td>
<td>1.1H</td>
<td>1.2H</td>
<td>1.3H</td>
</tr>
</tbody>
<tbody>
<tr>
<td>1.5H</td>
<td>1.6H</td>
<td>1.8H</td>
<td>2.0H</td>
</tr>
<tr>
<td>2.2H</td>
<td>2.4H</td>
<td>2.7H</td>
<td>3.0H</td>
</tr>
<tr>
<td>3.3H</td>
<td>3.6H</td>
<td>3.9H</td>
<td>4.3H</td>
</tr>
<tr>
<td>4.7H</td>
<td>5.1H</td>
<td>5.6H</td>
<td>6.2H</td>
</tr>
<tr>
<td>6.8H</td>
<td>7.5H</td>
<td>8.2H</td>
<td>9.1H</td>
</tr>
</tbody>
</table>
<p>Para obter os demais valores basta multiplicar por: 10<sup>-3</sup>, 10<sup>-6</sup>.</p>
<p><span class="Apple-style-span" style="font-size: 20px; font-weight: bold;">Fusíveis comerciais</span></p>
<table>
<tbody>
<tr>
<td>0,1A</td>
<td>0,315A</td>
<td>1,25A</td>
<td>3,15A</td>
<td>6A</td>
<td>20A</td>
</tr>
<tr>
<td>0,125A</td>
<td>0,35A</td>
<td>1,5A</td>
<td>3,5A</td>
<td>7A</td>
<td>25A</td>
</tr>
<tr>
<td>0,15A</td>
<td>0,4A</td>
<td>1,6A</td>
<td>3,15A</td>
<td>8A</td>
<td>30A</td>
</tr>
<tr>
<td>0,2A</td>
<td>0,5A</td>
<td>2A</td>
<td>3,5A</td>
<td>9A</td>
<td>40A</td>
</tr>
<tr>
<td>0,25A</td>
<td>0,8A</td>
<td>2,5A</td>
<td>4<sup>A</sup></td>
<td>10A</td>
<td>50A</td>
</tr>
<tr>
<td>0,3A</td>
<td>1A</td>
<td>3A</td>
<td>5<sup>A</sup></td>
<td>15A</td>
<td></td>
</tr>
</tbody>
</table>
</div>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/dicas-e-hacks/valores-comerciais-de-resistores-capacitores-indutores-e-fusiveis">Valores Comerciais de Resistores, Capacitores, Indutores e Fusíveis</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/dicas-e-hacks/valores-comerciais-de-resistores-capacitores-indutores-e-fusiveis/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reentrância</title>
		<link>http://www3.eletronica.org/artigos/70</link>
		<comments>http://www3.eletronica.org/artigos/70#respond</comments>
		<pubDate>Mon, 24 Oct 2011 16:46:05 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Artigos]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=70</guid>
		<description><![CDATA[<p>A maioria dos sistemas em tempo real necessitam de alguma porção de código reentrante, porém muitos programadores não fazem idéia do que isso envolve. Por muitas razões, debugar um sistema baseado em interrupções é muito mais difícil que fazê-lo em um loop simples de código. Uma das mais chatas fontes de bugs, difíceis de encontrar...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/artigos/70">Reentrância</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>A maioria dos sistemas em tempo real necessitam de alguma porção de código reentrante, porém muitos programadores não fazem idéia do que isso envolve.</p>
<div>Por muitas razões, debugar um sistema baseado em interrupções é muito mais difícil que fazê-lo em um loop simples de código. Uma das mais chatas fontes de bugs, difíceis de encontrar e, algumas vezes, de entender, é o problema da reentrância.</div>
<div>
<p>Funções reentrantes, também conhecidas como &#8220;código puro&#8221;, são falsamente conhecidas como qualquer código que não modifica a si mesmo. Muitos programadores se sentem tranquilos simplesmente evitando código que se modifique, então as suas rotinas seriam garantidamente reentrantes e, então, passiveis de interrupção sem problemas (interrupt-safe). Nada poderia ir tão além da verdade quanto isso.</p>
<p>Uma função é reentrante se, enquanto estiver sendo executada, puder se re-invocada por si mesmo ou por outras rotinas, interrompendo a execução atual por um instante. A reentrância foi originalmente inventada para os mainframes, nos dias em que memória era um luxo. Os operadores dos sistemas noticiaram que dezenas ou centenas de cópias idênticas de alguns grandes programas estavam ao mesmo tempo no array de memória do computador. Na Universidade de Marylard, meu velho terreno de hacking, o monstro Univac1108 possuia um dos primeiros compiladores FORTRAN reentrantes. Ele gastava (naquela época) 32k da memória do sistema mas, com o código reentrante, ele precisava apenas destes 32k se 50 usuários estivessem rodando-o. Cada usuário executava o mesmo código, a partir do mesmo conjunto de endereços.</p>
<p>A rotina precisa satisfazer as seguintes condições para ser reentrante:</p>
<ol>
<li> Jamais modificar a si mesma. Isto é, as instruções do programa jamais devem mudar. Sempre. Em nenhuma circunstância. Vários sistemas embarcados violam este regra crucial.</li>
<li>Qualquer variável alterada pela rotina precisa ser alocada para a &#8220;instância&#8221; particular da função invocada. Isto é, se a função FOO é chamada por três funções diferentes, então os dados em FOO precisam ser armazenadas em três diferentes áreas da RAM.</li>
</ol>
<p>O item (2) merece um pouco mais de discussão. Uma das melhores tendências na indústria é utilizar profissionais engenheiros de software no desenvolvimento de projetos de firmware. Nos velhos dias do design de hardware, quem escrevia o código era provavelmente o pessoal com pouca formação formal no assunto (com algumas excessões), que o faziam apenas depois de construir todo o hardware.</p>
<p>Os software de verdade utilizam estruturas mais sofisticadas de programas que levam à um código mais limpo (normalmente), como a recursão, mas elas trazem novos perigos.</p>
<p>Uma função recursiva chama a si mesma. O exemplo clássico é o cálculo de n! (n fatorial), onde a forma mais elegante é escrita com algumas linhas de código recursivo.</p>
<p>Qualquer função recursiva precisa ser reentrante, porque cada instância da execução precisa do seu próprio conjunto de variáveis para evitar corromper qualquer outra instância.</p>
<p>Por exemplo, considere esta simples função recursiva retirada de um exemplo do Borland C++ Programmers Guide:</p>
<pre>double power(double x, int exp)
{
if (exp&lt;=0) return(1);
return(x*power(x, exp-1));
}</pre>
<pre></pre>
<p>Esta função vai funcionar corretamente em um ambiente recursivo, assim como em um sistemas em tempo-real, com interrupções, onde &#8220;power&#8221; pode ser chamada a partir de uma rotina sequencial ou a partir de um serviço de interrupção. A função é certamente &#8220;pura&#8221; &#8211; todas as variáveis utilizadas são criadas para cada instância da execução.</p>
<div>Suponhamos que nós a modifiquemos da seguinte forma:</div>
<pre>double power(double x)
{
if (exp&lt;=0)return(1);
--exp;
return(x*power(x));
}</pre>
<p>onde exp é agora definida como uma variável pública, acessível de muitas outras funções. A função vai funcionar corretamente. No entanto, se esta função for chamada por, digamos, main(), e a interrupção for iniciada chamando a mesma função enquanto ela ainda estava executando, nós teremos um resultado incorreto. A variável exp é fixa na memória; ela não é única em cada chamada e quando chamadas compartilhadas ocorrem nós temos um desastre no ambiente.</p>
<p>Então um código &#8220;puro&#8221; jamais deve modificar a si mesmo e jamais deve compartilhar dados com outras instâncias de si mesmo, quando chamado por recursão, em um serviço de interrupção, ou qualquer outro processo.</p>
<p>No exemplo anterior nós mencionamos o compilador FORTRAN. Enquanto o próprio compilador era carregado apenas uma vez na memória principal, cada usuário alocava um pedaço desta ou daquela área de memória interna do compilador para seu próprio uso. Cada variável ou array de dados que o compilador usava era referenciado através de um conjunto base de registradores que ficavam no espaço de dados iniciado pelo usuário.</p>
<p>C é elegantemente orientado através de reentrância, onde variáveis locais automáticas são geralmente armazenadas em uma pilha cada vez que a função é invocada. Desta forma, como nós vimos, ainda é possível escrever código problemático em C. Em Assembly, é claro, o caos reina.</p>
<p>&nbsp;</p>
<h3>Reentrância em Sistemas Embarcados</h3>
<p>Qualquer sistema embarcado precisa de reentrância e mesmo os mais simples sistemas irão, normalmente, necessitar de código reentrante.  Antes de ver aonde a reentrância é crítica, nós devemos dar uma olhada em áreas típicas onde o código é &#8220;impuro&#8221;.</p>
<p>Alguns processadores possuem limitadas capacidades de endereçamento de I/O. Por exemplo, o 8085 só pode enviar dados para um específico endereço hard coded (definido no hardware) (algo como &#8220;envia o conteúdo da saída da porta para o registrador C&#8221;). A tradicional escapatória (work arround) seria gerar a saída e retornar o resultado na RAM, dinamicamente a partir da porta desejada, e então chamar o código baseado-se na RAM. Isso viola qualquer regra da reentrância. Uma abordagem melhor é gerar uma tabela das instruções de saída no espaço da ROM e chamá-las indiretamente cada uma. Isso, no entanto, consome uma grande quantidade de memória.</p>
<p>O 1802 não possui pilha&#8230; nenhuma. Não existem instruções de chamadas ou retorno (sem brincadeira!). Reentrância era completamente impossível.</p>
<p>Cada sistema operacional de tempo real moderno, normalmente, possui pequenos segmentos de máquina específicos para o código que não é reentrante. Uma vez que isso não é mais perigoso que ter código &#8220;impuro&#8221;, todos os fornecedores fazem um bom trabalho ao proteger seções &#8220;impuras&#8221; desabilitando interrupções por um curto tempo.</p>
<p>Reentrância é crucial em qualquer seção de código que precisa ser invocado por qualquer outro processo. Em um SO tempo real, cada tarefa é independente e preparada para os interesses da reentrância. Qualquer subrotinas compartilhadas entre tarefas podem ser fontes reais para estes interesses, uma vez que o RTOS pode trocar de contexto em um tick do timer durante a execução desta rotina crítica e então agendar outra tarefa que invoca a mesma função.</p>
<p>Existem muito mais problemas aqui. Suponha que sua rotina principal e as ISR (interrupt service routine) estão todas escritas em C. O compilador irá certamente invocar funções em tempo de execução para suportar matemática de ponto flutuante, I/O, manipulação de string, etc. Se o pacote com estas funções é apenas parcialmente reentrante, então as suas ISRs podem muito bem serem corrompidas durante a execução do código principal. Este problema é comum, mas é virtualmente impossível para pesquisar estes defeitos, uma vez que os sintomas podem apenas aparecer ocasionalmente e produzindo erros diversos. Você pode imaginar o quão difícil é isolar um bug que se manifesta apenas ocasionalmente e com características completamente diferentes cada vez ?</p>
<p>A moral da história é ter certeza que o seu compilador possui um pacote de runtime completamente &#8220;puro&#8221;.</p>
<p>Os programadores que usam Assembly estão vacinados deste mal, uma vez que qualquer rotina comum em baixo nível compartilhada entre uma ISR e outro código precisa ser puro. Se você compra uma biblioteca de ponto flutuante, de comunicação, etc., tenha certeza que o fornecedor garante a reentrância em todos os modos.</p>
<p>Uma vez que muitos sistemas embarcados executam a partir da ROM, alguns níveis de reentância são assegurados. Não importa o quanto se tente é impossível escrever código auto modificável, pelo menos no espaço da ROM! Infelizmente, isso adiciona uma certa complacência.</p>
<p>A minha empresa vende emuladores. O maior número de ligações no suporte vem de programadores que possuem um código que funciona na ROM, mas tem problemas quando executados a partir da memória interna do emulador. O problema é sempre o mesmo: o usuário inadvertidamente escreve código sobre outro código. Na ROM o problema nunca aparece. Certamente, no entanto, isso indica um problema mais sério. Essa escrita deveria provavelmente ocorrer em algum espaço de dados na RAM, que não está sendo atualizada. Ou, se o código for suspeito, algum valor aleatório pode estar indo para os registradores de índices e podem causar a escrita de algum lixo na pilha ou algum outra estrutura de dados crítica.</p>
<p>Tendo uma CPU relativamente decente, não é tão difícil escrever código reentrante do início (recursos para a pilha são uma grande requisito), mas o que eu vi é que é quase impossível fazer um grande programa impuro reentrante. Geralmente os monstros então no heap das variáveis globais. Se a reentrância é necessária, somente pequenas áreas podem, algumas vezes, se proteger desabilitando as interrupções ao seu redor. Então nenhuma ISR pode ser sincronizada com os recursos críticos. Isso pode não funcionar bem em sistemas multitarefas.</p>
<p>Infelismente, desabilitar as interrupções traz seus próprios problemas. Aumenta a latência das interrupções e em alguns casos pode fazer perder alguma interrupção.</p>
<p>Muitos anos atrás eu havia convertido uma pacote de ponto flutuante em Assembly para código &#8220;puro&#8221;. Eu tentei várias saídas para corrigir os problemas, mas no final eu só obtive a cura com um pacote totalmente reescrito.</p>
<h5></h5>
<h3>Encontrando a &#8220;Pureza&#8221;</h3>
<p>Como nós sabemos se o código é verdadeiramente reentrante ? Não importa o quão cuidadoso é o design do seu novo projeto, é simplesmente muito fácil inadvertidamente criar referências impuras aos dados, ocasionamente. Em uma atualização de um velho projeto o problema é mais severo, pois você pode não estar totalmente confortável com a estrutura do código ou as intenções do programador original.</p>
<p>Eu tenho dúvidas se existe um teste completo para reentrância. Apenas alguns testes parciais são simples e podem ajudar.</p>
<p>É muito fácil encontrar código que acidentalmente (ou de outra forma) escreve sobre si mesmo. Qualquer emulador decente deixa você escrever no espaço de programa. Quando utilizando um monitor de ROM, simulador, ou algo assim, regularmente execute checksum no código. Se o checksum mudar (para uma particular versão do código), alguma coisa está errada.</p>
<p>Eu faço buscas globais por declarações STATIC em C. STATIC pode indicar um problema de reentrância em potencial.</p>
<p>Em rotinas escritas em linguagem Assembly, qualquer referência direta a um endereço da RAM é um ponto para examinar a reentrância. Não há nada implicitamente errado com um MOV [CONT], AX; a maioria das vezes isso vai funcionar bem em rotinas reentrantes. Ainda assim, isso pode ser um indicador de código &#8220;impuro&#8221;. Uma solução é armazenar as variáveis locais no quadro atual da pilha.</p>
<p>Como você pode dizer se um pacote runtime comprado é realmente reentrante sem ler todo o código? Uma abordagem é linkar o programa sem o pacote (retirando as chamadas às rotinas) e depois fazê-lo com elas. Compare o relatório do linker para o espaço de dados. Um pacote realmente reentrante não vai necessitar de nenhuma RAM adicional além da pilha e/ou heap.</p>
<p><sub>Adaptado por Eletronica.org do artigo <strong>Reentrancy</strong> escrito pelo consultor americano <a href="http://www.ganssle.com/bio.htm" target="_self"><strong>Jack Ganssle</strong></a>, com a devida autorização.</sub></p>
<p><sub><em>Todos os direitos são reservados ao autor. Você pode encontrar mais artigos e informações sobre o Jack no site do <strong><a href="http://www.ganssle.com/" target="_self">Ganssle Group</a></strong>.</em></sub></p>
</div>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/artigos/70">Reentrância</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/70/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Construa seu Próprio Monitor Cardíaco, um ECG simples</title>
		<link>http://www3.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples</link>
		<comments>http://www3.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples#comments</comments>
		<pubDate>Mon, 24 Oct 2011 16:07:07 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Projetos]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=47</guid>
		<description><![CDATA[<p>Este projeto vai ensinar você a criar o seu próprio dispositivo de monitoramento cardíaco, um ECG/EKG (eletrocardiógrafo) simples. Nos Estados Unidos e no resto do mundo, milhões de pessoas perdem as suas vidas por problemas cardíacos. Estes problemas acompanham doenças como diabetes, estresse, etc. Antes de continuar a explicar a você o que eu fiz,...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples">Construa seu Próprio Monitor Cardíaco, um ECG simples</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Este projeto vai ensinar você a criar o seu próprio dispositivo de monitoramento cardíaco, um ECG/EKG (eletrocardiógrafo) simples.</p>
<div>Nos Estados Unidos e no resto do mundo, milhões de pessoas perdem as suas vidas por problemas cardíacos. Estes problemas acompanham doenças como diabetes, estresse, etc. Antes de continuar a explicar a você o que eu fiz, gostaria de ALERTAR você. 500mA (mili-ampéres) em 220V irá destruir completamente o seu sistema nervoso (então alimente isso a partir de baterias!), verifique tudo duas vezes e a responsabilidade é toda sua.</div>
<div>
<p>OK! Eu acho que posso continuar agora. Este foi um trabalho estudantil de quando eu iniciei no campo da biomedicina. Para fazer o meu CV parecer melhor eu queria contruir alguma coisa nessa área e fiz um ECG. A primeira coisa que eu procurei fazer foi ir até o google.com e pesquisar por projetos similares. Lá eu encontrei um bom número de projetos sobre o assunto. Alguns para logar dados de pacientes com doenças cardíacas, alguns outros sistemas de monitoramento cardíaco futuristas e mais alguns feitos apenas por diversão, como o meu.</p>
<p>Vamos iniciar com a definição do que é um ECG e algumas coisas sobre ele (retirado de &#8220;Introduction to Medical Electronics Application&#8221;, por D. Jennings, A. Flint, BCH Turton, LDM Nokes):</p>
<p>&#8220;O coração humano pode ser considerado um grande músculo que bate apenas por contrações musculares. Conseqüentemente, estas contrações causam uma diferença de potencial. O estudo da medida do potencial produzido pelo músculo cardíaco é chamada de eletrocardiologia.<br />
O campo despolarizante no coração é um vetor que altera a sua direção e magnitude através do ciclo cardíaco. A colocação de eletrodos na superfície do paciente determina a visão que será obtida desse vetor em função do tempo.</p>
<p>O esquema de posicionamento mais utilizada dos eletrodos é mostrada na Figura 1. Aqui, a diferença de potencial é medida entre os braços direito e esquedo, entre o braço direito e a perna esquerda e entre o braço esquerdo e a perna esquerda. Estas três medidas podem ser referenciadas como I, II e III, respectivamente. Este posicionamento foi desenvolvida por Einthiven, que determinou que conhecendo o estado das medidas dos sinais das  ligações I e II, o sinal que ia ser visualizado em III poderia ser calculado. E este é o princípio básico do posicionamento das ligações do ECG: a partir dos vários recursos disponíveis, a despolarização do coração pode ser calculada.</p>
<div style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/3lead_ecg.jpg"><img class="aligncenter size-full wp-image-1162" alt="ECG Figura 1" src="http://www3.eletronica.org/wp-content/uploads/2011/10/3lead_ecg.jpg" width="320" height="190" /></a> Figura 1</div>
<p>&nbsp;</p>
<p>Conseqüentemente, o sinal do ECG mostra ao clínico as formas de ondas elétricas associadas com as contrações dos ventrículos e artérias. Apartir de um ECG, o clínico pode determinar o tempo das contrações dos ventrículos e artérias e avaliar a magnitude relativa das polarizações e despolarizações ventriculares e arteriais. Esta informação pode permitir a identificação de pequenos bloqueios do coração. Depois de um ataque cardíaco, o ECG do paciente mostra alterações de sincronismo e forma de ondas, transmitidas através dos tecidos musculares. Estas alterações são associadas com danos cardíacos causados pelo ataques do coração&#8221;.</p>
<div style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/ecg_connection_diagram.jpg"><img class="aligncenter size-full wp-image-1169" alt="ECG Figura 2" src="http://www3.eletronica.org/wp-content/uploads/2011/10/ecg_connection_diagram.jpg" width="349" height="597" /></a></div>
<div style="text-align: center;">Figura 2., diagrama de conexão</div>
<p>&nbsp;</p>
<p>Depois desta pequena introdução sobre o ECG, vamos falar da descrição eletrônica. A maneira mais simples de explicar como isso funciona é fazer um diagrama de blocos.<br />
O sinal que vem do corpo inicia sendo amplificado (este sinal é muito pequeno e fraco, variando entre 0,5mV e 5,0mV), filtrado (para remover o ruído), amostrado (para amostrar eu preciso de um conversor Analógico/Digital, conhecido como ADC) e então envio ao computador através de uma interdace RS232 (uma interface sem fio ou qualquer outro tipo poderia ser escolhida, mas a RS232 é simples e rápida para desenvolver).</p>
<p>Os primeiros dois passos são mostrado na Figura 3.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/ecg_chain.jpg"><img class="aligncenter size-full wp-image-1167" alt="ECG Figura 3" src="http://www3.eletronica.org/wp-content/uploads/2011/10/ecg_chain.jpg" width="410" height="185" /></a></p>
<div style="text-align: center;">Figura 3., Blocos ECG</div>
<p>Os amplificadores que nós usamos na engenharia de biomedicida, aquisição de dados ou qualquer outro lugar onde é interessante representar uma pequena flutuação de tensão sobreposto em um offset de tensão, são chamados amplificadores de Instrumentação. Estes amplificadores possuem uma grande CMMR (Commom Mode Rejection Ratio), o que significa que eles têm a habilidade de um amplificador diferencial em não passar (rejeitar) a parte do sinal que é comum nas entradas + e -. Os famosos produtores de amplificadores de instrumentação são a Texas Intruments e a Analog Devices. Eu utilizei um amplificador da segunda empresa, Analog Devices. O AD620, amplificador de intrumentação, e o OP97, amplificador operacional de alta precisão. Como eles precisam de uma fonte de tensão negativa, eu a gerei com o LTC1044 da Linear, conversor de tensão com chaveamento de capacitor, Figura 4. A tensão fornecida é 5V. O esquemático é mostrado na Figura 5, e mais detalhes sobre o seu funcionamento pode ser visto em seu <a href="http://www.e-dsp.com/downloads/ecg.pdf" target="_blank">datasheet</a>.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/ltc1044-2.jpg"><img class="aligncenter size-full wp-image-1173" alt="EC Figura 4" src="http://www3.eletronica.org/wp-content/uploads/2011/10/ltc1044-2.jpg" width="410" height="181" /></a></p>
<div style="text-align: center;">Figura 4., LTC1044, gerador de tensão negativa</div>
<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/ecg_schematic-2.jpg"><img class="aligncenter size-full wp-image-1170" alt="ECG Figura 5" src="http://www3.eletronica.org/wp-content/uploads/2011/10/ecg_schematic-2.jpg" width="586" height="304" /></a><br />
Figure 5., ECG Esquemático do ECG</p>
<p>Os ruídos podem vir das contrações musculares, interferências da rede na faixa de 50-60Hz, ruídos do contato dos eletrodos, ruídos vindo de qualquer outro dispositivo eletrônico, etc. O filtro para a aplicação do ECG deve ser um filtro de corte (passa-alta e passa-baixa). Ele deve filtrar a faixa de 0.5Hz até 50Hz. Eu criei um filtro simples RC passa-alta e passa-baixa, conectados em série (apenas dois capacitores e resistores).</p>
<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/ecg_signal-2.jpg"><img class="aligncenter size-full wp-image-1171" alt="ECG Figura 6" src="http://www3.eletronica.org/wp-content/uploads/2011/10/ecg_signal-2.jpg" width="163" height="108" /></a><br />
Figura 6., Sinal do ECG</p>
<p>O ADC usado foi o interno da CPU Atmel, ATMega8. O código está aqui:</p>
<div>
<ol>
<li>
<div>.include “m8def.inc”</div>
</li>
<li>
<div>.def temp = r16</div>
</li>
<li>
<div>.equ CLOCK = 4000000    ; define frequency speed</div>
</li>
<li>
<div>.equ BAUD = 9600    ; define baud rate of sending data</div>
</li>
<li>
<div>.equ UBRRVAL = CLOCK/(BAUD*16)-1</div>
</li>
<li>
<div>main:</div>
</li>
<li>
<div>ldi r16, 0b00100000    ; configure the ADC</div>
</li>
<li>
<div>out ADMUX, r16</div>
</li>
<li>
<div>ldi r17, 0b10000111</div>
</li>
<li>
<div>out ADCSRA, r17</div>
</li>
<li>
<div>; Stackpointer initialisation</div>
</li>
<li>
<div>ldi temp, LOW(RAMEND)</div>
</li>
<li>
<div>out SPL, temp</div>
</li>
<li>
<div>ldi temp, HIGH(RAMEND)</div>
</li>
<li>
<div>out SPH, temp</div>
</li>
<li>
<div>; Baudrate configuration</div>
</li>
<li>
<div>ldi temp, LOW(UBRRVAL)</div>
</li>
<li>
<div>out UBRRL, temp</div>
</li>
<li>
<div>ldi temp, HIGH(UBRRVAL)</div>
</li>
<li>
<div>out UBRRH, temp</div>
</li>
<li>
<div>; Frame-Format: 8 Bit</div>
</li>
<li>
<div>ldi temp, (1&lt;&lt;</div>
</li>
<li>
<div>out UCSRC, temp</div>
</li>
<li>
<div>sbi UCSRB,TXEN    ; TX activate</div>
</li>
<li>
<div>ADC:</div>
</li>
<li>
<div>ldi r18, 0b00100000</div>
</li>
<li>
<div>out ADMUX, r18</div>
</li>
<li>
<div>ldi r19, 0b11000111</div>
</li>
<li>
<div>out ADCSRA, r19</div>
</li>
<li>
<div>loop:</div>
</li>
<li>
<div>in r24, ADCSRA    ; check if ADC done</div>
</li>
<li>
<div>sbrc r24, 6</div>
</li>
<li>
<div>rjmp loop</div>
</li>
<li>
<div>in temp, ADCH    ; fill the converted ADC value to temp</div>
</li>
<li>
<div>rcall serout    ; send ADC value to RS232(to computer)</div>
</li>
<li>
<div>rjmp ADC</div>
</li>
<li>
<div>serout:</div>
</li>
<li>
<div>sbis UCSRA,UDRE</div>
</li>
<li>
<div>rjmp serout</div>
</li>
<li>
<div>out UDR, temp</div>
</li>
<li>
<div>ret</div>
</li>
</ol>
</div>
<p>Os resultados podem ser vistos nas figuras a seguir. Eu utilizei o LabView para ver o ECG do meu coração.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/ECG2.jpg"><img class="aligncenter size-full wp-image-1172" alt="ECG Figura 7" src="http://www3.eletronica.org/wp-content/uploads/2011/10/ECG2.jpg" width="1024" height="768" /></a></p>
<p style="text-align: center;">Figura 7. Resultado do ECG no LabView</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/ECG1.jpg"><img class="aligncenter size-full wp-image-1165" alt="ECG Figura 8" src="http://www3.eletronica.org/wp-content/uploads/2011/10/ECG1.jpg" width="1024" height="768" /></a></p>
<p style="text-align: center;">Figura 8. Resultado do ECG no LabView</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/electrode_man_rofl.jpg"><img class="aligncenter size-full wp-image-1168" alt="ECG Figura 9" src="http://www3.eletronica.org/wp-content/uploads/2011/10/electrode_man_rofl.jpg" width="410" height="308" /></a></p>
<p style="text-align: center;">Figura 9. Este sou eu com os eletrodos (a imagem na camisa é o logo da Associação de Basquete da Bósnia)</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/DSCN1017.jpg"><img class="aligncenter wp-image-1164" alt="ECG Figura 10" src="http://www3.eletronica.org/wp-content/uploads/2011/10/DSCN1017.jpg" width="600" /></a></p>
<p style="text-align: center;">Figura 10. A placa do ECG criada por mim, frente</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/DSCN1022.jpg"><img class="aligncenter wp-image-1163" alt="ECG Figura 11" src="http://www3.eletronica.org/wp-content/uploads/2011/10/DSCN1022.jpg" width="600" /></a></p>
<p style="text-align: center;">Figura 11. A placa do ECG criada por mim, lado de baixo</p>
<p><span class="Apple-style-span" style="font-size: 11px;">Adaptado, com autorização do autor, por Eletronica.org.</span></p>
<div><sub>Veja o original, em inglês, em <a href="http://www.e-dsp.com/how-to-build-your-own-heart-monitoring-device-a-simple-ecg/" target="_self">http://www.e-dsp.com/how-to-build-your-own-heart-monitoring-device-a-simple-ecg/</a></sub></div>
<div><sub><br />
</sub></div>
</div>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples">Construa seu Próprio Monitor Cardíaco, um ECG simples</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Interruptor Eletrônico Controlado por Som</title>
		<link>http://www3.eletronica.org/projetos/interruptor-eletronico-controlado-por-som</link>
		<comments>http://www3.eletronica.org/projetos/interruptor-eletronico-controlado-por-som#comments</comments>
		<pubDate>Mon, 24 Oct 2011 16:00:41 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Projetos]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=44</guid>
		<description><![CDATA[<p>Seu princípio de funcionamento se baseia na utilização de um simples microfone, capaz de gerar um sinal muito intenso devido à alta freqüência e a intensidade do som propagado pelo bater palmas ou estalar os dedos. Esse sinal deve ser interpretado por um circuito como um pulso de entrada que está ligado a um flip-flop,...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/projetos/interruptor-eletronico-controlado-por-som">Interruptor Eletrônico Controlado por Som</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Seu princípio de funcionamento se baseia na utilização de um simples microfone, capaz de gerar um sinal muito intenso devido à alta freqüência e a intensidade do som propagado pelo bater palmas ou estalar os dedos. Esse sinal deve ser interpretado por um circuito como um pulso de entrada que está ligado a um flip-flop, o qual será responsável por ligar ou desligar o interruptor do sistema. O desenvolvimento do projeto segue abaixo.</p>
<div>
<h2>Introdução</h2>
<p>Para a prática proposta, buscando sempre auxílio no conhecimento de trabalhos anteriores e integrando um pouco com as necessidades e tecnologias atuais, devemos projetar um sistema de controle que consiste em um interruptor eletrônico, o qual deve ser capaz de ligar e desligar um LED apenas com o Bater as Palmas da Mãos ou um Estalar de Dedos.</p>
<p>Seu principio de funcionamento se baseia na utilização de um simples microfone, capaz de gerar um sinal muito intenso devido à alta freqüência e a intensidade do som propagado pelo Bater as Palmas ou Estalar os Dedos. Esse sinal deve ser interpretado por um circuito como um pulso de entrada que está ligado a um flip-flop, o qual será responsável por ligar ou desligar o interruptor do sistema.</p>
<p>O desenvolvimento do projeto segue abaixo.</p>
<h2>Desenvolvimento</h2>
<p>Para apresentar o projeto, iremos dividir sua apresentação em partes:</p>
<h3>1. Captação do som e filtragem</h3>
<p>Para captar o sinal sonoro, usaremos como entrada para o circuito um microfone de eletreto. Seu diagrama esquemático é mostrado abaixo:</p>
<div><sub>Figura 01: Entrada do circuito, com captação do som.</sub></div>
<p>&nbsp;</p>
<p>O microfone capta a vibração do ar provocado pelo som, transformando essa vibração mecânica em impulsos elétricos, produzindo ondas de mesma freqüência do som que o gerou. Ele está ligado em série com o resistor de 10k ohm para limitar a corrente que passa pelo microfone. É necessário também observar a polaridade do microfone.</p>
<p>Em seguida, o sinal gerado passa por um filtro que elimina a componente contínua do sinal (devido à tensão dc de 5V) e atenua parte da freqüência da fala, já que somente é desejável que o circuito seja acionado por ruídos muito intensos. Dessa forma, um capacitor de 200 nF já é suficiente para filtrar a componente contínua.</p>
<h3>2. Amplificação do sinal e pullup</h3>
<p>O som produzido por palmas gera sinais elétricos de amplitudes muito baixas no microfone de eletreto. Esses sinais precisam ser amplificados e nesse projeto se decidiu por um ganho de 330.</p>
<p><sub>Figura 02: Estágios de amplificação</sub></p>
<div>Observe que o nosso amplificador é inversor, desta forma o sinal entra no terminal inversor do amplificador. Logo, para uma resistência de 330k ohm na realimentação, teremos aproximadamente um ganho de 330.<br />
Novamente, ao capturarmos o sinal no final do estagio de amplificação, teremos agora uma tensão de pico equivalente a cerca de 4 a 5 V.<br />
Essa tensão de saída do comparador vai ativar um temporizador, que será explicado a seguir.Para garantir um disparo sem interferencia no trigger do nosso temporizador, conectamos um filtro de 680 nF e uma resistência de pullup de 10k ohm.</p>
<p><sub>Figura 03: Filtro</sub></div>
</div>
</div>
<h3>    3. Temporização</h3>
<p>O circuito do temporizador foi montado com um LM 555 configurado como um monoestável, já utilizado em práticas anteriores. Seu funcionamento permite elevar a tensão em sua saída para o valor da alimentação e mantê-la assim por um determinado período sempre que um pulso surgir na sua entrada de disparo (trigger). Nesse caso, a tensão de alimentação será de 5V, já que a alimentação do circuito é de 5V. Na saída do 555 teremos um flip-flop que será responsável por gripar o circuito em níveis lógicos 1 e 0, possibilitando ligar ou desligar o LED.</p>
<p>Na entrada do trigger do 555 foi conectada a saída do amplificador. Dessa forma, sempre que o microfone gerar um sinal elétrico capaz de disparar o 555, a saída permanecera por um período de tempo satisfatório ativada. Para que essa constante de tempo seja alcançada devemos calcular seus parâmetros de acordo com a fórmula apresentada abaixo:</p>
<div>T = 1,1 CR</div>
<p>Desejamos um tempo de aproximadamente 8 ms e escolhemos arbitrariamente um capacitor de 680 nF, temos que R deve ser igual a 10,7k ohm. Considerando esse valor, usaremos o valor comercial mais próximo e mais comum, que é 10k ohm.  Logo, o novo valor para o tempo será de 7,48 ms.</p>
<p><sub>Figura 04: Circuito temporizador com CI LM555</sub></p>
<div>
<p>Na saída do monoestável, conectamos mais um filtro de altas freqüência, o capacitor de 100 nF, e também implementamos um pulldown (resistor de 10k ohm ), buscando evitar que clocks indesejados apareçam no flip-flop.</p>
<div><sub>Figura 05: Filtro</sub></div>
</div>
<h3>4. Acionamento</h3>
<div>Para alternar o estado do LED que será acionado pelas palmas usaremos um flip-flop tipo D, encapsulado no <strong>CI 4013</strong>. Esse flip-flop, com clock sensível a borda de subida, muda seu estado de saída para o mesmo estado que estiver na entrada D quando um pulso de clock for emitido ao circuito. Nesse projeto, o pulso de clock será a saída do temporizador 555. Para garantir que o circuito irá alternar seus estados a cada pulso de clock, ligaremos o flip-flop como flip-flop tipo T (toogle), onde conectamos a saída Q’ diretamente a entrada D. Assim, sempre que a saída Q estiver em 0, a saída Q’ vai estar em 1. Quando um pulso de clock chegar até o circuito, a saída Q muda para 1, a Q’ para 0 e quando um novo pulso chegar ao clock, a saída Q voltará para 0.<br />
O LED será conectado à saída Q desse flip-flop por meio de uma resistência de 470 ohm. A importância dessa resistência é a limitação da corrente que passa pelo LED. É importante ressaltar que o LED será ligado ao flip-flop, ou seja, a corrente por ele drenada será fornecida por esse dispositivo. Nesse caso não tem muito problema porque a corrente é baixa. Mas para a ligação de outros componentes que drenem uma corrente alta se faz necessário um circuito de acionamento um pouco mais completo, com transistor e até relé, para aplicações que envolvem sistemas de potência.</p>
<p><sub>Figura 06: Circuito de Acionamento</sub></p>
<h2>Conclusão</h2>
<div>
<p>Figura 07: Circuito de completo</sub></sub>&nbsp;</p>
</div>
<p>O trabalho proposto integrou o conhecimento adquirido ao longo do semestre e no decorrer do curso de Engenharia Elétrica, como a eletrônica analógica com a digital, representada pelo flip-flop.<br />
O circuito não apresentou muitos problemas no processo de desenvolvimento uma vez que ele foi montado seguindo as etapas explicadas no relatório. Um forte exemplo para esse fato é o tempo estimado para o monoestável foi de 7,48 ms e o obtido na prática de 7,7 ms. Valores esses muito satisfatórios para o que foi projetado.<br />
Esse projeto pode ser considerado um protótipo para uma aplicação mais útil. Uma delas, simples e que pode ser muito usada no dia-a-dia, é o acionamento da iluminação de um determinado ambiente por palmas ou um estalar de dedos. Algumas modificações se fazem necessárias, como a remodelagem da parte de acionamento com a inserção de um transistor ou um relé de potência, mas o corpo do projeto é o mesmo.</p>
<h3><a name="1229947175"></a>Correção</h3>
<div>
<p>  <strong>Por Retes em 22/12/2008 03:59</strong></p>
<p>Pessoal,<br />
Uma pequena correção no circuito.<br />
Por favor, utilizem o CD4013 ao invés do 7474 citado no texto (texto já modificado). Usem o desenho esquemático. O 7474 tem uma pinagem e níveis de sinal diferentes do 4013 e não são compatíveis, necessitando alterções no circuito para o funcionamento.</p>
<p>Outras considerações:</p>
<ul>
<li>VDD = 5V</li>
<li>Vss = -5V a -15V</li>
<li>terra = 0V</li>
<li>Os valores de capacitores não são críticos.</li>
</ul>
</div>
<p>Thales Alexandre Carvalho Maia<br />
Pedro Felipe Leite Retes</p>
<p><sub><strong><br />
</strong></sub></p>
<div><sub><strong>Universidade Federal de Minas Gerais &#8211; Escola de Engenharia<br />
Departamento de Engenharia Eletrônica<br />
Curso de Graduação em Engenharia Elétrica<br />
Laboratório de Eletrônica II<br />
Trabalho Prático II<br />
Professor: José Luiz Silvino<br />
Alunos:<br />
Thales Alexandre Carvalho Maia<br />
Pedro Felipe Leite Retes</strong></sub></div>
</div>
</div>
</div>
</div>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/projetos/interruptor-eletronico-controlado-por-som">Interruptor Eletrônico Controlado por Som</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/projetos/interruptor-eletronico-controlado-por-som/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Detector de 4 níveis de Tensão com LM339</title>
		<link>http://www3.eletronica.org/projetos/detector-de-4-niveis-de-tensao-com-lm339</link>
		<comments>http://www3.eletronica.org/projetos/detector-de-4-niveis-de-tensao-com-lm339#respond</comments>
		<pubDate>Mon, 24 Oct 2011 15:58:01 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Projetos]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=40</guid>
		<description><![CDATA[<p>Circuito simples que sinaliza 4 níveis de tensão através de LED, podendo ser utilizado como base para diversas outras aplicações. Os resistores E1, R2, R3, R4 e R5 deve ser selecionados para os níveis de tensão desejados. A cada nível ultrapassado o LED correspondente acenderá. Via Circuits-Lab.com. Publicado com autorização.</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/projetos/detector-de-4-niveis-de-tensao-com-lm339">Detector de 4 níveis de Tensão com LM339</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Circuito simples que sinaliza 4 níveis de tensão através de LED, podendo ser utilizado como base para diversas outras aplicações.</p>
<div>Os resistores E1, R2, R3, R4 e R5 deve ser selecionados para os níveis de tensão desejados. A cada nível ultrapassado o LED correspondente acenderá.</div>
<div><sub>Via <a href="http://www.circuits-lab.com/">Circuits-Lab.com</a>. Publicado com autorização.</sub></div>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/projetos/detector-de-4-niveis-de-tensao-com-lm339">Detector de 4 níveis de Tensão com LM339</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/projetos/detector-de-4-niveis-de-tensao-com-lm339/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Leitor RFID</title>
		<link>http://www3.eletronica.org/projetos/leitor-rfid</link>
		<comments>http://www3.eletronica.org/projetos/leitor-rfid#respond</comments>
		<pubDate>Mon, 24 Oct 2011 15:53:24 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Projetos]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=34</guid>
		<description><![CDATA[<p>Cartões RFID são normalmente usados para controle de acesso e tickets de ônibus e metrôs. Eles são convenientes porque não precisam de contato direto para transferir informações de/para o cartão. Como estes cartões são alimentados pelos próprios leitores, dispensam o uso de baterias que precisariam ser recarregadas. Para os meus experimentos estou usando catrões da...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/projetos/leitor-rfid">Leitor RFID</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>Cartões RFID são normalmente usados para controle de acesso e tickets de ônibus e metrôs. Eles são convenientes porque não precisam de contato direto para transferir informações de/para o cartão. Como estes cartões são alimentados pelos próprios leitores, dispensam o uso de baterias que precisariam ser recarregadas.</p>
<div>Para os meus experimentos estou usando catrões da HID ISProx. Estes cartões são os mais simples de toda a linha de cartões RFID, que somente armazenam um número de série e não usam criptografia. A frequência da portadora é de 125kHz.<br />
O primeiro passo é descobrir como desenvolver um leitor simples. Nós sabemos que o cartões RFID é alimentado pelo campo magnético emitido pelo leitos. As <em>tags</em>¹ RFID transferem informação de volta ao leitor consumindo este campo magnético, que é detectado pelo leitor como uma variação no campo.</p>
<p>¹ São chamados de &#8220;<em>tags</em>&#8221; RFID todos os elementos que armazenam informações e são móveis, como o cartão, neste caso específico.</p>
<p>&nbsp;</p>
<p>O projeto mais comum de um leitor RFID faz uso de um circuito ressonante série. Ele consiste de um indutorsimples e um capacitor, excitados por uma fonte de tensão de baixa impedância. Se o Q do circuito for alto o suficiente, a tensão no ponto de amostragem (Vsample) vai exceder a tensão de alimentação. Quando o RFID é alimentado por este campo magnético o Q do circuito cai. O resultado é uma pequena alteração na tensão de amostragem (Vsample no circuito mostrado).</p>
<p>&nbsp;</p>
<p align="center">
<p>&nbsp;</p>
<p>Eu criei um leitor simples com componentes encontrados em minha sucata. Usando um gerador de função como fonte de sinal e um osciloscópio no ponto de amostragem, eu pude sintonizar a frequência até encontrar o ponto ressonante do circuito. Eu continuei substituindo os capacitores neste circuito até encontrar a frequência que eu estava procurando. O cálculo da frequência é este:<br />
<img src="http://www2.eletronica.org/projetos/leitor-rfid/one_over_root_lc.png" alt="Fórmula Frequência de Saída" /></p>
<p>&nbsp;</p>
<p>Por alguma razão eu me confundi e iniciei o projeto tendo em mente a frequência de 150kHz ao invés de 125kHz. As <em>tags</em> RFID respondem bem a uma frequência mais alta, então eu mantive assim para evitar voltar a trás e redesenhar todo o circuito. <img src="https://s.w.org/images/core/emoji/11/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Com um ajuste simples eu verifiquei quais alterações aconteciam quando a tag RFID era submetida a 4 ou 5 ciclos de frequência da portadora. Uma vez que o sinal precisa ser AC e não DC, eu assumi que a frequência de transmissão seria 150kH/8 = 18.75kHz ou 150kHz/10 = 15kHz. Este detalhe eu encontrei em um site que foi realmente útil por conter boas informações sobre RFID:<a href="http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2006/cjr37/Website/index.htm">http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2006/cjr37/Website/index.htm</a>.</p>
<p>A <em>tag</em> aparentemente codifica o dado usando FSK. As duas frequências representam o 0 e 1 lógicos.</p>
<p>Com esta informações em mãos, eu avancei e iniciei o projeto do meu próprio indutor-antena. Uma vez que eu mantive a idéia de usar 150kHz como frequência da portadora, eu fiz o cálculo e fiquei com uma indutância de 160uH e um capacitor de 10nF. Eu utilizei a seguinte equação para estimar o número de voltas que precisaria em minha bobina:</p>
<p>&nbsp;</p>
<p>Onde x, y são o comprimento e a largura da bobina, h é a altura e b é a espessura da parte condutora. Eu utilizer x=y=6cm, h=1cm e b=0.3cm. O número encontrado foi 34. Eu enrolei a bobina em uma caixa de papel que encontrei, de onde eu extrai o x e y. Depois de enrolada, a bobina foi extraída e presa com fita adesiva.</p>
<p>&nbsp;</p>
<p align="center">
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Para um ajuste fino da frequência ressonante do sistema todo eu decidi brincar com o valor da capacitância. Usando o gerador de função para variar a frequência e visualizando o pico da saída com um osciloscópio, eu variei os valores dos capacitores até que o pico da resposta ressonante fosse a 150kHz. O capacitor final foi de 0.056uF. Uma vez que o meu capacitor precisa ser um valor de mercado, a bobina que eu construí precisa ter uma indutância maior que 160uH.</p>
<p>&nbsp;</p>
<p>O próximo estágio era projetar o circuito analógico. Eu usei o confiável AMPOP TL062 (eu já possuia vários desses em casa). As frequências envolvidas neste circuito são relativamente baixas, então a baixa peformace em frequência deste AMPOP não é problema. Eu havia decidido evitar um circuito complexo, então elegi o circuito mais simples que poderia ser usado.</p>
<p>Então, a idéia é usar um simples diodo detector. Este detector de tensão passar por um primeiro AMPOP configurado como amplificador inversor com uma resposta em frequência passa baixa. Isso removerá uma boa parte do volume da portadora. O próximo estágio do circuito analógico é extrair o sinal FSK. O circuito mais simples que me veio a mente foi um filtro ressonante passa banda com frequência central em torno de 17kHz. Isso só me custaria um AMPOP. Este circuito foi desenhado no SPICE e o gráfico da frequência de resposta é mostrado no final desta página.</p>
<p>A saída do passa banda é um sinal que pode ser diretamente conectado à um microcontrolador PIC. Eu escolhi para este projeto o bom e velho microcontrolador PIC16F628A. Com o comparador interno eu posso receber o sinal diretamente do AMPOP e extrair o sinal digital.</p>
<p>A decodificação do sinal FSK é feita por software, o que realmente é interessante para não aumentar a nossa lista de componentes.<br />
Para decodificar o sinal FSK eu implementei três subrotinas que usam o TMR0 para marcar o tempo passado entre as mudanças detectadas na saída do comparador. Nenhuma interrupção é usada. Ao invés disso, as rotinas foram colocadas em loop até que um estado de mudança é detectado. O loop que faz a detecção leva em torno de três ciclos de CPU para rodar; assim, dependendo de quando a mudança ocorre, o erro máximo é de 3 ciclos.</p>
<p>Alguém que conhece como o hardware do PIC funciona poderia me perguntar porque eu não usei o módulo CCP (Compare and Capture). Infelismente eu utilizei o módulo PWM para gerar a portadora de 150kHz. Como o CCP compartilha recursos com o módulo PWM, apenas um deles pode ser ativado por vez.</p>
<p>Para ter uma idéia geral de como o sinal FSK aparece depois de digitalizado, eu adicionei um modo debug onde ele irá capturar um número de ciclos de CPU ocorridos entre cada mudança no sinal de entrada.</p>
<p>Devido às limitações da memória on-chip, somente 80+64 pontos de dados foram capturados. Isso não é grande o sufuciente para decodificar o dado, mas é suficiente para nós desenharmos uma visão geral de como o sinal se parece.</p>
<h2>Saída do modo Debug, logo após o final do contador de ciclos</h2>
<p align="center">  <img src="http://www2.eletronica.org/projetos/leitor-rfid/debugout.png" alt="Debug Out" /></p>
<p>Neste gráfico, os números no eixo Y representam o tempo (em ciclos de CPU) entre cada mudança de estado no sinal de entrada. Eu decidi que 85 era um número bom para saber se o sinal de entrada era zero ou um. No futuro eu acabei decidindo alterar a rotina de decodificação para contar o tempo gasto entre cada borda de subida do sinal (uma vez que o sinal não possui componente DC, isto economizaria memória já que eu só guardaria um bit ao invés de dois). Assim, a constante utilizada no firmware do PIC cresceu e eu estou usando 170 (2x 85).</p>
<p>A sequência decodificada dos dados se parece com:</p>
<pre>	0000000000000000000000001111111111111111000001111110000001111100000011111000000111111 ... ...
	111111000001111110000001111100000011111111110000000000001111111111100000011111000000000000 ...
	0000001111110000001111111111000000111111000000000000000000000000111111111111111100000</pre>
<p>Você pode ver que o dado inicia com vários zeros, seguidos de alguns números 1 que são o dado atual. A sequência inteira continua a se repetir.<br />
Eu conheço o sinal codificado em Manchester, então, a partir do sinal, eu posso chegar à seguinte conclusão:<br />
1. A sinal inicia com uma sequencia de zeros, superior a vinte zeros.<br />
2. A segunda sequência também é sempre uma sequência de 1 com pelo menos 15 bits.<br />
3. Para cada bit existem entre 10 e 12 números zero ou um.<br />
4. O bit é zero se não existe nenhuma mudança no sinal durante o tempo de um bit.</p>
<p>Um gráfico rápido pode ser desenhado:</p>
<pre>	111111000001111110000001111100000011111111110000000000001111111111100000011111000000000000
	-----------|-----------|----------|_________|___________|__________|----------|___________
	     1           1           1         0          0          0           1           0</pre>
<p>Com essas regras em mente, eu adicionei a função para decodificar o dado. Como um resumo de todo o sistema eu adicionei os seguintes diagramas:</p>
<h2>Diagrama de blocos</h2>
<div align="center"><img src="http://www2.eletronica.org/projetos/leitor-rfid/block.png" alt="Diagrama de Blocos Leitor RFID" /></div>
<h2>Esquemáticos:</h2>
<h3>Analógico</h3>
<p><img src="http://www2.eletronica.org/projetos/leitor-rfid/reader_analog.png" alt="Esquema Analógico" /></p>
<h3>  Microcontrolador</h3>
<p><img src="http://www2.eletronica.org/projetos/leitor-rfid/reader_mpu.png" alt="Esquema MCU" /></p>
<h2>Simulação Passa-Faixa:</h2>
<p><img src="http://www2.eletronica.org/projetos/leitor-rfid/bandpass_simulation.png/image_large" alt="Simulação Passa Banda" /></p>
<h2>Conclusão</h2>
<p>Atualmente eu ajustei o Vcc para 10V. A tensão se +5V é extraída a partir de um regulador de tensão 78L05. O Vref é setado pata a metade da tensão de alimentação, 2,5V. Isso é feito utilizando um simples divisor resistivo de 4,7k ohm.</p>
<p>O código fonte pode ser baixado logo abaixo. Existem duas versões:</p>
<p>Revisão 1: 1º de Maio de 2007 &#8211; Lançamento inicial</p>
<p>Revisão 2: 5 de Maio de 2007 &#8211; Revisão 2</p>
<blockquote><p>  Recursos adicionados:<br />
Auto start, iniciado quando o pino PB7 é colocado em nível alto;<br />
Suporte a um buzzer, saída no pino 4<br />
Detecção automática do cartão</p></blockquote>
<p><sub>Desenvolvido por <a href="http://memweb.newsguy.com/~rhuang/">Rick Huang</a>.</sub></p>
<p><sub>Adaptado para o português por Eletronica.org, com autorização do autor.</sub>
</div>
<fieldset id="attachmentsBox">
<legend>Anexos</legend>
<ul>
<li><a title="" href="http://www2.eletronica.org/projetos/leitor-rfid/reader_2.asm">Firmware Leitor RFID Revisão 2</a></li>
<li><a title="" href="http://www2.eletronica.org/projetos/leitor-rfid/reader_1.0.asm">Firmware Leitor RFID Revisão 1</a></li>
</ul>
</fieldset>
<div id="relatedItems"></div>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/projetos/leitor-rfid">Leitor RFID</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/projetos/leitor-rfid/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>STM32 Primer</title>
		<link>http://www3.eletronica.org/reviews/stm32-primer</link>
		<comments>http://www3.eletronica.org/reviews/stm32-primer#respond</comments>
		<pubDate>Thu, 20 Oct 2011 16:57:11 +0000</pubDate>
		<dc:creator><![CDATA[Administrador Eletronica.org]]></dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[microcontrolador]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=203</guid>
		<description><![CDATA[<p>O STM32 Primer é um kit de demostração/desenvolvimento fabricado pela Raisonance. Focado nos microcontroladores com núcleo ARM Cortex desenvolvidos pela ST Microelectronics, este kit oferece um hardware bastante interessante para conhecer os recursos oferecidos pelo microcontrolador. O microcontrolador central deste kit é o STM32F103RB1, fabricado pela ST Microelectronics com núcleo ARM Cortex M3. Além dos tradicionais LEDs, push-button e buzzer, o kit...</p>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/stm32-primer">STM32 Primer</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>O STM32 Primer é um kit de demostração/desenvolvimento fabricado pela Raisonance. Focado nos microcontroladores com núcleo ARM Cortex desenvolvidos pela ST Microelectronics, este kit oferece um hardware bastante interessante para conhecer os recursos oferecidos pelo microcontrolador.</p>
<div>
<p>O microcontrolador central deste kit é o <a href="http://www.st.com/stm32" target="_self">STM32F103RB1</a>, fabricado pela <a href="http://www.st.com/" target="_self">ST Microelectronics</a> com núcleo <a href="http://www.arm.com/products/CPUs/ARM_Cortex-M3.html" target="_self">ARM Cortex M3</a>. Além dos tradicionais LEDs, <em>push-button</em> e <em>buzzer</em>, o kit conta com um <a href="http://www.stm32circle.com/projects/file/DataSheet/PZG15BW-SCLW-1.pdf" target="_self">display colorido de 128&#215;128 pixel</a>, um acelerômetro de 3 eixos com dois níveis de sensibilidade (  <a href="http://www.stm32circle.com/projects/file/DataSheet/lis3lv02dl.pdf" target="_self">LIS3LV02DL</a>, +-2g/+-6g ), um conjunto de duas pilhas recarregáveis e uma porta USB &#8220;device&#8221;, disponível para o programador (além da porta &#8220;debugger&#8221; utilizado pelo gravador/debugger). Na placa também está disponível o local para a montagem de um transmissor/receptor infra-vermelho, mas no kit que temos em mãos este componente não foi soldado. Pontos de conexão com os pinos do microntrolador também estão disponíveis na PCI, facilitando a adição de algum hardware futuro a ser utilizado. Vale ressaltar que a alimentação do conjunto é feita por baterias recarregáveis via porta USB, também já soldadas na PCI.</p>
<p>Todo o conjunto é acondicionado em uma caixa de acrílico circular, que possui um cordão para prender no pescoço, facilitando o transporte durante os testes.</p>
<div>
<div><a title="SMT32 Primer - Caixa CD" href="http://www2.eletronica.org/resenhas/stm32-primer/p1060050.jpg" target="_self"></a><a title="SMT32 Primer - Desligado" href="http://www2.eletronica.org/resenhas/stm32-primer/p1060062.jpg" target="_self"></a><br />
<a title="SMT32 Primer - Inside 1" href="http://www2.eletronica.org/resenhas/stm32-primer/p1060065.jpg" target="_self"></a><a title="SMT32 Primer - Inside 2 - Baterias" href="http://www2.eletronica.org/resenhas/stm32-primer/p1060073.jpg" target="_self"><br />
</a>O CD que acompanha o produto trás a IDE da própria <a href="http://www.raisonance.com/" target="_self">Raisonance</a>, o Ride7, prontinho para compilar e debugar a aplicação sem nenhuma configuração extra. Basicamente você instala o aplicativo e pluga o Primer. Após o processo do Windows de detecção do dispositivo USB você pode simplesmente acionar os botões de &#8220;Make&#8221; e &#8220;Start Debugger Session&#8221; para começar a depurar o seu aplicativo.</p>
</div>
</div>
<div><a title="Ride 7 IDE" href="http://www2.eletronica.org/resenhas/stm32-primer/ride7.jpg" target="_self"></a></div>
<p>Dois exemplos de &#8220;Alô Mundo&#8221; são disponibilizados, com o intuito básico de piscar os LEDs da placa. A diferença entre os dois está na utilização ou não do CircleOS, um sistema operacional desenvolvido para facilitar a escrita de aplicativos para a plataforma, que não possui requerimentos de tempo real.<br id="zz-8" /><br id="xl7e" />Com o intuito básico de conhecer a API do CircleOS nós escrevemos uma aplicação simples, para capturar os dados do acelerômetro e plotar na tela o resultado dos 3 eixos: X, Y e Z.<br id="w0is" />As rotinas disponibilizadas pelo CircleOS tornam o acesso ao hardware trivial. Basicamente nós utilizamos as seguintes rotinas:<br id="j1aq" /><br id="n6va" />Display:<br id="gmmm" />1. LCD_SetBackLightOn(): Liga o backlight do display;<br id="je22" />2. DRAW_Clear(): Limpa o display;<br id="ah4r" />3. DRAW_Line( x, y, x1, y1, RGB_RED ): desenha uma linha vermelha entre os pontos (x,y) e (x1,y1).<br id="mw8w" />4. DRAW_DisplayString( x,y,&#8221;Txt&#8221;,3 ): escreve a string de comprimento 3 &#8220;Txt&#8221; iniciando no ponto (x,y).<br id="kx3o" /><br id="fvop" />Botão:<br id="mdk3" />1. BUTTON_GetState(): captura o estado do botão;<br id="p:sj" /><br id="bzvw" />Led:<br id="ujwg" />1. LED_Set ( LED_GREEN, LED_OFF): desliga o led verde;<br id="e5ml" /><br id="edso" />Acelerômetro:<br id="i_ds" />1. tMEMS_Info *memsInfo = MEMS_GetInfo(): a estrutura tMEMS_Info possui os dados informados pelo acelerômetro e é retornada pela função MEMS_GetInfo.<br id="p:uq" /><br id="onxy" />O código desta pequena aplicação está anexo. A partir da referência de 1G da gravidade, foi simples calcular a posição para plotar o eixo Z (barra azul sobre a linha indicativa do eixo X significa 1G sobre o eixo Z). A cruz vermelha aponta para o centro do gráfico quando os eixos X e Y estão em 0G. A inclinação do acelerômetro provoca alterações nos 3 eixos em virtude da aceleração da gravidade, como pode ser visto no aplicativo executando:</p>
<div>
<div><a title="SMT32 Primer - Aplicação 4" href="http://www2.eletronica.org/resenhas/stm32-primer/p1060023.jpg" target="_self"></a><a title="SMT32 Primer - Aplicação" href="http://www2.eletronica.org/resenhas/stm32-primer/p1060014.jpg" target="_self"></a><br />
<a title="SMT32 Primer - Aplicação 2" href="http://www2.eletronica.org/resenhas/stm32-primer/p1060015.jpg" target="_self"></a><a title="SMT32 Primer - Aplicação 3" href="http://www2.eletronica.org/resenhas/stm32-primer/p1060020.jpg" target="_self">></a></div>
</div>
<p><br id="d_2l" /><br id="n_qf" />Como nós utilizamos o CircleOS, o gerenciador padrão do sistema operacional continua operacional. Ao iniciar basta selecionar a aplicação em um menu que ela começa a executar.</p>
<div><a title="SMT32 Primer - Menu" href="http://www2.eletronica.org/resenhas/stm32-primer/p1060005.jpg" target="_self"></a></div>
<p><br id="tx6j" />Um dos pontos fracos do kit é exatamente o fato de possuir apenas um botão para interação com o usuário. No CircleOS o acelerômetro foi utilizado como elemento para navegação entre os menus. A idéia é interessante, mas a implementação ficou a desejar. Leva algum tempo até você acostumar a controlar o menu pela inclinação do dispositivo e fazer isso dentro de um veículo em movimento diminui razoalvelmente o grau de precisão.<br id="sqr1" /><br id="emhl" />Nós efetuamos alguns testes adicionais, como atualizar o sistema operacional CircleOS para a última versão, executar sem o CircleOS e também instalar o <a href="http://www.freertos.org/" target="_self">FreeRTOS</a> no dispositivo (já existe um port para ele). Nenhum problema foi encontrado, todos os recursos funcionaram da forma esperada.<br id="fms1" /><br id="adbp" /><span class="Apple-style-span" style="font-size: 20px; font-weight: bold;">Conclusão</span></p>
<p>No geral o kit STM32 Primer é uma alternativa muito interessante para quem deseja aprender mais sobre os microcontroladores STM32 da ST Microelectronics. Segundo o fabricante ele é compatível com 20 chips desta família, tornando-o bastante versátil. O hardware oferecido é extremamente útil para desenvolver e testar aplicações, ao permitir mobilidade e versatilidade na apresentação de informações aos usuários. Se você pretende trabalhar com esta plataforma ou precisa de um dispositivo que agregue as características deste kit para a sua aplicação, vale a pena utilizá-lo.</p>
</div>
<p>O post <a rel="nofollow" href="http://www3.eletronica.org/reviews/stm32-primer">STM32 Primer</a> apareceu primeiro em <a rel="nofollow" href="http://www3.eletronica.org">Eletronica.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/reviews/stm32-primer/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
