Paso 2: Configurar el Arduino
Interfaz con el acelerometro
Conecte el acelerómetro a la placa arduino. Si usas el ADXL335 conectar la clavija marcada ST en el pin analógico 0, Z a la clavija analógica 1, Y al pin analógico 2, X a la clavija analógica 3 y GND al pin analógico 4 y VCC al pin analógico 5. Si usted consigue perdido en cualquier lugar, sólo se refieren a la
hojas de datos. Hojas de datos siempre tienden a lo denso, pero valen una exploración cercana.
El pin es irrelevante para nuestro proyecto, los pasadores de X-Y-Z de salida los datos brutos, el pin GND es la tierra (lógico bajo o 0 voltios), el VCC es la fuente de alimentación para el acelerómetro (lógico alto). El siguiente código establece esto para arriba en el arduino.
// Define variables to be used to process raw accelerometer values int x, y, z, mag; int xPrev, yPrev, zPrev; // Constant for Low Pass filter const double k = 0.8f; // Define pins for ADXL335 const int xPin = 1; const int yPin = 2; const int zPin = 3; const int vcc = A5; const int gnd = A4; void setup() { //Default baud rate Serial.begin(9600); pinMode(vcc, OUTPUT); digitalWrite(vcc, HIGH); pinMode(gnd, OUTPUT); digitalWrite(gnd, LOW); // Initialize variables x = 0; y = 0; z = 0; xPrev = 0; yPrev = 0; zPrev = 0; }
Luego utilizamos la función analogRead(pin) , donde 'pin' es cualquiera de los 3 pines es decir xPin, yPin o zPin definido anteriormente para leer un valor entre el 0 al 1024, que nos indica el valor de la aceleración que se lee.
Así que vamos a empezar a leer estos valores!
Filtrado de
Esto es intrínsecamente bastante complicado desde la aceleración de la lectura de una pieza (relativamente) barata de hardware como la ADXL335 es problemático. El tipo de señal que vas a obtener del acelerometro va a estar lleno de ruido de señal. Esto significa que nuevos valores de acelerómetro no son confiables, y por lo tanto usamos un filtro. En este caso utilizamos un Filtro de paso bajo
. Queremos permitir sólo señales de baja frecuencia pase a través, valores que no difieren demasiado de las lecturas anteriores. Nota: incluso con filtrado complicados, el margen de error de un acelerómetro barato va a ser alta, así que integrar en el tiempo para obtener la velocidad y/o posición del acelerómetro va para componer este error - los valores que estamos recibiendo no será preciso en todo. También hay consideraciones de sesgo deriva puede hacerse, pero para eso está fuera del alcance de este tutorial. Sentido de datos ruidosos es un campo a su propio! Así que vamos a mantenerlo simple por ahora.
Esto agregamos en nuestro programa loop():
void loop() { // Apply a Low Pass Filter on the raw signal x = k*xPrev + (1-k)*(analogRead(xPin) - xAvg); y = k*yPrev + (1-k)*(analogRead(yPin) - yAvg); z = k*zPrev + (1-k)*(analogRead(zPin) - zAvg); // Calculate the magnitude of the force for this particular implementation mag = (int) sqrt(x*x + y*y + z*z); // Update values for next iteration xPrev = x; yPrev = y; zPrev = z; }
Definimos 'k' arriba setup(). Se trata de una filtración constante. No dude en modificar esta constante pero permanecer dentro de la gama 0.5 < < 1 k. Los valores más altos significa que confiamos en nuevos valores incluso menos, y por lo que tendrán menos efecto en la siguiente iteración, esto es lo que queremos. También puede notar xAvg, yAvg y zAvg. Se trata de una función de calibrar, así que deja que hablar ahora.
Sin ningún tipo de calibración del acelerómetro escupirá típicamente los valores de la gama media del 0 al 1024. Esto no es muy beneficioso para nosotros ya que queremos el cambio relativo en la aceleración de un punto de referencia, posición de salida del acelerómetro. Cada vez que arranca el arduino, ejecutamos la función calibrate(). Es imperativo que la placa arduino solos durante el tiempo, cualquier empujones del acelerómetro alterará la exactitud de la calibración.
Añadir esto al final del código de arduino:
// Function to re-zero the acceleremeter, finds an average void calibrate() { int i; xAvg = 0; yAvg = 0; zAvg = 0; for(i = 0; i < calCount; i++) { // Read in the raw unclean data sset xAvg += analogRead(xPin); yAvg += analogRead(yPin); zAvg += analogRead(zPin); } // Get the average xAvg = xAvg / calCount; yAvg = yAvg / calCount; zAvg = zAvg / calCount; delay(100); }
Al final del día, la calibración es realmente sólo un promedio simple que terminan restando de los valores crudos. Ningún fanciness aquí.
Transmisión de datos a analizar
Código completo: https://github.com/aehernandez/Accordion-Master/bl...