Professional Documents
Culture Documents
Projeto Final - p1
Projeto Final - p1
CURITIBA 2019
1. INTRODUÇÃO SOBRE O FUNCIONAMENTO DO ROTARY ENCODER
ÓPTICO: é utilizada uma cabeça de leitura fixa que inclui uma fonte luminosa
(LED infravermelho) e, um receptor fotodetector (fototransistor ou fotodiodo) que emite
luz através de fendas em um disco de metal ou vidro. Versões reflexivas também
existem. Essa é uma das tecnologias mais comuns.
ENCODER ÓPTICO:
Disco de
Disco de Disco de Disco de
resolução de Disco de resolução
resolução de 32 resolução de 64 resolução de 128
16 de 516 pulsos/volta
pulsos/volta pulsos/volta pulsos/volta
pulsos/volta
Princípio de funcionamento dos encoders por reflexão.
O disco absoluto na figura acima possui quatro saídas, fornecendo um código binário
exclusivo para cada segmento do disco, dezesseis nesse caso (conforme
demonstrado na tabela abaixo). Uma alternativa ao código binário é o código cinza,
que é um código binário em que palavras binárias adjacentes diferem apenas por uma
transição de bit único.
Número do Setor Faixa Setorial (em graus) Código Binário
1 22.5 - 45 0001
2 45 - 67.5 0010
3 67.5 - 90 0011
4 90 - 112.5 0100
O terceiro sinal do encoder, o sinal O ou Z ou I, tem por objetivo indicar a posição "0"
(zero) do encoder, com essa informação é possível detectar o número de voltas completas
que o dispositivo acoplado ao encoder gerou.
Disco de resolução de 32 Disco de resolução de
pulsos/volta, sem sinal de sincronismo 32 pulsos/volta, com sinal de sincronismo
Os principais problemas dos encoders ópticos são provenientes de partículas de
sujeira e/ou efeitos devidos a vibrações e, os encoders ópticos incrementais ainda tem
uma desvantagem adicional que é a necessidade de contadores externos para
determinar o ângulo absoluto para uma dada rotação. Na prática, um encoder
incremental de posição pode ser formado por uma régua linear, ou por um disco de
baixa inércia, interfaceado a um dispositivo cuja posição deve ser determinada.
9505
9513
9517
9512
9509
9510
9507
9503
9505
9502
9510
9507
9510
9506
9510
9509
9511
9514
9512
9515
9516
9516
9521
9512
9506
9521
9528
9522
9512
9516
9513
9518
9515
9507
9511
9507
9505
9505
9505
9502
9509
9506
9510
9508
9508
9510
9512
9513
9512
9512
9515
9522
9515
9503
9522
9525
9527
9522
9519
9520
Código de calibração
import numpy as np
import matplotlib.pyplot as plt
import json
from matplotlib.ticker import MultipleLocator
import scipy
from scipy import interpolate
from scipy import stats
from scipy.stats import norm
import csv
def get_data(file):
data = list()
with open(file, 'r') as f:
reader = csv.reader(f)
for row in reader:
for i in range(0, len(row)):
data.append(float(row[i]))
f.close()
return data
results = np.array(get_data('medidas.csv'))
# calculando a média
# desvio da média
print("Mean: {:.2f}".format(mean))
b0 = 0
b1 = 75 / mean
calibration_deviation = reg_y(deviation)
wbin_edges = list()
bin_edges = np.array(wbin_edges)
hist = whist
rv_x_confidence_interval = np.arange(c_interval[0],
c_interval[1],
abs(c_interval[0] - c_interval[1]) / 100)
#: histograma
plt.clf()
plt.bar(bin_edges,
hist,
color='#a4c0f4',
edgecolor="#000000",
width=bin_width,
linewidth=0.1,
align='center',
label="Histograma")
plt.plot(rv_x,
rv_values,
linestyle="dashed",
color='#000000',
label="Distribuição")
plt.plot(rv_x_confidence_interval,
rv_values_confidence_interval,
color="#000000")
plt.fill_between(rv_x_confidence_interval,
0,
rv_values_confidence_interval,
facecolor='#4a84ef',
label="Intervalo de confiança (95%)")
plt.ylabel("Frequência do Intervalo")
plt.show()
#: calibração
yp = calibration_deviation
wbin_edges = list()
bin_edges = np.array(wbin_edges)
hist = whist
rv_x_confidence_interval = np.arange(c_interval[0],
c_interval[1],
abs(c_interval[0] - c_interval[1]) / 100)
#: histograma
plt.clf()
plt.bar(bin_edges,
hist,
color='#a4c0f4',
edgecolor="#000000",
width=bin_width,
linewidth=0.1,
align='center',
label="Histograma")
plt.plot(rv_x,
rv_values,
linestyle="dashed",
color='#000000',
label="Distribuição")
plt.plot(rv_x_confidence_interval,
rv_values_confidence_interval,
color="#000000")
plt.fill_between(rv_x_confidence_interval,
0,
rv_values_confidence_interval,
facecolor='#4a84ef',
label="Intervalo de confiança (95%)")
plt.ylabel("Frequência do Intervalo")
plt.show()
print(reg_y)
Curva de calibração normalizada, com intervalo de confiança de 95%
(altura padrão do elevador de 75cm)
REFERÊNCIAS:
https://www.embarcados.com.br/condicionamento-de-sinais-analogicos/
https://www.hitecnologia.com.br/blog/o-que-%C3%A9-encoder-para-que-serve-
como-escolher-como-interfacear/
https://www.digikey.ca/en/articles/techzone/2018/dec/how-to-use-rotary-
encoders-convert-mechanical-rotation-digital-signals
https://www.solidswiki.com/index.php?title=Absolute_Encoders
Figura 6 -
Esquema elétrico do ARDUINO UNO com as entradas analógicas em destaque
Na Figura 7 pode-se observar um resumo das principais
especificações do conversor A/D do ATMEGA328. Note que o
conversor tem 10 bits de resolução, uma precisão de 8 bits e taxa
máxima de amostragem de 76,9 kSPS (kiloAmostras por segundo - 8
bits).