Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Rastreador de senderismo

Componentes y suministros

Arduino 101
× 1
Pilas AA
× 1
portapilas 4xAA
× 1
Accesorio guardado
× 1
Sensor de presión Adafruit BMP180
× 1
Adafruit Ultimate GPS Breakout
× 1
Adafruit - Magnético de 3 ejes
× 1
Sensor de humedad Adafruit AM2320
× 1
Adafruit Coin Cell CR2012
× 2
Resistencia de 10k ohmios
× 1
Resistencia 3.9 k
× 1

Herramientas y máquinas necesarias

Pistola de pegamento caliente (genérica)
Soldador (genérico)

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

¿Qué es Hiking Tracker?

Hiking Tracker es un dispositivo para detectar el cambio en el entorno circundante de un excursionista durante una caminata.

La idea es observar el cambio de temperatura, presión, humedad, altitud, ubicación, dirección, etc. Ofrece una visión interesante del senderismo.

En las montañas, donde el aire es frío, seco y de baja densidad en comparación con las tierras bajas, a muchas personas les cuesta respirar. Algunos experimentan irritación de la piel seca. Este dispositivo permite a las personas interesadas en el senderismo conocer sus límites. También está la diversión de ir a lugares de gran altura. ¡Poder conocer la altitud es algo divertido!

No solo las montañas, sino también la exploración de pantanos, desiertos y bosques; cada uno tiene su perfil ambiental único, ser capaz de monitorear el medio ambiente sobre la marcha es una mejor manera de comprender la naturaleza.

Demostración en video

Paso 1:hardware, ¿para qué?

Hay muchos sentidos circulando con este proyecto

El protector de accesorios viene con algunos dispositivos I2C a bordo:

  • Sensor de temperatura LM 75B para detectar la temperatura ambiente
  • Acelerómetro de 3 ejes ADXL345 para detectar la inclinación y la gravedad
  • DS3231 RTC de alta precisión para tiempo de detección
  • Sensor magnético de 3 ejes HMC5883 para detectar el rumbo de la brújula
  • Sensor de humedad AM2320 para detectar el% de humedad relativa del aire
  • Sensor de presión BMP180 para detectar la presión atmosférica y la altitud
  • Sensor GPS MTK3339 para detectar la ubicación y la distancia recorrida

En el Arduino Uno:

  • Divisor de voltaje de 3.9k + 22k para detección 4 AA voltaje de la batería
  • 1306 OLED para ver datos
  • Zumbador para alarma sonora
  • LED RGB no es necesario para este proyecto
  • La interfaz XBee no se usa, pero Arduino D2, D3, D9, D10 se pueden sacar de esta interfaz para otros proyectos, D2 está conectado para reiniciar, lo que permite reiniciar el Arduino desde el código.
  • No se utiliza el joystick de 5 direcciones
  • 101 olla no se usa

Paso 2:modificar y conectar el hardware

Se realizan pocas modificaciones en el Arduino Uno. Está montado en un soporte de 4 pilas AA con separadores de tornillos y pegamento caliente.

4 AA y CR1220 (para RTC) están instalados en los portapilas.

Hay un espacio entre el soporte de la batería y la placa Arduino Uno donde se pueden colocar el sensor de presión, humedad, magnético y GPS.

Los sensores I2C se sueldan juntos en una pieza de placa pref y se colocan en este espacio

Estos sensores están conectados a Arduino Uno desde la parte inferior:

Se agrega un divisor de voltaje para medir el voltaje de la batería de 4 baterías AA.

La línea de detección de voltaje del paquete de baterías AA va al ADC A1:

El joystick del escudo se asigna al pin ACD A1 a través del pin A5. Es por eso que el joystick se desolda y se quita.

Al conectar una almohadilla en el protector de accesorios (para ver el esquema, consulte la referencia) con el puente de soldadura D2 (para reinicio suave), los pines D3, D9, D10 de Arduino están disponibles en la interfaz Xbee.

Los componentes se apilan así:

  • Capa superior:Escudo de accesorios en Arduino
  • Capa intermedia:otros sensores y GPS irán entre el Uno y la caja de la batería
  • Capa inferior:4 portapilas AA con pilas

Y las conexiones se ven así:

Paso 3:programación del dispositivo

Arduino IDEBuild 1.8.5 se utiliza para programar el dispositivo. Primero, todas las siguientes bibliotecas se incluyen o descargan usando el administrador de bibliotecas.

Al escribir el nombre del sensor en el cuadro de búsqueda del administrador de bibliotecas, aparecerán las bibliotecas correspondientes.

Algunas de las bibliotecas de Accessory Shield (ver referencia) se agregan a través de la opción zip.file

Después de agregar las bibliotecas necesarias, se revisan los códigos de ejemplo para cada sensor para averiguar las API de los sensores asociados.

A continuación, todos los encabezados de la biblioteca se incluyen en un boceto de Arduino vacío.

Lista de archivos de encabezado

  math.h, inttypes.h, Wire.h, lm75.h, ADXL345.h, ChainableLED.h, U8glib.h, ds3231.h, Adafruit_Sensor.h, Adafruit_AM2320.h, Adafruit_BMP085_U.h, Adafruit_HMC5883_U.h, Adafruit_GPS.h  

Después de múltiples editar, compilar y depurar (incluida la conexión suelta, donde descubrí que el BMP180 funciona sin Vcc debido a una fuga de energía para los pines I2C, tal vez) y cargar, finalmente el código estaba listo.

Las advertencias

  • El cálculo de la altitud se basa en la caída de presión del aire, aplicable solo durante condiciones climáticas normales.
  • El código de la brújula no tiene compensación de inclinación en el software, el dispositivo debe mantenerse en un plano nivelado. Hay un círculo de brújula fijo, en el que hay otro círculo de radio variable. Cuando el dispositivo está inclinado, el círculo interior aumentará. Cuando está en una posición nivelada (es decir, tanto el componente x como el componente y del acelerómero son casi 0), el círculo interno se reducirá a un punto. Aquí es cuando el rumbo de la brújula es más preciso.
  • El ángulo de declinación del puntero de la brújula depende de la ubicación y variación del campo magnético de la Tierra. Que puede verse afectado por la tormenta solar. Si no se incluye el ángulo de declinación, el rumbo de la brújula se desviará algunos grados.

Encuentre la declinación para su área:http://www.magnetic-declination.com

  • El rumbo de la brújula es propenso a los objetos magnéticos cercanos, como la presencia de fuertes minerales magnéticos en las montañas.
  • El voltaje de funcionamiento mínimo del dispositivo es de aproximadamente 4,5 voltios. Aquí es cuando se deben reemplazar las baterías AA.
  • La hora y la fecha se programan a partir del código. Si se necesita tiempo para cambiar, la batería de tipo botón debe estar desenchufada y enchufada. Una nueva carga de programa con una nueva hora en el código cambiará la hora.
  • Durante el desarrollo, el módulo GPS no estaba disponible. Por lo tanto, las coordenadas de demostración se colocan en Lat-Long. Si alguien desea replicar este proyecto, debe incluir la biblioteca GPS y los códigos asociados.
  • El plano XY del acelerómetro y el magnetómetro están sujetos a la colocación en la PCB. Se requiere que el código se ajuste en consecuencia.
  • La precisión de la lectura del acelerómetro tiende a vibrar. Se recomienda utilizar el dispositivo en condición de reposo.

Alcance de la mejora

Se pueden realizar mejoras desde el lado del firmware para algunas funciones más:

  • Registro periódico de parámetros en EEPROM
  • La alarma sonora suena al alcanzar el hito de altitud / ubicación
  • Recordatorio de beber agua
  • Recordatorio para tomar un descanso
  • Alarma de batería baja
  • Alerta de baja temperatura y humedad
  • Calibración del software Compass para compensación de inclinación (muchas cosas de trigonometría)
  • Recuperación automática de la declinación mediante la conectividad GPS e IoT a través de la aplicación Gateway

En cuanto a la parte de hardware de la mejora:

  • Interruptores de entrada de usuario para configurar el tiempo, declinación, etc.
  • Carcasa 3D personalizada para el dispositivo
  • Uso de batería LiPo recargable
  • Diseño de PCB compacto de placa única para mayor portabilidad

Conclusión

Viajar y hacer senderismo es genial, cuando puedes comprobar el cambio en el entorno circundante, hace que las cosas sean más interesantes. Especialmente, verificando los cambios de altitud, humedad, presión y temperatura en cuestión de horas durante la caminata. Este dispositivo te permite saber a qué altura sientes el mal de altura, qué nivel de humedad hace que tu piel se seque, cosas así. Aunque hay margen de mejora tanto en el diseño del circuito como en el código para hacer frente a las advertencias, ¡sigue siendo genial tener un dispositivo como este mientras te adentras en la naturaleza!

Recursos externos

https://www.waveshare.com/wiki/Accessory_Shield

Kit de creación rápida de prototipos

Código

  • Hiking_Tracker.ino
  • Bibliotecas
Senderismo_Tracker.ino C / C ++
main.c
 / * /////////// NOTA ////////// D2 permite el reinicio suave configurable desde el código D3, D9, D10 están disponibles a través de 12,13,16 de xbee interfaceD4, D13 no son accesibles /////////////////////////// * ///// ARCHIVOS DE ENCABEZADO PARA LA BIBLIOTECA ///// # include  #include  #include  #include  #include  #include  #include "U8glib.h" #include "ds3231.h" #include "Adafruit_Sensor.h" #include "Adafruit_AM2320.h" #include  #include  #include  //////////// ///////////// Variables RTC /////////////////// uint8_t tiempo [8]; struct ts t; int s; int m; int h; int dy; int mo; int yr; ///////////////// Variables del acelerómetro ///////////// float X =0.0; float Y =0.0; float Z =0.0; float Gravity =0.0; ///////////////// Variables del acelerómetro ///////////// float Xm =0.0; flotante Ym =0.0; flotante Zm =0.0; /////////////////////// Variables LED RGB /////////////// const int rgb_pwr =12; const int clk_pin =6; const int data_pin =5; float hue =0.0; boolean up =true; //////////////////////// potenciómetro /////////////////// // int pot =0; ////////////////////// Batt / Supply Vin /////////////////// float Vbatt =0.0; //// ////////////////// Termómetro ////////////////////// temp de flotación =0.0; ////// /////////////// Humedad ///////////////////////// flotación húmeda =0.0; ////// ////////////// Presión de aire //////////////////// doble prsr =0.0; ///////// /////////// Altitud ////////////////////// flotar alt =0.0; ///////////// ////// Lat, Long ////////////////////// flotar lat =0.0; flotar lon =0.0; ////////////////// Rumbo de brújula ///////////////// rumbo flotante =0.0; /// ////////////////// Otras variables /////////////// int mstime =0; int sensor_selector =1; ///// /////// ENUM // I2C Tipo de dispositivo Objeto ///////////////// U8GLIB_SSD1306_128X64 u8g (U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C OLED DisplayTempI2C_LM75 termo =TempI2C_LM75 (0x48, TempI2C_LM75 ::nine_bits); // Acelerómetro I2C Temp SensorADXL345; // LED I2C Acce SensorChainableLED (clk_pin, data_pin, rgb_pwr, 1); // I2C RGB LEDAdafruit_AM2320 am2320 =Adafruit_AM2320 (); // Sensor de humedad I2CAdafruit_BMP085_Unified bmp180 =Adafruit_BMP085_Unified (10085); // I2C Presione SensorAdafruit_HMC5883_Unified mag =Adafruit_HMC5883_Unified (12345); // I2C Compa Sensor // descomente las siguientes 2 líneas para habilitar el GPS // La depuración serial no estará disponible // HardwareSerial mySerial =Serial; // Adafruit_GPS GPS (&mySerial); configuración vacía (void) {// 1.1V Internal Analog Ref // analogReference (INTERNAL); ///////////// Señales para OLED en el protector de accesorios /////////// //// soldadura puenteada en el escudo necesario para D2, D3, D9, D10 // pinMode (2,1); // auto reinicio D2 a RST pinMode (3,1); // salidas en xbee int 12, pinMode (9,1); // salidas en xbee int 13 pinMode (10,1); // salidas en xbee int 16 // digitalWrite (2, HIGH); escritura digital (3, ALTA); digitalWrite (9, BAJO); escritura digital (10, ALTA); pinMode (7,1); pinMode (8,1); escritura digital (7, ALTA); digitalWrite (8, BAJO); // 10k POT en A0 // Vin Batt / Supply en A1 (3.91k / 21.76k) /////////////////////////////// //////////////////////// Comunicación serie para depuración (opcional) ////////// Serial.begin (9600); // //////////// Accel Init Waiting ///////// if (! Accelerometer.begin ()) {delay (50); } /////////////// Habilitación de interrupción RTC ///////// DS3231_init (DS3231_INTCN); //////////////// Buzzer Init //////////////// pinMode (11,1); digitalWrite (11, LOW); } bucle vacío (vacío) {// bucle de imagen u8g.firstPage (); hacer {dibujar (); } while (u8g.nextPage ()); // cambiar entre sensores I2C sensor_selector ++; if (sensor_selector> =3) {sensor_selector =0;} ////// API de recuperación de temperatura ////// temp =termo.getTemp (); delay (5); // "C /////// API de recuperación de presión //////// if (sensor_selector ==0) {///////////// Sensor de presión Init ///////// if (! Bmp180.begin ()) delay (11); sensor_event_t event; bmp180.getEvent (&event); if (event.pressure) {prsr =event.pressure / 10; / / hP to kP delay (50);}} ////////////// GPS Init ////////////GPS.begin(9600);//// /// API de recuperación de altitud //////// if (sensor_selector ==0) {sensor_event_t event; bmp180.getEvent (&event); alt =bmp180.pressureToAltitude (1013.25, event.pressure); delay (50); // bmp180.end ();} // en metros ////////////// Inicialización del sensor de humedad /////// if (sensor_selector ==1) {am2320.begin (); delay (50); ////// API de recuperación de humedad ///////// humid =am2320.readHumidity (); delay (50); // am2320.end (); // en% de RH} // en kPa ////// API de recuperación de aceleración ////// Vector norm =acelerometer.readNormalize (); X =norm.XAxis; Y =norm.YAxis; Z =norm.ZAxis; Gravity =sqrt (X * X + Y * Y + Z * Z) - (0.3); // desplazamiento // en m / s ^ 2 ///// API de recuperación de tiempo //////// DS3231_get (&t); s =t.seg; m =t.min; h =t. hora; dy =t.mday; mo =t.mon; año =t. año; ///// Búsqueda de posición del bote /////// pot =analogRead (A0) * 5 / (10 * 3); delay (2); ///// VBatt / Supply Fetch /////// // 1.1 es 1.08 para este chip Vbatt =(1.08 * analogRead (A1) / 1023) /3.91 * ((3.91 + 21.76) ); delay (2); ///////// Compass Heading //////// if (sensor_selector ==2) {if (! mag.begin ()) {while (1); } // retraso (70); sensor_t sensor2; mag.getSensor (&sensor2); retraso (70); // el ángulo de declinación depende de la ubicación geográfica // use Lat Long del GPS para calcular sensors_event_t event2; mag.getEvent (&event2); // Xm =event2.magnetic.x; // Ym =event2.magnetic.y; retraso (70); declinación de flotación =0.0; rumbo =atan2 (event2.magnetic.y, event2.magnetic.x); rumbo + =declinación; // corrección de signo if (rumbo <0) rumbo + =2 * PI; si (título> 2 * PI) título - =2 * PI; // Convierta radianes a grados para mejorar la legibilidad. encabezado =encabezado * 180 / M_PI; // mag.end ();} ///// Buzzer Control ////////// if (pot> 80) {digitalWrite (11,1);} else {digitalWrite (11,0); } ///// Control LED RGB direccionable ///////////// if (pot> 40) {leds.pwr_set (PWR_ENABLE); para (byte i =0; i <1; i ++) leds.setColorHSB (i, hue, 1.0, 0.5); si (arriba) tono + =0.025; else hue- ​​=0.025; si (tono> =1.0 &&arriba) arriba =falso; else if (matiz <=0.0 &&! up) up =true; } /////////////////////////////////////////// Restablecimiento automático //// /////// // digitalWrite (2, LOW); /////////////////////////////////} ///////// El bucle vacío termina aquí ///////////////////////// Oled Picture Loop Draw Fn ///////// ////////// vacío dibujar (vacío) {u8g.setFont (u8g_font_7x13); u8g.drawHLine (37, 0, 62); u8g.setPrintPos (41, 12); if (h <10) u8g.print (0); u8g.print (h); u8g.drawStr (54,12, ":"); u8g.setPrintPos (62, 12); if (m <10) u8g.print (0); u8g.print (m); u8g.drawStr (75,12, ":"); u8g.setPrintPos (83, 12); si (s <10) u8g.print (0); u8g.print (s); u8g.drawHLine (37, 14, 62); u8g.setFont (u8g_font_5x8); u8g.drawVLine (37, 0, 14); u8g.setPrintPos (0, 7); if (dy <10) u8g.print (0); u8g.print (dy); u8g.drawStr (11,7, "/"); u8g.setPrintPos (17, 7); if (mes <10) u8g.print (0); u8g.print (mes); u8g.drawStr (0,16, "/"); u8g.setPrintPos (6, 16); u8g.print (año); u8g.drawVLine (99, 0, 14); u8g.drawStr (104,7, "BAT"); u8g.setPrintPos (102, 15); u8g.print (Vbatt); u8g.drawStr (123,15, "V"); // u8g.setFont (u8g_font_7x13); // u8g.setPrintPos (40, 25); u8g.print (round (temp)); u8g.drawStr (55,25, "'C"); // u8g.print (round (temp)); u8g.setFont (u8g_font_5x8); // u8g.drawStr (5,40, "x"); u8g.setPrintPos (15, 40); u8g.print (round (X)); // u8g.drawStr (50,40, "y"); u8g.setPrintPos (60, 40); u8g.print (round (Y)); // u8g.drawStr (90,40, "z"); u8g.setPrintPos (100, 40); u8g.print (round (Z)); // u8g.drawStr (68,22, "BATT:"); u8g.setPrintPos (95, 22); u8g.print (Vbatt); u8g.drawStr (123,22, "V"); u8g.drawVLine (37, 18, 36); u8g.drawStr (39,24, "TEMPERATURA DEL AIRE:"); u8g.setPrintPos (85, 24); u8g.print (temp); u8g.drawStr (118,24, "C"); u8g.drawStr (39,34, "HUMEDAD:"); u8g.setPrintPos (85, 34); u8g.print (húmedo); u8g.drawStr (118,34, "%"); u8g.drawStr (39,44, "PRESIÓN:"); u8g.setPrintPos (85, 44); u8g.print (prsr); u8g.drawStr (118,44, "hP"); u8g.drawStr (39,54, "ALTITUD:"); u8g.setPrintPos (85, 54); u8g.print (redondo (alt)); u8g.drawStr (118,54, "m"); u8g.drawHLine (0, 56, 128); u8g.drawStr (19,64, "LAT:"); u8g.setPrintPos (39, 64); u8g.print (23,57); // Demostración, reemplazar con LAT cuando GPS agregó u8g.drawStr (69,64, "LONG:"); u8g.setPrintPos (94, 64); u8g.print (90.36); // demostración, reemplace con LON cuando se agregue GPS // u8g.setPrintPos (40, 25); u8g.print (ronda (temperatura)); u8g.drawStr (55,25, "'C"); int r =redondo (raíz cuadrada (X * X + Y * Y)); // float tid =atan (Y / X) * 180 / 3.1415; // cuestiones matemáticas aquí // int radio =round (tid); u8g.drawStr (0,22, "título"); u8g.drawCircle (18, 34, r, U8G_DRAW_ALL); // círculo de nivelación interior u8g.drawCircle (18, 34,10, U8G_DRAW_ALL); // círculo exterior fijo // círculo interior se convertirá en un punto cuando no haya inclinación en xy eje y // aquí es cuando el rumbo de la brújula es más preciso //u8g.drawLine(18, 34, (18 + round (Y * 2)), (34 + round (X * 2))); // ampliado 2x u8g.setPrintPos (0, 53); u8g.print (título); // 0 o 360 es N // 90 es E // 180 es S // 270 es W // u8g.setFont (u8g_font_5x8); if ((título> 315) | (título <=45)) {u8g.drawLine (18,34,8,34); } if ((título> 45) &(título <=135)) {u8g.drawLine (18,34,18,24);} if ((título> 135) &(título <=225)) {u8g.drawLine (18,34,28,34);} if ((título> 225) &(título <315)) {u8g.drawLine (18,34,18,44);} // u8g.drawLine (18, 34, (18 + ronda (Y * 2)), (34 + ronda (X * 2))); // escalado 2x BASADO EN ACELAROMETER // bucle termina aquí} 
Bibliotecas C / C ++
Descomprímalo y agregue las cremalleras de la biblioteca individual a Arduino Library Manager
 Sin vista previa (solo descarga). 

Esquemas


Proceso de manufactura

  1. ¿Qué es un sensor de O2?
  2. Sensor de movimiento con Raspberry Pi
  3. Sensor de humedad del suelo Raspberry Pi
  4. Convierte tu Raspberry Pi en un rastreador de ejercicios para hámster
  5. Prueba del sensor DS18B20
  6. Sensor de temperatura Raspberry Pi
  7. Rastreador de inodoro (Desarrollado por Walabot)
  8. Sensor de emoción / EEG
  9. Windows 10 IoT Core en Raspberry Pi 2 - Datos del sensor Adafruit
  10. UnifiedWater v1
  11. Rastreador de sensor WiFi RSSI para la ISS