Skip to main content

Sensorizando maquina de impactos con Arduino

Sensorizando maquina de impactos con Arduino

Algunas de las propiedades de las maquinas de impactos deben verificarse para ver que siguen en sus rangos antes de usarla en algún ensayo

Muchas maquinas deben ser testeadas de vez en cuando para confirmar que los valores de fabrica permanecen entre los limites establecidos. Esta semana pasada me encargaron confirmar estos valores de una maquina de impactos con los valores establecidos en el Anexo A de la norma ISO 140-7:1998, una norma para la mediciones acústicas en edificaciones.

Una maquina de impactos tiene es una cosa como lo de la imagen de arriba pero del que yo he tomado medidas es esta de abajo.

 


El experimento de la izquierda mide la distancia entre un sensor de ultrasonidos y el uno de los martillos, lo cual me ha valido para estudiar la gráfica de distancia contra tiempo, el experimento de la derecha mide con un sensor de infrarrojos la revoluciones por minuto del cigueñal de la maquina, lo cual sirve para inferir el numero de golpeos del martillo por minuto, y el experimento de abajo sirve para medir la distancia de dos martillos con respecto de dos sensores simultaneamente para medir el tiempo entre imapctos de martillos consecutivos.

En la norma se especifica que:

  1. El tiempo medio entre impactos debe ser de 100 ms con un margen de mas menos 5 ms.
  2. El tiempo entre el impacto de un martillo y su elevación debe ser menor a 80 ms.
  3. El tiempo entre el impacto de dos martillos consecutivos debe ser de 100 ms mas menos 20 ms.

¿Como lo he hecho?

Usando un microcontrolador de Arduino con un código hecho para la ocasión que recoge la infromación de los sensores y la vuelca a un archivo de texto. También hay que afinar la precisión de los sensores para que respondan a lo que se quiere que respondan, especialmente el sensor de infrarrojos del cual hay que asegurarse que reciba la luz rebotada en una superficie blanca pero no en una superficie negra.

El tiempo medio entre impactos lo he medido indirectamente midiendo la velocidad de giro del cigueñal, sabiendo que por cada vuelta de cigueñal hay 10 golpes de martillo es sencillo saber el tiempo medio entre impactos.

El código de Arduino para este experimento es el siguiente, al contrario de mis otros códigos este está escrito en C y no en Python.

unsigned long myTime;
int wave;
int sensor = 3;

void setup() {
Serial.begin(9600);
pinMode(sensor, INPUT);
}

void loop() {
wave = digitalRead(sensor);
myTime = millis();
Serial.print(myTime);
Serial.print(" ");
Serial.println(wave);
delay(1);
}

Ejecutando este código tendría impresor por el monitor serial de la pantalla el tiempo en milisegundos y la señal binaria del receptor de infrarrojos, una vez tenía este archivo listo haré los calculos en un Notebook de Jupyter con Python.

El codigo de abajo es el que usado para medir los requisitos segundo y tercero, especificamente para el tercer los experimentos de los fotos.

int trigPin4 = 8;
int echoPin4 = 9;
int trigPin5 = 10;
int echoPin5 = 11;

unsigned long myTime;

void setup()
{
Serial.begin(9600);
pinMode(trigPin4, OUTPUT);
pinMode(echoPin4, INPUT);
pinMode(trigPin5, OUTPUT);
pinMode(echoPin5, INPUT);
}

void loop()
{
myTime = millis();

long duration4, distance4;
digitalWrite(trigPin4, LOW);
delayMicroseconds(2);
digitalWrite(trigPin4, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin4, LOW);
duration4 = pulseIn(echoPin4, HIGH);
distance4 = (duration4 / 2) / 2.91;

long duration5, distance5;
digitalWrite(trigPin5, LOW);
delayMicroseconds(2);
digitalWrite(trigPin5, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin5, LOW);
duration5 = pulseIn(echoPin5, HIGH);
distance5 = (duration5 / 2) / 2.91;

Serial.print(myTime);
Serial.print(" ");
Serial.print(distance4);
Serial.print(" ");
Serial.println(distance5);

}

Los es quemas de ambos circuitos son como los que se enseñan abajo, el de lz izquierda mide la distancia y habría que añadirle otro snesor y el de la derecha mide si una superficie refleja o no una luz infrarroja.











Tratamiento de la señal

Los datos crudos consistían en miles de lineas de texto así que hace falta tratarlas para obtener resultados utiles. Para esto, he empezado a trabajar con Python, la cual creo que es la herramienta adecuada para este tipo de tareas.

Aquí abajo se puede ver el código que he usado y los resultados finales en gráficas con una breves reseñas en las anotaciones del cuaderno de Jupyter

Resultados

Una revolución tarda de media 99.63 ms, dado que idealmente debería ser de 100 ms con un margen de mas menos 5 ms, en este aspecto la maquina cumple perfectamente. El tiempo mediano entre los impactos de los martillos 3 y 4 es de 108 ms  e idealmente debería ser 100 ms con un margen de mas menos 20 ms, y el tiempo que transcurre entre el impacto del martillo y sus elevación es de 58 ms, en este apartado el unico requisito es que esté por debajo de 80 ms con lo cual cumple perfectamente también.

En lo que respecta la cinemática de la maquina todos sus parametros cumplen con lo establecidos en el Anexo A de la norma que he mencionado antes, quedan otros de medir pero se refieren mas a temas de diemsniones y cosas así.

Jupyter Notebook





Calculadora RPM Calculadora RPM

Comments

Post a Comment

Popular posts from this blog

Advent of Code, day 1

 Day 1 of the Advent of Code A bit late for Christmas, isn't it? It's been a long time since I did my last post, some days of boredom have inspired me to get back at it. I am going to be trying to solve the last Christmas' Advent of Code. For those that you don't know the Advent of Code is an Advent calendar of small programming puzzles that can be solved the way you like, each day contains two puzzles in which the first is linked to the second. If you want to get more info about it, check out this link:  https://adventofcode.com/2023/about Without further ado, let's get at it, I'm going to copy down below the statement for the Day 1 Statement Input Basically we are given a long list of characters (the one shown in the picture) where each line contains numbers and letters, we first need to get just the numbers, then store somewhere else the first and last numbers in each row, and lastly sum all those values. A link to the input file:  https://adventofcode.com/20...

A first approach to IoT, connecting my 3D printer to the internet

My first approach to the IoT, connecting my 3D printer to the internet IoT is one of those fancy words that people like to talk about in conferences and in TedTalks without (apparently) having too much idea of what it is all about. Set up to manage the 3D printer through the internet This one is going to be a short entry where I don't go through code or anything, just wanted to talk about a bit about how I connected my 3D printer to the internet.  I've been in the 3D printing thing for a while now, about a year and I haven't stopped printing ever since I bought my Ender 3. Fortunately enough, I live in a big house where my room/working place is on the fourth floor and my 3D printing is on the first one. You might be thinking as well: "OK Pablo but where do you want to bring us? Go to the point" Well, as you might have noticed there are two floors in betw...

Advent of Code, day 2

We made it to Day 2 of Advent of Code I have kept my promise for 2 days in a row. As weird as it seems for this day and age, I have kept my promise and today is the day 2 of the Advent of Code, this time with elves involved. There you go, the statement of today's first problem down below: And usual, my solution: import pandas as pd import re import numpy as np filepath = "/content/input 1.txt" with open (filepath, 'r' ) as file :     lines = [line.strip() for line in file .readlines()] lines_split = [] for line in lines:   token = re.findall(r '\w+|[^\s\w]' , line)   lines_split.append(token) blue_list = [] green_list = [] red_list = [] for line in lines_split:   blue,green,red = 0 , 0 , 0   for ix, word in enumerate (line):     if word == "blue" :       if blue < int (line[ix -1 ]):         blue = int (line[ix -1 ])     if word == "green" :       if green < int (...