Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Wandeltracker

Componenten en benodigdheden

Arduino 101
× 1
AA-batterijen
× 1
4xAA-batterijhouder
× 1
Accessoire Shiled
× 1
Adafruit BMP180-druksensor
× 1
Adafruit Ultimate GPS Breakout
× 1
Adafruit - 3-assig magnetisch
× 1
Adafruit AM2320-vochtigheidssensor
× 1
Adafruit Coin Cell CR2012
× 2
Weerstand 10k ohm
× 1
Weerstand 3,9 k
× 1

Benodigde gereedschappen en machines

Hot lijmpistool (algemeen)
Soldeerbout (algemeen)

Apps en online services

Arduino IDE

Over dit project

Wat is Hiking Tracker?

Hiking Tracker is een apparaat om de verandering in de omgeving van een wandelaar tijdens het wandelen waar te nemen.

Het idee is om de verandering in temperatuur, druk, vochtigheid, hoogte, locatie, richting enz. Waar te nemen. Het geeft een interessant inzicht in wandelen.

Op de bergen waar het koude, droge lucht met een lage dichtheid is in vergelijking met lager gelegen landen, vinden veel mensen het moeilijk om te ademen. Sommigen ervaren een droge huidirritatie. Met dit apparaat kunnen mensen die geïnteresseerd zijn in wandelen hun grenzen kennen. Er is ook het plezier om naar plaatsen op grote hoogte te gaan. De hoogte kunnen kennen is leuk!

Niet alleen de bergen, maar ook het verkennen van moerassen, woestijnen en bossen - met elk hun unieke milieuprofiel, is het onderweg kunnen volgen van de omgeving een betere manier om de natuur te begrijpen.

Videodemonstratie

Stap 1:Hardware, waarvoor?

Er gaan veel zintuigen rond met dit project

Het accessoire schild wordt geleverd met enkele I2C-apparaten aan boord:

  • LM 75B temperatuursensor voor het meten van de omgevingstemperatuur
  • ADXL345 3-assige versnellingsmeter voor het meten van kanteling en zwaartekracht
  • DS3231 uiterst nauwkeurige RTC voor detectietijd
  • HMC5883 3-assige magnetische sensor voor waarneming van kompasrichting
  • AM2320 vochtigheidssensor voor meten van % RV van lucht
  • BMP180-druksensor voor meten van atmosferische druk en hoogte
  • MTK3339 GPS-sensor voor detectie van locatie en loopafstand

Op de Arduino Uno:

  • 3.9k + 22k spanningsdeler voor sensing 4 AA batterijspanning
  • 1306 OLED voor het bekijken van gegevens
  • Zoemer voor alarmpiep
  • RGB LED is niet nodig voor dit project
  • XBee-interface wordt niet gebruikt, maar Arduino D2, D3, D9, D10 kan uit deze interface worden gehaald voor andere projecten, D2 is verbonden met reset, waardoor de Arduino vanuit code kan worden gereset!
  • 5-weg joystick wordt niet gebruikt
  • 101 pot wordt niet gebruikt

Stap 2:De hardware aanpassen en aansluiten

Er zijn weinig wijzigingen aangebracht aan de Arduino Uno. Het is gemonteerd op een 4 AA-batterijhouder met schroefafstandhouders en hete lijm.

4 AA en CR1220 (voor RTC) zijn geïnstalleerd op batterijhouders.

Er is een ruimte tussen de batterijhouder en het Arduino Uno-bord waar de druk-, vochtigheids-, magnetische en GPS-sensor kan worden geplaatst.

I2C-sensoren worden aan elkaar gesoldeerd op een stuk prefboard en in deze ruimte geplaatst

Deze sensoren zijn vanaf de onderkant verbonden met Arduino Uno:

Er is een spanningsdeler toegevoegd om de batterijspanning van 4 AA-batterijen te meten.

De spanningsdetectielijn van de AA-batterij gaat naar ADC A1:

De joystick van het schild is toegewezen aan de ACD-pin A1 via pin A5. Daarom is de joystick gedesoldeerd en verwijderd.

Door een pad op het Accessory Shield (voor schema zie referentie) te verbinden met soldeerbrug D2 (voor zachte reset), worden D3-, D9- en D10-pinnen van Arduino beschikbaar gemaakt op de Xbee-interface.

De componenten stapelen zich als volgt op:

  • Toplaag:accessoire-schild op Arduino
  • Middelste laag:andere sensoren en GPS gaan tussen Uno en batterijhouder
  • Onderlaag:4 AA-batterijhouder met batterijen

En de verbindingen zien er als volgt uit:

Stap 3:Programmeren van het apparaat

Arduino IDEBuild 1.8.5 wordt gebruikt om het apparaat te programmeren. Eerst worden alle volgende bibliotheken opgenomen of gedownload met behulp van de bibliotheekmanager.

Door de naam van de sensor in het zoekvak van bibliotheekmanager te typen, verschijnen de juiste bibliotheken.

Sommige van de Accessory Shield-bibliotheken (zie referentie) zijn toegevoegd via de zip.file-optie

Nadat de benodigde bibliotheken zijn toegevoegd, worden voorbeeldcodes voor elke sensor beoordeeld om de API's voor bijbehorende sensoren te achterhalen.

Vervolgens worden alle bibliotheekheaders opgenomen in één lege Arduino-schets.

Lijst met koptekstbestanden

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 

Na meerdere bewerkingen, compileren en debuggen (inclusief losse verbinding, waar ik ontdekte dat de BMP180 werkt zonder Vcc vanwege lekstroom voor I2C-pinnen misschien) en uploaden - eindelijk was de code klaar.

De waarschuwingen

  • Hoogteberekening is gebaseerd op luchtdrukdaling, alleen van toepassing tijdens normale weersomstandigheden.
  • Kompascode wordt niet gecompenseerd voor kanteling in software, het apparaat moet in een horizontaal vlak worden gehouden. Er is een vaste kompascirkel, waarin zich een andere cirkel met variabele straal bevindt. Wanneer het apparaat wordt gekanteld, wordt de binnenste cirkel groter. Wanneer het zich in een genivelleerde positie bevindt (d.w.z. zowel de x- als de y-component van acceleromeer is bijna 0), zal de binnenste cirkel verkleinen tot een punt. Dit is wanneer de kompasrichting nauwkeuriger is.
  • Declinatiehoek van de kompasaanwijzer hangt af van de locatie en variatie van het aardmagnetisch veld. Die kan worden beïnvloed door zonnestorm. Als de declinatiehoek niet is inbegrepen, wijkt de kompaskoers enkele graden af.

Zoek declinatie voor uw regio:http://www.magnetic-declination.com

  • De koers van het kompas is gevoelig voor nabije magnetische objecten, zoals de aanwezigheid van sterke magnetische mineralen op bergen.
  • De minimale bedrijfsspanning van het apparaat is ongeveer 4,5 volt. Dit is wanneer AA-batterijen moeten worden vervangen.
  • Tijd en datum worden geprogrammeerd vanuit de code. Als er tijd nodig is om de knoopcelbatterij te vervangen, moet deze worden losgekoppeld en aangesloten. Een nieuwe programma-upload met een nieuwe tijd in de code zal de tijd veranderen.
  • Tijdens de ontwikkeling was de GPS-module niet beschikbaar. Daarom worden demo-coördinaten in Lat-Long geplaatst. Als iemand dit project wil repliceren, is het vereist om de GPS-bibliotheek en bijbehorende codes op te nemen.
  • XY-vlak van versnellingsmeter en magnetometer zijn onderhevig aan plaatsing op PCB. Code moet dienovereenkomstig worden aangepast.
  • De nauwkeurigheid van de acceleratiemeter is gevoelig voor trillingen. Het wordt aangeraden het apparaat in stilstand te gebruiken.

Bereik van verbetering

Er kunnen verbeteringen worden aangebracht aan de firmware-kant voor nog een paar functies:

  • Periodieke logging van parameters op EEPROM
  • Zoemer pieptoon bij het bereiken van een hoogte-/locatiemijlpaal
  • Drinkwaterherinnering
  • Herinnering voor een pauze
  • Lage batterij-alarm
  • Lage temperatuur, vochtigheidswaarschuwing
  • Kompas-softwarekalibratie voor kantelcompensatie (veel trigonometrie-dingen)
  • Declinatie automatisch ophalen met behulp van GPS en IoT-connectiviteit via de Gateway-app

Wat betreft het hardwaregedeelte van verbetering:

  • Gebruikersinvoerschakelaars voor het instellen van tijd, declinatie enz.
  • Aangepaste 3D-hoes voor het apparaat
  • Oplaadbare LiPo-batterij gebruiken
  • Single board compact PCB-ontwerp voor meer draagbaarheid

Conclusie

Reizen en wandelen is cool, als je de verandering in de omgeving kunt controleren, maakt het dingen interessanter. Vooral het controleren van de hoogte, vochtigheid, druk en temperatuur verandert binnen enkele uren tijdens het wandelen. Dit apparaat laat je weten op welke hoogte je hoogteziekte voelt, bij welke vochtigheidsgraad je huid droog wordt - dat soort dingen. Hoewel er ruimte is voor verbetering in zowel de lay-out van het circuit als de code om met de voorbehouden om te gaan, is het nog steeds cool om een ​​gadget als deze te hebben terwijl je de wildernis in gaat!

Externe bronnen

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

Kit voor snelle prototypen

Code

  • Hiking_Tracker.ino
  • Bibliotheken
Hiking_Tracker.inoC/C++
main.c
/*/////////// OPMERKING //////////D2 maakt zachte reset mogelijk vanaf code D3,D9,D10 zijn beschikbaar tot en met 12,13,16 van xbee interfaceD4, D13 zijn niet toegankelijk///////////////////////////*///// HEADER-BESTANDEN VOOR BIBLIOTHEEK /////# include #include #include #include #include #include #include "U8glib.h"#include "ds3231.h"#include "Adafruit_Sensor.h"#include "Adafruit_AM2320.h"#include #include #include ////////// /////////////RTC-variabelen///////////////////uint8_t time[8];struct ts t;int s;int m; int h;int dy;int mo;int jr;///////////////// Accelerometervariabelen/////////////float X=0.0;float Y=0.0;float Z=0.0;float Zwaartekracht =0.0;///////////////// Accelerometervariabelen/////////////float Xm=0.0;vlotter Ym=0,0;vlotter Zm=0,0; /////////////////////// RGB LED-variabelen///////////////const int rgb_pwr =12; const int clk_pin =6; const int data_pin =5; float hue =0.0;boolean up =true;////////////////////// potentiometer///////////////// //int-pot=0; //////////////////// Batt/Supply Vin /////////////////float Vbatt =0.0;//// //////////////////Thermometer////////////////////vlottertemperatuur =0,0;////// /////////////// Vochtigheid///////////////////////vlotter vochtig =0,0;////// //////////////Luchtdruk////////////////////dubbele prsr =0,0;///////// ///////////Hoogte ////////////////////float alt =0.0;///////////// ////// Lat, Long////////////////////float lat =0.0; float lon =0.0;//////////////////Kompaskoers/////////////////float koers =0.0;/// ////////////////// Andere variabelen ///////////////int mstime =0;int sensor_selector =1;///// /////// ENUM //I2C Apparaattype Object /////////////////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); // I2C Temp SensorADXL345 versnellingsmeter; // I2C Acce SensorChainableLED-leds (clk_pin, data_pin, rgb_pwr, 1); // I2C RGB LEDAdafruit_AM2320 am2320 =Adafruit_AM2320(); // I2C Vochtige SensorAdafruit_BMP085_Unified bmp180 =Adafruit_BMP085_Unified(10085); // I2C-perssensor Adafruit_HMC5883_Unified mag =Adafruit_HMC5883_Unified (12345); // I2C Compa Sensor// verwijder commentaar op de volgende 2 regels om GPS in te schakelen// Seriële foutopsporing is niet beschikbaar//HardwareSerial mySerial =Serial;//Adafruit_GPS GPS(&mySerial); void setup (void) {// 1.1V Interne Analoge Ref //analogReference (INTERN);///////////// Signalen voor OLED op accessoirescherm /////////// //// soldeer overbrugd op schild nodig voor D2,D3,D9,D10// pinMode(2,1); // zelf reset D2 naar RST pinMode (3,1); // outs op xbee int 12, pinMode (9,1); // outs bij xbee int 13 pinMode (10,1);// outs bij xbee int 16// digitalWrite (2,HIGH); digitalWrite (3, HOOG); digitalWrite(9,LAAG); digitalWrite(10,HOOG); pinMode(7,1); pinMode (8,1); digitalWrite(7,HOOG); digitalWrite (8, LAAG); // 10k POT op A0 // Vin Batt/Supply op A1 (3.91k/21.76k)///////////////////////////// //////////////////////// Seriële communicatie voor foutopsporing (optioneel)////////// Serial.begin (9600);// //////////// Accel Init Waiting ///////// if (!accelerometer.begin()) { delay(50); }/////////////// RTC Interrupt inschakelen /////////DS3231_init(DS3231_INTCN); //////////////// Buzzer Init ////////////////pinMode (11,1);digitalWrite (11,LOW); }void loop(void) { // picture loop u8g.firstPage(); doe { tekenen(); } while(u8g.nextPage());// schakelen tussen I2C-sensoren sensor_selector++; if (sensor_selector>=3) {sensor_selector=0;}////// Temperature Fetch API ////// temp=termo.getTemp(); vertraging (5);// "C/////// Drukophaal-API ////////if(sensor_selector ==0){ ///////////// Druksensor Init ///////// if(!bmp180.begin()) delay(11); sensors_event_t event; bmp180.getEvent(&event); if (event.pressure) { prsr =event.pressure/10; / /hP naar kP vertraging (50); } }////////////// GPS Init ////////////GPS.begin (9600);//// /// Altitude Fetch API ////////if(sensor_selector ==0){ sensors_event_t event; bmp180.getEvent(&event); alt =bmp180.pressureToAltitude(1013.25,event.pressure); delay(50); // bmp180.end();}// in meter ////////////// Vochtigheidssensor Init ///////if(sensor_selector ==1){ am2320.begin(); delay(50);////// Humidity Fetch API /////////humid=am2320.readHumidity(); delay(50);// am2320.end(); // in % van RH}// in kPa////// Acceleration Fetch API ////// Vector norm =accelerometer.readNormalize(); X =norm.XAxis; Y =norm.YAxis; Z =norm.ZAxis; Gravity =sqrt(X*X + Y*Y+ Z*Z)-(0.3);// offset// in m/s^2///// Time Fetch API //////// DS3231_get(&t); s=t.sec; m=t.min; h=t. uur; dy=t.mdag; ma=t.ma; jr=t.jaar; ///// Potpositie ophalen /////// pot=analogRead(A0)*5/(10*3); vertraging (2);///// VBatt/Supply Fetch ///////// 1.1 is 1.08 voor deze chip Vbatt=(1.08*analogRead(A1)/1023)/3.91*((3.91+21.76) ); vertraging(2);///////// Kompaskoers ////////if(sensor_selector ==2){ if(!mag.begin()) { while(1); } // vertraging (70); sensor_t sensor2; mag.getSensor(&sensor2); vertraging (70); // declinatiehoek hangt af van geografische locatie // gebruik Lat Long van GPS om sensors_event_t event2 te berekenen; mag.getEvent(&event2); // Xm =gebeurtenis2.magnetisch.x; // Ym =gebeurtenis2.magnetisch.y; vertraging (70); float declinatie =0,0; kop =atan2(gebeurtenis2.magnetisch.y, gebeurtenis2.magnetisch.x); kop +=declinatie; // tekencorrectie als (kop <0) kop +=2 * PI; if(kop>
 2*PI) kop -=2*PI; // Converteer radialen naar graden voor leesbaarheid. koers =koers * 180/M_PI; // mag.end();} ///// Zoemerbesturing ////////// if (pot>80) {digitalWrite(11,1);} else {digitalWrite(11,0); }///// RGB-adresseerbare LED-besturing ///////////// if(pot>40) { leds.pwr_set(PWR_ENABLE); voor (byte i=0; i<1; i++) leds.setColorHSB(i, hue, 1.0, 0.5); indien (omhoog) tint+=0,025; anders tint-=0,025; if (tint>=1,0 &&omhoog) omhoog =onwaar; anders if (tint<=0.0 &&!up) up =true; }/////////////////////////////////////////// Zelf resetten //// /////// // digitalWrite(2,LOW);///////////////////////////////// } ///////// Void Loop eindigt hier /////////////////////// Oled Picture Loop Draw Fn///////// //////////void draw (void) { u8g.setFont(u8g_font_7x13); u8g.drawHLin(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.drawHLin(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(jr); 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,"LUCHTTEMP:"); u8g.setPrintPos(85, 24); u8g.print(temp);u8g.drawStr( 118,24,"C"); u8g.drawStr( 39,34,"VOCHTHEID:"); u8g.setPrintPos(85, 34); u8g.print(vochtig);u8g.drawStr( 118,34,"%"); u8g.drawStr( 39,44,"DRUK:"); u8g.setPrintPos(85, 44); u8g.print(prsr);u8g.drawStr( 118,44,"hP"); u8g.drawStr( 39,54,"HOOGTE:"); u8g.setPrintPos(85, 54); u8g.print(round(alt));u8g.drawStr( 118,54,"m"); u8g.drawHLin (0, 56, 128); u8g.drawStr( 19,64,"LAT:");u8g.setPrintPos(39, 64); u8g.print(23.57); // Demo, vervang door LAT wanneer GPS u8g.drawStr( 69,64,"LONG:");u8g.setPrintPos(94, 64); u8g.print(90.36);// demo, vervang door LON wanneer GPS is toegevoegd // u8g.setPrintPos(40, 25); u8g.print(round(temp));u8g.drawStr( 55,25, "'C"); int r =rond(sqrt(X*X + Y*Y)); // float tid =atan(Y/X)*180/3.1415;// wiskundige problemen hier // int radius =round(tid); u8g.drawStr( 0,22,"kop"); u8g.drawCircle(18, 34,r, U8G_DRAW_ALL);// binnenste nivelleringscirkel u8g.drawCircle(18, 34,10, U8G_DRAW_ALL);// buitenste vaste cirkel // binnenste cirkel wordt een punt als er geen kanteling in x en y-as // dit is wanneer de kompasrichting nauwkeuriger is //u8g.drawLine(18, 34, (18+round(Y*2)),(34+round(X*2))); // 2x opgeschaald u8g.setPrintPos (0, 53); u8g.print(kop); // 0 of 360 is N // 90 is E // 180 is S // 270 is W // u8g.setFont(u8g_font_5x8); if ((kop>
315)|(kop<=45)) {u8g.drawLine(18,34,8,34); }if ((heading>45)&(heading<=135)){u8g.drawLine(18,34,18,24);}if ((heading>135)&(heading<=225)){u8g.drawLine (18,34,28,34);}if ((kop>
225)&(kop<315)){u8g.drawLine(18,34,18,44);}// u8g.drawLine(18, 34, (18+ronde(Y*2)),(34+ronde(X*2))); // 2x opgeschaald GEBASEERD OP VERSNELLINGSMETER // lus eindigt hier }
BibliothekenC/C++
Pak het uit en voeg de afzonderlijke bibliotheekritsen toe aan Arduino Library Manager
Geen voorbeeld (alleen downloaden).

Schema's


Productieproces

  1. Wat is een O2-sensor?
  2. Bewegingssensor met Raspberry Pi
  3. Raspberry Pi Bodemvochtsensor
  4. Verander je Raspberry Pi in een Hamster Fitness Tracker
  5. Test DS18B20-sensor
  6. Raspberry Pi-temperatuursensor
  7. Toilet Tracker (Powered by Walabot)
  8. Emotiesensor / EEG
  9. Windows 10 IoT Core op Raspberry Pi 2 – Adafruit-sensorgegevens
  10. UnifiedWater v1
  11. WiFi RSSI-sensortracker voor het ISS