Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Suivi de randonnée

Composants et fournitures

Arduino 101
× 1
Piles AA
× 1
Support de 4 piles AA
× 1
Accessoire Shiled
× 1
Capteur de pression Adafruit BMP180
× 1
Adafruit Ultimate GPS Breakout
× 1
Adafruit - 3 axes magnétiques
× 1
Capteur d'humidité Adafruit AM2320
× 1
Adafruit Coin Cell CR2012
× 2
Résistance 10k ohm
× 1
Résistance 3,9 k
× 1

Outils et machines nécessaires

Pistolet à colle chaude (générique)
Fer à souder (générique)

Applications et services en ligne

Arduino IDE

À propos de ce projet

Qu'est-ce que le Tracker de randonnée ?

Le Tracker de Randonnée est un appareil permettant de détecter le changement d'environnement d'un randonneur pendant une randonnée.

L'idée est d'observer le changement de température, de pression, d'humidité, d'altitude, d'emplacement, de direction, etc. Cela donne un aperçu intéressant de la randonnée.

Dans les montagnes où l'air est froid, sec et de faible densité par rapport aux terres basses, beaucoup de gens ont du mal à respirer. Certains ressentent une irritation de la peau sèche. Cet appareil permet aux personnes intéressées par la randonnée de connaître leurs limites. Il y a aussi le plaisir d'aller dans des endroits de haute altitude. Pouvoir connaître l'altitude est une chose amusante !

Non seulement les montagnes, mais aussi l'exploration des marécages, des déserts, des forêts - avec chacun son profil environnemental unique, être capable de surveiller l'environnement en déplacement est un meilleur moyen de comprendre la nature.

Démonstration vidéo

Étape 1 :Matériel, pour quoi faire ?

Il y a beaucoup de sens autour de ce projet

Le shield accessoire est livré avec certains périphériques I2C à bord :

  • Capteur de température LM 75B pour détecter la température ambiante
  • Accéléromètre 3 axes ADXL345 pour détecter l'inclinaison et la gravité
  • DS3231 RTC haute précision pour le temps de détection
  • Capteur magnétique à 3 axes HMC5883 pour capter le cap de la boussole
  • Capteur d'humidité AM2320 pour détecter le % HR de l'air
  • Capteur de pression BMP180 pour détecter la pression atmosphérique et l'altitude
  • Capteur GPS MTK3339 pour détecter l'emplacement et la distance parcourue

Sur l'Arduino Uno :

  • Diviseur de tension 3,9 k + 22 k pour détection 4 AA tension de la batterie
  • 1306 OLED pour la visualisation des données
  • Buzzer pour le bip d'alarme
  • La LED RVB n'est pas nécessaire pour ce projet
  • L'interface XBee n'est pas utilisée mais les Arduino D2, D3, D9, D10 peuvent être extraits de cette interface pour d'autres projets, D2 est connecté pour réinitialiser, ce qui permet de réinitialiser l'Arduino à partir du code !
  • Le joystick à 5 directions n'est pas utilisé
  • Le pot 101 n'est pas utilisé

Étape 2 :Modification et connexion du matériel

Peu de modifications sont apportées sur l'Arduino Uno. Il est monté sur un support de 4 piles AA avec vis et colle chaude.

4 AA et CR1220 (pour RTC) sont installés sur des supports de piles.

Il y a un espace entre le support de batterie et la carte Arduino Uno où le capteur de pression, d'humidité, magnétique et GPS peut être placé.

Les capteurs I2C sont soudés ensemble sur un morceau de carte de préférence et placés dans cet espace

Ces capteurs sont connectés à Arduino Uno par le bas :

Un diviseur de tension est ajouté pour mesurer la tension de la batterie de 4 piles AA.

La ligne de détection de tension du bloc-piles AA va à l'ADC A1 :

Le joystick du blindage est mappé sur la broche ACD A1 à la broche A5. C'est pourquoi le joystick est dessoudé et retiré.

En connectant un tampon sur le blindage d'accessoires (pour le schéma, voir la référence) avec le pont de soudure D2 (pour une réinitialisation logicielle), les broches D3, D9, D10 d'Arduino sont rendues disponibles sur l'interface Xbee.

Les composants s'empilent comme ceci :

  • Couche supérieure :Accessory Shield sur Arduino
  • Couche intermédiaire :les autres capteurs et GPS iront entre Uno et le boîtier de la batterie
  • Couche inférieure :support de 4 piles AA avec piles

Et les connexions ressemblent à ceci :

Étape 3 :Programmation de l'appareil

Arduino IDEBuild 1.8.5 sert à programmer l'appareil. Tout d'abord, toutes les bibliothèques suivantes sont incluses ou téléchargées à l'aide du gestionnaire de bibliothèque.

En tapant le nom du capteur dans la zone de recherche du gestionnaire de bibliothèque, les bibliothèques appropriées apparaîtront.

Certaines des bibliothèques Accessory Shield (voir référence) sont ajoutées via l'option zip.file

Après avoir ajouté les bibliothèques nécessaires, des exemples de codes pour chaque capteur sont examinés pour découvrir les API des capteurs associés.

Ensuite, tous les en-têtes de la bibliothèque sont inclus dans une esquisse Arduino vide.

Liste des fichiers d'en-tête

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 

Après plusieurs éditions, compilations et débogages (y compris une connexion lâche, où j'ai découvert que le BMP180 fonctionne sans Vcc en raison de la puissance de fuite pour les broches I2C peut-être) et téléchargement - enfin le code était prêt.

Les mises en garde

  • Le calcul de l'altitude est basé sur la chute de pression atmosphérique, applicable uniquement dans des conditions météorologiques normales.
  • Le code de la boussole n'est pas compensé en inclinaison dans le logiciel, l'appareil doit être maintenu dans un plan horizontal. Il y a un cercle de boussole fixe, dans lequel il y a un autre cercle de rayon variable. Lorsque l'appareil est incliné, le cercle intérieur augmente. Lorsqu'il est dans une position nivelée (c'est-à-dire que les composants x et y de l'accéléromètre sont presque 0), le cercle intérieur se réduira à un point. C'est à ce moment-là que le cap de la boussole est plus précis.
  • L'angle de déclinaison du pointeur de la boussole dépend de l'emplacement et de la variation du champ magnétique terrestre. Qui peut être affecté par la tempête solaire. Si l'angle de déclinaison n'est pas inclus, le cap de la boussole sera décalé de quelques degrés.

Trouvez la déclinaison pour votre région :http://www.magnetic-declination.com

  • Le cap de la boussole est sujet à des objets magnétiques proches, comme la présence de minéraux magnétiques puissants sur les montagnes.
  • La tension de fonctionnement minimale de l'appareil est d'environ 4,5 volts. C'est à ce moment-là qu'il faut remplacer les piles AA.
  • L'heure et la date sont programmées à partir du code, si le temps est nécessaire pour changer la pile bouton doit être débranchée et branchée. Un nouveau téléchargement de programme avec une nouvelle heure dans le code changera l'heure.
  • Pendant le développement, le module GPS n'était pas disponible. Par conséquent, les coordonnées de démonstration sont placées en Lat-Long. Si quelqu'un souhaite reproduire ce projet, il est nécessaire d'inclure la bibliothèque GPS et les codes associés.
  • Le plan XY de l'accéléromètre et du magnétomètre est soumis à un placement sur le PCB. Le code doit être ajusté en conséquence.
  • La précision de lecture de l'accéléromètre est sujette aux vibrations. Il est conseillé d'utiliser l'appareil à l'arrêt.

Portée de l'amélioration

Des améliorations peuvent être apportées du côté du firmware pour quelques fonctionnalités supplémentaires :

  • Enregistrement périodique des paramètres sur EEPROM
  • Bip d'alarme sonore lorsque vous atteignez le jalon d'altitude/de position
  • Rappel de consommation d'eau
  • Rappel de pause
  • Alarme de batterie faible
  • Alerte température basse, humidité
  • Calibrage du logiciel de boussole pour la compensation d'inclinaison (beaucoup de trucs de trigonométrie)
  • Déclinaison de récupération automatique à l'aide de la connectivité GPS et IoT via l'application Gateway

Quant à la partie matérielle de l'amélioration :

  • Interrupteurs d'entrée utilisateur pour régler l'heure, la déclinaison, etc.
  • Étui 3D personnalisé pour l'appareil
  • Utilisation d'une batterie LiPo rechargeable
  • Conception de circuits imprimés compacts à carte unique pour plus de portabilité

Conclusion

Voyager et faire de la randonnée est cool, quand vous pouvez vérifier le changement de l'environnement, cela rend les choses plus intéressantes. En particulier, vérifier l'altitude, l'humidité, la pression et les changements de température en quelques heures lors d'une randonnée. Cet appareil vous permet de savoir à quelle hauteur vous ressentez le mal de l'altitude, quel niveau d'humidité rend votre peau sèche - des trucs comme ça. Bien qu'il y ait place à l'amélioration à la fois de la disposition du circuit et du code pour faire face aux mises en garde, c'est toujours cool d'avoir un gadget comme celui-ci tout en allant dans la nature !

Ressources externes

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

Kit de prototypage rapide

Code

  • Hiking_Tracker.ino
  • Bibliothèques
Hiking_Tracker.inoC/C++
main.c
/*/////////// REMARQUE //////////D2 permet une réinitialisation logicielle assertable à partir des codesD3,D9,D10 sont disponibles jusqu'à 12,13,16 de xbee interfaceD4, D13 ne sont pas accessibles //////////////////////////*///// FICHIERS EN-TÊTE POUR LA BIBLIOTHÈQUE /////# 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 time[8];struct ts t;int s;int m; int h;int dy;int mo;int an;///////////////// Variables de l'accéléromètre/////////////float X=0.0;float Y=0.0;float Z=0.0;float Gravity =0.0;///////////////// Variables de l'accéléromètre /////////////float Xm=0.0;float Ym=0.0;float Zm=0.0; ////////////////////// Variables LED RVB//////////////const int rgb_pwr =12; const int clk_pin =6; const int data_pin =5; float hue =0.0;boolean up =true;///////////////////// potentiomètre//////////////// //int pot=0; /////////////////// Batt/Vin d'approvisionnement ////////////////float Vbatt =0.0;//// /////////////////Thermomètre///////////////////température du flotteur =0.0 ;////// ////////////// Humidité//////////////////////flotteur humide =0.0 ;////// //////////////Pression d'air///////////////////double prsr =0.0;///////// ///////////Altitude ///////////////////alt flotteur =0.0;///////////// ////// Lat, Long///////////////////lat flottant =0.0 ; float lon =0.0;/////////////////Cap boussole////////////////Cap float =0.0;/// ///////////////// Autres variables //////////////int mstime =0;int sensor_selector =1;///// /////// ENUM //I2C Type d'appareil Objet /////////////////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); // Accéléromètre I2C Temp SensorADXL345 ; // LED I2C Acce SensorChainableLED (clk_pin, data_pin, rgb_pwr, 1); // LED RVB I2CAdafruit_AM2320 am2320 =Adafruit_AM2320(); // Capteur d'humidité I2CAdafruit_BMP085_Unified bmp180 =Adafruit_BMP085_Unified (10085); // Presse I2C SensorAdafruit_HMC5883_Unified mag =Adafruit_HMC5883_Unified (12345); // Capteur Compa I2C// décommentez les 2 lignes suivantes pour activer le GPS// Le débogage série ne sera pas disponible//HardwareSerial mySerial =Serial;//Adafruit_GPS GPS(&mySerial); void setup(void) {// 1.1V Internal Analog Ref //AnalogReference(INTERNAL); ///////////// Signaux pour OLED sur Accessory Shield /////////// //// soudure pontée sur le blindage nécessaire pour D2,D3,D9,D10// pinMode(2,1) ; // auto-réinitialiser D2 à RST pinMode(3,1) ; // sorties à xbee int 12, pinMode(9,1) ; // sorties à xbee int 13 pinMode(10,1) ;// sorties à xbee int 16// digitalWrite(2,HIGH); digitalWrite (3, HAUT); digitalWrite(9,LOW); écriture numérique (10, ÉLEVÉ); pinMode(7,1) ; pinMode(8,1) ; digitalWrite(7,HIGH); digitalWrite(8,LOW); // 10k POT sur A0 // Vin Batt/Supply sur A1 (3.91k/21.76k)/////////////////////////// /////////////////////// Comm série pour le débogage (facultatif)///////// Serial.begin(9600) ;// //////////// Accel Init Waiting ///////// if (!accelerometer.begin()) { delay(50); }/////////////// Activation de l'interruption RTC /////////DS3231_init(DS3231_INTCN); /////////////// Buzzer Init ///////////////pinMode(11,1);digitalWrite(11,LOW); }void loop(void) { // boucle d'image u8g.firstPage(); faire { dessiner(); } while( u8g.nextPage() );// basculer entre les capteurs I2C sensor_selector++; if (sensor_selector>=3) {sensor_selector=0;}////// API de récupération de température ////// temp=termo.getTemp(); delay(5);// "C/////// API de récupération de pression ////////if(sensor_selector ==0){ ///////////// Capteur de pression Init ///////// if(!bmp180.begin()) delay(11); sensor_event_t event; bmp180.getEvent(&event); if (event.pressure) { prsr =event.pressure/10; / /hP à kP délai (50); } }////////////// Init GPS ////////////GPS.begin (9600);//// /// API de récupération d'altitude ////////if(sensor_selector ==0){ sensor_event_t event; bmp180.getEvent(&event); alt =bmp180.pressureToAltitude(1013.25,event.pressure); delay(50); // bmp180.end();}// en mètre ////////////// Init capteur d'humidité ///////if(sensor_selector ==1){ am2320.begin(); delay(50);////// API de récupération d'humidité ///////// humid=am2320.readHumidity(); delay(50);// am2320.end(); // en % de RH}// en kPa////// API Acceleration Fetch ////// Vector norm =accelerometer.readNormalize(); X =norm.XAxis; Y =norm.YAxis; Z =norm.ZAxis; Gravity =sqrt(X*X + Y*Y+ Z*Z)-(0.3);// offset// en m/s^2///// Time Fetch API //////// DS3231_get(&t); s=t.sec; m=t.min; h=t. heure; dy=t.mday; mo=t.mon; an=t.année ; ///// Récupération de la position du pot /////// pot=analogRead(A0)*5/(10*3) ; delay(2);///// VBatt/Supply Fetch /////// // 1.1 vaut 1.08 pour cette puce Vbatt=(1.08*analogRead(A1)/1023)/3.91*((3.91+21.76) ); delay(2);///////// Cap compas ////////if(sensor_selector ==2){ if(!mag.begin()) { while(1); } // délai (70); sensor_t sensor2; mag.getSensor(&sensor2); retard (70); // l'angle de déclinaison dépend de la géolocalisation // utilise Lat Long du GPS pour calculer sensor_event_t event2; mag.getEvent(&event2); // Xm =event2.magnetic.x; // Ym =event2.magnetic.y; retard (70); déclinaison flottante =0,0 ; rubrique =atan2(event2.magnetic.y, event2.magnetic.x); cap +=déclinaison; // correction de signe if(titre <0) titre +=2*PI; if(titre> 2*PI) titre -=2*PI; // Convertit les radians en degrés pour plus de lisibilité. cap =cap * 180/M_PI; // mag.end();} ///// Contrôle du buzzer ////////// if (pot>80) {digitalWrite(11,1);} else {digitalWrite(11,0); }///// Contrôle LED adressable RVB ///////////// if(pot>40) { leds.pwr_set(PWR_ENABLE); pour (octet i=0; i<1; i++) leds.setColorHSB(i, teinte, 1,0, 0,5); si (haut) teinte+=0,025 ; sinon teinte-=0,025 ; if (teinte>=1.0 &&up) up =false; else if (teinte<=0.0 &&!up) up =true; }//////////////////////////////////////// Réinitialisation automatique //// /////// // digitalWrite(2,LOW);///////////////////////////////////////////// } ///////// La boucle vide se termine ici ////////////////////////////////////////////////////////////////////////////// //////////void draw(void) { 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);if(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(mo<10) u8g.print(0);u8g.print(mo);u8g.drawStr( 0,16,"/"); u8g.setPrintPos(6, 16);u8g.print(an); u8g.drawVLine(99, 0, 14); u8g.drawStr( 104,7,"BATT"); 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,"AIR TEMP:"); u8g.setPrintPos(85, 24); u8g.print(temp);u8g.drawStr( 118,24,"C"); u8g.drawStr( 39,34,"HUMIDITÉ :"); u8g.setPrintPos(85, 34); u8g.print(humide);u8g.drawStr( 118,34,"%"); u8g.drawStr( 39,44,"PRESSION:"); u8g.setPrintPos(85, 44); u8g.print(prsr);u8g.drawStr( 118,44,"hP"); u8g.drawStr( 39,54,"ALTITUDE:"); u8g.setPrintPos(85, 54); u8g.print(round(alt));u8g.drawStr( 118,54,"m"); u8g.drawHLine (0, 56, 128); u8g.drawStr( 19,64,"LAT:");u8g.setPrintPos(39, 64); u8g.print(23,57); // Démo, remplacer par LAT lorsque le GPS a ajouté u8g.drawStr( 69,64,"LONG:");u8g.setPrintPos(94, 64); u8g.print(90.36); // démo, remplacer par LON lorsque GPS ajouté // u8g.setPrintPos (40, 25); u8g.print(round(temp));u8g.drawStr( 55,25, "'C"); int r =round(sqrt(X*X + Y*Y)); // float tid =atan(Y/X)*180/3.1415;// problèmes mathématiques ici // int radius =round(tid); u8g.drawStr( 0,22, "titre"); u8g.drawCircle(18, 34,r, U8G_DRAW_ALL);// cercle de nivellement intérieur u8g.drawCircle(18, 34,10, U8G_DRAW_ALL); // cercle extérieur fixe // le cercle intérieur deviendra un point lorsqu'aucune inclinaison en x et axe y // c'est lorsque le cap de la boussole est plus précis // u8g.drawLine(18, 34,(18+round(Y*2)),(34+round(X*2))); // augmenté 2x u8g.setPrintPos (0, 53); u8g.print(titre); // 0 ou 360 est N // 90 est E // 180 est S // 270 est W // u8g.setFont(u8g_font_5x8) ; if ((titre>315)|(titre<=45)) {u8g.drawLine(18,34,8,34); }if ((titre>45)&(titre<=135)){u8g.drawLine(18,34,18,24);}if ((titre>135)&(titre<=225)){u8g.drawLine (18,34,28,34);}if ((titre>225)&(titre<315)){u8g.drawLine(18,34,18,44);}// u8g.drawLine(18, 34, (18+rond(Y*2)),(34+rond(X*2))); // augmenté 2x BASÉ SUR L'ACCÉLAROMÈTRE // la boucle se termine ici }
BibliothèquesC/C++
Décompressez-le et ajoutez les zips de bibliothèque individuels à Arduino Library Manager
Aucun aperçu (téléchargement uniquement).

Schémas


Processus de fabrication

  1. Capteur de mouvement utilisant Raspberry Pi
  2. Capteur d'humidité du sol Raspberry Pi
  3. Transformez votre Raspberry Pi en un moniteur d'activité pour hamster
  4. Test du capteur DS18B20
  5. Capteur de température Raspberry Pi
  6. Toilet Tracker (Powered by Walabot)
  7. Capteur d'émotion/EEG
  8. Windows 10 IoT Core sur Raspberry Pi 2 – Données du capteur Adafruit
  9. Traqueur de capteur WiFi RSSI pour l'ISS