Mensagens de Mauro Assis - Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)2024-03-29T12:16:07ZMauro Assishttps://labdegaragem.com/profile/MauroAssishttps://static.ning.com/socialnetworkmain/widgets/profiles/gfx/defaults/profile-0000FF.png?xn_version=431723162&width=48&height=48&crop=1%3A1&xj_user_default=1https://labdegaragem.com/profiles/blog/feed?user=0om1jz76e8ivb&xn_auth=noControlando meArm (braço robótico) com LeapMotion (sensor de movimento)tag:labdegaragem.com,2015-05-26:6223006:BlogPost:4433562015-05-26T22:30:00.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Abaixo, o vídeo dos meus primeiros resultados controlando o meArm a partir do sensor <a href="https://www.leapmotion.com/">LeapMotion</a>.</p>
<p></p>
<p><iframe frameborder="0" height="614" src="https://www.youtube.com/embed/5z3shrWEaTw?wmode=opaque" width="1093"></iframe>
</p>
<p></p>
<p><span>Esse sensor é semelhante ao Kinect, ou seja, detecta movimentos do nosso corpo (no caso, somente as mãos e braços) e constrói, usando modelos matemáticos bastante complexos, um modelo 3D que descreve…</span></p>
<p>Abaixo, o vídeo dos meus primeiros resultados controlando o meArm a partir do sensor <a href="https://www.leapmotion.com/">LeapMotion</a>.</p>
<p></p>
<p><iframe width="1093" height="614" src="https://www.youtube.com/embed/5z3shrWEaTw?wmode=opaque" frameborder="0"></iframe>
</p>
<p></p>
<p><span>Esse sensor é semelhante ao Kinect, ou seja, detecta movimentos do nosso corpo (no caso, somente as mãos e braços) e constrói, usando modelos matemáticos bastante complexos, um modelo 3D que descreve cada parte do que está em seu "campo de visão". Essa detecção é feita com emissão e captação de radiação infravermelha.</span><br/> <br/>
<span>Como a matemática por trás do troço é muito complexa, ele precisa do PC, ou seja, ainda não é possível ter uma plaquinha das que a gente usa (Arduino, RPi, Edison etc) para processar diretamente os sinais enviados pelo sensor.</span><br/>
<br/>
<span>Dito isso, se quisermos comandar algum device com o LM, devemos estabelecer a comunicação entre o PC onde o LM está conectado e o dispositivo a ser comandado.</span><br/>
<br/>
<span>No caso, a ideia é estabelecer uma maneira de comandar o meArm (pequeno robô visto no vídeo acima) de forma total, ou seja, todos os movimentos, a partir de movimentos captados pelo LM em uma ou duas mãos.</span><br/>
<br/>
<span>Como o robô pode ser controlado com um Arduino, pensei em ligar o Arduino no PC, captar os movimentos do meArm com uma aplicação em Python, processar esses comandos para facilitar o comando pelo Arduino e enviar pro Arduino via porta serial.</span><br/>
<br/>
<span>Os primeiros testes, me pareceu óbvio, seriam mais fáceis com a pinça, ou seja, fechando e abrindo a pinça do robô com movimentos em pinça do polegar contra o indicador.</span><br/>
<br/>
<span>Esse post vai tratar de como isso foi feito.</span><br/>
<br/>
<span>Primeiro, vamos analisar a aplicação Python:</span></p>
<div><p></p>
<p># -*- coding: cp1252 -*-<br/> ###############################################################################<br/>
# #<br/>
# This program tests the tweezers movement in meArm controlled by Leap Motion #<br/>
# You can see more in <a href="http://automatobr.blogspot.com.br">http://automatobr.blogspot.com.br</a> #<br/>
# #<br/>
# assismauro@hotmail.com #<br/>
# #<br/>
###############################################################################<br/>
import sys<br/>
# Bring serial stuff<br/>
import serial<br/>
import thread, time</p>
<p># Add path to LeapMotion libs directory <br/> sys.path.insert(0,"D:\Atrium\Projects\Arduino\LeapMotion\lib")</p>
<p># import LM stuff<br/> import Leap<br/>
from Leap import CircleGesture, KeyTapGesture, ScreenTapGesture, SwipeGesture</p>
<p># initialize Arduino/PC communication. You must set COM port accordingly your Arduino connection<br/> arduino = serial.Serial('COM48', 9600, timeout=.1)</p>
<p># This listener is called anytime some data is available form LM<br/> class SampleListener(Leap.Listener):</p>
<p># some readable names to use later<br/> finger_names = ['Thumb', 'Index', 'Middle', 'Ring', 'Pinky']<br/>
bone_names = ['Metacarpal', 'Proximal', 'Intermediate', 'Distal']</p>
<p>def on_init(self, controller):<br/> print "Initialized"</p>
<p>def on_connect(self, controller):<br/> print "Connected"</p>
<p>def on_frame(self, controller):</p>
<p>global arduino</p>
<p># Get the most recent frame, that contains data sent from LM engine<br/> frame = controller.frame()</p>
<p># Get hands<br/> if len(frame.hands) == 0:<br/>
return<br/>
<br/>
hand = frame.hands[0] # only one hand</p>
<p># Get fingers: we only need Thumb and Index data, for a while<br/> for finger in hand.fingers:<br/>
if (self.finger_names[finger.type()] == "Thumb") or (self.finger_names[finger.type()] == "Index"):<br/>
# Get bones<br/>
for b in range(0, 4):<br/>
bone = finger.bone(b)</p>
<p>d=0.0<br/> i=0.0<br/>
tshMin = 10.0<br/>
tshMax = 100.0<br/>
# The idea is to process only distal bone data, that corresponds to te tip of our fingers.<br/>
# The LM coordinate system is a X,Y,Z based in the center of the sensor (see picture in my<br/>
# blog). As we need only the distance between tips, in a tweezers movement, I transform it<br/>
# in a "percent distance", that is, 0 corresponds to tweezer closed, and 100, tweezer<br/>
# oppened.<br/>
if (self.bone_names[bone.type] == "Distal"):<br/>
if (self.finger_names[finger.type()] == "Thumb"):<br/>
t=bone.next_joint[0]<br/>
else:<br/>
i=bone.next_joint[0]<br/>
d=abs(t-i)<br/>
o=100 if d >= tshMax else (0 if (d <= tshMin) else (d-tshMin)/tshMax*100.0)<br/>
print o<br/>
# here we send data to Arduino<br/>
toSend = str(o)+"\n"<br/>
arduino.write(toSend)<br/>
# and... that´s it.</p>
<p>def main():<br/> # Create a sample listener and controller<br/>
listener = SampleListener()<br/>
controller = Leap.Controller()<br/>
<br/>
# Have the sample listener receive events from the controller<br/>
controller.add_listener(listener)</p>
<p># Keep this process running until Enter is pressed<br/> print "Press Enter to quit..."<br/>
try:<br/>
sys.stdin.readline()<br/>
except KeyboardInterrupt:<br/>
pass<br/>
finally:<br/>
# Remove the sample listener when done<br/>
controller.remove_listener(listener)</p>
<p>if __name__ == "__main__":<br/> main()</p>
<p></p>
</div>
<p><span><span>O código acima, devidamente comentado, é responsável por enviar ao Arduino os comandos do motor da pinça (garra) do meArm.</span><br/> <br/>
<span>Abaixo, o programa que roda no Arduino:</span></span></p>
<p></p>
<p>/*<br/> Program to command meArm gripper from LeapMotion (Arduino side)<br/>
More about that: <a href="http://automatobr.blogspot.com.br">http://automatobr.blogspot.com.br</a><br/>
assismauro@hotmail.com<br/>
*/</p>
<p>#include <Servo.h><br/> #include <SoftwareSerial.h></p>
<p>// Debug communication, if you think is necessary<br/> SoftwareSerial mySerial(7,8);</p>
<p>// meArm servo pins<br/> int basePin = 11;<br/>
int shoulderPin = 10;<br/>
int elbowPin = 9;<br/>
int gripperPin = 6;</p>
<p>Servo base;<br/> Servo shoulder;<br/>
Servo elbow;<br/>
Servo gripper;</p>
<p>void setup() {<br/> /*<br/>
base.attach(basePin);<br/>
shoulder.attach(shoulderPin);<br/>
elbow.attach(elbowPin);<br/>
*/<br/>
// Gripper test<br/>
gripper.attach(gripperPin);<br/>
Serial.begin(9600);<br/>
mySerial.begin(9600);<br/>
gripper.write(90);<br/>
delay(500);<br/>
gripper.write(120);<br/>
delay(500);<br/>
}</p>
<p>// Stores the last cmd received<br/> int cmdOld=-1;</p>
<p>// Threshold<br/> int limiar = 5;</p>
<p>void loop() <br/> {<br/>
String cmdStr = "";<br/>
// Get command from Pyton PC app<br/>
if(Serial.available())<br/>
cmdStr=Serial.readStringUntil(10);<br/>
<br/>
if(cmdStr != "")<br/>
{<br/>
int cmd=cmdStr.toInt();<br/>
//Check threshold<br/>
if((cmd > 100) || (abs(cmd - cmdOld) < limiar))<br/>
return;<br/>
cmdOld=cmd;<br/>
// Map LeapMotion command to gripper servo angle <br/>
int gripAngle=map(cmd,0,100,140,90);<br/>
gripper.write(gripAngle);<br/>
delay(30);<br/>
// Send data to debug Arduino<br/>
mySerial.print(cmd);<br/>
mySerial.print(" - ");<br/>
mySerial.println(gripAngle);<br/>
}<br/>
}</p>
<p></p>
<p><span>O programa é bem simples: recebe o comando que vem do Python e o trata, acionando o motor da garra.</span><br/> <br/>
<span>Dois detalhes importantes:</span><br/>
<br/>
<span>1) Vc pode observar que tem a definição de uma segunda porta serial. Eu fiz isso para depurar o meu programa, porque como a porta serial que normalmente a gente usa para se comunicar com o Arduino está ocupada pelo próprio. Aí eu liguei um segundo Arduino a outro PC e conectei os dois criando uma porta serial usando os pinos 7 e 8. Aí deu para monitorar os comandos que estavam chegando enviando-os ao outro Arduino.</span><br/>
<br/>
<span>2) Outro pronto é a variável </span><b>limiar</b><span>. Ela serve para suavizar os movimentos do meArm, porque os comandos recebidos variam muito. Isso evita a "tremedeira" da garra.</span><br/>
<br/>
<span>É isso.</span></p>Arduino Yún - Configurando o WiFitag:labdegaragem.com,2015-02-19:6223006:BlogPost:4189192015-02-19T06:30:00.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p><span>Vamos aprender a colocar o Yún no seu devido lugar: a nuvem, ou 雲, como vcs já aprenderam lá atrás.</span><br></br> <br></br> <span>Para isso, molezinha: Quando ligamos o Yún pela primeira vez ele aparece como um access point, então vc pode vê-lo através do gerenciador de conexões de rede do seu notebook como Arduino Yun-XXXXXXX, assim:</span></p>
<p><span><img src="http://2.bp.blogspot.com/-V_yK1324jKQ/VNFSrdzFtxI/AAAAAAAACVE/uTa9RZlZyN8/s1600/Untitled.png"></img></span></p>
<p></p>
<p><span>O número é único por Yún.</span><br></br> <br></br> <span>Conecte-se ao bicho, abra o seu browser e aponte…</span></p>
<p><span>Vamos aprender a colocar o Yún no seu devido lugar: a nuvem, ou 雲, como vcs já aprenderam lá atrás.</span><br/> <br/> <span>Para isso, molezinha: Quando ligamos o Yún pela primeira vez ele aparece como um access point, então vc pode vê-lo através do gerenciador de conexões de rede do seu notebook como Arduino Yun-XXXXXXX, assim:</span></p>
<p><span><img src="http://2.bp.blogspot.com/-V_yK1324jKQ/VNFSrdzFtxI/AAAAAAAACVE/uTa9RZlZyN8/s1600/Untitled.png"/></span></p>
<p></p>
<p><span>O número é único por Yún.</span><br/> <br/> <span>Conecte-se ao bicho, abra o seu browser e aponte para: <a href="http://arduino.local">http://arduino.local</a> ou 192.168.240.1 e você verá a tela de configuração da plaquinha:</span></p>
<p></p>
<p><span><img src="http://arduino.cc/en/uploads/Guide/YunWebPassword.png"/></span></p>
<p></p>
<p><span><span>A senha é </span><b>arduino</b><span>.</span><br/> <br/> <span>Digitada a senha, aparece a seguinte tela:</span><br/> <br/></span></p>
<div class="separator"><a href="http://4.bp.blogspot.com/-oa2h9UthkUE/VNFV2khi67I/AAAAAAAACVQ/4tYk46LP3O8/s1600/Untitled.png"><img border="0" src="http://4.bp.blogspot.com/-oa2h9UthkUE/VNFV2khi67I/AAAAAAAACVQ/4tYk46LP3O8/s1600/Untitled.png" height="505" width="640"/></a></div>
<div class="separator"></div>
<div class="separator"><span>Dá para ver os parâmetros das duas conexões possíveis, wifi e ethernet.</span><br/> <br/> <span>Para colocar na nuvem a bichinha, temos que colocá-la como cliente na nossa rede. Para isso, clique em CONFIGURE e acesse:</span></div>
<div class="separator"></div>
<div class="separator"><span><img src="http://4.bp.blogspot.com/-BYTZLFYvobo/VNFajiiRnxI/AAAAAAAACVc/vLCQt04lAXY/s1600/Untitled.png"/></span></div>
<div class="separator"></div>
<div class="separator"></div>
<div class="separator"><span>Aqui vc pode dar um nome para o seu Yun, alterar a senha de acesso a ele e, mais importante, colocá-lo na sua rede wifi.</span><br/> <br/> <span>Configure a rede e clique em CONFIGURE AND RESTART. Isso feito, após reiniciar a plaquinha estará como client da nossa rede.</span><br/> <br/> <b>Uma dica importante</b><span>: caso vc leve o seu Yún para passear por alguma outra rede, vc tem duas opções:</span><br/> <br/> <span>1) Apertar o botão de reset do wifi. Aliás, o Yún tem três resets, como vc pode ver abaixo:</span><br/> <br/> <img src="http://arduino.cc/en/uploads/Guide/YunResetIllustrations.png" height="280" width="400"/></div>
<div class="separator"></div>
<div class="separator"></div>
<div class="separator"><span>O botão </span><b>32U4 Reset</b><span> reseta a parte Arduino da plaquinha, ou seja, reinicia o sketch (programa) que estiver rodando no processador 32U4.</span><br/> <br/> <span>Já o botão Linino Reboot "reboota" o Linux, enquanto que o botão Wifi Reset, se pressionado por mais de 5 segundos e menos de 30 faz com que o wifi volte ao modo access point, ou seja, permita a conexão usando o arduino.local.</span><br/> <br/> <span>E se vc pressionar por mais de 30 segundos? Bom, nesse caso o Linino volta ao seu status inicial, po seja, à configuração "de fábrica" (ou, caso vc tenha baixado alguma outra distribuição mais recente, ele atualiza para ela). Tudo o que vc tiver instalado e, claro, a configuração de rede, será perdido.</span></div>
<div class="separator"></div>
<div class="separator"><span>2) Eu reparei (mas não achei nada sobe isso na net) que, se vc liga o Yún e ele não acha a rede para a qual foi configurado, ele volta ao modo access point depois de algum tempo, sozinho. Quanto tempo? Sei lá, acho que em torno de um minuto. Quando eu descobrir eu conto.</span><br/> <br/> <span>Bom, e agora, o que fazemos?</span><br/> <br/> <span>Bom, uma coisa legal que dá para fazer é programá-lo via wifi. Para isso, abra a IDE do Arduino, selecione a Board como Yún e dê uma olhada na lista do Port:</span><br/> <br/><div class="separator"><img src="http://1.bp.blogspot.com/-ip7wo9qh5Yc/VNFih2hRYCI/AAAAAAAACVs/DHwWvFY71yA/s1600/Untitled.png"/></div>
<div class="separator"></div>
<div class="separator"><span>Agora o Yún aparece como serial e rede, com o respectivo ip. E vc pode, claro, enviar o seu programa por aí, em vez de pela serial. E porque ele aparece nas duas formas? Porque ele está conectado também pela USB, para que possa ser alimentado. Mas caso vc queira e ele esteja ligado a uma bateria ou outra fonte de alimentação, pode ser programado à distância!</span><br/> <br/> <span>Falar em alimentação, eu já falei que o Yún é PoE? Quer dizer, uma vez que vc plugou o bicho num cabo de rede, ele se alimentará por aí, não sendo necessária outra fonte de alimentação.</span></div>
<div class="separator"></div>
<div class="separator"><span>É isso.</span></div>
<div class="separator"></div>
<div class="separator"></div>
<div class="separator"><span>Abracadabraço,</span></div>
<div class="separator"></div>
<div class="separator"></div>
<div class="separator"><span>Mauro Assis</span></div>
</div>
<p></p>
<p></p>Arduino Yún - Apresentaçãotag:labdegaragem.com,2015-02-07:6223006:BlogPost:4158622015-02-07T00:30:00.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p><img height="426" src="https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2Ftavendo.com%2Fstatic%2Fimg%2Fblog%2Farduino-yun-getting-started-part-1%2Farduino-yun.jpg&container=blogger&gadget=a&rewriteMime=image%2F*" width="640"></img></p>
<p>No dia do meu aniversário de 50 anos, em 13/12 passado, meu amigo Tiago, um Arduino-aficcionado a quem eu tive o prazer de apresentar o mundo das plaquinhas, trouxe-me direto de NYC dois brinquedinhos novos: um <a href="http://www.google.com/chrome/devices/chromecast/">Google Chromecast</a> e um Arduino Yún. O Chormecast foi logo espetado na TV e passou imediatamente a prestar os seus serviços.</p>
<p></p>
<p>Já o Yún ficou na caixa algum tempo e, como vieram as férias, fim…</p>
<p><img height="426" src="https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2Ftavendo.com%2Fstatic%2Fimg%2Fblog%2Farduino-yun-getting-started-part-1%2Farduino-yun.jpg&container=blogger&gadget=a&rewriteMime=image%2F*" width="640"/></p>
<p>No dia do meu aniversário de 50 anos, em 13/12 passado, meu amigo Tiago, um Arduino-aficcionado a quem eu tive o prazer de apresentar o mundo das plaquinhas, trouxe-me direto de NYC dois brinquedinhos novos: um <a href="http://www.google.com/chrome/devices/chromecast/">Google Chromecast</a> e um Arduino Yún. O Chormecast foi logo espetado na TV e passou imediatamente a prestar os seus serviços.</p>
<p></p>
<p>Já o Yún ficou na caixa algum tempo e, como vieram as férias, fim de ano etc, só agora tive um tempo para começar a explorá-lo. Boralá?</p>
<p></p>
<p>Como dá prá ver, ela tem mais ou menos a cara de um Arduino Uno, e o mesmo tamanho. Apesar disso, ela é muito mais que o Uno. Senão vejamos:</p>
<p></p>
<p><b>Um pouco de história</b></p>
<p></p>
<p>Quando foi lançado, já nos idos de 2005, o primeiro modelo de Arduino trouxe um conceito novo ao mundo: uma plaquinha única contendo microcontrolador, clock, porta serial, regulador de tensão e portas de entrada e saída, bem como uma IDE (software editor de programas) integrada capaz de compilar e enviar os programas direto para o microcontrolador. Além disso, o produto foi lançado como "hardware livre", quer dizer, os caras não patentearam o produto e publicaram toda a documentação para reproduzi-lo livremente na internet, de maneira que imediatamente começaram a aparecer clones vendidos por todo o mundo, e a plataforma Arduino foi fazendo um sucesso cada vez maior. No início de 2013 tinham sido vendidas 700k placas "oficiais", e estima-se que exista uma n"ao-oficial para cada oficial. O preço, hoje em torno de $15 por um modelo típico também ajudou, claro.</p>
<p></p>
<p><strong>Pode-se afirmar, sem medo de errar, que o Arduino revolucionou o ensino e a prática de automação, robótica e mesmo programação, já que tudo o que vc precisa para controlar dispositivos está contido numa única plaquinha. Uma ideia na cabeça e um Arduino na mão é o suficiente.</strong></p>
<p></p>
<p>Vários modelos foram lançados pelo pessoal do Arduino, todos com a mesma filosofia: microcontroladores diferentes, mais ou menos memória e portas de E/S, tamanho menor ao maior, mas o mesmo conceito: microcontrolador único, sem sistema operacional, perfeito para uso em controle e automação.</p>
<p></p>
<p>Com o tempo, outras iniciativas apareceram com conceitos um pouco diferentes. Exemplo: o <a href="http://en.wikipedia.org/wiki/Raspberry_Pi">Raspberry Pi</a>, plaquinha do tamanho de um cartão de crédito, capaz de rodar algumas distribuições Linux, usando cartões de memória tipo SD como "HD". Possui também uma porta HDMI para ser ligada a monitores e TVs, ao mesmo tempo em que possui também pinos para conexão de entrada e saída de dados. O preço também em conta, em torno de $35, mas não foi adotado o conceito do hardware livre.</p>
<p></p>
<p>Interessante que o assunto interessou também os gigantes do hardware e software, que também lançaram suas iniciativas, ex:</p>
<p></p>
<p>- Microsoft: <a href="http://www.netduino.com/">NetDuino</a>, capaz de rodar uma versão do .Net Framework.</p>
<p>- Intel: <a href="http://www.intel.com/content/www/us/en/do-it-yourself/galileo-maker-quark-board.html">Galileo </a>e <a href="http://www.intel.com/content/www/us/en/do-it-yourself/edison.html">Edson</a>.</p>
<p></p>
<p>Algumas alternativas possuem alguma compatibilidade com o Arduino, por exemplo a posição dos pinos de E/S compatível, o que facilita a interconexão com hardwares (<a href="http://arduino.cc/en/Main/ArduinoShields">shields</a>) desenvolvidos para o Arduino.</p>
<p></p>
<p>A questão é que, por terem um sistema operacional, as plaquinhas de outros fabricantes, apesar de terem clocks bem mais rápidos, acabam sendo mais lentas quando se trata de controle em tempo real. Isso porque o sistema operacional traz várias demandas a serem atendidas (segurança, vídeo, rede etc) que fazem com que um RPi com um clock de 700 MHz tenha problemas para controlar mais de um servo enquanto o Arduino, do alto dos seus 16 MHz possa controlar 5 servos com um pé nas costas.</p>
<p></p>
<p>Isso faz com que a gente às vezes tenha que colocar um Arduino junto para fazer o "trabalho sujo", ou seja, fazer o controle do hardware enquanto o RPi (ou Galileo etc) roda a parte nobre, ou seja, o software mais sofisticado.</p>
<p></p>
<p><a href="http://3.bp.blogspot.com/-zkgLSxrVtmU/VMli7pdMxtI/AAAAAAAACTk/rlbydpy7agQ/s1600/IMG_5619.JPG"><img border="0" height="400" src="https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F3.bp.blogspot.com%2F-zkgLSxrVtmU%2FVMli7pdMxtI%2FAAAAAAAACTk%2Frlbydpy7agQ%2Fs1600%2FIMG_5619.JPG&container=blogger&gadget=a&rewriteMime=image%2F*" width="300"/></a></p>
<p></p>
<p>Ao lado, um exemplo de um projeto combinado. O sistema publica um site que, hospedado numa instância Apache que roda no RPi (dentro da caixa plástica transparente), exibe em tempo real as imagens da câmera do RPi (quadradinho preto). O posicionamento da câmera pode ser ajustado pelos dois servo-motores (em azul, abaixo da câmera). Para que isso funcione foi necessário colocar um Arduino para comandar os motores e criar uma comunicação I<sup><font>2</font></sup>C entre Arduino e Pi para que o comando enviado pela internet ao Pi seja transmitido para o Arduino.</p>
<p></p>
<p><b>Em cena, o Yún</b></p>
<p></p>
<p>O Yún foi concebido para preencher essa lacuna. Ele é uma espécie de 2 em 1: tem um processador AR9331, que "roda" o Linux, e outro, o ATMega 32U4, que é um microcontrolador típico da plataforma Arduino. Isso proporciona o melhor dos dois mundos: um microprocessador rodando um sistema operacional e um microcontrolador para interagir com o hardware.</p>
<p></p>
<p>Para comunicar um "mundo" com o outro, protocolo serial com uma camada de software que os caras chamam de Bridge.</p>
<p></p>
<p>Como se não bastasse: o Yún tem ainda WiFi, duas portas USB em vez de uma (mais sobre isso à frente) e uma porta Ethernet (conexão de rede). Tudo isso mantendo a mesma pinagem do Arduino Uno, ou seja, compatível com tudo o que existe em termos de shields para a plataforma Arduino.</p>
<p></p>
<p>O foco do Yún, como se pode perceber, é a interação pela internet, mais especificamente IoT, Internet das Coisas.</p>
<p></p>
<p>Aliás, Yún quer dizer "Nuvem", em chinês. Em mandarim:</p>
<h2><font size="6">雲</font></h2>
<p>Cool, isn´t it?</p>
<p></p>
<p>Tudo isso por aproximadamente US$74,00 (nos EUA).</p>
<p></p>
<p>Pretendo fazer mais alguns posts sobre a plaquinha cá no Lab e no meu blog: <a href="http://automatobr.blogspot.com.br" target="_blank">http://automatobr.blogspot.com.br</a>.</p>
<p></p>
<p>Abracadabraço!</p>Interaja com um projeto de Internet das Coisastag:labdegaragem.com,2014-10-01:6223006:BlogPost:3886282014-10-01T11:44:30.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Amigos,</p>
<p></p>
<p>Criei um projeto que usa o MQTT, protocolo mais usado em IoT. Ele consiste de uma câmera com um mecanismo de pan/tilt comandado por um Arduino. Esse mecanismo por sua vez está ligado a um Raspberry que publica em tempo real as imagens captadas pela câmera. Para ver as imagens é só acessar aqui: <a href="http://automatobr.noip.me:81/" target="_blank">http://automatobr.noip.me:81/</a>.</p>
<p></p>
<p>Vc pode também reposicionar a câmera. O ângulo do motor pan pode variar…</p>
<p>Amigos,</p>
<p></p>
<p>Criei um projeto que usa o MQTT, protocolo mais usado em IoT. Ele consiste de uma câmera com um mecanismo de pan/tilt comandado por um Arduino. Esse mecanismo por sua vez está ligado a um Raspberry que publica em tempo real as imagens captadas pela câmera. Para ver as imagens é só acessar aqui: <a href="http://automatobr.noip.me:81/" target="_blank">http://automatobr.noip.me:81/</a>.</p>
<p></p>
<p>Vc pode também reposicionar a câmera. O ângulo do motor pan pode variar de 0 a 140, e o tilt pode variar de 10 até 120.</p>
<p>Para comandar a câmera vc tem que enviar comandos via MQTT. Para isso:</p>
<p></p>
<p>Num celular Andoid:</p>
<p></p>
<p>1) Baixe e instale o programa myMQTT</p>
<p>2) Vá na opção <strong>Settings</strong></p>
<p>3) Na primeira linha coloque o server <strong>iot.eclipse.org</strong>.</p>
<p>4) Vá na opção <strong>Publish</strong>.</p>
<p>5) Na primeira linha, coloque <strong>/home/remotePiCamera</strong>.</p>
<p>6) Na segunda linha, coloque os ângulos na forma: <pan>,<tilt>, ex: <strong>90,40</strong>.</p>
<p>7) Acesse o site da câmera antes de enviar o comando e veja a imagem se movimentando.</p>
<p></p>
<p>Legal, né?</p>
<p></p>
<p>No meu blog, <a href="http://automatobr.blogspot.com.br" target="_blank">automatobr.blogspot.com.br</a>, tem mais informações sobre MQTT e esse projeto. Por favor, testem a brincadeira, quero ver se o troço funciona mesmo.</p>
<p></p>
<p>Abracadabraço,</p>
<p></p>
<p>Mauro Assis</p>Resenha do novo Raspberry B+tag:labdegaragem.com,2014-09-08:6223006:BlogPost:3838442014-09-08T20:30:00.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p><span>Dia desses recebi o meu primeiro Raspberry B+. Para quem não sabe, é a nova versão da plaquinha Raspberry, lançada a coisa de uns quarenta dias. Resolvi dar uma divulgada na bichinha e também dar a minha primeira impressão após alguns testes.</span><br></br> <br></br> <span>Esse é o Raspberry B "antigo":</span><br></br> <br></br><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979582004?profile=original" target="_self"><img class="align-full" src="http://storage.ning.com/topology/rest/1.0/file/get/1979582004?profile=original" width="260"></img></a> <br></br> <br></br> <span>A partir do canto superior esquerdo, dá…</span></p>
<p><span>Dia desses recebi o meu primeiro Raspberry B+. Para quem não sabe, é a nova versão da plaquinha Raspberry, lançada a coisa de uns quarenta dias. Resolvi dar uma divulgada na bichinha e também dar a minha primeira impressão após alguns testes.</span><br/> <br/> <span>Esse é o Raspberry B "antigo":</span><br/> <br/><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979582004?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979582004?profile=original" width="260" class="align-full"/></a><br/> <br/> <span>A partir do canto superior esquerdo, dá para ver o conector GPIO, que serve para conectar o RPi a sensores e atuadores, o plug RCA de vídeo, o plug de áudio, igual aos usados em celulares. Na lateral direita, dois conectores USB e um conector de rede. Na parte inferior, conector HDMI e entre o HDMI e o de rede o conector para a câmera específica do Raspberry. Por fim, do lado esquerdo o conector de energia apenas, do tipo micro USB.</span><br/> <br/><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979582035?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979582035?profile=original" width="273" class="align-full"/></a></p>
<div class="post-body entry-content" id="post-body-161229718409513359">Da mesma forma, no topo da placa o GPIO, só que com 40 pinos em vez de 28. <a href="http://raspi.tv/2014/rpi-gpio-quick-reference-updated-for-raspberry-pi-b">Aqui</a> uma referência com o diagrama do novo GPIO. Saíram o conector RCA e o de som. Na lateral direita, agora com 4 conectores USB e o conector de rede. Na parte inferior um conector de áudio e vídeo de 3.4 mm. Esse conector substituiu os dois que ficavam na parte de cima. Mais sobre ele <a href="http://www.raspberrypi-spy.co.uk/2014/07/raspberry-pi-model-b-3-5mm-audiovideo-jack/">aqui</a>. Ao lado o conector da câmera, depois o HDMI e o micro SD de alimentação. Dá prá ver que ela agora tem quatro furos para fixação, que faziam falta nas versões anteriores (chegaram a sair algumas com dois furos, assimétricos, na versão anterior).<br/> <br/> Bom, qual o ganho no layout? Dois, muito importantes: primeiro só dois lados tem conectores, o que facilita muito colocar o RPi numa caixinha, sem ter que colocar conector por tudo que é lado. E também o "HD", que na versão anterior era um cartão SD tamanho grande, como dá prá ver na imagem abaixo, do lado esquerdo. É o cartão azul.<br/> <br/><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979582615?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979582615?profile=original" width="259" class="align-full"/></a> <br/> Já na versão nova o cartão é do tipo micro, e fica na parte inferior da placa, nesse conector aqui:</div>
<div class="post-body entry-content"></div>
<div class="post-body entry-content"><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979582809?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979582809?profile=original" width="250" class="align-full"/></a><br/> <img/><br/> Isso melhorou muito a robustez da placa, porque o cartão grande soltava com facilidade, ás vezes nem se conectava direito.<br/> <br/> Já o processador é o mesmo, assim como a quantidade de memória. O preço também é o mesmo, $35,00 mais taxas.<br/> <br/> Outra vantagem alegada pelo povo do fabricante é que o consumo baixou. Eu fiz alguns testes comparando as duas plaquinhas, e realmente o consumo caiu significativamente, como vocês podem ver abaixo:<br/> <br/><table border="0" cellspacing="0">
<colgroup><col width="209"></col><col width="96"></col><col width="110"></col><col width="64"></col></colgroup><tbody><tr><td height="20" width="209">Função</td>
<td width="96">Raspberry B</td>
<td width="110">Raspberry B+</td>
<td width="64"></td>
</tr>
<tr><td height="20">Carregamento, pico de consumo</td>
<td align="right">240</td>
<td align="right">130</td>
<td> mA</td>
</tr>
<tr><td height="20">Consumo modo texto</td>
<td align="right">200</td>
<td align="right">110</td>
<td> mA</td>
</tr>
<tr><td height="20">Modo gráfico, pico</td>
<td align="right">230</td>
<td align="right">130</td>
<td> mA</td>
</tr>
<tr><td height="20">Idle, depois do shutdown</td>
<td align="right">60</td>
<td align="right">20</td>
<td> mA</td>
</tr>
</tbody>
</table>
<br/> Dá prá ver que o consumo realmente caiu significativamente.<br/> <br/> No mais, como o hardware de processamento não mudou, tudo o que existe em termos de software é 100% compatível com a versão nova.<br/> <br/> Conclusão: apesar de nenhuma novidade em termos de processamento e memória, o RB+ traz novidades interessantes para quem pensa em usar o produto embarcado. Na verdade isso era quase impossível antes, principalmente por causa do cartão "sobrando" para fora da placa, mas também pelos outros fatores descritos acima.<br/> <br/> E, como o preço não subiu... agora, obviamente não dá para jogar as nossas plaquinhas "B-" fora, e também se a gente tiver acesso a comprar uma delas, sem problema.<br/> <br/> Abracadabraço,<br/> <br/> Mauro Assis</div>Trinket, o menor Arduino-liketag:labdegaragem.com,2014-08-12:6223006:BlogPost:3725732014-08-12T20:00:00.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p><a href="http://1.bp.blogspot.com/-1lUhHiE1RmM/U94e51uRxWI/AAAAAAAACA8/HyNSrIuDvvI/s1600/IMAG0178.jpg" target="_blank"><img class="align-center" src="http://1.bp.blogspot.com/-1lUhHiE1RmM/U94e51uRxWI/AAAAAAAACA8/HyNSrIuDvvI/s1600/IMAG0178.jpg?width=600" width="600"></img></a></p>
<p></p>
<p></p>
<p><span>Dia desses comprei três Trinkets</span><span>, mas no fim só chegaram dois, :(. Dei um pro Euclas e fui brincar com o meu. Eis aí as primeiras impressões.</span></p>
<h4>O hardware</h4>
<p><span>Essencialmente o Trinket é uma plaquinha baseada no </span><a href="http://www.atmel.com/devices/attiny85.aspx">ATTiny85</a><span>,…</span></p>
<p><a href="http://1.bp.blogspot.com/-1lUhHiE1RmM/U94e51uRxWI/AAAAAAAACA8/HyNSrIuDvvI/s1600/IMAG0178.jpg" target="_blank"><img src="http://1.bp.blogspot.com/-1lUhHiE1RmM/U94e51uRxWI/AAAAAAAACA8/HyNSrIuDvvI/s1600/IMAG0178.jpg?width=600" width="600" class="align-center"/></a></p>
<p></p>
<p></p>
<p><span>Dia desses comprei três Trinkets</span><span>, mas no fim só chegaram dois, :(. Dei um pro Euclas e fui brincar com o meu. Eis aí as primeiras impressões.</span></p>
<h4>O hardware</h4>
<p><span>Essencialmente o Trinket é uma plaquinha baseada no </span><a href="http://www.atmel.com/devices/attiny85.aspx">ATTiny85</a><span>, processador de 8Kb de memória flash (para programas), 512 bytes EEPROM e 512 bytes SRAM. Com o bootloader (programa que recebe os programas que mandamos pela serial os "roda" no processador) sobra-nos pouco mais de 5k para trabalhar. Não dá para desenvolver nenhum Excel, mas dá para fazer aplicativos simples de automação residencial ou mesmo pequenos robôs. Vou fazer alguns para postar por aqui.</span><br/> <br/> <span>Aqui, a plaquinha mais de perto:</span></p>
<p><span><a href="http://2.bp.blogspot.com/-ptkF5N323F4/U94gEFYLgGI/AAAAAAAACBE/OEJs4jbr9y4/s1600/Untitled.png" target="_blank"><img src="http://2.bp.blogspot.com/-ptkF5N323F4/U94gEFYLgGI/AAAAAAAACBE/OEJs4jbr9y4/s1600/Untitled.png?width=600" width="600" class="align-full"/></a></span></p>
<p></p>
<p><span><span>Dá prá ver aqui as características da bichinha. Existem dois modelos: 5V e 3V3, me arrependi de não tem comprada nenhuma de 3V3 para conectar direto do Raspberry.</span><br/> <br/> <span>- Conector mini-USB para conexão ao PC e também para alimentação. Isso é muito legal, porque dá prá programar diretamente no PC e enviar o programa sem ter que usar nenhum outro hardware para isso.</span><br/> <br/> <span>- GPIO (pinos de entrada/saída de dados), numerados de #1 a #4.</span><br/> <br/> <span>- Conexão de bateria externa. Pode-se ligar até 16V na bichinha.</span><br/> <br/> <span>- Botão reset.</span><br/> <br/> <span>- Conexão para botão reset externo.</span><br/> <br/> <span>- Furos para fixação</span><br/> <br/> <span>"Tudo isso" faz dessa plaquinha uma bela alternativa para projetos onde a minitaturização é essencial. Também o consumo de energia é menor, o que favorece o uso de baterias menores e/ou a durabilidade delas.</span><br/></span></p>
<h4>Coonfigurando e programando</h4>
<p><span><span>Segui os procedimentos indicados </span><a href="https://learn.adafruit.com/introducing-trinket/setting-up-with-arduino-ide">aqui</a><span> para colocar ele prá funcionar através da IDE do Arduino. Segui o roteiro chamado no texto de The Slow Way, que visa reconfigurar a IDE do Arduino para trabalhar também com o Trinket. Após as alterações (bem fáceis), fui testar e... nada.</span><br/> <br/> <span>Primeiro a IDE não reconheceu o dispositivo. Pesquisando, vi que ela não trabalha com USB 3.0, só com USB 2 ou 1. Como transformar a USB do micro em uma versão anterior? O jeito que dei foi arrumar um desses multiplicadores de portas USB mais velhinho e usá-lo. Ele fez a conversão, e o Trinket apareceu na lista de dispositivos conectados.</span></span></p>
<p></p>
<p></p>
<p><a href="http://2.bp.blogspot.com/-DeTacZ7iU98/U94dCQsqYyI/AAAAAAAACAw/qv49eIslzFU/s1600/Untitled.png" target="_blank"><img src="http://2.bp.blogspot.com/-DeTacZ7iU98/U94dCQsqYyI/AAAAAAAACAw/qv49eIslzFU/s1600/Untitled.png?width=600" width="600" class="align-full"/></a></p>
<p></p>
<p><span>Depois não apareceu a porta serial para que eu a selecionasse. Pesquisa dali e daqui, descobri que a porta não aparece mesmo na lista, mas é só selecionar a plaquinha correta na lista (menu Tools\Board, placa Trinket 8 MHz) e o bichinho funciona que é uma beleza.</span><br/> <br/> <span>Para testar, podemos rodar o velho blink. A única alteração é que a porta conectada ao LED é a porta 1, então temos que alterar a variável </span><b>led</b><span> do programa para 1.</span><br/> <br/> <span>Na hora de fazer o upload é um pouquinho diferente:</span><br/> <br/> <span>- Quando vc liga a plaquinha no Arduino ela inicialmente fica piscando por uns 10s. Nesse modo ela está pronta para receber o programa via USB. Após esse período ela começa a rodar o programa que está nela, e não é possível fazer o upload de uma nova versão. Para habilitar de novo o envio, deve-se apertar o reset de novo para um novo ciclo de upload.</span></p>
<p><span><span>Para testar a nossa plaquinha (depois de rodar o Blink, claro), resolvi acionar um servo.</span><br/> <br/> <span>A lib de servo que vem com o Arduino não rola, porque o ATtiny não tem timer de 16 bits. Para "tocar" um servo precisamos então de uma outra lib, compatível. O povo da Adafruit fez uma, que vc pode baixar </span><a href="https://github.com/adafruit/Adafruit_SoftServo/archive/master.zip">daqui</a><span>. Essa lib tem um pequeno inconveniente: vc tem que chamar a rotina de refresh dela a intervalos de no máximo 20 milissegundos. Vamos analisar cá um exemplo. É o que vem com a lib, simplificado:</span></span></p>
<p></p>
<p><span style="font-family: 'courier new', courier;">#include <Adafruit_SoftServo.h> // SoftwareServo (works on non PWM pins)</span></p>
<p><span style="font-family: 'courier new', courier;">// We demonstrate two servos!</span><br/> <span style="font-family: 'courier new', courier;">#define SERVO1PIN 0 // Servo control line (orange) on Trinket Pin #0</span></p>
<p><span style="font-family: 'courier new', courier;">Adafruit_SoftServo myServo1;</span><br/> <br/> <span style="font-family: 'courier new', courier;">void setup() {</span><br/> <span style="font-family: 'courier new', courier;"> OCR0A = 0xAF; // any number is OK</span><br/> <span style="font-family: 'courier new', courier;"> TIMSK |= _BV(OCIE0A); // Turn on the compare interrupt (below!)</span><br/> <br/> <span style="font-family: 'courier new', courier;"> myServo1.attach(SERVO1PIN); // Attach the servo to pin 0 on Trinket</span><br/> <span style="font-family: 'courier new', courier;"> myServo1.write(90); // Tell servo to go to position per quirk</span><br/> <span style="font-family: 'courier new', courier;"> delay(15); // Wait 15ms for the servo to reach the position</span><br/> <span style="font-family: 'courier new', courier;">}</span></p>
<p><span style="font-family: 'courier new', courier;">void loop() {</span><br/> <span style="font-family: 'courier new', courier;"> myServo1.write(0);</span><br/> <span style="font-family: 'courier new', courier;"> delay(2000);</span> <br/> <span style="font-family: 'courier new', courier;"> myServo1.write(90);</span><br/> <span style="font-family: 'courier new', courier;"> delay(2000);</span> <br/> <span style="font-family: 'courier new', courier;"> myServo1.write(180);</span><br/> <span style="font-family: 'courier new', courier;"> delay(2000);</span> <br/> <span style="font-family: 'courier new', courier;">}</span></p>
<p><span style="font-family: 'courier new', courier;">// We'll take advantage of the built in millis() timer that goes off</span><br/> <span style="font-family: 'courier new', courier;">// to keep track of time, and refresh the servo every 20 milliseconds</span><br/> <span style="font-family: 'courier new', courier;">volatile uint8_t counter = 0;</span><br/> <span style="font-family: 'courier new', courier;">SIGNAL(TIMER0_COMPA_vect) {</span><br/> <span style="font-family: 'courier new', courier;">// this gets called every 2 milliseconds</span><br/> <span style="font-family: 'courier new', courier;"> counter += 2;</span><br/> <span style="font-family: 'courier new', courier;">// every 20 milliseconds, refresh the servos!</span><br/> <span style="font-family: 'courier new', courier;"> if (counter >= 20) {</span><br/> <span style="font-family: 'courier new', courier;"> counter = 0;</span><br/> <span style="font-family: 'courier new', courier;"> myServo1.refresh();</span><br/> <span style="font-family: 'courier new', courier;"> }</span><br/> <span style="font-family: 'courier new', courier;">}</span></p>
<p></p>
<p>Ao rodar o programa, o servo alterna entre as três posições: 0, 90 e 180 graus. <br/> Mole,. não? Nem vou fazer filminho... :)<br/> <br/> A ideia foi mostrar que a plaquinha não faz feio mesmo em tarefas de automação. Dá prá controlar pelo menos mais um servo, simultãneamente.</p>
<p></p>
<p><em><strong>Referências:</strong></em></p>
<p><span style="color: #0000ff;"><a href="https://learn.adafruit.com/introducing-trinket/guided-tour">https://learn.adafruit.com/introducing-trinket/guided-tour</a></span></p>Batendo o Geniustag:labdegaragem.com,2014-07-24:6223006:BlogPost:3699852014-07-24T19:52:43.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p><iframe frameborder="0" height="510" src="www.youtube.com/embed/TJ1Z88D1zJM?wmode=opaque" width="854"></iframe>
</p>
<p>Aqueles com mais de 40 devem se lembrar desse brinquedinho aí em cima. Naquele tempo o bicho era caro, eu jogava na casa dos meus amigos riquinhos e me perguntava? O que será que acontece quando a gente "zera" ele, quer dizer, chega no fim? Será que toca uma musiquinha de parabéns, coisa assim?</p>
<p></p>
<p>Pois é, quase completando meio século de vida, eis que um…</p>
<p><iframe width="854" height="510" src="//www.youtube.com/embed/TJ1Z88D1zJM?wmode=opaque" frameborder="0"></iframe>
</p>
<p>Aqueles com mais de 40 devem se lembrar desse brinquedinho aí em cima. Naquele tempo o bicho era caro, eu jogava na casa dos meus amigos riquinhos e me perguntava? O que será que acontece quando a gente "zera" ele, quer dizer, chega no fim? Será que toca uma musiquinha de parabéns, coisa assim?</p>
<p></p>
<p>Pois é, quase completando meio século de vida, eis que um destes veio ter às minhas mãos. Aí... resolvi descobrir, com uma ajuda fundamental do Arduino. E descobri, só que... :(</p>
<p></p>Câmera Raspberry Pitag:labdegaragem.com,2014-03-25:6223006:BlogPost:3391952014-03-25T12:36:33.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Hi all,</p>
<p> </p>
<p>Ano passado comprei um Raspberry Pi e comecei a me divertir com ele. Tenho arduinado já há alguns anos, e foi uma ótima ter incorporado o Pi aos meus brinquedinhos.</p>
<p>Junto com ele comprei uma câmera, dessas <a href="http://www.raspberrypi.org/camera" target="_blank">daí</a>. A bichinha é valente, full HD. Fotografa e filma, mas não tem microfone para as filmagens. O ponto negativo é que ela é conectada ao Pi com um flat muito delicado, que eu acho que nem vai…</p>
<p>Hi all,</p>
<p> </p>
<p>Ano passado comprei um Raspberry Pi e comecei a me divertir com ele. Tenho arduinado já há alguns anos, e foi uma ótima ter incorporado o Pi aos meus brinquedinhos.</p>
<p>Junto com ele comprei uma câmera, dessas <a href="http://www.raspberrypi.org/camera" target="_blank">daí</a>. A bichinha é valente, full HD. Fotografa e filma, mas não tem microfone para as filmagens. O ponto negativo é que ela é conectada ao Pi com um flat muito delicado, que eu acho que nem vai durar muito na minha mão.</p>
<p>Semana passada resolvi estudar o comando da câmera pelo Pi, e como a melhor linguagem de programação do mundo na última semana é o Python, tomei logo esse rumo.</p>
<p>Pesquisa dali e daqui, achei essa <a href="https://pypi.python.org/pypi/picamera/" target="_blank">lib</a>, que prometia comandar as muitas features da camerazinha.</p>
<p>Fiz então uma aplicação chamada piCamExplorer.py, que roda no Pi e faz as seguintes coisas:</p>
<p>python piCamExplorer.py -mp: tira uma foto e armazena no arquivo pict1.jpg.</p>
<p>python piCamExplorer.py -mm -i10: entra no modo filme, exibindo o que a câmera "vê" durante o intervalo especificado em -i, em segundos</p>
<p>python piCamExplorer.py -mm -i10 -mt -n1000 -i5 -d3600: entra no modo timelapse, tirando -n fotos em sequencia, a um intervalo de -i segundos, depois de um delay de -d segundos (serve por exemplo prá vc fotografar o nascer do sol sem ter que ficar acordado até de madrugada).</p>
<p>As fotos são numeradas como pic00000.jpg, pic00001.jpg e assim por diante.</p>
<p>Depois fica fácil de vc, com um programa tipo mencoder, transformar as imagens no filme como esse abaixo. Os fontes do programa python estão no meu <a href="http://automatobr.blogspot.com.br/2014/03/teste-import-timeimport-picameraimport.html" target="_blank">blog</a>.</p>
<p>Aqui algumas imagens da câmera posicionada na minha janela:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979571712?profile=original" target="_self"><img width="750" src="http://storage.ning.com/topology/rest/1.0/file/get/1979571712?profile=RESIZE_1024x1024" width="750" class="align-full"/></a></p>
<p> </p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979573359?profile=original" target="_self"><img width="750" src="http://storage.ning.com/topology/rest/1.0/file/get/1979573359?profile=RESIZE_1024x1024" width="750" class="align-full"/></a></p>
<p> </p>
<p> </p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979575208?profile=original" target="_self"><img width="750" src="http://storage.ning.com/topology/rest/1.0/file/get/1979575208?profile=RESIZE_1024x1024" width="750" class="align-full"/></a></p>
<p> </p>
<p>Por fim, o fime devidamente editado:<iframe width="420" height="315" src="//www.youtube.com/embed/-InahhVlhok?wmode=opaque" frameborder="0"></iframe>
</p>
<p>É isso.</p>
<p> </p>
<p> </p>Tutorial - como comandar "n" displays de LED multiplexando com o 74HC595tag:labdegaragem.com,2013-08-03:6223006:BlogPost:2621992013-08-03T11:39:51.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p><a href="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTelF1VB5O_9p-fgVZFFUmeJVbQEBNuyCYnoFCV__KO42lQ55VtOA" target="_blank"><img class="align-left" src="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTelF1VB5O_9p-fgVZFFUmeJVbQEBNuyCYnoFCV__KO42lQ55VtOA"></img></a> Outro dia apareceu no nosso Sabugosa (apelido do <a href="http://sjchackerclube.com.br/">Hacker Clube de São José dos Campos</a>) um monte de displays de oito segmentos e três dígitos, desses daí ao lado. O resultado você pode ver no vídeo abaixo.…</p>
<p></p>
<p></p>
<p><a href="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTelF1VB5O_9p-fgVZFFUmeJVbQEBNuyCYnoFCV__KO42lQ55VtOA" target="_blank"><img src="https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcTelF1VB5O_9p-fgVZFFUmeJVbQEBNuyCYnoFCV__KO42lQ55VtOA" class="align-left"/></a>Outro dia apareceu no nosso Sabugosa (apelido do <a href="http://sjchackerclube.com.br/">Hacker Clube de São José dos Campos</a>) um monte de displays de oito segmentos e três dígitos, desses daí ao lado. O resultado você pode ver no vídeo abaixo.</p>
<p></p>
<p><iframe width="854" height="510" src="http://www.youtube.com/embed/XiXHgf3jWeU?wmode=opaque" frameborder="0"></iframe>
</p>
<p></p>
<p><span>Clique para ver </span><a href="http://pdf1.alldatasheet.com/datasheet-pdf/view/87518/ETC/A-573H.html">o datasheet</a><span>.</span></p>
<p><span><a href="http://1.bp.blogspot.com/-hy9WeJfPql8/UfuOHVlJvNI/AAAAAAAABkQ/Q2i4qYJC-BE/s200/displa2.png" target="_blank"><img src="http://1.bp.blogspot.com/-hy9WeJfPql8/UfuOHVlJvNI/AAAAAAAABkQ/Q2i4qYJC-BE/s200/displa2.png" class="align-left"/></a><br/></span></p>
<p><span><span>Na figura ao lado, o esquema visual do display. O dígito mais à esquerda é o 1, os segmentos são identificados por letras de A a G e o ponto decimal é o DP (Dot Point). Essa identificação aparece em 100% dos displays que vi até hoje.</span></span></p>
<p></p>
<p></p>
<p><a href="http://3.bp.blogspot.com/-x8hf09_IaNs/UfuOHe5IOKI/AAAAAAAABkM/_dR6X-AN64U/s1600/displa1.png" target="_blank"><img src="http://3.bp.blogspot.com/-x8hf09_IaNs/UfuOHe5IOKI/AAAAAAAABkM/_dR6X-AN64U/s1600/displa1.png" class="align-left"/></a></p>
<p><span>Essa outra figura é o esquema elétrico do display O display é de anodo comum, ou seja, o terminal positivo é conectado em comum para cada display (pinos 8,9,10).</span><br/> <br/> <span>Isso significa que, para ligar um determinado segmento, temos que conectar o pino do segmento correspondente ao terra. Para desligar o segmento, é só alimentar o pino correspondente com a mesma tensão do anodo, 5V no caso de nosso circuito. Isso vai contra o senso comum. que é 5V liga, 0V desliga, mas é assim mesmo.</span><br/> <br/> <span>Temos então um pino que é o anodo de todos os segmentos de um determinado display. O catodo é comum aos segmentos iguais dos diferentes displays, e os segmentos são conectados aos pinos 7,6,3 etc. Observe que eles são interconectados nos três displays, quer dizer, se eu conecto +5V ao pino 8 e 0V aos pinos 6 e 3 vai aparecer o número 1 nos três displays.</span></p>
<p><span>Como faço então para mostrar números diferentes nos displays? É só alternar o número a ser mostrado com o display ligado. Supondo que temos que mostrar o número 1,2,3 temos que fazer assim:</span><br/> <br/> <span>1) Habilito o display 1 (5V pino 10).</span><br/> <span>2) Desenho o número 3 (0V em 7,6,3,2,4)</span><br/> <span>3) Desligo o display 1 (0V em 10)</span><br/> <span>4) Ligo o display 2 (5V pino 9)</span><br/> <span>5) Desenho o número 2 (0V em 7,6,2,1,4)</span><br/> <span>6) Desligo o display 2 (0V pino 9)</span><br/> <span>7) Ligo o display 3 (5V pino 8)</span><br/> <span>8) Desenho o número 1 (5V pinos 6,3)</span><br/> <span>9) Volto ao passo 1.</span></p>
<p></p>
<p><span><span>E para que é feito dessa forma? Porque não ter um pino para cada segmento? R: Para diminuir o número de conexões necessárias ao acionamento do display. Se fosse um para cada seriam 25 pinos a serem comandados, um para cada segmento mais um anodo comum. No display que usamos temos apenas 11 conexões.</span></span></p>
<p></p>
<p></p>
<p><span>Na minha montagem, para diminuir ainda mais o número de pontos eu conectei todos os segmentos iguais dos quatro displays que usei. Assim se ativamos todos os displays e mostramos um 4, o que aparece é o que vc vê aí embaixo.</span><br/> <span>Temos então 8 segmentos mais 1 pino para cada chip a comandar, o que dá "apenas" 20 pinos para comandar 12 displays, muito menos que os </span><b>exatos 100 </b><span>que seriam necessários caso fossem ligados a todos os pinos (96 LEDs mais 1 catodo comum para cada conjunto de 3 displays).</span></p>
<p></p>
<p><img src="http://3.bp.blogspot.com/-DDtj43v4CcQ/UfskkDPiW9I/AAAAAAAABj8/OT2v4t2DDdI/s320/IMG_4225.JPG"/></p>
<p></p>
<p><span>De toda forma, 20 pinos digitais é o limite máximo do Arduino Uno (14 digitais "verdadeiros" mais os 6 analógicos que podem ser usados como digitais), ou seja, se ligarmos o display direto no Arduino não dá para usar o Arduino prá mais nada. Temos que diminuir mais ainda o número de portas necessárias. Aí entra o 74HC595.</span><br/> <br/> <span>Em 2012 eu fiz alguns posts no meu blog e aqui tb sobre o uso desse chip para controlar LEDs RGB. Lá eu descrevo detalhadamente o funcionamento dele: </span><a href="http://automatobr.blogspot.com.br/2012/07/como-parte-de-um-projeto-de-automacao.html">Parte I</a><span>, </span><a href="http://automatobr.blogspot.com.br/2012/07/controlando-infinitos-leds-com-arduino.html">Parte II</a><span>. Tem também outros posts sobre a conexão de displays de oito segmentos isolados, então não vou repetir a descrição do bicho. Vou apenas dizer que ele é um conversor serial-paralelo, ou seja, com apenas 3 pinos eu comando oito pinos de saída. Além disso eles podem ser interconectados, o que faz com que eu possa controlar, teoricamente, "n" pinos com apenas três pinos do Arduino.</span><br/> <br/> <span>No nosso caso, usamos 3 chips 595: um deles comanda os segmentos e os outros dois selecionam cada um dos displays. Observem que a gente poderia então ter mais quatro displays sendo comandados pelos mesmos três chips, já que estou usando apenas 12 dos 16 possíveis na saída de dois 595. Não coloquei mais porque simplesmente não coube na protoboard e eu não tinha outra.</span><br/> <br/> <span>Abaixo, um vídeo do sistema funcionando, só que com 100 ms entre cada exibição de display:</span></p>
<p></p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/z4RBDwxTF68?feature=player_detailpage&wmode=opaque" frameborder="0"></iframe>
</p>
<p></p>
<p><span>Dá para ver "em câmera lenta" os dígitos sendo exibidos. Observe que, como é um contador, o primeiro dígito (à direta, claro) vai mudando.</span><br/> <br/> <span>Quando a gente acelera (retira o delay), tem-se o resultado do primeiro vídeo.</span></p>
<p></p>
<p><span><span>Não vou postar o esquema (Fritzing) do circuito por razão óbvia: a preguiça de desenhar esse "aranzel", como se diz em minha terra. Mas dá para explicar como fiz. Identifique os CIs na figura logo abaixo.</span><br/> <br/> <span>Os dois 595 à esquerda (chamarei de 1 e 2) são responsáveis pela seleção do display corrente, e o do direita, o 3, comanda os segmentos.</span></span></p>
<p></p>
<p></p>
<p><img src="http://3.bp.blogspot.com/-uyXWxN2GP9U/Ufw9-885mII/AAAAAAAABk0/yBEPjGqctgk/s640/img1.png"/></p>
<p></p>
<p><span><span>Para conectar os CIs entre si são ligados os pinos 11 e 12 de cada CI entre si. O pino 9 do CI 1 é ligado ao pino 14 do CI 2. Essa conexão é a que será usada pelo CI 1 para "exportar" os dados para o CI 2. Da mesma forma, conectamos o CI 2 ao 3.</span><br/> <br/> <span>Abaixo um esquema com dois 595 conectados. O nome dessa conexão em inglês e "daisy chain (seriam "margaridas encadeadas"???), em português se usa "cascata".</span></span></p>
<p></p>
<p><img src="http://1.bp.blogspot.com/-eBsdotgjz1U/T_stjFC7-zI/AAAAAAAAAr0/AjyUcErElfw/s400/leds.png"/></p>
<p></p>
<p><span>Os pinos de saída do chip são conectados aos displays, da seguinte forma:</span><br/> <br/> <span>Vamos chamar os displays de 1 a 4 do menos significativo ao mais significativo, ou seja, da direita para a esquerda.</span><br/> <br/> <span>O esquema de ligação dos CIs está descrito na tabela abaixo:</span></p>
<table border="0" cellspacing="0">
<tbody><tr><td></td>
</tr>
<tr><td class="xl69" height="20"><b> <br/> CI</b></td>
<td class="xl69"><b> Pino</b></td>
<td class="xl69"><b> Display</b></td>
<td class="xl69"><b> Pino</b></td>
<td class="xl69"><b> CI</b></td>
<td class="xl69"><b> Pino</b></td>
<td class="xl69"><b>Arduino Pino</b></td>
<td class="xl66"><b>Função</b></td>
<td class="xl65"></td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">1</td>
<td align="right" class="xl67">4</td>
<td align="right" class="xl67">9</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Selec. display 2</td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">2</td>
<td align="right" class="xl67">4</td>
<td align="right" class="xl67">8</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Selec. display 3</td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">3</td>
<td align="right" class="xl67">3</td>
<td align="right" class="xl67">10</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Selec. display 4</td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">4</td>
<td align="right" class="xl67">3</td>
<td align="right" class="xl67">9</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Selec. display 5</td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">5</td>
<td align="right" class="xl67">3</td>
<td align="right" class="xl67">8</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Selec. display 6</td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">6</td>
<td align="right" class="xl67">2</td>
<td align="right" class="xl67">10</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Selec. display 7</td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">7</td>
<td align="right" class="xl67">2</td>
<td align="right" class="xl67">9</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Selec. display 8</td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">8</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67">GND</td>
<td class="xl67">GND</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">9</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td align="right" class="xl67">2</td>
<td align="right" class="xl67">14 </td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Daisy chain</td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">10</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67">Vcc</td>
<td class="xl67">Vcc</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">11</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td align="right" class="xl67">2</td>
<td align="right" class="xl67">11 </td>
<td align="right" class="xl67">12 </td>
<td class="xl67">Clock</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">12</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td align="right" class="xl67">2</td>
<td align="right" class="xl67">12 </td>
<td align="right" class="xl67">8 </td>
<td class="xl67">Latch</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">13</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67">GND</td>
<td class="xl67">GND</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">14</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td align="right" class="xl67">11 </td>
<td class="xl67">Data</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">15</td>
<td align="right" class="xl67">4</td>
<td align="right" class="xl67">10</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Selec. display 1</td>
</tr>
<tr><td align="right" class="xl67" height="20">1</td>
<td align="right" class="xl67">16</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67">Vcc</td>
<td class="xl67"></td>
<td class="xl67"></td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">10</td>
<td></td>
<td></td>
<td></td>
<td colspan="2">Selec. display 10</td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">2</td>
<td align="right">1</td>
<td align="right">9</td>
<td></td>
<td></td>
<td></td>
<td colspan="2">Selec. display 11</td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">3</td>
<td align="right">1</td>
<td align="right">8</td>
<td></td>
<td></td>
<td></td>
<td colspan="2">Selec. display 12</td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">4</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td colspan="2">Não usado</td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">5</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td colspan="2">Não usado</td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">6</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td colspan="2">Não usado</td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">7</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td colspan="2">Não usado</td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">8</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>GND</td>
<td>GND</td>
<td></td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">9</td>
<td></td>
<td></td>
<td align="right">3</td>
<td align="right">14 </td>
<td></td>
<td colspan="2">Daisy chain</td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">10</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>Vcc</td>
<td>Vcc</td>
<td></td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">11</td>
<td></td>
<td></td>
<td align="right">3</td>
<td align="right">11 </td>
<td></td>
<td>Clock</td>
<td></td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">12</td>
<td></td>
<td></td>
<td align="right">3</td>
<td align="right">12 </td>
<td></td>
<td>Latch</td>
<td></td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">13</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>GND</td>
<td>GND</td>
<td></td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">14</td>
<td></td>
<td></td>
<td align="right">1</td>
<td align="right">9 </td>
<td></td>
<td>Data</td>
<td></td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">15</td>
<td align="right">2</td>
<td align="right">8</td>
<td></td>
<td></td>
<td></td>
<td colspan="2">Seleciona display 9</td>
</tr>
<tr><td align="right" height="20">2</td>
<td align="right">16</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td>Vcc</td>
<td>Vcc</td>
<td></td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">1</td>
<td align="right" class="xl67">1</td>
<td align="right" class="xl67">6</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Segmento B</td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">2</td>
<td align="right" class="xl67">1</td>
<td align="right" class="xl67">3</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Segmento C</td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">3</td>
<td align="right" class="xl67">1</td>
<td align="right" class="xl67">2</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Segmento D</td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">4</td>
<td align="right" class="xl67">1</td>
<td align="right" class="xl67">1</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Segmento E</td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">5</td>
<td align="right" class="xl67">1</td>
<td align="right" class="xl67">5</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Segmento F</td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">6</td>
<td align="right" class="xl67">1</td>
<td align="right" class="xl67">4</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Segmento G</td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">7</td>
<td align="right" class="xl67">1</td>
<td align="right" class="xl67">11</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67">dot</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">8</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67">GND</td>
<td class="xl67">GND</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">9</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td align="right" class="xl67">2</td>
<td align="right" class="xl67">14 </td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Daisy chain</td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">10</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67">Vcc</td>
<td class="xl67">Vcc</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">11</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td align="right" class="xl67">2</td>
<td align="right" class="xl67">11 </td>
<td class="xl67"></td>
<td class="xl67">Clock</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">12</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td align="right" class="xl67">2</td>
<td align="right" class="xl67">12 </td>
<td class="xl67"></td>
<td class="xl67">Latch</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">13</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67">GND</td>
<td class="xl67">GND</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">14</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67">Data</td>
<td class="xl67"></td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">15</td>
<td align="right" class="xl67">1</td>
<td align="right" class="xl67">7</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67" colspan="2">Segmento A</td>
</tr>
<tr><td align="right" class="xl67" height="20">3</td>
<td align="right" class="xl67">16</td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67"></td>
<td class="xl67">Vcc</td>
<td class="xl67">Vcc<br/></td>
</tr>
</tbody>
</table>
<p><span>Observe que tem pinos que são conectados a mais de um ponto simultãneamente, ex: os pinos 9, 11 e 12 do CI 1 estão também conectados ao CI 2 e também ao Arduino.</span><br/> <br/> <span>Além dessas conexões é necessário ligar os segmentos correspondentes da seguinte forma: conecte os pinos 7,6,3,2,1,5,4,11 dos quatro chips aos seus correspondentes, ou seja o pino 7 do display 1 ao pino 7 do display 2, o pino 7 do display 2 ao pino 7 do display 3, o pino 6 do display 1 ao pino 6 do display 2 e assim por diante. Uma sugestão: faça </span><b>PRIMEIRO</b><span> essa conexão entre os displays, acho que deve ser mais fácil assim.</span></p>
<p></p>
<p><span>Agora, o software:</span></p>
<p></p>
<div class="line number1 index0 alt2"><code class="csharp comments">/*****************************************************************</code></div>
<div class="line number2 index1 alt1"><code class="csharp spaces"> </code><code class="csharp comments">Controle de "n" displays de LED 3x8 tipo Para Light A-573H</code></div>
<div class="line number3 index2 alt2"><code class="csharp spaces"> </code><code class="csharp comments"><a href="http://automatobr.blogspot.com.br/">http://automatobr.blogspot.com.br</a></code></div>
<div class="line number4 index3 alt1"><code class="csharp comments">******************************************************************/</code></div>
<div class="line number5 index4 alt2"> </div>
<div class="line number6 index5 alt1"><code class="csharp comments">// Este programa funcionará com qualquer número de dígitos</code></div>
<div class="line number7 index6 alt2"><code class="csharp preprocessor">#define nDigits 12 // número de dígitos a serem usados</code></div>
<div class="line number8 index7 alt1"><code class="csharp preprocessor">#define nCIs 3 // número de CIs 595 existentes no</code></div>
<div class="line number9 index8 alt2"><code class="csharp spaces"> </code><code class="csharp comments">// circuito, no mínimo 2.</code></div>
<div class="line number10 index9 alt1"> </div>
<div class="line number11 index10 alt2"><code class="csharp comments">// pinos para comunicação com o CI 74HC595</code></div>
<div class="line number12 index11 alt1"><code class="csharp preprocessor">#define latchPin 8</code></div>
<div class="line number13 index12 alt2"><code class="csharp preprocessor">#define clockPin 12</code></div>
<div class="line number14 index13 alt1"><code class="csharp preprocessor">#define dataPin 11</code></div>
<div class="line number15 index14 alt2"> </div>
<div class="line number16 index15 alt1"><code class="csharp comments">/* máscara de bits para os dígitos, conforme diagrama abaixo:</code></div>
<div class="line number17 index16 alt2"><code class="csharp spaces"> </code><code class="csharp comments">A</code></div>
<div class="line number18 index17 alt1"><code class="csharp spaces"> </code><code class="csharp comments">--</code></div>
<div class="line number19 index18 alt2"><code class="csharp spaces"> </code><code class="csharp comments">F| |B</code></div>
<div class="line number20 index19 alt1"><code class="csharp spaces"> </code><code class="csharp comments">|G |</code></div>
<div class="line number21 index20 alt2"><code class="csharp spaces"> </code><code class="csharp comments">--</code></div>
<div class="line number22 index21 alt1"><code class="csharp spaces"> </code><code class="csharp comments">E| |C</code></div>
<div class="line number23 index22 alt2"><code class="csharp spaces"> </code><code class="csharp comments">| |</code></div>
<div class="line number24 index23 alt1"><code class="csharp spaces"> </code><code class="csharp comments">-- *d</code></div>
<div class="line number25 index24 alt2"><code class="csharp spaces"> </code><code class="csharp comments">D</code></div>
<div class="line number26 index25 alt1"><code class="csharp comments">*/</code></div>
<div class="line number27 index26 alt2"><code class="csharp keyword">byte</code> <code class="csharp plain">digits[] =</code></div>
<div class="line number28 index27 alt1"><code class="csharp comments">// dGFEDCBA - segmentos</code></div>
<div class="line number29 index28 alt2"><code class="csharp spaces"> </code><code class="csharp plain">{B00111111,</code> <code class="csharp comments">// 0</code></div>
<div class="line number30 index29 alt1"><code class="csharp spaces"> </code><code class="csharp plain">B00000110,</code> <code class="csharp comments">// 1</code></div>
<div class="line number31 index30 alt2"><code class="csharp spaces"> </code><code class="csharp plain">B01011011,</code> <code class="csharp comments">// 2</code></div>
<div class="line number32 index31 alt1"><code class="csharp spaces"> </code><code class="csharp plain">B01001111,</code> <code class="csharp comments">// 3</code></div>
<div class="line number33 index32 alt2"><code class="csharp spaces"> </code><code class="csharp plain">B01100110,</code> <code class="csharp comments">// 4</code></div>
<div class="line number34 index33 alt1"><code class="csharp spaces"> </code><code class="csharp plain">B01101101,</code> <code class="csharp comments">// 5</code></div>
<div class="line number35 index34 alt2"><code class="csharp spaces"> </code><code class="csharp plain">B01111101,</code> <code class="csharp comments">// 6</code></div>
<div class="line number36 index35 alt1"><code class="csharp spaces"> </code><code class="csharp plain">B00000111,</code> <code class="csharp comments">// 7</code></div>
<div class="line number37 index36 alt2"><code class="csharp spaces"> </code><code class="csharp plain">B01111111,</code> <code class="csharp comments">// 8</code></div>
<div class="line number38 index37 alt1"><code class="csharp spaces"> </code><code class="csharp plain">B01101111,</code> <code class="csharp comments">// 9</code></div>
<div class="line number39 index38 alt2"><code class="csharp spaces"> </code><code class="csharp plain">B10000000,</code> <code class="csharp comments">// dot</code></div>
<div class="line number40 index39 alt1"><code class="csharp spaces"> </code><code class="csharp plain">B00000000};</code> <code class="csharp comments">// blank </code></div>
<div class="line number41 index40 alt2"> </div>
<div class="line number42 index41 alt1"><code class="csharp comments">// valor apresentado no display</code></div>
<div class="line number43 index42 alt2"><code class="csharp plain">uint64_t displayValue = 0;</code></div>
<div class="line number44 index43 alt1"> </div>
<div class="line number45 index44 alt2"><code class="csharp comments">// rotina que envia um byte para o 595 de maneira serial,</code></div>
<div class="line number46 index45 alt1"><code class="csharp comments">// um bit de cada vez</code></div>
<div class="line number47 index46 alt2"> </div>
<div class="line number48 index47 alt1"><code class="csharp keyword">void</code> <code class="csharp plain">shiftOut(</code><code class="csharp keyword">byte</code> <code class="csharp plain">dataOut)</code></div>
<div class="line number49 index48 alt2"><code class="csharp plain">{</code></div>
<div class="line number50 index49 alt1"><code class="csharp spaces"> </code><code class="csharp plain">boolean pinState;</code></div>
<div class="line number51 index50 alt2"><code class="csharp comments">// prepara o envio</code></div>
<div class="line number52 index51 alt1"><code class="csharp spaces"> </code><code class="csharp plain">digitalWrite(dataPin, LOW);</code></div>
<div class="line number53 index52 alt2"><code class="csharp spaces"> </code><code class="csharp plain">digitalWrite(clockPin, LOW);</code></div>
<div class="line number54 index53 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">for</code> <code class="csharp plain">(</code><code class="csharp keyword">int</code> <code class="csharp plain">i=0; i<=7; i++)</code></div>
<div class="line number55 index54 alt2"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div>
<div class="line number56 index55 alt1"><code class="csharp spaces"> </code><code class="csharp plain">digitalWrite(clockPin, LOW);</code></div>
<div class="line number57 index56 alt2"><code class="csharp comments">// se o bit "i" está ligado, envia para o pino de dados um byte com</code></div>
<div class="line number58 index57 alt1"><code class="csharp comments">// só o primeiro bit ligado (HIGH), se não, envia 0 (LOW)</code></div>
<div class="line number59 index58 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">if</code> <code class="csharp plain">( dataOut & (1 << i) )</code></div>
<div class="line number60 index59 alt1"><code class="csharp spaces"> </code><code class="csharp plain">pinState = HIGH;</code></div>
<div class="line number61 index60 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">else</code></div>
<div class="line number62 index61 alt1"><code class="csharp spaces"> </code><code class="csharp plain">pinState = LOW;</code></div>
<div class="line number63 index62 alt2"><code class="csharp comments">// envia o bit</code></div>
<div class="line number64 index63 alt1"><code class="csharp spaces"> </code><code class="csharp plain">digitalWrite(dataPin, pinState);</code></div>
<div class="line number65 index64 alt2"><code class="csharp comments">// informa ao chip que terminou o envio</code></div>
<div class="line number66 index65 alt1"><code class="csharp spaces"> </code><code class="csharp plain">digitalWrite(clockPin, HIGH);</code></div>
<div class="line number67 index66 alt2"><code class="csharp spaces"> </code><code class="csharp plain">digitalWrite(dataPin, LOW);</code></div>
<div class="line number68 index67 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div>
<div class="line number69 index68 alt2"><code class="csharp spaces"> </code><code class="csharp plain">digitalWrite(clockPin, LOW);</code></div>
<div class="line number70 index69 alt1"><code class="csharp plain">}</code></div>
<div class="line number71 index70 alt2"> </div>
<div class="line number72 index71 alt1"><code class="csharp comments">// "desenha" um determinado dígito (digit) no display</code></div>
<div class="line number73 index72 alt2"><code class="csharp comments">// (display). O número 1 é o menos significativo</code></div>
<div class="line number74 index73 alt1"><code class="csharp comments">// (primeiro da direita) e assim por diante.</code></div>
<div class="line number75 index74 alt2"><code class="csharp keyword">void</code> <code class="csharp plain">displayDigit(</code><code class="csharp keyword">int</code> <code class="csharp plain">display,</code> <code class="csharp keyword">int</code> <code class="csharp plain">digit)</code></div>
<div class="line number76 index75 alt1"><code class="csharp plain">{</code></div>
<div class="line number77 index76 alt2"><code class="csharp comments">// primeiro montamos o endereço do display, quer dizer,</code></div>
<div class="line number78 index77 alt1"><code class="csharp comments">// vamos indicar qual display será</code></div>
<div class="line number79 index78 alt2"><code class="csharp comments">// habilitado e mostrará o dígito.</code></div>
<div class="line number80 index79 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">int</code> <code class="csharp plain">data1, data2;</code></div>
<div class="line number81 index80 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">if</code><code class="csharp plain">(display <= 8)</code></div>
<div class="line number82 index81 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div>
<div class="line number83 index82 alt2"><code class="csharp spaces"> </code><code class="csharp plain">data1 = B00000001 << (8-display);</code></div>
<div class="line number84 index83 alt1"><code class="csharp spaces"> </code><code class="csharp plain">data2 = B00000000;</code></div>
<div class="line number85 index84 alt2"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div>
<div class="line number86 index85 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">else</code></div>
<div class="line number87 index86 alt2"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div>
<div class="line number88 index87 alt1"><code class="csharp spaces"> </code><code class="csharp plain">data1 = B00000000;</code></div>
<div class="line number89 index88 alt2"><code class="csharp spaces"> </code><code class="csharp plain">data2 = B00000001 << (16-display);</code></div>
<div class="line number90 index89 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div>
<div class="line number91 index90 alt2"><code class="csharp spaces"> </code><code class="csharp comments">// prepara o envio</code></div>
<div class="line number92 index91 alt1"><code class="csharp spaces"> </code><code class="csharp plain">digitalWrite(latchPin, LOW);</code></div>
<div class="line number93 index92 alt2"><code class="csharp spaces"> </code><code class="csharp comments">// envia o dígito para o CI 3</code></div>
<div class="line number94 index93 alt1"><code class="csharp spaces"> </code><code class="csharp plain">shiftOut(digits[digit]);</code></div>
<div class="line number95 index94 alt2"><code class="csharp spaces"> </code><code class="csharp comments">// envia o endereço (máscara de bits) indicando</code></div>
<div class="line number96 index95 alt1"><code class="csharp spaces"> </code><code class="csharp comments">// o display a ser ativado</code></div>
<div class="line number97 index96 alt2"><code class="csharp spaces"> </code><code class="csharp plain">shiftOut(data1);</code></div>
<div class="line number98 index97 alt1"><code class="csharp spaces"> </code><code class="csharp comments">// se tiver mais de 1 CI de endereçamento, envia</code></div>
<div class="line number99 index98 alt2"><code class="csharp spaces"> </code><code class="csharp comments">// a outra parte do endereço</code></div>
<div class="line number100 index99 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">if</code> <code class="csharp plain">(nCIs > 2)</code></div>
<div class="line number101 index100 alt2"><code class="csharp spaces"> </code><code class="csharp plain">shiftOut(data2);</code></div>
<div class="line number102 index101 alt1"><code class="csharp spaces"> </code><code class="csharp comments">// termina o envio</code></div>
<div class="line number103 index102 alt2"><code class="csharp spaces"> </code><code class="csharp plain">digitalWrite(latchPin, HIGH);</code></div>
<div class="line number104 index103 alt1"><code class="csharp plain">}</code></div>
<div class="line number105 index104 alt2"> </div>
<div class="line number106 index105 alt1"><code class="csharp comments">// exibe um número inteiro</code></div>
<div class="line number107 index106 alt2"><code class="csharp keyword">void</code> <code class="csharp plain">display(uint64_t number)</code></div>
<div class="line number108 index107 alt1"><code class="csharp plain">{</code></div>
<div class="line number109 index108 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">for</code> <code class="csharp plain">(</code><code class="csharp keyword">int</code> <code class="csharp plain">i = 1;i <= nDigits && number != 0;i++)</code></div>
<div class="line number110 index109 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div>
<div class="line number111 index110 alt2"><code class="csharp spaces"> </code><code class="csharp comments">// pega o i-ésimo dígito</code></div>
<div class="line number112 index111 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">int</code> <code class="csharp plain">digit = number % 10LL;</code></div>
<div class="line number113 index112 alt2"><code class="csharp spaces"> </code><code class="csharp comments">// envia para exibição</code></div>
<div class="line number114 index113 alt1"><code class="csharp spaces"> </code><code class="csharp plain">displayDigit(i,digit);</code></div>
<div class="line number115 index114 alt2"><code class="csharp spaces"> </code><code class="csharp comments">// trunca o número, eliminando o último</code></div>
<div class="line number116 index115 alt1"><code class="csharp spaces"> </code><code class="csharp comments">// dígito exibido</code></div>
<div class="line number117 index116 alt2"><code class="csharp spaces"> </code><code class="csharp plain">number /= 10LL;</code></div>
<div class="line number118 index117 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div>
<div class="line number119 index118 alt2"><code class="csharp plain">}</code></div>
<div class="line number120 index119 alt1"> </div>
<div class="line number121 index120 alt2"><code class="csharp keyword">void</code> <code class="csharp plain">setup()</code></div>
<div class="line number122 index121 alt1"><code class="csharp plain">{</code></div>
<div class="line number123 index122 alt2"><code class="csharp spaces"> </code><code class="csharp plain">pinMode(latchPin, OUTPUT);</code></div>
<div class="line number124 index123 alt1"><code class="csharp spaces"> </code><code class="csharp plain">pinMode(clockPin, OUTPUT);</code></div>
<div class="line number125 index124 alt2"><code class="csharp spaces"> </code><code class="csharp plain">pinMode(dataPin, OUTPUT); </code></div>
<div class="line number126 index125 alt1"><code class="csharp spaces"> </code><code class="csharp comments">// "inverte" a máscara de bits, porque os displays são</code></div>
<div class="line number127 index126 alt2"><code class="csharp spaces"> </code><code class="csharp comments">// anodo comum => o bit "1" desliga o LED.</code></div>
<div class="line number128 index127 alt1"><code class="csharp spaces"> </code><code class="csharp comments">// Se os seus displays forem catodo comum,</code></div>
<div class="line number129 index128 alt2"><code class="csharp spaces"> </code><code class="csharp comments">// delete as próximas duas linhas.</code></div>
<div class="line number130 index129 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">for</code><code class="csharp plain">(</code><code class="csharp keyword">int</code> <code class="csharp plain">i=0; i <</code> <code class="csharp keyword">sizeof</code><code class="csharp plain">(digits)/</code><code class="csharp keyword">sizeof</code><code class="csharp plain">(digits[0]);i++)</code></div>
<div class="line number131 index130 alt2"><code class="csharp spaces"> </code><code class="csharp plain">digits[i]=~digits[i];</code></div>
<div class="line number132 index131 alt1"><code class="csharp plain">}</code></div>
<div class="line number133 index132 alt2"> </div>
<div class="line number134 index133 alt1"><code class="csharp keyword">void</code> <code class="csharp plain">loop()</code></div>
<div class="line number135 index134 alt2"><code class="csharp plain">{</code></div>
<div class="line number136 index135 alt1"><code class="csharp spaces"> </code><code class="csharp plain">displayValue=188459823945LL;</code></div>
<div class="line number137 index136 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">while</code><code class="csharp plain">(displayValue < 9999999999999LL)</code></div>
<div class="line number138 index137 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div>
<div class="line number139 index138 alt2"><code class="csharp spaces"> </code><code class="csharp plain">display(displayValue);</code></div>
<div class="line number140 index139 alt1"><code class="csharp spaces"> </code><code class="csharp plain">displayValue++;</code></div>
<div class="line number141 index140 alt2"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div>
<div class="line number142 index141 alt1"><code class="csharp plain">}</code></div>
<p></p>
<p><span><span>O fonte está todo comentado acima.</span><br/> <br/> <span>As constantes </span><b>nDigits </b><span>e </span><b>nCIs </b><span>servem para vc adaptar o programa ao seu circuito, informando quantos CIs 595 vc tem e o número de dígitos que vc usou. Para usar mais ou menos CIs (e dígitos, consequentemente) vc deve adaptar o circuito que publiquei, não é difícil. Se forem, por exemplo, seis displays, vc pode usar 2 CIs, um para controlar os segmentos e outro para multiplexar (selecionar) os displays. Nesse caso a diferença é que vc não terá o CI 1 e consequentemente nenhuma de suas conexões e o pino de dados do CI 2 (pino 14) será conectado ao Arduino (pino 11). Mas nada impede que vc controle menos displays com algum CI sobrando, ou seja, os números são "quase" independentes: para controlar 10 displays vc é obrigado a ter no mínimo 3 CIs, já para controlar 4 displays apenas 2 são necessários, mas se vc tiver ligado 3 o programa funcionará.</span><br/> <br/> <span>Uma curiosidade desse sketch é que eu usei o tipo de dado</span><b> uint64_t</b><span>, que é um inteiro 64 bits suportado pelo Arduino. Usando-se esse tipo de dados podemos manipular um decimal até 20 dígitos.</span></span></p>
<p></p>
<p></p>
<p>É isso, abracadabraço a todos!</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>Robô cartesianotag:labdegaragem.com,2013-03-29:6223006:BlogPost:2193342013-03-29T23:53:04.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>No vídeo abaixo, a versão final do robô cartesiano, máquina que alunos do curso de Engenharia de Controle e Automação construíram e eu assessorei. A correia alimentadora, que conduz as peças até o sistema hidráulico que alimenta o robô é da escola, e está ligada a uma fonte que não tem potência para manter a velocidade constante. Isso fez com que o sistema precisasse de uma ajudinha manual, porque senão a peça não se encaixa na máquina.</p>
<p></p>
<p>De toda forma, deu para os alunos…</p>
<p>No vídeo abaixo, a versão final do robô cartesiano, máquina que alunos do curso de Engenharia de Controle e Automação construíram e eu assessorei. A correia alimentadora, que conduz as peças até o sistema hidráulico que alimenta o robô é da escola, e está ligada a uma fonte que não tem potência para manter a velocidade constante. Isso fez com que o sistema precisasse de uma ajudinha manual, porque senão a peça não se encaixa na máquina.</p>
<p></p>
<p>De toda forma, deu para os alunos exercitarem desde o uso de sw de projeto para desenham a máquina, passando pela parte eletrônica de potência e controle. E o Arduino controla de maneira eficiente os vários sensores e aciona os diversos dispositivos através de relés e drivers. Ainda colocamos um display LCD para indicar as fases da operação.</p>
<p></p>
<p>Quando eu tiver a máquina em mãos vou escrever mais sobre as diversão.</p>
<p></p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/WLQU1Z2Xg48?feature=player_detailpage&wmode=opaque" frameborder="0"></iframe>
</p>Uso da biblioteca AccelStepper para controlar motores de passo com o Arduinotag:labdegaragem.com,2013-02-14:6223006:BlogPost:2069292013-02-14T17:30:00.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Uso da biblioteca AccelStepper para controlar motores de passo com o Arduino</p>
<p>O Arduino vem com uma biblioteca, Stepper.h, que facilita o controle de motores de passo. Ela é bem simples de usar, conforme pode-se ver no exemplo abaixo:</p>
<p></p>
<p>#include <Stepper.h></p>
<p><span style="font-size: 13px;">// seta o número de passos por volta do motor que estiver sendo usado</span></p>
<p>#define STEPS 100</p>
<p></p>
<p>// cria uma instância do Stepper definindo os pinos do…</p>
<p>Uso da biblioteca AccelStepper para controlar motores de passo com o Arduino</p>
<p>O Arduino vem com uma biblioteca, Stepper.h, que facilita o controle de motores de passo. Ela é bem simples de usar, conforme pode-se ver no exemplo abaixo:</p>
<p></p>
<p>#include <Stepper.h></p>
<p><span style="font-size: 13px;">// seta o número de passos por volta do motor que estiver sendo usado</span></p>
<p>#define STEPS 100</p>
<p></p>
<p>// cria uma instância do Stepper definindo os pinos do Arduino aos quais serão conectados ao circuito do motor.</p>
<p>Stepper stepper(STEPS, 8, 9, 10, 11);</p>
<p></p>
<p>void setup()</p>
<p>{</p>
<p>// seta a velocidade do motor para 30 RPM</p>
<p> stepper.setSpeed(30);</p>
<p>}</p>
<p></p>
<p>void loop()</p>
<p>{</p>
<p> stepper.step(100);</p>
<p> delay(100);</p>
<p> stepper.step(-100);</p>
<p> delay(100);</p>
<p>}</p>
<p></p>
<p>Esse programa fará o motor girar cem passos em uma direção e em seguida cem passos na direção contrária.</p>
<p></p>
<p>Também é possível variar a velocidade de giro do motor, sendo possível gerenciar o giro de mais de um motor.</p>
<p>Ocorre que a a Stepper tem algumas limitações: suporta um número limitado de tipos de drivers e motores, além de não suportar velocidades muito baixas nem muito altas. E a principal delas: a função step() bloqueia o Arduino, isso é, a cada chamada da função o Arduino "congela". Isso faz com que misturar código de controle do motor com outras funcionalidades (incluindo o controle de outros motores simultaneamente) fique bem complicado. Para rodar um motor de um carrinho-robô ainda vai, mas se vc quiser manter um movimento preciso em termos de velocidade e posicionamento, aí que complica de vez.</p>
<p></p>
<p>No meu caso, estou trabalhando em um projeto de um CNC tipo robô cartesiano (no meu blog tem posts a respeito do projeto), então eu preciso acionar dois motores simultaneamente com controle absoluto de velocidade e posicionamento. Além disso o troço vai ter um display LCD, duas chaves de fim de curso, um leitor de código de barras e dois acionadores pneumáticos, para manipular as peças. Também vai ter uma correia transportadora. Ou seja um monte coisa funcionando ao mesmo tempo, o que tornaria virtualmente impossível controlar os motores com a lib Stepper.</p>
<p></p>
<p>Pesquisa dali e daqui, achei a lib AccelStepper. Ela é muito mais "parruda" que a Stepper, resolvendo todas as questões que citei na Stepper e mais algumas tais como:</p>
<p></p>
<p>- Suporte muito simples para aceleração e desaceleração</p>
<p>- Controle de mais de um stepper muito simplificado, fazendo com que manter controle de velocidade, posicionamento e aceleração seja muuuuito mais fácil.</p>
<p>- Suporte a motores de 2, 3 e quatro fios (na realidade até de unipolares de 6 fios, que são os que eu estou usando), através de um driver.</p>
<p>- Suporte a alguns drivers "proprietários", ou seja, com bibliotecas específicas desenvolvidas pelo fabricante mas não tão boas.</p>
<p>- etc (lá no site tem outras)</p>
<p></p>
<p>A documentação é prá lá de boa no site (em inglês), embora seja bem "técnica" para um iniciante, e os caras disponibilizam alguns exemplos com as várias funcionalidades.</p>
<p></p>
<p>Apanhei um pouquinho para aprender como usá-la, até porque estava usando com um driver nacional, o SMC-U-PRO, que é muito bom hardware mas na parte de documentação deixa um pouco a desejar (tem um monte de versão do hardware já vendida, e um monte de documentação na net, foi difícil achar o pdfde uma versão ao menos parecida com a nossa, além de não se achar exemplo de uso do bicho com o Arduino). Mas vale o preço, é uma excelente opção principalmente para motores mais parrudos, quando se quer velocidades altas e/ou passos muito pequenos.</p>
<p></p>
<p>Bom, vamos a um exemplo de código, devidamente comentado:</p>
<p></p>
<p>#include <AccelStepper.h></p>
<p>// Define os motores.<br/>// AccelStepper::DRIVER - seta o tipo de controladora, no caso um driver, SMC-U-PRO<br/>AccelStepper stepperX(AccelStepper::DRIVER,6,7);<br/>AccelStepper stepperY(AccelStepper::DRIVER,9,10);</p>
<p>void setup()<br/>{ <br/> // habilita os pinos de enable dos motores<br/> stepperX.setEnablePin(8);<br/> s<span style="font-size: 13px;">tepperY.setEnablePin(11);</span></p>
<p>// seta a a velocidade máxima dos motores<br/> stepperX.setMaxSpeed(2000);<br/> stepperY.setMaxSpeed(2000);<br/>}</p>
<p>void loop()<br/>{ <br/> // prepara os motores para girar em uma direção...<br/> // "manda" girar o motor -2000 steps. O valor legativo significa giro no sentido contrário<br/> // aos ponteiros do relógio.<br/> // Obs: o comando não gira o motor, só diz que é para girar. O giro efetivo é no loop abaixo<br/> stepperX.moveTo(-2000);</p>
<p>// seta a velocidade de giro em passos/s.<br/> stepperX.setSpeed(1000);<br/> stepperY.moveTo(-2000);<br/> stepperY.setSpeed(1000);</p>
<p>// esse é o loop que move os motores até a posição 2000. Observe que a rotina não<br/> // fica bloqueada no stepperX.runSpeed, ou seja, ele dá um passo e sai.<br/> //Aí vc pode fazer outras coisas, como por exemplo acionar o giro de outros motores,<br/> // como eu fiz.<br/> // Mas o que quer que vc coloque dentro do while tem que ser rápido, porque<br/> // senão vai atrasar o giro dos motores. Você pode colocar, por exemplo, um botão de<br/> // parada imediata, a ser testado dentro do loop, ou um sensor de fim de curso.<br/> while ((stepperX.currentPosition() != -2000) && (stepperY.currentPosition() != -2000))<br/> {<br/> stepperX.runSpeed();<br/> stepperY.runSpeed();<br/> }</p>
<p><span style="font-size: 13px;">// o código abaixo é análogo, só que gira na direção contrária, agora.</span></p>
<p> stepperX.moveTo(2000);<br/> stepperX.setSpeed(1000);<br/> stepperY.moveTo(2000);<br/> stepperY.setSpeed(1000);<br/> // move os motores até a posição -2000<br/> while ((stepperX.currentPosition() != 2000) && (stepperY.currentPosition() != 2000))<br/> {<br/> stepperX.runSpeed();<br/> stepperY.runSpeed();<br/> }<br/>}</p>
<p></p>
<p>Parece grande mais é mais comentário do que programa. O que importa é que vc pode colocar "quase qualquer" código dentro dos loops while, ou colocar outras funcionalidades dentro do comando loop que não vai afetar o giro do motor. Porque "quase qualquer"? Porque se vc colocar alguma rotina que demore muito (e o "muito" depende da velocidade de giro que vc quer do motor) ou que trave a execução (um delay(), por exemplo) aí ferrou, pq o programa tem que "passar" periodicamente pela rotina runSpeed() ou outra equivalente.</p>
<p></p>
<p>Daí, vc pergunta: Uai, como faço prá não usar delay(), se precisar de esperar durante um intervalo de tempo?</p>
<p>Resposta: crie o seu próprio delay(), e use ele em vez do da lib do Arduino, assim:</p>
<p></p>
<p>void myDelay(long interval)</p>
<p>{</p>
<p> long init = millis();</p>
<p> while ((millis() - init) <= interval)</p>
<p> {</p>
<p> stepper.runSpeed();</p>
<p> }</p>
<p>}</p>
<p></p>
<p>Essa myDelay() pode ser usada no seu programa sem comprometer o comando dos motores.</p>
<p>É isso! A AccellStepper tem outras funcionalidades, mas com essas que descrevi já dá para vc ver como controlar mais de um motor ao mesmo tempo com precisão.</p>
<p></p>
<p>Abaixo, um vídeo de um teste que fiz com ela, onde os motores aceleram e desaceleram simultaneamente:</p>
<p></p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/XKisnfCcFxs?feature=player_detailpage&wmode=opaque" frameborder="0"></iframe>
</p>
<p></p>Impressora 3D de órgãos humanostag:labdegaragem.com,2013-01-24:6223006:BlogPost:2021332013-01-24T13:40:18.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Deu na veja: a Autodesk, gigante da área de sw de CAD/CAM acaba de firmar uma parceria com a Organovo, única empresa do mundo que trabalha com fabricação de tecidos humanos usando impressoras 3D para fornecer software que permita a criação de tecidos humanos mais complexos que os que ela consegue fazer atualmente. A ideia é, em 20 anos, ter impressoras capazes de "imprimir" rins, pâncreas, fígados etc.</p>
<p></p>
<p>Quer saber mais?…</p>
<p>Deu na veja: a Autodesk, gigante da área de sw de CAD/CAM acaba de firmar uma parceria com a Organovo, única empresa do mundo que trabalha com fabricação de tecidos humanos usando impressoras 3D para fornecer software que permita a criação de tecidos humanos mais complexos que os que ela consegue fazer atualmente. A ideia é, em 20 anos, ter impressoras capazes de "imprimir" rins, pâncreas, fígados etc.</p>
<p></p>
<p>Quer saber mais? <a href="http://veja.abril.com.br/noticia/ciencia/a-fabrica-de-orgaos-humanos" target="_blank">Cicaqui</a>.</p>Comunicação Serial com o Arduino em C#tag:labdegaragem.com,2013-01-09:6223006:BlogPost:1990182013-01-09T22:15:51.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Para atender a uma demanda minha, escrevi um aplicativo que faz comunicação serial, não só com Arduino, claro.</p>
<p>É uma aplicação console, ou seja, roda na linha de comando, da seguinte forma:</p>
<p></p>
<p><span style="color: #888888;"><strong>serialcomm -pCOM4 -b9600 -d<dados> -f<nomearquivo> -w</strong> (</span>se vc colocar -w, ele espera uma resposta. Esta deve terminar com CR LF, e o sistema a imprime assim que for enviada).</p>
<p></p>
<p>Muito simples,…</p>
<p>Para atender a uma demanda minha, escrevi um aplicativo que faz comunicação serial, não só com Arduino, claro.</p>
<p>É uma aplicação console, ou seja, roda na linha de comando, da seguinte forma:</p>
<p></p>
<p><span style="color: #888888;"><strong>serialcomm -pCOM4 -b9600 -d<dados> -f<nomearquivo> -w</strong> (</span>se vc colocar -w, ele espera uma resposta. Esta deve terminar com CR LF, e o sistema a imprime assim que for enviada).</p>
<p></p>
<p>Muito simples, não?</p>
<p></p>
<p>Abaixo o executável e os fontes. QQuer dúvida...</p>
<p></p>
<p>Abracadabraço!</p>
<p></p>
<p>Mauro Assis</p>
<p></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979551156?profile=original" target="_self">SerialCommExe.zip</a></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979551150?profile=original" target="_self">SerialCommSource.zip</a></p>
<p></p>
<p></p>
<p></p>Robô solteiro procura...tag:labdegaragem.com,2012-12-02:6223006:BlogPost:1875422012-12-02T11:49:41.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979554015?profile=original" target="_self"><img class="align-full" src="http://storage.ning.com/topology/rest/1.0/file/get/1979554015?profile=RESIZE_1024x1024" width="750"></img></a></p>
<p></p>
<p>Dia desses fui aos EUA (mais exatamente na semana do furacão) e trouxe de lá um <a href="http://www.lynxmotion.com/c-130-al5d.aspx" target="_blank">braço robótico</a> que vinha namorando há um bom tempo. Ainda estou iniciando a brincadeira com ele, por absoluta falta de tempo. Mas já deu para implementar alguma coisa para estudar a sua …</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979554015?profile=original" target="_self"><img width="750" src="http://storage.ning.com/topology/rest/1.0/file/get/1979554015?profile=RESIZE_1024x1024" width="750" class="align-full"/></a></p>
<p></p>
<p>Dia desses fui aos EUA (mais exatamente na semana do furacão) e trouxe de lá um <a href="http://www.lynxmotion.com/c-130-al5d.aspx" target="_blank">braço robótico</a> que vinha namorando há um bom tempo. Ainda estou iniciando a brincadeira com ele, por absoluta falta de tempo. Mas já deu para implementar alguma coisa para estudar a sua <a href="http://pt.wikipedia.org/wiki/Cinem%C3%A1tica_Inversa" target="_blank">cinemática inversa</a>, que aliás é um desafio em um braço com seis articulações (ou graus de liberdade, em robotês).</p>
<p>Conectei o bicho num controle (joystick) de PS/2 para fazer os primeiros movimentos. Pretendo com ele estudar outros tipos de controle como WiFi, bluetooth e comunicação serial a partir do PC. Para isso estou escrevendo uma lib especializada para lidar com ele, que já conta com algumas features legais.</p>
<p>Se alguém tiver algum braço igual ou semelhante e quiser entrar em contato para trocarmos informações e código, é só me escrever.</p>
<p>Abaixo um vídeo do bichinho em movimento.</p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/83RZgdlqRJc?feature=player_embedded&wmode=opaque" frameborder="0"></iframe>
</p>
<p></p>Projeto: Comunicação serialtag:labdegaragem.com,2012-10-21:6223006:BlogPost:1738932012-10-21T16:44:16.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p><span>Dia desses, por demanda de um projeto, resolvi criar um programa do tipo linha de comando, para enviar dados através da porta serial. Agora publico o dito, incluindo, como é de lei nesse blog, os fontes.</span><br></br> <br></br> <span>Para usar o programa, basta fazer o download e copiá-lo para alguma pasta (ia escrevendo "diretório", estou ficando velho...) e usar.</span><br></br> <br></br> <strong>serialcomm -pCOM4 -b9600 -ddadosaenviar -w</strong><br></br> <br></br> <span>Nesse caso o sistema enviará pela…</span></p>
<p><span>Dia desses, por demanda de um projeto, resolvi criar um programa do tipo linha de comando, para enviar dados através da porta serial. Agora publico o dito, incluindo, como é de lei nesse blog, os fontes.</span><br/> <br/> <span>Para usar o programa, basta fazer o download e copiá-lo para alguma pasta (ia escrevendo "diretório", estou ficando velho...) e usar.</span><br/> <br/> <strong>serialcomm -pCOM4 -b9600 -ddadosaenviar -w</strong><br/> <br/> <span>Nesse caso o sistema enviará pela porta (-p) COM4, a uma taxa de (-b) 9600 bauds a sequencia de caracteres dadosaenviar (-d). Em seguida esperará (-w) que algum dado seja enviado de volta pela porta, encerrando com CRLF (char(13),char(10)). A sequência enviada sera escrita na tela e então o programa terminará. O parâmetro -w é, obviamente, opcional.</span><br/> <br/> <span>Pode-se também optar por enviar um arquivo em disco inteiro pela porta, para tanto:</span><br/> <br/><strong>serialcomm -pCOM4 -b9600 -farquivo.txt</strong><br/> <br/> <span>sendo arquivo.txt o arquivo cujo conteúdo deverá ser enviado pela porta.</span></p>
<p><span> </span></p>
<p><span>Quem estiver interessado nos fontes: <a href="http://www.automatobr.blogspot.com.br/">http://www.automatobr.blogspot.com.br/</a></span></p>
<p><span> </span></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979554267?profile=original" target="_self">SerialComm.zip</a></p>Automação no Parquetag:labdegaragem.com,2012-08-21:6223006:BlogPost:1588982012-08-21T16:12:52.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Desde o fim do ano passado tenho dedicado as minhas manhãs de sábado a uma espécie de trabalho voluntário: a partir das 7:30 da manhã vou até um <a href="http://goo.gl/maps/blVH8" target="_blank">parque</a> em frente à minha casa com as tralhas (Arduinos e quetais) e apoio projetos de automação de quem aparece. É uma espécie de LdG no sabadão, que eu chamo de Automação no Parque.</p>
<p>Já escrevi sobre essa iniciativa aqui no Lab, e divulgo com mais detalhes no grupo…</p>
<p>Desde o fim do ano passado tenho dedicado as minhas manhãs de sábado a uma espécie de trabalho voluntário: a partir das 7:30 da manhã vou até um <a href="http://goo.gl/maps/blVH8" target="_blank">parque</a> em frente à minha casa com as tralhas (Arduinos e quetais) e apoio projetos de automação de quem aparece. É uma espécie de LdG no sabadão, que eu chamo de Automação no Parque.</p>
<p>Já escrevi sobre essa iniciativa aqui no Lab, e divulgo com mais detalhes no grupo <a href="http://labdegaragem.com/group/ldg-sao-jose-dos-campos" target="_self">LdG Vale do Paraíba</a> e no meu <a href="http://automatobr.blogspot.com.br/" target="_blank">blog</a>.</p>
<p>O objetivo desse post é estimular iniciativas semelhantes a serem feitas por garagistas em outras praças Brasil afora.</p>
<p><strong>Olhem, o negócio é muito bom!</strong> Nesses meses já passou por lá um monte de gente, de todo o tipo: estudantes secundaristas, alunos de engenharia (o maior grupo), hobbistas e todo o tipo de curioso. No começo as pessoas tinham um pouco de receio de levar seus equipamentos e notebooks pro parque, preocupadas com segurança etc. No nosso último encontro, até um osciloscópio apareceu. Cada um com suas ideias e demandas. Seguramente já passaram por lá mais de uns quarenta projetos diferentes. Esse fim de semana foram sete. Tá vindo gente de outras cidades, como Jacareí, Suzano, São Paulo e até de Bauru, a 450 km de distância. E olhem que eu só divulgo aqui, o resto é boca-a-boca.</p>
<p>Para mim o retorno é diversão pura: posso trabalhar em vários projetos diferentes simultaneamente, conheço gente nova todo sábado, vejo as pessoas colaborando entre si...</p>
<p>Eu vejo que os grupos aqui do Lab se reúnem, alguns são bastante ativos mas é uma coisa mais fechada, voltada para dentro do grupo. Eu sou membro do grupo de Recife e acompanhei algumas mensagens de frustração com o jeito que o grupo está caminhando, meio paradão segundo alguns. Talvez uma saída para isso seja se voltar para a comunidade, as escolas, enfim, ir atrás de gente interessada e propor ajuda, simplesmente.</p>
<p>Outra questão é a segurança: o Parque aqui em SJC é razoavelmente seguro, mas não especialmente, quer dizer, tem uma cerca de um metro de altura e duas portarias ondem ficam dois guardinhas. Ou seja, risco tem, mas "viver é muito perigoso", já avisava Guimarães Rosa. E eu acredito que esse modelo possa ser replicado em outros ambientes, como uma escola, ou outro lugar mais fechado no fim de semana.</p>
<p>Resumindo: este post é para compartilhar a minha satisfação com o "projeto" Automação no Parque (na verdade uma brincadeira), e quem sabe achar mais alguns animadões a replicar a experiência.</p>
<p></p>
<p>Abracadabraço!</p>
<p></p>
<p>Mauro</p>Arduino no Parque, 25/03/2012tag:labdegaragem.com,2012-03-27:6223006:BlogPost:1220902012-03-27T20:51:00.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Sabadão tivemos mais uma edição do Arduino no Parque. Apareceram dois projetos: o Godoi com o seu computador de bordo, cada vez mais turbinado, e dupla Fernanda & Alessandra, com o seu projeto de mouse com o acelerômetro, além, claro, de outros alunos e demais interessados nas práticas com o Arduino. Abaixo, as fotos:</p>
<p></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979538657?profile=original" target="_self"><img class="align-full" src="http://storage.ning.com/topology/rest/1.0/file/get/1979538657?profile=original" width="460"></img></a></p>
<p>Acima,"petrechos" do Godoy para…</p>
<p>Sabadão tivemos mais uma edição do Arduino no Parque. Apareceram dois projetos: o Godoi com o seu computador de bordo, cada vez mais turbinado, e dupla Fernanda & Alessandra, com o seu projeto de mouse com o acelerômetro, além, claro, de outros alunos e demais interessados nas práticas com o Arduino. Abaixo, as fotos:</p>
<p></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979538657?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979538657?profile=original" width="460" class="align-full"/></a></p>
<p>Acima,"petrechos" do Godoy para o computador de bordo (e não, a caixa de sapato <span style="color: #000000;"><strong>não</strong></span> é o chassi do bicho...)</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979538812?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979538812?profile=original" width="460" class="align-full"/></a></p>
<p>Aqui, o teste do GPS. A primeira coordenada que pegamos foi jogada no Google Maps e apontou prá aproximadamente 10m de onde estávamos... é a velha emoção de trazer um bebê à vida!</p>
<p></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979538857?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979538857?profile=original" width="460" class="align-full"/></a></p>
<p>Aqui, o nosso já velho drama do acelerômetro 10 x nós 0. Prá semana tem mais.</p>
<p></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979538887?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979538887?profile=original" width="460" class="align-full"/></a></p>
<p>Aqui, a turma trabalhando. As quatro garotas da ponta de lá da mesa estavam noutra, fazendo trabalho de escola.</p>
<p>Fiquei sabendo de um projeto que rola no ITA de construção de um foguete para disputar competições nos EUA. Pena que as reuniões dos caras são na quarta à noite, como dou aulas não dá para participar. Mas vou procurar saber mais sobre o projeto, de toda forma.</p>
<p></p>
<p></p>
<p></p>Mão biônicatag:labdegaragem.com,2012-03-18:6223006:BlogPost:1202342012-03-18T15:48:15.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Estou ajudando um aluno, o Fábio D´Ávila, com o projeto de construção de uma mão biônica. Como ele não pode ir ao Arduino no Parque, nos encontramos no Parque Santos Dumont hoje às 8:00 da matina para testarmos a primeira montagem do sistema. A idéia é utilizar servos para movimentar os dedos de uma mão de brinquedo. Os dedos da mão biônica reproduzirão os movimentos realizados pela mão do usuário, que usará uma luva com sensores de flexão.</p>
<p></p>
<p>A ideia hoje era testar o…</p>
<p>Estou ajudando um aluno, o Fábio D´Ávila, com o projeto de construção de uma mão biônica. Como ele não pode ir ao Arduino no Parque, nos encontramos no Parque Santos Dumont hoje às 8:00 da matina para testarmos a primeira montagem do sistema. A idéia é utilizar servos para movimentar os dedos de uma mão de brinquedo. Os dedos da mão biônica reproduzirão os movimentos realizados pela mão do usuário, que usará uma luva com sensores de flexão.</p>
<p></p>
<p>A ideia hoje era testar o funcionamento de um servo para acionar o dedo, usando um sensor que já foi comprado. Se desse certo, o Fábio ia comprar mais três conjuntos servo/sensor. Tínhamos dúvida se o motor ia conseguir flexionar o dedo.</p>
<p></p>
<p>Aí as fotos da montagem:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979541698?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979541698?profile=original" width="460" class="align-full"/></a></p>
<p>Este é o sensor de flexão:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979541860?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979541860?profile=original" width="460" class="align-full"/></a></p>
<p>Conexão entre o motor e a mão:</p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979542163?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979542163?profile=original" width="460" class="align-full"/></a></p>
<p>E... funcionou! Vejam aí como ficou. Agora é só o Fábio comprar o resto dos componentes...</p>
<p><iframe width="420" height="315" src="http://www.youtube.com/embed/RsT7qKhVPpw?wmode=opaque" frameborder="0"></iframe>
</p>
<p></p>Arduino no Parquetag:labdegaragem.com,2012-03-18:6223006:BlogPost:1203272012-03-18T15:00:00.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Galera,</p>
<p></p>
<p>O Arduino no Parque de ontem bombou! Tivemos o recorde de presença, além de pela primeira vez termos participantes do sexo feminino.</p>
<p>Trabalhamos em várias montagens, duas delas de TCC:</p>
<p>- Gerador eólico com sistema de posicionamento automático onde uma espécie de biruta capta a direção do vento e posiciona a hélice na melhor direção do vento. </p>
<p>- Mouse a partir de um acelerômetro.</p>
<p>Ficamos no parque até as 15:00. Me dediquei mais ao projeto com…</p>
<p>Galera,</p>
<p></p>
<p>O Arduino no Parque de ontem bombou! Tivemos o recorde de presença, além de pela primeira vez termos participantes do sexo feminino.</p>
<p>Trabalhamos em várias montagens, duas delas de TCC:</p>
<p>- Gerador eólico com sistema de posicionamento automático onde uma espécie de biruta capta a direção do vento e posiciona a hélice na melhor direção do vento. </p>
<p>- Mouse a partir de um acelerômetro.</p>
<p>Ficamos no parque até as 15:00. Me dediquei mais ao projeto com o acelerômetro, e conseguimos ler e interpretar os sinais X e Y. O sinal de Z, estranhamente, se mantém em 0 o tempo todo. Semana que vem vamos concluir o projeto.</p>
<p></p>
<p>O amigo Moisés apareceu e se enturmou logo, ajudando com o sw do gerador eólico.</p>
<p></p>
<p>Quem tiver uma dicas sobre o uso dos acelerômetros <span class="wikiword">ADXL, ou sobre projetos com o mesmo, por favor ajude-nos.</span><span> </span></p>
<p></p>
<p>Pena que eu me esqueci de tirar fotos... :(</p>
<p></p>
<p>Abracadabraço,</p>
<p></p>
<p>Mauro Assis</p>
<p></p>Controle remoto para powerpointtag:labdegaragem.com,2012-03-04:6223006:BlogPost:1175392012-03-04T14:30:00.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Eu dou aulas em duas faculdades. Uso powerpoint em todas as aulas, até porque a minha letra não é lá essas coisas</p>
<p>No nosso Arduino no Parque de ontem aproveitei para desenvolver um dispositivo+software para controle remoto do powerpoint, de maneira a que eu possa comandar os slides para frente e para trás à distância, até porque as salas são grandes.</p>
<p>A parte do Arduino é mole: um sensor infravermelho, que eu já tinha mostrado aqui em outro post, que é ligado direto nos pinos do…</p>
<p>Eu dou aulas em duas faculdades. Uso powerpoint em todas as aulas, até porque a minha letra não é lá essas coisas</p>
<p>No nosso Arduino no Parque de ontem aproveitei para desenvolver um dispositivo+software para controle remoto do powerpoint, de maneira a que eu possa comandar os slides para frente e para trás à distância, até porque as salas são grandes.</p>
<p>A parte do Arduino é mole: um sensor infravermelho, que eu já tinha mostrado aqui em outro post, que é ligado direto nos pinos do Arduino:</p>
<p></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979540487?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979540487?profile=original" width="680" class="align-full"/></a></p>
<p>O software do Arduino também não tem mistério nenhum:</p>
<p><span style="color: #333399;">#include <WProgram.h></span><br/> <span style="color: #333399;">#include <NECIRrcv.h></span></p>
<p><span style="color: #333399;">// look for IR codes and print them as they are received</span></p>
<p><span style="color: #333399;">#define IRPIN 5 // pin that IR detector is connected to</span></p>
<p><span style="color: #333399;">NECIRrcv ir(IRPIN) ;</span></p>
<p><span style="color: #333399;">void setup()</span><br/> <span style="color: #333399;">{</span><br/> <span style="color: #333399;"> Serial.begin(9600) ;</span><br/> <span style="color: #333399;"> ir.begin() ;</span><br/> <span style="color: #333399;">}</span></p>
<p><span style="color: #333399;">void loop()</span><br/> <span style="color: #333399;">{</span><br/> <span style="color: #333399;"> unsigned long ircode ;</span><br/> <span style="color: #333399;"> while (ir.available())</span></p>
<p><span style="color: #333399;"> {</span><br/> <span style="color: #333399;"> ircode = ir.read() ;</span><br/> <span style="color: #333399;"> Serial.println(ircode,HEX) ;</span><br/> <span style="color: #333399;"> }</span><br/> <span style="color: #333399;">}</span></p>
<p><span style="color: #333399;"><br/></span></p>
<p>A lib NECIRcv.h provê o objeto que lida com o receptor infravermelho. Ela se chama NEC mas é compatível cm outros sensores (o meu não é NEC).</p>
<p>A parte que proporcionou mais diversão foi o software do PC.</p>
<p>A "cara" do software é até simples, e dispensa maiores explicações:</p>
<p></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979542448?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979542448?profile=original" width="377" class="align-full"/></a></p>
<p></p>
<p>Usando o Microsoft Office Interop, criei alguns objetos para abrir e manipular a apresentação:</p>
<p><span style="color: #333399;"><br/></span></p>
<p><span style="color: #333399;">Microsoft.Office.Interop.PowerPoint.Application ppApp = new Microsoft.Office.Interop.PowerPoint.Application();</span><br/> <span style="color: #333399;">ppApp.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;</span><br/> <span style="color: #333399;">Presentations ppPresens = ppApp.Presentations;</span><br/> <span style="color: #333399;">Presentation objPres = ppPresens.Open(edFName.Text, Microsoft.Office.Core.MsoTriState.msoFalse,</span> <br/> <span style="color: #333399;">Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoTrue);</span><br/> <span style="color: #333399;">Slides objSlides = objPres.Slides;</span><br/> <span style="color: #333399;">Microsoft.Office.Interop.PowerPoint.SlideShowWindows objSSWs;</span><br/> <span style="color: #333399;">Microsoft.Office.Interop.PowerPoint.SlideShowSettings objSSS;</span></p>
<p><span style="color: #333399;">objSSS = objPres.SlideShowSettings;</span></p>
<p><span style="color: #333399;">objSSS.Run();</span><br/> <span style="color: #333399;">objSSWs = ppApp.SlideShowWindows;</span></p>
<p></p>
<p>Em seguida, a criação e parametrização da classe SerialPort, que vai receber os comandos do Arduino:</p>
<p></p>
<p><span style="color: #333399;">System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort();</span><br/> <span style="color: #333399;">sp.PortName = edPorta.Text;</span><br/> <span style="color: #333399;">sp.BaudRate = 9600;</span><br/> <span style="color: #333399;">sp.Open();</span></p>
<p></p>
<p>Por fim o tratamento das mensagens do Arduino. Os códigos usados no <strong><span style="color: #333399;">switch</span></strong> dependem do modelo de controle remoto:</p>
<p></p>
<p><span style="color: #333399;">bool navigation = true;</span><br/> <span style="color: #333399;">DateTime now = DateTime.Now;</span><br/> <span style="color: #333399;">string lastCmd = string.Empty;</span><br/> <span style="color: #333399;">while (navigation)</span><br/> <span style="color: #333399;">{</span><br/> <span style="color: #333399;"> string cmd = string.Empty;</span><br/> <span style="color: #333399;"> if (sp.BytesToRead > 0)</span><br/> <span style="color: #333399;"> {</span><br/> <span style="color: #333399;"> cmd = sp.ReadLine().TrimEnd('\r');</span><br/> <span style="color: #333399;"> TimeSpan diff = DateTime.Now.Subtract(now);</span><br/> <span style="color: #333399;"> if (diff.Milliseconds > 200)</span><br/> <span style="color: #333399;"> now = DateTime.Now;</span><br/> <span style="color: #333399;"> else</span><br/> <span style="color: #333399;"> cmd = string.Empty;</span><br/> <span style="color: #333399;"> }</span><br/> <span style="color: #333399;"> switch (cmd)</span><br/> <span style="color: #333399;"> {</span><br/> <span style="color: #333399;"> case "BC4352AD":</span><br/> <span style="color: #333399;"> ppPresens[1].SlideShowWindow.View.Next();</span><br/> <span style="color: #333399;"> break;</span><br/> <span style="color: #333399;"> case "BD4252AD":</span><br/> <span style="color: #333399;"> ppPresens[1].SlideShowWindow.View.Previous();</span><br/> <span style="color: #333399;"> break;</span><br/> <span style="color: #333399;"> }</span><br/> <span style="color: #333399;"> System.Windows.Forms.Application.DoEvents();</span><br/> <span style="color: #333399;">}</span></p>
<p></p>
<p>Agora as imagens:</p>
<p></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979542970?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979542970?profile=original" width="460" class="align-full"/></a></p>
<p></p>
<p><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979542980?profile=original" target="_self"><img src="http://storage.ning.com/topology/rest/1.0/file/get/1979542980?profile=original" width="460" class="align-full"/></a></p>
<p>E um vídeo mostrando a "coisa" funcionando:</p>
<p><iframe width="420" height="315" src="http://www.youtube.com/embed/57m5Urk3yes?wmode=opaque" frameborder="0"></iframe>
</p>
<p></p>
<p>Amanhã é o teste real, dou aulas de manhã e à noite.</p>
<p>Esse projeto pode ser usado como base para outros, controlando outras aplicações. Pode-se transformar o controle remoto num mouse, controlando qualquer aplicação.</p>
<p></p>
<p>É isso!</p>
<p></p>
<p>Aqui, os fontes e o executável do aplicativo que roda no PC e controla o powerpoint a partir do Arduino: <a href="http://storage.ning.com/topology/rest/1.0/file/get/1979543859?profile=original" target="_self">pptRemote.zip</a></p>
<p></p>
<p>Abracadabraço,</p>
<p></p>
<p>Mauro Assis</p>
<p></p>
<p></p>Genius IItag:labdegaragem.com,2012-01-18:6223006:BlogPost:1088692012-01-18T00:01:54.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p>Atendendo a pedidos, os fontes do Genius estão aí, <a href="http://storage.ning.com/topology/rest/1.0/file/get/1979540332?profile=original" target="_self">GeniusPalestra.ino</a>. A extensão .ino é do Arduino 1.0.</p>
<p>Aqui, um post sobre o projeto com o esquema e um vídeo: <a href="http://labdegaragem.com/profiles/blogs/genius">http://labdegaragem.com/profiles/blogs/genius</a></p>
<p></p>
<p>Abracadabraço a todos,</p>
<p></p>
<p>Mauro</p>
<p></p>
<p></p>
<p></p>
<p>Atendendo a pedidos, os fontes do Genius estão aí, <a href="http://storage.ning.com/topology/rest/1.0/file/get/1979540332?profile=original" target="_self">GeniusPalestra.ino</a>. A extensão .ino é do Arduino 1.0.</p>
<p>Aqui, um post sobre o projeto com o esquema e um vídeo: <a href="http://labdegaragem.com/profiles/blogs/genius">http://labdegaragem.com/profiles/blogs/genius</a></p>
<p></p>
<p>Abracadabraço a todos,</p>
<p></p>
<p>Mauro</p>
<p></p>
<p></p>
<p></p>Geniustag:labdegaragem.com,2011-12-19:6223006:BlogPost:1057382011-12-19T14:00:00.000ZMauro Assishttps://labdegaragem.com/profile/MauroAssis
<p></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979540281?profile=original" target="_self"></a>Aqueles que tem mais de 30 certamente se lembram do<span class="Apple-converted-space"> </span></span><a style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #436590; text-transform: none; text-indent: 0px; letter-spacing: normal; text-decoration: none; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" href="http://digitalgames.com.br/jogar-online/genius">Genius</a><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">, game que fez muito sucesso nos anos 80. Foi, junto com o<span class="Apple-converted-space"> </span></span><a style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #436590; text-transform: none; text-indent: 0px; letter-spacing: normal; text-decoration: none; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" href="http://www.gamegen.com.br/gamegen/alguem-viu-um-telejogo-por-ai/">telejogo</a><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">, o primeiro game a que tive acesso. Na época era negócio de gente rica, meus amigos remediados tinham. Abaixo, duas imagens do troço pronto:</span></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><img src="http://3.bp.blogspot.com/-XSwpFDJom4I/TqybCxPR9XI/AAAAAAAAAm0/BzTuFP8imnY/s320/IMG_1700.JPG"/></span></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><img src="http://2.bp.blogspot.com/-xNqySocSVKk/TqyQM0aLUYI/AAAAAAAAAms/qQTxy1eQTPA/s320/IMG_1608.JPG"/></span></p>
<p> </p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">A ideia é a seguinte: são quatro leds, quatro cores, quatro chaves "push button" (fecham enquanto vc está pressionando) e quatro sons. Um twitter velho desses de carro é o responsável pelo som. A cada som corresponde uma cor e um botão. O sistema "inventa" uma sequência aleatória de sons/cores/botões e toca, e depois a gente deve repetir.<span class="Apple-converted-space"> Abaixo, o esquema do jogo feito no Fritzing:</span></span></span></p>
<p> </p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-converted-space"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979540281?profile=original" target="_self"><img width="750" class="align-full" src="http://storage.ning.com/topology/rest/1.0/file/get/1979540281?profile=RESIZE_1024x1024" width="509" height="261"/></a></span></span></span></span></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-converted-space">Aqui, um vídeo dele funcionando. APerta-se qualquer tecla e o jogo começa:</span></span></span></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-converted-space"><object style="width: 640px; height: 390px;" width="640" height="360" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="false"></param><param name="allowScriptAccess" value="never"></param><param name="src" value="http://www.youtube.com/v/Y2Z9N4KtQ3s?version=3&feature=player_detailpage"></param><param name="allowfullscreen" value="false"></param><param name="allowscriptaccess" value="never"></param><param name="wmode" value="opaque"></param><embed wmode="opaque" style="width: 640px; height: 390px;" width="640" height="360" type="application/x-shockwave-flash" src="http://www.youtube.com/v/Y2Z9N4KtQ3s?version=3&feature=player_detailpage" allowfullscreen="false" allowscriptaccess="never"></embed> </object>
</span></span></span></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-converted-space">Outro dia ganhei um Genius de verdade, na caixa, presente do amigo <a href="http://www.facebook.com/#!/profile.php?id=100001143041043" target="_blank">Sidney Rocha</a>. Vou hackeá-lo e fazer o Arduino comandá-lo, depois posto cá.</span></span></span></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-converted-space">Em anexo, Fritzing e código fonte do brinquedo.</span></span></span></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-converted-space"><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979542439?profile=original" target="_self">Genius.fz</a></span></span></span></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-converted-space"><a href="http://storage.ning.com/topology/rest/1.0/file/get/1979544589?profile=original" target="_self">Genius.pde</a></span></span></span></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-converted-space"><strong>Obs</strong>: o sketch (programa) <strong>genius.pde</strong> usa uma lib, piches.h, que define as frequencias correspondentes às notas musicais das oitavas encontradas em um piano. Para instruções sobre como criá-lo, veja em <a href="http://arduino.cc/en/Tutorial/tone">http://arduino.cc/en/Tutorial/tone</a>, ou então faça o download aqui (<a href="http://storage.ning.com/topology/rest/1.0/file/get/1979544657?profile=original" target="_self">Piches.h</a>). Você deve colocar o arquivo em <dir do arduino>\libraries\Piches.</span></span></span></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-converted-space"><br/></span></span></span></p>
<p><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span style="font: 13px/18px 'Trebuchet MS', Trebuchet, sans-serif; color: #666666; text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; float: none; display: inline !important; white-space: normal; orphans: 2; widows: 2; font-size-adjust: none; font-stretch: normal; background-color: #ffffff; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><span class="Apple-converted-space"><br/></span></span></span></p>
<p> </p>