Escolar Documentos
Profissional Documentos
Cultura Documentos
Pró-Reitoria de Pesquisa
Coordenadoria dos Projetos de Iniciação Científica e Tecnológica
1
1. IDENTIFICAÇÃO
E-mail: fywatanabe@ufscar.br
Telefone: (16) 3351-9703 ou (19) 99774-4789
RA: 800676
Curso: Engenharia Mecânica
E-mail: matheus.markies@estudante.ufscar.br
Telefone: (14) 98142-2072
2
2. RESUMO DO PLANO INICIAL
3
3. INTRODUÇÃO
(a) Strain gages alinhados a ±45º (b) Strain gge duplo e inclinado
Fonte: (a) HBK (2022); (b) FUTEK (2022)
5
estas alternativas apresentam problemas de custo elevado e massas adicionais
desbalanceadas que podem comprometer o funcionamento do sensor, especialmente
em altas rotações.
7
Figura 6 - Sensores ótico de torque com faixas únicas
8
4. METODOLOGIA
9
Figura 8 - Protótipo inicial com faixas coloridas e sensores óticos
10
menor que 6. O mesmo ocorre se fosse um pico de vermelho e um pouco de verde, o
ângulo não seria 6, mas maior que 6 pois a faixa verde está do lado contrário a faixa
azul. Esse valor maior ou menor que 6, é possível de ser calculado com base na
diferença entre os valores das cores, que já foi implementado no projeto. O problema
desses sensores de cores é justamente a velocidade de leitura e a precisão de sua
leitura.
Dessa forma, foi encontrado o sensor TCS34725 que está trabalhando para
baixas velocidades, mas com uma precisão um pouco distante do que é preciso ao
detectar mudanças de faixa, isso também está sendo causado pela baixa velocidade
de resposta dele que está em 2,4 ms. A velocidade almejada ao realizar os próximos
testes é algo em torno de 44 rpm , que é a velocidade dos motores do protótipo que
foi criado. Foi calculado que para um eixo com 60 trilhas, cada trilha vai ocupar um
arco de 6 graus e para cada trilha o sensor terá que ser capaz de realizar 90 leituras,
então será possível traçar uma média móvel com um offset definido para 10, ou seja
em 90 leituras teremos 9 valores válidos, que serão posteriormente processados no
programa. Então é necessário um sensor que tenha velocidade de leitura de 0,25 ms
ou 34 KHz, valor esse calculado a partir das condições de contorno estabelecidas de
90 leituras por faixa para que seja possível usar um filtro de média móvel para cada 9
leituras, e assim ter 10 leituras efetivas.
Abordando mais detalhes sobre o Filtro Média Móvel (FMM), se possuirmos
um conjunto de dados com ruído, e esse conjunto possuir , por exemplo 100 dados,
podemos diminuir o ruído dos dados calculando a média em um intervalo fixo para
todas as amostras de dados do conjunto. Ou seja, calcular a média de 10 em 10
amostras e no fim ter uma lista de dados de 10 amostras com ruído reduzido.
Após todas as considerações serem feitas uma pesquisa por sensores mais
rápidos foi feita, e logo constatou-se que não seria viável o projeto colorido, mesmo
considerando todas suas vantagens.
Após a identificação dessa limitação um novo modelo de sensor foi procurado,
um sensor analógico preto e branco. O fato dele ser analógico indica que ele pode
realizar teoricamente um número infinito de leituras em um espaço de tempo muito
curto, sendo limitado apenas pelo ADC (Conversor Analógico Digital) do
microcontrolador escolhido.
O ADC ou Conversor Analógico-Digital, é um componente essencial em
eletrônica que desempenha um papel fundamental na interface entre o mundo
11
analógico e o mundo digital. Sua principal função é converter sinais analógicos, que
variam continuamente no tempo, em sinais digitais discretos, que podem ser
processados por microcontroladores. Os microcontroladores não conseguem ler
sinais analógicos diretamente porque sua arquitetura interna e seu funcionamento são
baseados em processamento digital, que lida com valores binários, 0(desligado) e 1
(ligado).
Os microcontroladores utilizam ADCs para permitir a aquisição de dados de
sensores e dispositivos que geram sinais analógicos, como temperatura, pressão, luz,
som e muitos outros parâmetros físicos. Com esses sinais analógicos em formato
digital, os microcontroladores podem processar e analisar essas informações.
O Arduino possui um ADC com velocidade de leitura de 15 mil amostras por
segundo ou 15KHz de velocidade de leitura. Ainda abaixo do valor teórico calculado.
Por esse motivo, além dos sensores analógicos ópticos (CNY70) foi implementado um
ADC externo, o MCP3002. Esse dispositivo é capaz de ler os sinais analógicos,
convertê-los para digitais e enviá-los para o Arduino através de comunicação I2C. A
velocidade de leitura do MCP3002 é de 100 mil amostras por segundo, ou seja, 100
kHz de velocidade de leitura nas configurações mais baixas.
12
valor inicial após a carga ser retirada do torquímetro, no entanto por dificuldades no
projeto, optou-se por trabalhar somente com o primeiro formato, feito com um arame
de aço mola (Figura
13
Figura 10 - Conclusão da parte mecânica
14
5. RESULTADOS E DISCUSSÃO
15
decorrido de uma rotação completa do eixo a velocidade em RPM. A implementação
do algoritmo foi realizada em uma plataforma Arduino e o Software desktop foi
desenvolvido em Java para a aquisição de dados dos sensores ópticos.
16
6. CONCLUSÕES
17
7. REFERÊNCIAS BIBLIOGRÁFICAS
18
8. PRODUÇÃO TÉCNICO-CIENTÍFICA
19
9. AUTO-AVALIAÇÃO
20
10. AVALIAÇÃO DO ORIENTADOR
21
11. DESTINO DO ALUNO
22
APÊNDICE A – Listagem dos códigos de programação
this.transducer = transducer;
DateTimeFormatter dtf =
DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSSSSS");
LocalTime localTimeNow = LocalTime.now();
LocalDateTime localTime =
localTimeNow.atDate(LocalDate.now());
Instant instant =
localTime.atZone(ZoneId.systemDefault()).toInstant();
previousAddedTime = (Date.from(instant));
startTime = (Date.from(instant));
}
23
public Sensor() {
//System.err.println("Create new Sensor!");
}
boolean lock = false;
double oldDiscrepancy = 0;
public boolean pulseRegister(double lightValue){
LocalTime localTimeNow = LocalTime.now();
LocalDateTime localTime =
localTimeNow.atDate(LocalDate.now());
Instant instant =
localTime.atZone(ZoneId.systemDefault()).toInstant();
deltaTime = Date.from(instant).getTime() -
previousAddedTime.getTime();
globalDeltaTime = Date.from(instant).getTime()-
startTime.getTime();
previousAddedTime = (Date.from(instant));
if(lock)
sensorPosition +=
360/transducer.getTracksNumber().getValue();
this.lightValue = lightValue;
this.lightValueHistory.add(lightValue);
return addPulse();
}
int peak = 0;
int valley = 0;
24
public void addPeak(){
peak ++;
}
public void addValley(){
valley ++;
}
if (transducer != null) {
int tracks =
(int)transducer.getTracksNumber().getValue();
if((pulseCounter >= tracks)) {
this.pulseCounter = 0;
sensorPosition = 0;
setRotationDeltaTime(instatTime -
rotationAddedTime.getTime());
25
double rpm = (double) Math.round((60000 /
getRotationDeltaTime()) * 100) /100;
rotationAddedTime = Date.from(instant);
lock = true; //Comecar a contar a posicao relativa
apos a primeira volta
return true;
}
}
return false;
}
}
Sensor.java
currentSensor.setCurrentCondition(Condition.INCREASE);
else if (currentSensor.getCurrentCondition() ==
Condition.DECREASE) {
currentSensor.addValley();
currentSensor.setPulseCounter(currentSensor.getPulseCounter()+1);
currentSensor.setCurrentCondition(Condition.INCREASE);
}
} else if (brightness < 3.9) {
if (currentSensor.getCurrentCondition() ==
Condition.NONE)
currentSensor.setCurrentCondition(Condition.DECREASE);
else if (currentSensor.getCurrentCondition() ==
Condition.INCREASE) {
currentSensor.addPeak();
26
currentSensor.setCurrentCondition(Condition.DECREASE);
}
}
currentSensor.pulseRegister(brightness);
axleDataHistory.add(axleData);
}
@Override
public void serialEvent(SerialPortEvent event) {
if (event.getEventType() !=
SerialPort.LISTENING_EVENT_DATA_AVAILABLE)
return;
byte[] buffer = new byte[port.bytesAvailable()];
inputString = received_string;
try {
try {
}catch (Exception exception){}
switch (inputString) {
case "a":
readingSensorIndex = 0;
break;
case "b":
readingSensorIndex = 1;
break;
case "None:":
27
getReadType = false;
break;
case "B:":
readType = ReadType.B;
getReadType = false;
break;
case "DT:":
readType = ReadType.DT;
getReadType = false;
break;
case "SC:":
readType = ReadType.SC;
getReadType = false;
break;
default:
if (getReadType) {
readType = null;
}
if (readType != null)
switch (readType) {
case None:
getReadType = true;
break;
case B:
controller.getDataManager()
.changeSensorStats(readingSensorIndex,Double.parseDouble(inputStrin
g));
getReadType = true;
break;
case DT:
getReadType = true;
break;
case SC:
getReadType = true;
break;
}
28
break;
}
}catch (Exception exception){
}
controller.chartRefresh();
}
29