Fablab Taitung Arduino 物聯網創客實戰 3 雲端照相 -GPS 衛星定位 謝明哲國立臺東大學資訊管理學系 hmz@nttu.edu.tw 2016/3/27 hmz@nttu.edu.tw 3/27/2016 1
接收 GPS 定位資料並儲存 在 SD 卡 2016/3/27 9:00-12:00 hmz@nttu.edu.tw 3/27/2016 2
認識 GPS 全球衛星定位系統 由美國研製和維護的中距離圓形軌道衛星導航系統 由 24 顆 GPS 衛星 1 個地面主控站 3 個數據注入站 5 個監測站 和用戶端 GPS 接收器組成 最少只需其中 3 顆衛星即可定位出經緯度及海拔高度 衛星數越多, 定位資料越精確 https://en.wikipedia.org/wiki/global_positioning_system 3
認識 PAM-7Q GPS 定位器 使用 u-blox 7 GPS Antenna Module 具有簡易介面 嵌入式天線 低功率消耗 雜訊抑制等優點 正常工作溫度範圍 : -40 C~85 C 符合 ISO 16750 車輛電子裝置檢測標準 可靠性及穩定性良好 hmz@nttu.edu.tw 3/27/2016 4
認識 GPS 定位原理? hmz@nttu.edu.tw 3/27/2016 5
演練 1:GPS 定位 G VS VCC TXD GND Digital PIN 8 hmz@nttu.edu.tw 3/27/2016 6
Digital PIN 8 行動電源 2A 行動電源 1A hmz@nttu.edu.tw 3/27/2016 7
綠色跳接器 OFF 行動電源 2A 行動電源 1A hmz@nttu.edu.tw 3/27/2016 8
Arduino Yún 啟動或 reset 後, 將 PIN 8 的 GPS 定位座標數位讀值傳回序列埠監控視窗 先到 PARALLAX 下載 28509-Pam-7Q-GPS- Module-Arduino-Demo-Code https://www.parallax.com/downloads/pa m-7q-gps-module-arduino-demo-code 打開 Pam7QGPS.ino, 另存新檔 Pam7QGPS01.ino TinyGPS.h TinyGPS.cpp hmz@nttu.edu.tw 3/27/2016 9
https://www.parallax.com/downloads/pam-7q-gps-module-arduino-demo-code 10
#include <Bridge.h> #include <Console.h> #include <SoftwareSerial.h> #include "TinyGPS.h" TinyGPS gps; //SoftwareSerial(rxPin, txpin, inverse_logic) // 可以用來建立 PIN 0 與 PIN 1 以外之串列通訊 // TXD to PIN 8 SoftwareSerial nss(8, 255); hmz@nttu.edu.tw 3/27/2016 11
void setup() { Bridge.begin(); Console.begin(); nss.begin(9600); // Communicate at 9600 baud // (default for PAM-7Q module) while(!console); Console.println("Reading GPS "); } hmz@nttu.edu.tw 3/27/2016 12
void loop() { bool newdata = false; unsigned long start = millis(); // Update every 5 seconds while (millis() - start < 5000) { if (feedgps()) newdata = true; } if (newdata) gpsdump(gps); } hmz@nttu.edu.tw 3/27/2016 13
// Get and process GPS data void gpsdump(tinygps &gps) { float flat, flon; unsigned long age; gps.f_get_position(&flat, &flon, &age); Console.print(flat, 4); Console.print(", "); Console.println(flon, 4); } hmz@nttu.edu.tw 3/27/2016 14
// Feed data as it becomes available bool feedgps() { while (nss.available()) { if (gps.encode( nss.read() )) return true; } return false; } hmz@nttu.edu.tw 3/27/2016 15
hmz@nttu.edu.tw 3/27/2016 16
hmz@nttu.edu.tw 3/27/2016 17
演練 2: 加入 SD 卡存取 hmz@nttu.edu.tw 3/27/2016 18
#include <Bridge.h> #include <Console.h> #include <SoftwareSerial.h> #include <FileIO.h> #include "TinyGPS.h" TinyGPS gps; //SoftwareSerial(rxPin, txpin, inverse_logic) // 可以用來建立 PIN 0 與 PIN 1 以外之串列通訊 // TXD to PIN 8 SoftwareSerial nss(8, 255); File gpslog; hmz@nttu.edu.tw 3/27/2016 19
void setup() { Bridge.begin(); Console.begin(); nss.begin(9600); // Communicate at 9600 baud // (default for PAM-7Q module) FileSystem.begin(); while(!console); Console.println("Filesystem datalogger"); Console.println("Reading GPS "); } hmz@nttu.edu.tw 3/27/2016 20
void loop() { bool newdata = false; unsigned long start = millis(); // Update every 5 seconds while (millis() - start < 5000) { if (feedgps()) newdata = true; } if (newdata) gpsdump(gps); } hmz@nttu.edu.tw 3/27/2016 21
// Get and process GPS data void gpsdump(tinygps &gps) { float flat, flon; unsigned long age; gps.f_get_position(&flat, &flon, &age); Console.print(flat, 4); Console.print(", "); Console.println(flon, 4); hmz@nttu.edu.tw 3/27/2016 22
File gpslogfile = FileSystem.open("/mnt/sda1/gpslog.txt",FILE_APPEND); if (gpslogfile) { gpslogfile.print(flat, 4); gpslogfile.print(", "); gpslogfile.println(flon, 4); gpslogfile.close(); } else Console.println("error opening gpslog.txt"); } // end of gpsdump() hmz@nttu.edu.tw 3/27/2016 23
// Feed data as it becomes available bool feedgps() { while (nss.available()) { if (gps.encode( nss.read() )) return true; } return false; } hmz@nttu.edu.tw 3/27/2016 24
hmz@nttu.edu.tw 3/27/2016 25
hmz@nttu.edu.tw 3/27/2016 26
SD 卡存取 2-1. 使用 PieTTY 透過 TCP/IP 通訊埠連線 YBB Car hmz@nttu.edu.tw 3/27/2016 27
2-2. 以 root 帳號登入 hmz@nttu.edu.tw 3/27/2016 28
2-3. 登入成功後顯示 Linux 終端機及工作目錄 hmz@nttu.edu.tw 3/27/2016 29
2-4. 輸入 dmesg 指令查看裝置訊息 2-5. 確認 SD 卡已正常掛載 :sda1 hmz@nttu.edu.tw 3/27/2016 30
2-6. 將工作目錄切換到 :/mnt/sda1 hmz@nttu.edu.tw 3/27/2016 31
2-7. 查看 GPS 定位紀錄檔 hmz@nttu.edu.tw 3/27/2016 32
將 GPS 定位座標上傳到 Google 地圖 2016/3/27 13:30-15:30 hmz@nttu.edu.tw 3/27/2016 33
演練 3. Arduino Yún 啟動或 reset 後, 將 GPS 定位座標上傳到 Goodle 雲端硬碟試算表 另存新檔建立 Pam7QGPS03 專案 將之前在 Arduino 物聯網創客實戰 2_ 雲端環境監測步驟 3-5 完成的 TembooAccount.h 加入 hmz@nttu.edu.tw 3/27/2016 34
#include <Temboo.h> #include "TembooAccount.h" #include <Bridge.h> #include <Console.h> #include <SoftwareSerial.h> #include <FileIO.h> #include "TinyGPS.h" hmz@nttu.edu.tw 3/27/2016 35
TinyGPS gps; //SoftwareSerial(rxPin, txpin, inverse_logic) // 可以用來建立 PIN 0 與 PIN 1 以外之串列通訊 // TXD to PIN 8 SoftwareSerial nss(8, 255); File gpslog; int numruns = 1; int maxruns = 10; String rowdata = ""; hmz@nttu.edu.tw 3/27/2016 36
void setup() { Bridge.begin(); Console.begin(); nss.begin(9600); FileSystem.begin(); delay(4000); while(!console); pinmode(13, OUTPUT); digitalwrite(13, LOW); Console.println("Filesystem datalogger"); Console.println("Reading GPS "); } hmz@nttu.edu.tw 3/27/2016 37
void loop() { bool newdata = false; unsigned long start = millis(); // Update every 5 seconds while (millis() - start < 5000) { if (feedgps()) newdata = true; } hmz@nttu.edu.tw 3/27/2016 38
if (newdata) { digitalwrite(13, HIGH); if (numruns <= maxruns) { gpsdump(gps); temboo(); numruns++; digitalwrite(13, LOW); } } } // end of loop() hmz@nttu.edu.tw 3/27/2016 39
// Get and process GPS data void gpsdump(tinygps &gps) { float flat, flon; unsigned long age; gps.f_get_position(&flat, &flon, &age); rowdata = String(numRuns) + "," + String(flat,4)+ "," + String(flon,4); Console.print(flat, 4); Console.print(", "); Console.println(flon, 4); hmz@nttu.edu.tw 3/27/2016 40
File gpslogfile = FileSystem.open("/mnt/sda1/gpslog.txt",FILE_APPEND); if (gpslogfile) { gpslogfile.print(flat, 4); gpslogfile.print(", "); gpslogfile.println(flon, 4); gpslogfile.close(); } else Console.println("error opening gpslog.txt"); } // end of gpsdump() hmz@nttu.edu.tw 3/27/2016 41
// Feed data as it becomes available bool feedgps() { while (nss.available()) { if (gps.encode( nss.read() )) return true; } return false; } hmz@nttu.edu.tw 3/27/2016 42
void temboo() { TembooChoreo AppendRowChoreo; AppendRowChoreo.begin(); AppendRowChoreo.setAccountName(TEMBOO_ACCOUNT); AppendRowChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME); AppendRowChoreo.setAppKey(TEMBOO_APP_KEY); AppendRowChoreo.addInput("RowData", rowdata); AppendRowChoreo.addInput("SpreadsheetTitle", "map"); AppendRowChoreo.addInput("RefreshToken", "XXXXX"); AppendRowChoreo.addInput("ClientSecret", "XXXXX ); AppendRowChoreo.addInput("ClientID", "XXXXX"); hmz@nttu.edu.tw 3/27/2016 43
// Identify the Choreo to run AppendRowChoreo.setChoreo( "/Library/Google/Spreadsheets/AppendRow"); // Run the Choreo; when results are available, print them to serial AppendRowChoreo.run(); while(appendrowchoreo.available()) { } char c = AppendRowChoreo.read(); Console.print(c); AppendRowChoreo.close(); } hmz@nttu.edu.tw 3/27/2016 44
hmz@nttu.edu.tw 3/27/2016 45
hmz@nttu.edu.tw 3/27/2016 46
hmz@nttu.edu.tw 3/27/2016 47
hmz@nttu.edu.tw 3/27/2016 48
hmz@nttu.edu.tw 3/27/2016 49
hmz@nttu.edu.tw 3/27/2016 50
hmz@nttu.edu.tw 3/27/2016 51
hmz@nttu.edu.tw 3/27/2016 52
hmz@nttu.edu.tw 3/27/2016 53
hmz@nttu.edu.tw 3/27/2016 54
hmz@nttu.edu.tw 3/27/2016 55
hmz@nttu.edu.tw 3/27/2016 56
參考資料 飆機器人 Arduino 入門學習套件 : 輕鬆上手 18+1 堂課 普特企業有限公司 2015 http://www.playrobot.com 飆機器人 雲端物聯網 (IOT) 實務教學平台 :Arduino YUN (YBB Car) 普特企業有限公司 2015 http://www.playrobot.com 葉難 Arduino 輕鬆入門 : 範例分析與實作設計 台北 : 博碩文化 2014 ISBN: 978-986-201-870-5 施瓦兹 (Schwartz, Marco) 曾吉弘 CAVEDU 教育團隊 實戰物聯網開發 : 使用 Arduino Yún 台北 : 碁峰資訊 2014 ISBN: 978-986-347-339-8 Global Positioning System, March 2016. (Available at: https://en.wikipedia.org/wiki/global_positioning_system) u-blox. PAM-7Q: u-blox 7 GPS Antenna Module Data Sheet, March 2016. (Available at: http://www.u-blox.com) hmz@nttu.edu.tw 3/27/2016 57