工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ハイキングトラッカー

コンポーネントと消耗品

>
Arduino 101
× 1
単三電池
× 1
4xAAバッテリーホルダー
× 1
付属品のシールド
× 1
AdafruitBMP180圧力センサー
× 1
Adafruit Ultimate GPS Breakout
× 1
Adafruit-3軸磁気
× 1
AdafruitAM2320湿度センサー
× 1
Adafruit Coin Cell CR2012
× 2
抵抗10kオーム
× 1
抵抗器3.9k
× 1

必要なツールとマシン

>
ホットグルーガン(汎用)
はんだごて(汎用)

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

ハイキングトラッカーとは何ですか?

Hiking Trackerは、ハイキング中にハイカーの周囲の環境の変化を感知するデバイスです。

アイデアは、気温、気圧、湿度、高度、場所、方向などの変化を観察することです。これにより、ハイキングに関する興味深い洞察が得られます。

低地に比べて寒くて乾燥していて密度の低い空気の山では、多くの人が呼吸が難しいと感じています。乾燥肌の炎症を経験する人もいます。このデバイスを使用すると、ハイキングに興味のある人は自分の限界を知ることができます。高地に行く楽しみもあります。高度を知ることができるのは楽しいことです!

山だけでなく、沼地、砂漠、森を探索することもできます。それぞれに固有の環境プロファイルがあるため、外出先で環境を監視できることは、自然を理解するためのより良い方法です。

<図>

ビデオデモンストレーション

ステップ1:ハードウェア、何のために?

このプロジェクトでは多くのセンシングが行われています

アクセサリシールドには、いくつかのI2Cデバイスが搭載されています:

  • 周囲温度を検知する用のLM75B温度センサー
  • ADXL3453軸加速度計傾きと重力を感知する
  • DS3231のセンシング時間用の高精度RTC
  • HMC5883 コンパスの方位を検知する用の3軸磁気センサー
  • 空気の%RHを検知する用のAM2320湿度センサー
  • 大気圧と高度を検知する用のBMP180圧力センサー
  • 検知位置と徒歩距離用のMTK3339GPSセンサー

Arduino Unoについて:

  • センシング4 用の3.9k + 22k分圧器 AA バッテリー電圧
  • データを表示するための1306OLED
  • アラームビープ音のブザー
  • このプロジェクトにはRGBLEDは必要ありません
  • XBeeインターフェースは使用されませんが、Arduino D2、D3、D9、D10は他のプロジェクトのためにこのインターフェースから引き出すことができ、D2はリセットに接続され、コードからArduinoをリセットできます!
  • 5方向ジョイスティックは使用されません
  • 101ポットは使用されていません

ステップ2:ハードウェアの変更と接続

ArduinoUnoにはほとんど変更が加えられていません。ネジスタンドオフとホットグルーを備えた4AAバッテリーホルダーに取り付けられています。

<図> <図>

4 AAおよびCR1220(RTC用)はバッテリーホルダーに取り付けられています。

<図> <図>

バッテリーホルダーとArduinoUnoボードの間には、圧力、湿度、磁気、GPSセンサーを配置できるスペースがあります。

<図> <図>

I2Cセンサーは、1枚の設定ボードにはんだ付けされ、このスペースに配置されます

<図> <図>

これらのセンサーは、下側からArduino Unoに接続されています:

<図>

単三電池4本の電池電圧を測定するために分圧器が追加されています。

<図>

単三電池パックの電圧検出ラインはADCA1に接続されています:

<図>

シールドのジョイスティックは、ピンA5を介してACDピンA1にマップされます。そのため、ジョイスティックははんだ除去されて取り外されます。

<図>

アクセサリシールド(回路図についてはリファレンスを参照)のパッドをはんだブリッジD2(ソフトリセット用)に接続することにより、ArduinoのD3、D9、D10ピンがXbeeインターフェースで利用できるようになります。

<図> <図>

コンポーネントは次のようにスタックします:

<図>
  • 最上層:Arduinoのアクセサリシールド
  • 中間層:他のセンサーとGPSはUnoとバッテリーケースの間を行き来します
  • 最下層:電池付き単三電池4本

そして、接続は次のようになります:

<図>

ステップ3:デバイスのプログラミング

Arduino IDEBuild 1.8.5 デバイスをプログラムするために使用されます。まず、ライブラリマネージャを使用して、次のすべてのライブラリが含まれるか、ダウンロードされます。

<図>

ライブラリマネージャーの検索ボックスにセンサーの名前を入力すると、適切なライブラリが表示されます。

<図>

一部のアクセサリシールドライブラリ(リファレンスを参照)は、zip.fileオプションを介して追加されます

<図>

必要なライブラリを追加した後、各センサーのサンプルコードを確認して、関連するセンサーのAPIを見つけます。

次に、すべてのライブラリヘッダーが1つの空のArduinoスケッチに含まれます。

ヘッダーファイルのリスト

  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  

複数の編集、コンパイル、デバッグ(接続の緩みを含む、I2Cピンのリーク電力のためにBMP180がVccなしで動作することを発見した場合を含む)とアップロードの後、最終的にコードの準備が整いました。

警告

  • 高度の計算は気圧降下に基づいており、通常の気象条件でのみ適用されます。
<図>
  • コンパスコードはソフトウェアで傾斜補正されていません。デバイスは水平面に保持する必要があります。固定コンパス円があり、その中に別の可変半径円があります。デバイスを傾けると、内側の円が大きくなります。それが水平な位置にあるとき(つまり、加速度計のx成分とy成分の両方がほぼ0であるとき)、内側の円はある点に減少します。これは、コンパスの方位がより正確な場合です。
  • コンパスポインターの偏角は、地球の磁場の位置と変化によって異なります。太陽嵐の影響を受ける可能性があります。偏角が含まれていない場合、コンパスの方位は数度ずれます。

お住まいの地域の偏角を見つける:http://www.magnetic-declination.com

  • コンパスの方位は、山に強い磁性鉱物が存在するなど、近くに磁性体が存在する傾向があります。
  • デバイスの最小動作電圧は約4.5ボルトです。単三電池を交換する必要があるのはこのときです。
  • 時刻と日付はコードからプログラムされます。コイン電池の交換に時間が必要な場合は、プラグを抜いて差し込む必要があります。コードに新しい時刻が含まれる新しいプログラムのアップロードにより、時刻が変更されます。
  • 開発中、GPSモジュールは利用できませんでした。したがって、デモ座標はLat-Longに配置されます。このプロジェクトを複製したい場合は、GPSライブラリと関連するコードを含める必要があります。
  • 加速度計と磁力計のXY平面は、PCB上に配置される可能性があります。コードはそれに応じて調整する必要があります。
  • 加速度計の読み取り精度は振動しやすいです。静止状態でデバイスを使用することをお勧めします。

改善の範囲

さらにいくつかの機能について、ファームウェア側から改善を行うことができます。

  • EEPROMのパラメータの定期的なロギング
  • 高度/位置のマイルストーンに達するとブザーアラームが鳴ります
  • 水を飲むリマインダー
  • 休憩のリマインダーを取ります
  • バッテリー低下アラーム
  • 低温、湿度の警告
  • 傾斜補正用のコンパスソフトウェアキャリブレーション(多くの三角法関連のもの)
  • ゲートウェイアプリを介したGPSおよびIoT接続を使用した自動フェッチ偏角

改善のハードウェア部分について:

  • 時間の設定、偏角などのユーザー入力スイッチ
  • デバイス用のカスタム3Dケース
  • 充電式LiPoバッテリーの使用
  • 携帯性を高めるシングルボードコンパクトPCBデザイン

結論

旅行やハイキングはかっこいいです。周囲の環境の変化を確認できると、物事がより面白くなります。特に、ハイキング中に数時間以内に標高、湿度、気圧、気温の変化をチェックします。このデバイスは、高山病を感じる高さ、肌を乾燥させる湿度レベルなどを知らせます。警告に対処するために回路レイアウトとコードの両方に改善の余地がありますが、荒野に入るときにこのようなガジェットを持っていることはまだクールです!

外部リソース

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

ラピッドプロトタイピングキット

コード

  • Hiking_Tracker.ino
  • ライブラリ
Hiking_Tracker.ino C / C ++
main.c
 / * ///////////注////////// D2を使用すると、codeD3、D9、D10からアサート可能なソフトリセットを使用できます。 xbee interfaceD4、D13にアクセスできません/////////////////////////// * /////ライブラリのヘッダーファイル/////# include  #include  #include  #include  #include  #include  #include "U8glib.h" #include "ds3231.h" #include "Adafruit_Sensor.h" #include "Adafruit_AM2320.h" #include  #include  #include  ////////// ///////////// RTC変数/////////////////// uint8_ttime [8]; struct ts t; int s; int m; int h; int dy; int mo; int yr; /////////////////加速度計変数///////////// floatX =0.0; float Y =0.0; float Z =0.0; float Gravity =0.0; /////////////////加速度計変数///////////// floatXm =0.0; float Ym =0.0; float Zm =0.0; /////////////////////// RGBLED変数/////////////// const int rgb_pwr =12; const int clk_pin =6; const int data_pin =5; float hue =0.0; boolean up =true; //////////////////////ポテンショメータ///////////////// // int pot =0; /////////////////// Batt / Supply Vin ///////////////// float Vbatt =0.0; //// //////////////////温度計///////////////////フロート温度=0.0; ////// ///////////////湿度///////////////////////フロート湿度=0.0; ////// //////////////空気圧//////////////////// doubleprsr =0.0; ///////// ///////////高度//////////////////// float alt =0.0; ///////////// ////// Lat、Long //////////////////// float lat =0.0; float lon =0.0; ////////////////// Compass Heading ///////////////// float heading =0.0; /// //////////////////その他の変数/////////////// int mstime =0; int Sensor_selector =1; ///// /////// ENUM // I2Cデバイスタイプオブジェクト///////////////// 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温度センサーADXL345加速度計; // I2C Acce SensorChainableLED leds(clk_pin、data_pin、rgb_pwr、1); // I2C RGB LEDAdafruit_AM2320 am2320 =Adafruit_AM2320(); // I2C湿度センサーAdafruit_BMP085_Unifiedbmp180 =Adafruit_BMP085_Unified(10085); // I2C Press SensorAdafruit_HMC5883_Unified mag =Adafruit_HMC5883_Unified(12345); // I2C Compa Sensor //次の2行のコメントを解除してGPSを有効にします//シリアルデバッグは利用できません// HardwareSerial mySerial =Serial; // Adafruit_GPS GPS(&mySerial); void setup(void){// 1.1V内部アナログ参照// analogReference(INTERNAL); /////////////アクセサリシールド上のOLEDの信号/////////// //// D2、D3、D9、D10に必要なシールドにはんだブリッジ// pinMode(2,1); // D2をRSTにセルフリセットpinMode(3,1); // xbee int 12でouts、pinMode(9,1); // xbee int 13でoutspinMode(10,1); // xbee int16でouts // digitalWrite(2、HIGH); digitalWrite(3、HIGH); digitalWrite(9、LOW); digitalWrite(10、HIGH); pinMode(7,1); pinMode(8,1); digitalWrite(7、HIGH); digitalWrite(8、LOW); // A0で10kPOT // Vin Batt / Supply on A1(3.91k / 21.76k)///////////////////////////// ////////////////////////デバッグ用シリアル通信(オプション)////////// Serial.begin(9600); // //////////// Accel Init Waiting ///////// if(!accelerometer.begin()){delay(50); } /////////////// RTC割り込みの有効化///////// DS3231_init(DS3231_INTCN); ////////////////ブザーの初期化//////////////// pinMode(11,1); digitalWrite(11、LOW); } void loop(void){//画像ループu8g.firstPage(); do {draw(); } while(u8g.nextPage()); // I2Cセンサーを切り替えるsensor_selector ++; if(sensor_selector> =3){sensor_selector =0;} ////// Temperature Fetch API ////// temp =termo.getTemp(); delay(5); // "C ///////圧力フェッチAPI //////// if(sensor_selector ==0){/////////////圧力センサーInit ///////// if(!bmp180.begin())delay(11); Sensors_event_t event; bmp180.getEvent(&event); if(event.pressure){prsr =event.pressure / 10; / / hP to kP delay(50);}} ////////////// GPS Init //////////// GPS.begin(9600); //// /// Altitude Fetch API //////// if(sensor_selector ==0){sensor_event_t event; bmp180.getEvent(&event); alt =bmp180.pressureToAltitude(1013.25、event.pressure); delay(50); // bmp180.end();} //メーター内//////////////湿度センサーの初期化/////// if(sensor_selector ==1){am2320.begin(); delay(50); ////// Humidity Fetch API ///////// humid =am2320.readHumidity(); delay(50); // am2320.end(); // in%of 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.hour; dy =t.mday; mo =t.mon; yr =t.year; /////ポット位置フェッチ/////// pot =analogRead(A0)* 5 /(10 * 3); delay(2); ///// VBatt / Supply Fetch /////////このチップの1.1は1.08Vbatt =(1.08 * analogRead(A1)/ 1023)/3.91 *((3.91 + 21.76) ); delay(2); /////////コンパスの見出し//////// if(sensor_selector ==2){if(!mag.begin()){while(1); } // delay(70); Sensor_t Sensor2; mag.getSensor(&sensor2); delay(70); //赤緯角度は地理的位置に依存します// GPSからの緯度経度を使用してsensor_event_tevent2を計算します; mag.getEvent(&event2); // Xm =event2.magnetic.x; // Ym =event2.magnetic.y; delay(70);フロート偏角=0.0;見出し=atan2(event2.magnetic.y、event2.magnetic.x);見出し+ =偏角; //符号修正if(heading <0)heading + =2 * PI; if(heading> 2 * PI)heading- =2 * PI; //読みやすくするためにラジアンを度に変換します。見出し=見出し* 180 / M_PI; // mag.end();} /////ブザーコントロール////////// if(pot> 80){digitalWrite(11,1);} else {digitalWrite(11,0); } ///// RGBアドレス指定可能なLED制御///////////// if(pot> 40){leds.pwr_set(PWR_ENABLE); for(byte i =0; i <1; i ++)leds.setColorHSB(i、hue、1.0、0.5); if(up)hue + =0.025;それ以外の場合、色相-=0.025; if(hue> =1.0 &&up)up =false; else if(hue <=0.0 &&!up)up =true; } ///////////////////////////////////////////セルフリセット//// /////// // digitalWrite(2、LOW); /////////////////////////////////} /////////ボイドループはここで終了します/////////////////////// Oled Picture Loop Draw Fn ///////// ////////// 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(yr); 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、 "気温:"); u8g.setPrintPos(85、24); u8g.print(temp); u8g.drawStr(118,24、 "C"); u8g.drawStr(39,34、 "湿度:"); u8g.setPrintPos(85、34); u8g.print(humid); u8g.drawStr(118,34、 "%"); u8g.drawStr(39,44、 "圧力:"); 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); //デモ、GPSが追加されたときにLATに置き換えますu8g.drawStr(69,64、 "LONG:"); u8g.setPrintPos(94、64); u8g.print(90.36); //デモ、GPSが追加されたときにLONに置き換えます// 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; //ここで数学的な問題// int radius =round(tid); u8g.drawStr(0,22、 "heading"); u8g.drawCircle(18、34、r、U8G_DRAW_ALL); //内側のレベリング円u8g.drawCircle(18、34,10、U8G_DRAW_ALL); //外側の固定円//内側の円はxに傾きがないときに点になりますy軸//これは、コンパスの見出しがより正確な場合です//u8g.drawLine(18、34、(18 + round(Y * 2))、(34 + round(X * 2))); //スケールアップ2xu8g.setPrintPos(0、53); u8g.print(heading); // 0または360はN // 90はE // 180はS // 270はW // u8g.setFont(u8g_font_5x8); if((heading> 315)|(heading <=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((heading> 225)&(heading <315)){u8g.drawLine(18,34,18,44);} // u8g.drawLine(18、34、 (18 +ラウンド(Y * 2))、(34 +ラウンド(X * 2))); // ACCELAROMETERに基づいて2倍にスケールアップ//ループはここで終了します} 
ライブラリ C / C ++
それを解凍し、個々のライブラリzipをArduino Library Managerに追加します
プレビューなし(ダウンロードのみ)。

回路図


製造プロセス

  1. O2センサーとは何ですか?
  2. RaspberryPiを使用したモーションセンサー
  3. ラズベリーパイ土壌水分センサー
  4. RaspberryPiをHamsterFitnessTrackerに変えましょう
  5. DS18B20センサーをテストする
  6. ラズベリーパイ温度センサー
  7. トイレトラッカー(Powered by Walabot)
  8. 感情センサー/ EEG
  9. Raspberry Pi2上のWindows10 IoT Core –Adafruitセンサーデータ
  10. UnifiedWater v1
  11. ISS用のWiFiRSSIセンサートラッカー