Dissertacao e Produto Nathan Rabelo Martins
Dissertacao e Produto Nathan Rabelo Martins
Dissertacao e Produto Nathan Rabelo Martins
Dissertação apresentada à
Universidade Federal de Viçosa, como
parte das exigências do Programa de
Pós-Graduação em Ensino de Física,
para obtenção do título de Magister
Scientiae.
VIÇOSA
MINAS GERAIS – BRASIL
2018
NATHAN RABELO MARTINS
Dissertação apresentada à
Universidade Federal de Viçosa, como
parte das exigências do Programa de
Pós-Graduação em Ensino de Física,
para obtenção do título de Magister
Scientiae.
_____________________________
Eduardo Nery Duarte de Araujo Orlando Pinheiro da F. Rodrigues
____________________________________
Ricardo dos Santos Ferreira
ii
AGRADECIMENTOS
LISTA DE ILUSTRAÇÕES
RESUMO
ABSTRACT
This work aims to enable the use of the Arduino platform in experimental Physics
classes, with automated data collection, by teachers from all over Brazil, including
those who do not have programming knowledge. To do so, we created an program
that facilitates the relationship between user and Arduino, enabling it to be used in a
practical, dynamic and simple way. This program, developed in the Python language,
brings a user-friendly interface allowing the experiments with Arduino, after assembly,
to be performed with just a few clicks and the insertion of some values. As mentioned,
we used the Python language for the creation of the program and made the necessary
conversation between it and the Arduino platform, based on C / C ++, through the
signature protocol. We initially enclose three separate experiments in order to cover a
large number of areas of Physics. The experiments chosen were on the simple
pendulum, charge and discharge of a capacitor and absorption of electromagnetic
radiation. Through the developed program it is possible to monitor the values read by
the sensors concomitant to the realization of the experiment. And at the end of the
readings it was also possible to visualize the results graphically without the need to
use other software or spreadsheets. This way, the software created makes the physical
phenomena inherent to the experiments more evident, leaving the results more
transparent and palpable to the users.
vi
SUMÁRIO
1 INTRODUÇÃO ......................................................................................................... 1
2 OBJETIVOS ............................................................................................................. 6
2.1 OBJETIVO GERAL ............................................................................................... 6
2.2 OBJETIVOS ESPECÍFICOS ................................................................................. 6
3 PYTHON .................................................................................................................. 7
4 ARDUINO ............................................................................................................... 10
5 METODOLOGIA..................................................................................................... 14
5.1 PÊNDULO SIMPLES........................................................................................... 17
5.2 CARGA E DESCARGA DE UM CAPACITOR ..................................................... 19
5.3 ABSORÇÃO DE RADIAÇÃO ELETROMAGNÉTICA .......................................... 21
6 CONSIDERAÇÕES FINAIS ................................................................................... 23
REFERÊNCIAS BIBLIOGRÁFICAS .......................................................................... 24
APÊNDICE: PYDUINO: LABORATÓRIO PARA O ENSINO DE FÍSICA .................. 27
1
1 INTRODUÇÃO
1
Documentação da linguagem C++ disponível em: <http://en.cppreference.com/w/>.
2
Open source ou software livre são aplicativos ou programas desenvolvidos e disponibilizados a comunidade de
forma gratuita. As pessoas além de poderem utilizar o software sem custos, podem também consultá-lo e editá-lo,
criando assim novas versões. São exemplos de open source o Linux e a linguagem de programação Python.
3
3
Documentação da biblioteca pyFirmata disponível em: <https://pyfirmata.readthedocs.io/en/latest/#>.
4
Documentação da biblioteca Matplotlib disponível em: <https://matplotlib.org/contents.html>.
5
O software desenvolvido terá código aberto, uma vez que acreditamos que
o produto criado tenha potencial para crescimento, e com a ajuda de colaboradores
ele poderá abordar muitos outros experimentos nos mais diversos ramos da Física.
Pensando nesta colaboração, precisávamos escolher uma linguagem, para
escrever o programa, que fosse bastante difundida e que os códigos fossem de fácil
entendimento. Optamos pelo Python por se tratar de uma linguagem de programação
de alto nível, por ser um programa livre de fácil portabilidade e com grande apoio da
comunidade de usuários, tendo vários módulos e bibliotecas com as mais diversas
funcionalidades. Outro motivo que nos fez optar pelo Python foi a sua estrutura de
programação que faz com que os códigos dos programas sejam facilmente
assimilados por outros usuários.
6
2 OBJETIVOS
3 PYTHON
ser chamado por programas C e C ++, pode se integrar com componentes Java e
.NET ... ” LUTZ (2013)
Lutz (2007) afirma que a linguagem Python também aumenta a
produtividade do programador primeiro, porque como já citado, não são necessários
compilamentos e em segundo pelo fato dos códigos escritos em Python serem mais
enxutos tendo cerca de 1/3 a 1/5 do tamanho dos equivalentes em C++ ou Java. Isso
implica em menos digitação, menos depuração e menos manutenção após o
desenvolvimento.
Para Pratik Desai (2015) o principal diferencial de Python é exatamente seu
vasto número de bibliotecas e módulos gratuitos, o que faz com que ele tenha uma
infinidade de aplicações, podendo trabalhar com programação funcional, imperativa,
orientada a objetos e com gerenciamento automático de memória. Sua robustez se
deve, principalmente, à contribuição da sua comunidade de usuários uma vez que,
por se tratar de um software aberto, eles podem criar novas bibliotecas e módulos
com as mais diversas funções.
Entre estas bibliotecas destacamos aqui a pyFirmata, que trabalha com o
protocolo Firmata e serve para fazer com que os códigos criados em Python possam
ser implementados em placas de prototipagem através da porta serial do computador
e que foi de fundamental importância na execução deste trabalho.
Outras bibliotecas que merecem destaque por terem sido utilizadas
programa que desenvolvemos, são a Tkinter5 e o Matplotlib. A primeira foi utilizada na
criação das interfaces gráficas do software e a segunda nas apresentações de valores
numéricos em modo gráfico. Utilizamos também dois módulos, o Os 6 e o Time7, que
foram utilizados respectivamente para abertura dos arquivos vinculados ao programa
e para contagem de tempo.
O único ponto negativo comentado pelos autores acima é quanto a
velocidade de processamento dos programas escritos em Python já que, em alguns
tipos de implementação, ela é menor que o de escritos em outras linguagens, como a
C++ por exemplo. Está redução na velocidade se deve exatamente ao fato do código
não ser compilado.
5
Documentação da biblioteca Tkinter disponível em: <https://docs.python.org/2/library/tkinter.html#module-
Tkinter>
6
Documentação do módulo Os disponível em: <https://docs.python.org/3/library/os.html>
7
Documentação do módulo Os disponível em: <https://docs.python.org/3/library/
time.html?highlight=time#module-time>
9
4 ARDUINO
8
Página principal dos desenvolvedores da Raspeberry Pi disponível em <https://www.raspberrypi.org/>.
9
Página com informações da Intel Galileo disponível em
<https://www.intel.com.br/content/www/br/pt/support/articles/000005912/boards-and-kits/intel-galileo-
boards.html>.
11
Optamos pela placa Arduino UNO, por ser a placa mais difundida no
mercado atualmente. Ela tem 14 pinos de input/output digitais, com mais 6 de entrada
analógica, trabalha com tensão de 5 V e um processador ATmega328. Outro motivo
para a escolha do Arduino é o fato dela ser compatível com uma infinidade de
módulos/sensores. Esse fato proporciona os mais diversos tipos de aplicação para
esta placa. Martinazzo, et al (2014) citam que suas aplicações se estendem inclusive
ao ensino de Física:
“No que diz respeito ao Ensino de Física, tem grande aplicabilidade, pois é possível
ler dados de qualquer fenômeno físico detectável por sensores, ou seja, basicamente
é um sistema que lê sinais elétricos em sensores expostos ao ambiente a partir de
suas portas digitais e analógicas. ”
Acreditamos que, mesmo em experimentos para fins didáticos, é
necessário que haja um mínimo de precisão nos resultados, para que os fenômenos
fiquem claros, conciliando assim a teoria e a prática e facilitando o estabelecimento
das relações quantitativas, acreditamos que experimentos realizados por estudantes
cujo resultado tenha grande margem de erro faz com que eles criem uma descrença
com relação a teoria. Os resultados obtidos com o Arduino têm sido promissores:
Cavalcante, et al (2011) conseguiram resultados semelhantes aos feitos por
equipamentos tradicionais nos experimentos de carga e descarga de um capacitor.
Martinazzo, et al (2014) e Moraes, et al (2017) por sua vez, citam
experimentos de aceleração, movimento uniformemente variado, oscilações,
resfriamento, evaporação e queda dos corpos. Já Fernandes, et al (2014) utilizaram o
Arduino nos estudos da eletrodinâmica.
Ainda segundo Moraes, et al (2017), outra vantagem dos protótipos usando
Arduino sobre os kits feitos por empresas é que estes últimos são muitas vezes
engessados, ficando restritos a um único objetivo. Os protótipos com Arduínos
possuem mais liberdade de modificação, podendo ser alterados conforme a
curiosidade do usuário.
Uma limitação da placa Arduino foi citada por Martinazzo, et al (2014),
sendo relacionada ao fato dela sozinha não permitir o processamento de dados para
apresentação gráfica. Eles contornam o problema tratando os dados em planilhas
eletrônicas, assim como fizeram Moraes, et al (2017). Cavalcante, et al (2011)
utilizaram um outro software, o Processing10, para tratar os dados coletados e
construir os respectivos gráficos, tudo em tempo real.
10
Página principal do Processing disponível em <https://processing.org/>.
13
5 METODOLOGIA
Figura 5: Gráfico do experimento de absorção de radiação eletromagnética, com placas preta e branca e tempo
de coleta de 10 minutos.
Fonte: Autor.
utilizado e o período experimental obtido cada vez que o experimento é feito. Esses
dados são mostrados na tela do programa e o usuário possui liberdade para gerar o
gráfico relacionado clicando no botão correspondente. É também possível apagar
alguns dados caso isso seja necessário. Segue uma imagem extraída do software,
onde o histórico do experimento está mostrado no lado direito da tela.
Figura 9: Gráfico do experimento carga e descarga de um capacitor com 2 ciclos de carga e descarga e utilizando
um resistor de 4.7 KΩ e um capacitor de 20µF.
Fonte: Autor.
11
Informações da biblioteca OneWire disponível em <https://playground.arduino.cc/Learning/OneWire>.
12
Documentação da biblioteca DallasTempeture disponível em <https://www.arduinolibraries.info/libraries/dallas-
temperature>.
22
6 CONSIDERAÇÕES FINAIS
REFERÊNCIAS BIBLIOGRÁFICAS
BRUIJN, Tino de. pyFirmata 1.0.3: A Python interface for the Firmata procotol.
Disponível em: <https://pypi.python.org/pypi/pyFirmata>. Acesso em: 25 mai. 2017.
LUTZ, Mark. Learning Python. 5. ed. Sebastopol: O'reilly Media, 2013. 1540 p.
Meriat, Vitor. Programando seu Arduino com Visual Studio. 2015. Disponível em:
<http://www.vitormeriat.com.br/2015/07/12/programando-seu-arduino-com-visual-
studio/>. Acesso em: 27 mai. 2018.
27
RESUMO
SUMÁRIO
1 APRESENTAÇÃO .................................................................................................. 30
2 TEXTOS DE APOIO PARA OS USUÁRIOS. ......................................................... 34
2.1 LEIA-ME ANTES DE UTILIZAR O APLICATIVO PYDUINO ............................... 34
2.2 DICAS PARA A PRIMEIRA UTILIZAÇÃO DO APLICATIVO PYDUINO ............. 37
2.3 DESCOBRINDO QUAL A PORTA DE COMUNICAÇÃO GERADA PARA O SEU
ARDUINO .................................................................................................................. 42
2.4 TEXTO DE APOIO PARA O EXPERIMENTO PÊNDULO SIMPLES .................. 44
2.5 TEXTO DE APOIO PARA O EXPERIMENTO CARGA E DESCARGA DE UM
CAPACITOR ............................................................................................................. 51
2.6 TEXTO DE APOIO PARA O EXPERIMENTO ABSORÇÃO DE RADIAÇÃO
ELETROMAGNÉTICA ............................................................................................... 57
3 TEXTOS MATERIAIS NECESSÁRIOS .................................................................. 65
3.1 PÊNDULO SIMPLES........................................................................................... 65
3.2 CARGA E DESCARGA DE UM CAPACITOR ..................................................... 68
3.3 EMISSÃO E ABSORÇÃO DE RADIAÇÃO ELETROMAGNÉTICA ..................... 71
4 IMAGENS DAS MONTAGENS ELETRÔNICAS .................................................... 76
4.1 PÊNDULO SIMPLES........................................................................................... 76
4.2 CARGA E DESCARGA DE UM CAPACITOR ..................................................... 77
4.3 ABSORÇÃO DE RADIAÇÃO ELETROMAGNÉTICA .......................................... 77
5 CÓDIGO DO SOFTWARE PYDUINO .................................................................... 78
30
1 APRESENTAÇÃO
listas, em sua integridade, estão na seção 3 deste trabalho. Ao clicar sobre o botão
Esquema de montagem, será aberto um arquivo PDF mostrando como deverão ser
feitas as ligações na placa Arduino. Estes esquemas compõe a seção 4. Se o usuário
escolher a opção Texto de apoio, então será aberto um arquivo PDF com um texto
detalhado sobre o experimento escolhido com explicações sobre os fenômenos e
dicas de utilização. Estes textos fazem parte da seção 2, sendo o tópico 2.4 para o
experimento de pêndulo simples, o tópico 2.5 para a prática de carga e descarga de
um capacitor e o tópico 2.6 para o experimento de absorção de radiação
eletromagnética.
Todos estes textos são de leitura opcional. Caso o usuário já tenha
conhecimento de como funciona a prática e já esteja com toda a montagem pronta ele
poderá acessar diretamente o menu de configuração do experimento clicando sobre
o botão com este nome.
Para todos os experimentos será necessário informar qual a porta de
comunicação utilizada, uma vez que o software se comunicará com o Arduino através
dela. Essa informação deverá ser fornecida em todos os casos no menu de
configuração de experimento. Segue abaixo o menu do experimento carga e descarga
de um capacitor para servir de ilustração.
Será aberta uma nova janela. Nela clique na setinha mostrada abaixo e
espere até que o código seja compilado no Arduino.
Pronto! Agora é sua placa de Arduino está pronta para ser utilizada em
qualquer prática do PyDuino.
42
A Montagem:
Configurando o Experimento:
A Realização do Experimento:
comprimento do fio e g a aceleração da gravidade local. Cabe frisar que esta equação
é válida apenas para pequenos ângulos de oscilação. Assim, é importante que, ao
realizar o experimento, se utilize sempre pequenos ângulos de aberturas.
Led
Parafuso
capacitor está sendo carregado pela fonte V. Ao passar a chave para a posição b, a
fonte é desligada e o capacitor passa a alimentar o circuito sendo assim descarregado.
realização do experimento. Outra vantagem é que após o término dos ciclos de carga
e descarga previamente estabelecidos por você, será possível visualizar os resultados
de forma gráfica. Os gráficos exibidos serão da tensão, da carga nas placas do
capacitor e da corrente no circuito, sendo estes dois últimos frutos de cálculos
baseados em resistores ôhmicos.
A Montagem:
O que faz com que o circuito esteja hora carregando o capacitor e hora o
descarregando é a porta digital A2 do Arduino. É ela que faz o papel da chave do
circuito RC.
Uma porta digital só trabalha com dois tipos de valores: 1 (HIGH) ou 0
(LOW). O sinal 1 (HIGH), para este tipo de porta, é análogo à posição ligada da chave
do circuito RC, ou seja, a porta fornece tensão ao circuito carregando o capacitor.
Quando o capacitor está próximo de sua carga máxima, o software é programado para
mudar o sinal da porta para 0 (LOW) automaticamente. Assim a porta não fornece
mais diferença de potencial ao circuito, funcionando como a posição desligada da
chave do circuito RC. Nessa posição o capacitor será descarregado.
O software, ao reconhecer que o capacitor está com tensão em seus polos
próximo a zero, faz a mudança automaticamente do sinal da porta para 1 (HIGH).
Neste momento é completado um ciclo de carga e descarga do capacitor. Este
procedimento será repetido até que o número de ciclos preestabelecidos pelo usuário
sejam atingidos.
Configurando o Experimento:
A Realização do Experimento:
Experimento Absorção
de Radiação Eletromagnética
Trocas de Calor:
A Montagem:
Caso você não esteja familiarizado com o uso de protoboard, cabe aqui
uma breve explicação. As duas primeiras e duas últimas fileiras da placa tem os furos
conectados verticalmente. Estas estão representadas no esquema abaixo pelas cores
azul e vermelho. Elas geralmente são utilizadas para distribuir o polo positivo e
negativo. Neste caso utilizamos a protoboard apenas para fazer esta distribuição,
usamos o fio vermelho para distribuir o polo positivo (5V) e o fio preto para distribuir o
negativo (GND). Já os demais furos são conectados horizontalmente de 5 em 5,
representadas no esquema abaixo pela cor verde, neste experimento não utilizamos
nenhum destes campos.
60
com que ele consiga leituras mais próximas às temperaturas das placas. Depois de
prendê-lo, coloque um pedaço de isopor atrás do sensor, afim de isolá-lo
termicamente.
Pinte cada placa de uma cor diferente. Inicialmente sugerimos que utilize
uma branca e outra preta já que o fenômeno será mais evidente. E agora basta colocar
a lâmpada a mesma distância das duas placas metálicas para realizar o experimento.
Configurando o Experimento:
A Realização do Experimento:
Material Necessário
Experimento
Pêndulo Simples
Material Necessário
Experimento
Carga e Descarga de um Capacitor
01 Arduino Uno;
01 Protoboard;
70
01 Capacitor (sugerimos que não utilize modelos com mais de 100 micro
farads);
Material Necessário
Experimento
Absorção de Radiação
Eletromagnética
01 Arduino Uno;
01 Protoboard;
#criando frame
frame = tk.Frame(janela, bg='white')
frame.pack()
#criando logo
img_logo = tk.PhotoImage(file='Componentes/Logo Imagem.gif').subsample(1, 2)
logo = tk.Label(frame, image=img_logo, bg='white')
logo.pack()
Imagem.gif').subsample(8, 10)
botao_iniciar = tk.Button(janela, image=img_comecar, cursor='hand2',
command=iniciar_menu_principal, bg='white')
botao_iniciar.place(x=950, y=550)
for i in elementos:
i.destroy()
menu_experimento('Componentes/Capacitor Imagem.gif', 'Carga e Descarga de
um Capacitor', 'Componentes\Capacitor Material.pdf',
'Componentes\Capacitor Montagem.pdf', 'Componentes\Capacitor
Texto Auxilio.pdf', 2)
#criando fundo
img_preenchimento = tk.PhotoImage(file='Componentes/Imagem
Complementar2.png').subsample(1, 1)
container1 = tk.Label(janela, image=img_preenchimento)
container1.place(x=0, y=0)
container2 = tk.Label(janela, image=img_preenchimento)
container2.place(x=725, y=0)
# criando logo
img_logo = tk.PhotoImage(file='Componentes/Logo Imagem.gif').subsample(1, 2)
logo = tk.Label(janela, text='Menu Principal', font=('Arial', 25, 'bold'),
image=img_logo,
compound='top')
logo.pack()
# criando botão1
img_pendulo = tk.PhotoImage(file='Componentes/Pendulo
Imagem.gif').subsample(3, 7)
botao1 = tk.Button(janela, text='Pêndulo Simples', font=('Arial', '16'),
image=img_pendulo,
compound='top', bg='#b5b5b5', cursor='hand2',
command=pendulo)
botao1.place(x=190, y=200)
# criando botão 2
img_radiacao = tk.PhotoImage(file='Componentes/Radiacao
Imagem.gif').subsample(3, 7)
botao2 = tk.Button(janela, text='Absorção de Radiação', font=('Arial', '16'),
image=img_radiacao,
81
# criando botão 3
img_capacitor = tk.PhotoImage(file='Componentes/Capacitor
Imagem.gif').subsample(3, 7)
botao3 = tk.Button(janela, text='Carga e Descarga de um capacitor', font=('Arial',
'16'),
image=img_capacitor, compound='top', bg='#b5b5b5',
cursor='hand2', command=capacitor)
botao3.place(x=750, y=200)
# criando botão 4
img_exp_4 = tk.PhotoImage(file='Componentes/Experimento4
Imagem.gif').subsample(3, 7)
botao4 = tk.Button(janela, text='Experimento 4', font=('Arial', '16'),
image=img_exp_4,
compound='top', bg='#b5b5b5', cursor='hand2')
botao4.place(x=750, y=400)
menu_conf_rad()
# criando logo
img_logo = tk.PhotoImage(file=img).subsample(2, 5)
logo = tk.Label(janela, text=texto, font=('Arial', 20, 'bold'), image=img_logo,
compound='top')
logo.pack()
# criando botão1
img_componentes = tk.PhotoImage(file='Componentes/Componentes
Imagem.gif').subsample(10, 12)
botao1 = tk.Button(janela, text=' Material necessário ', font=('Arial', '16'),
image=img_componentes,
compound='left', bg='#b5b5b5', cursor='hand2',
command=abre_material)
botao1.pack()
# criando botão2
img_montagem = tk.PhotoImage(file='Componentes/Montagem
Imagem.gif').subsample(10, 12)
botao2 = tk.Button(janela, text='Esquema de montagem', font=('Arial', '16'),
image=img_montagem,
compound='left', bg='#b5b5b5', cursor='hand2',
command=abre_montagem)
botao2.pack()
# criando botão3
img_texto = tk.PhotoImage(file='Componentes/Texto Imagem.gif').subsample(10,
12)
botao3 = tk.Button(janela, text=' Texto de apoio ', font=('Arial', '16'),
image=img_texto,
compound='left', bg='#b5b5b5', cursor='hand2',
command=abre_texto)
botao3.pack()
# criando botão4
img_exp = tk.PhotoImage(file='Componentes/Experimento
Imagem.gif').subsample(10, 12)
botao4 = tk.Button(janela, text=' Experimento ', font=('Arial', '16'),
image=img_exp,
compound='left', bg='#b5b5b5', cursor='hand2',
command=experimento)
botao4.pack()
def menu_conf_pend():
var1 = tk.IntVar()
marcador1 = tk.Checkbutton(frame, text=medidas[0], font=('Arial', '12', 'bold'),
height=1, variable=var1,
onvalue=1, offvalue=0)
marcador1.pack()
var2 = tk.IntVar()
marcador2 = tk.Checkbutton(frame, text=medidas[1], font=('Arial', '12', 'bold'),
height=1, variable=var2,
onvalue=1, offvalue=0)
marcador2.pack()
var3 = tk.IntVar()
marcador3 = tk.Checkbutton(frame, text=medidas[2], font=('Arial', '12', 'bold'),
height=1, variable=var3,
onvalue=1, offvalue=0)
marcador3.pack()
var4 = tk.IntVar()
marcador4 = tk.Checkbutton(frame, text=medidas[3], font=('Arial', '12', 'bold'),
height=1, variable=var4,
onvalue=1, offvalue=0)
marcador4.pack()
var5 = tk.IntVar()
marcador5 = tk.Checkbutton(frame, text=medidas[4], font=('Arial', '12', 'bold'),
height=1, variable=var5,
onvalue=1, offvalue=0)
85
marcador5.pack()
var6 = tk.IntVar()
marcador6 = tk.Checkbutton(frame, text=medidas[5], font=('Arial', '12', 'bold'),
height=1, variable=var6,
onvalue=1, offvalue=0)
marcador6.pack()
var7 = tk.IntVar()
marcador7 = tk.Checkbutton(frame, text=medidas[6], font=('Arial', '12', 'bold'),
height=1, variable=var7,
onvalue=1, offvalue=0)
marcador7.pack()
var8 = tk.IntVar()
marcador8 = tk.Checkbutton(frame, text=medidas[7], font=('Arial', '12', 'bold'),
height=1, variable=var8,
onvalue=1, offvalue=0)
marcador8.pack()
var9 = tk.IntVar()
marcador9 = tk.Checkbutton(frame, text=medidas[8], font=('Arial', '12', 'bold'),
height=1, variable=var9,
onvalue=1, offvalue=0)
marcador9.pack()
var10 = tk.IntVar()
marcador10 = tk.Checkbutton(frame, text=medidas[9], font=('Arial', '12', 'bold'),
height=1, variable=var10,
onvalue=1, offvalue=0)
marcador10.pack()
global marcadores
marcadores = [marcador1, marcador2, marcador3, marcador4, marcador5,
marcador6, marcador7, marcador8, marcador9,
marcador10]
frame.update()
#emite uma janela de aviso caso o programa apresente algum erro na porta de
comunicação.
try:
# cálculo período teórico
global periodo_teorico
periodo_teorico = 2 * 3.14159 * (float(comprimento) / 9.78) ** 0.5 # cálculo
do período teórico:
except:
aviso('Comprimento inválido,\n '
'favor informe apenas números')
#emite uma janela de aviso caso o programa apresente algum erro na porta de
comunicação.
try:
global placa
placa = pf.Arduino(porta)
for i in elementos:
i.destroy()
monitoramento_pendulo()
except:
aviso('Porta de comunicação informada inválida,\n '
'favor verificar qual a porta de comunicação \n'
'que o Arduino está conectado')
for linha in arquivo1: # trabalhando com cada linha do arquivo por vez.
termo = linha.split() # cada vez que há um espaço na linha, gera se uma nova
string, chamada de termo.
x = float(termo[0])
y = float(termo[1])
periodos.append(y), comprimentos.append(x)
arquivo1.close()
medidas = []
for x in range(10):
if x < len(periodos):
texto = 'Medida {} : T = {:.2f} e L = {:.2f}'.format((x+1), periodos[x],
comprimentos[x])
else:
texto = 'Medida {} : T = eL= '.format(x+1)
medidas.append(texto)
cria_marcadores()
botao_grafico.place(x=820, y=580)
janela.mainloop()
sensor = placa.get_pin('d:9:i')
oscilacao_completa = 0
limitador = 5
contador = 0
lista = []
resultados = '\n'
botao_começar.destroy()
texto_resultados.config(text='Aguardando lançamento!')
botao_grafico.config(command=grafico_periodos)
janela.update()
while oscilacao_completa < int(num_periodos):
detecta = bool(sensor.read())
if detecta == False:
contador += 1
tempo = time.time()
if contador == 3:
t0 = tempo
elif contador == limitador:
periodo = tempo - t0
t0 = tempo
limitador += 2
90
janela.mainloop()
# criando frame
frame = tk.Frame(janela, bg='white')
frame.pack()
# criando logo
91
# criando botões
img_exp = tk.PhotoImage(file='Componentes/Iniciar Imagem.gif').subsample(10,
12)
botao_começar = tk.Button(janela, image=img_exp, cursor='hand2',
text='Começar', compound='top',
font=('Arial', '10', 'bold'), bg='#b5b5b5',
command=pendulo_comecou)
botao_começar.place(x=470, y=600)
img_graf = tk.PhotoImage(file='Componentes/Grafico Imagem.gif').subsample(10,
12)
botao_grafico = tk.Button(janela, text='Gráfico', image=img_graf, compound='top',
font=('Arial', '10', 'bold'), bg='#b5b5b5')
botao_grafico.place(x=615, y=600)
img_voltar = tk.PhotoImage(file='Componentes/Voltar
Imagem2.gif').subsample(10, 12)
botao_voltar = tk.Button(janela, text='Voltar', image=img_voltar, compound='top',
font=('Arial', '10', 'bold'),
command=voltar, bg='#b5b5b5')
botao_voltar.place(x=760, y=600)
elementos = [frame, botao_grafico, botao_começar, botao_voltar]
janela.mainloop()
def voltar():
for i in elementos:
i.destroy()
menu_principal()
try:
global placa
placa = pf.Arduino(porta)
for i in elementos:
i.destroy()
monitoramento_capacitor()
except:
aviso('Porta de comunicação informada inválida,\n '
'favor verificar qual a porta de comunicação \n'
'que o Arduino está conectado')
#criando campo para informar quantas ciclos de carga e descarga serão medidos
texto_ciclos = tk.Label(janela, text='Quantos ciclos de carga e descarga devem
ser medidos?',
font=('Arial', '16', 'bold'), justify='center')
93
texto_ciclos.place(x=355, y=215)
define_ciclos = tk.Scale(janela, from_=0, to=10, orient=tk.HORIZONTAL,
font=('Arial', '12', 'bold'))
define_ciclos.place(x=595, y=255)
janela.mainloop()
plt.subplot(3, 1, 2)
plt.plot(periodos, corrente_circuito) # criando gráfico
plt.title('Experimento Carga e Descarga de um Capacitor')
plt.xlabel('Tempo (s)')
plt.ylabel('Corrente no Circuito(A)')
plt.subplot(3, 1, 3)
plt.plot(periodos, carga_capacitor) # criando gráfico
plt.title('Experimento Carga e Descarga de um Capacitor')
plt.xlabel('Tempo (s)')
plt.ylabel('Carga Armazenada (A)')
plt.tight_layout()
plt.show()
botao_grafico.config(command=graficos)
fonte = placa.get_pin('d:2:o')
leitor = placa.get_pin('a:0:i')
x=0
ciclos_medidos = 0
ciclos2 = int(num_ciclos)*2
tempo_total = 0
fonte.write(1)
fonte_status = 'ligada'
95
time.sleep(2)
corrente_circuito = []
tensao = []
carga_capacitor = []
periodos = [0]
while ciclos_medidos < ciclos2:
tempo = time.time()
leitura = leitor.read() * 5 # a leitura retornada do sensor da um valor entre 0 e
1,
# como a fonte do arduíno é de 5v, fazemos a converção
corrente = (5 - leitura) / float(resistencia)
carga = float(capacitancia) * leitura
tensao.append(leitura)
corrente_circuito.append(corrente)
carga_capacitor.append(carga)
if x == 0:
texto_resultados.config(text='Em 0.00s\n a tensão no capacitor é {:.3f} V,\n'
'a corrente elétrica no circuito é {:.3f} mA\n'
'a carga armazenada no capacitor é {:.3f}
uC'.format(leitura,
corrente, carga))
t0 = tempo
x += 1
else:
periodo = tempo - t0
tempo_total += periodo
periodos.append(tempo_total)
t0 = tempo
texto_resultados.config(text='Em {:.2f}s\n a tensão no capacitor é {:.3f}
V,\n'
'a corrente elétrica no circuito é {:.3f} mA\n'
'a carga armazenada no capacitor é {:.3f}
uC'.format(tempo_total,
leitura, corrente, carga))
if leitura == 4.980 or leitura == 0.010:
if fonte_status == 'ligada':
fonte_status = 'desligada'
fonte.write(0)
else:
fonte_status = 'ligada'
fonte.write(1)
ciclos_medidos += 1
frame.update()
time.sleep(0.5)
texto_resultados.config(text='Em {:.2f}s\n a tensão no capacitor é {:.3f} V,\n'
'a corrente elétrica no circuito é {:.3f} mA\n'
'a carga armazenada no capacitor é {:.3f} uC\n\n'
'EXPERIMENTO FINALIZADO!\n'
'Click em GRÁFICOS!'.format(tempo_total,leitura,
corrente, carga))
96
placa.exit()
# criando frame
frame = tk.Frame(janela, bg='white')
frame.pack()
# criando logo
img_mon = tk.PhotoImage(file='Componentes/Monitora Imagem.gif').subsample(3,
6)
texto = tk.Label(frame, text='Resultados medidos:', image=img_mon,
compound='top', font=('Arial', '20'),
bg='#b5b5b5')
texto.pack()
# criando botões
img_exp = tk.PhotoImage(file='Componentes/Iniciar Imagem.gif').subsample(10,
12)
botao_começar = tk.Button(janela, image=img_exp, cursor='hand2',
text='Começar', compound='top',
font=('Arial', '10', 'bold'), bg='#b5b5b5',
command=capacitor_comecou)
botao_começar.place(x=470, y=500)
img_graf = tk.PhotoImage(file='Componentes/Grafico Imagem.gif').subsample(10,
12)
botao_grafico = tk.Button(janela, text='Gráfico', image=img_graf, compound='top',
font=('Arial', '10', 'bold'), bg='#b5b5b5')
botao_grafico.place(x=615, y=500)
img_voltar = tk.PhotoImage(file='Componentes/Voltar
Imagem2.gif').subsample(10, 12)
botao_voltar = tk.Button(janela, text='Voltar', image=img_voltar, compound='top',
font=('Arial', '10', 'bold'),
command=voltar, bg='#b5b5b5')
botao_voltar.place(x=760, y=500)
elementos = [frame, botao_grafico, botao_começar, botao_voltar]
janela.mainloop()
97
try:
global placa
placa = pf.Arduino(porta)
for i in elementos:
i.destroy()
monitoramento_radiacao()
except:
aviso('Porta de comunicação informada inválida,\n '
'favor verificar qual a porta de comunicação \n'
'que o Arduino está conectado')
# criando campos para informar qual a cor dos corpos utilizados na montagem
#primeira placa
texto_cor1 = tk.Label(janela, text='Qual a cor da primeira placa?(Conectada na
porta A1)',
font=('Arial', '16', 'bold'), justify='center')
texto_cor1.place(x=355, y=330)
define_cor1 = tk.Entry(janela, bd=5, font=('Arial', '12', 'bold'), justify='center')
define_cor1.place(x=565, y=370)
#segunda placa
texto_cor2 = tk.Label(janela, text='Qual a cor da segunda placa?(Conectada na
porta A2)',
font=('Arial', '16', 'bold'), justify='center')
texto_cor2.place(x=355, y=410)
define_cor2 = tk.Entry(janela, bd=5, font=('Arial', '12', 'bold'), justify='center')
define_cor2.place(x=565, y=450)
janela.mainloop()
#configurando eixo 2
plt.plot(periodos, leituras2, color='red', label='{}'.format(cor2))
plt.ylim([0, 70])
plt.title('Experimento Absorção de Radiação Eletromagnética')
plt.grid(True)
plt.xlabel('Tempo (s)')
plt.ylabel('Temperatura (ºC)')
plt.legend()
plt.show()
botao_grafico.config(command=graficos)
sensor1 = placa.get_pin('a:1:i')
sensor2 = placa.get_pin('a:2:i')
else:
periodo = tempo - t0
tempo_total += periodo
periodos.append(tempo_total)
t0 = tempo
texto_resultados.config(text='Em {:.2f}s\n a temperatura na placa {} é
{:.2f}ºC e\n'
'a temperatura na placa {} é {:.2f}ºC'.format(tempo_total,
cor1,
temperatura1, cor2, temperatura2))
frame2.update()
time.sleep(0.3)
texto_resultados.config(text='Em {:.2f}s\n a temperatura na placa {} é {:.2f}ºC
e\n'
'a temperatura na placa {} é {:.2f}ºC\n\n'
'EXPERIMENTO FINALIZADO!\n'
'Click em GRÁFICOS!'.format(tempo_total,
cor1,temperatura1, cor2,
temperatura2))
placa.exit()
# criando frame
frame = tk.Frame(janela, bg='white')
frame.pack()
# criando logo
img_mon = tk.PhotoImage(file='Componentes/Monitora Imagem.gif').subsample(3,
6)
texto = tk.Label(frame, text='Resultados medidos:', image=img_mon,
compound='top', font=('Arial', '20'),
bg='#b5b5b5')
texto.pack()
101
janela_inicial()