Linkit ONE 研究筆記 === [回目錄](https://hackmd.io/CYIwxqBMoLQKYgKwDYYBYDMB2LMAcAZgIx4zACGISy4ycwkQA===) --- document: http://labs.mediatek.com/api/linkit-one/frames.html?frmname=topic&frmfile=index.html # 建立開發環境(在mac上) **安裝Arduino IDE** **安裝Linkit ONE COM driver** 下載連結:https://labs.mediatek.com/en/download/I2cGRHeR 解除安裝方法: 1 Open the Terminal 2 Run command as follow: "sudo rm -rf /System/Library/Extensions/BMUSBCDC.kext" "sudo touch /System/Library/Extensions/" "sudo sync" 3 Reboot MacOS **安裝LinkIt ONE SDK** - 在Arduino IDE的preferences的Additional board manager urls加入[http://download.labs.mediatek.com/package_mtk_linkit_index.json](http://download.labs.mediatek.com/package_mtk_linkit_index.json) - 在Board manager安裝Linkit One board setting # 設定板子 三個手動開關需切換到以下模式: - UART (才能燒錄程式) - USB (用usb供電) - SPI (才能用13號pin) 手動開關意義:(ref: https://yehnan.blogspot.tw/2015/03/linkit-one_17.html) 1:上下兩端標示著SPI與SD,請切到SPI(上),代表SPI功能相關腳位由你使用。若切到SD,代表想使用外插的Micro SD卡,那麼腳位D11、D12、D13就不能運作,而內建LED連接到腳位D13。 2:上下兩端標示著MS與UART,請切到UART(下),代表你想燒錄程式。MS代表不會執行程式,板子裡的Flash儲存媒體會成為類似於隨身碟/記憶卡的模式,可用於韌體更新。 3:上下兩端標示著USB與BAT,請切到USB(上),從USB線/電腦端汲取電源。若是BAT則從電池供電,若連接電腦可進行充電。 # 第一個程式blink - 打開blink範例 - board選擇linkit one - com選擇/dev/cu.usbmodem1411(Linkit One) - 上傳 - 看 # 更新韌體 - 燒錄器選擇Linkit Firmware Updater - 板子最左邊手動開關切換到MS模式(Mass Storage Bootup mode**)** - 按下「燒錄bootloader」 - 點綠色下載按鈕 - 拔掉usb再重插 - 等它安裝成功 # 一些範例程式 ## Wifi連線,發http request ``` cpp #include <LWiFi.h> #include <LWiFiClient.h> #define SITE_URL "www.mediatek.com" #define WIFI_AP "AP-NAME" // replace with your setting #define WIFI_PWD "AP-PASSWORD" // replace with your setting LWiFiClient c; void setup() { Serial.begin(9600); LWiFi.begin(); Serial.println(); Serial.print("Connecting to AP..."); if(LWiFi.connectWPA(WIFI_AP, WIFI_PWD) < 0) { Serial.println("FAIL!"); return; } Serial.println("ok"); Serial.print("Connecting to site..."); if(!c.connect(SITE_URL, 80)) { Serial.println("FAIL!"); return; } Serial.println("ok"); Serial.println("send HTTP GET request"); c.println("GET / HTTP/1.1"); c.println("Host: " SITE_URL); c.println("Connection: close"); c.println(); } void loop() { int v; while(c.available()) { v = c.read(); if(v < 0) break; Serial.print((char)v); } delay(100); } ``` ## 建立藍芽server,當個echo機 問題:ios無法搜到藍芽 linkit one的藍芽好像是特化的? ``` cpp #include <LBT.h> #include <LBTServer.h> void setup() { Serial.begin(9600); if(!LBTServer.begin((uint8_t*)"My_BTServer")) { Serial.println("Fail to start BT."); return; } Serial.println("BT server is started."); } void loop() { uint8_t buf[64]; int bytesRead; if(LBTServer.connected()) { // echo back all received data while(true) { bytesRead = LBTServer.readBytes(buf, 64); if(!bytesRead) break; Serial.write(buf, bytesRead); LBTServer.write(buf, bytesRead); } delay(100); } else { LBTServer.accept(5); } } ``` ## 傳送SMS簡訊(需要SIM卡) 實測發不出簡訊,因為我的SIM卡無效!? ``` cpp #include <LGSM.h> void setup() { Serial.begin(9600); while(!LSMS.ready()) delay(1000); Serial.println("SIM ready for work!"); LSMS.beginSMS("0912345678"); LSMS.print("Hello from LinkIt"); if(LSMS.endSMS()) { Serial.println("SMS is sent"); } else { Serial.println("SMS is not sent"); } } void loop() { // do nothing } ``` ## 充電顯示目前電量 level只有0, 33, 66, 100 isChargine是0, 1 手動開關要調到BAT 如果沒有接電池,isCharging會顯示1, level會顯示100 (BUG) LinkIt ONE官方配屬的鋰電池為**1,050mAh/3.9Wh,3.7V**(典型鋰電池供電電壓) ref: http://makerpro.cc/2015/07/control-linkit-one%CA%BBs-battery/ ``` cpp #include <LBattery.h> void setup() { Serial.begin(9600); } void loop() { Serial.print("Is Charging: "); Serial.println(LBattery.isCharging()); Serial.print("Battery Level: "); Serial.println(LBattery.level()); delay(1000); } ``` ## GPS 尚未完全看懂code 實測在社窩抓不到衛星,不知道為什麼 ``` cpp #include <LGPS.h> gpsSentenceInfoStruct info; char buff[256]; static unsigned char getComma(unsigned char num,const char *str) { unsigned char i,j = 0; int len=strlen(str); for(i = 0;i < len;i ++) { if(str[i] == ',') j++; if(j == num) return i + 1; } return 0; } static double getDoubleNumber(const char *s) { char buf[10]; unsigned char i; double rev; i=getComma(1, s); i = i - 1; strncpy(buf, s, i); buf[i] = 0; rev=atof(buf); return rev; } static double getIntNumber(const char *s) { char buf[10]; unsigned char i; double rev; i=getComma(1, s); i = i - 1; strncpy(buf, s, i); buf[i] = 0; rev=atoi(buf); return rev; } void parseGPGGA(const char* GPGGAstr) { /* Refer to http://www.gpsinformation.org/dale/nmea.htm#GGA * Sample data: $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47 * Where: * GGA Global Positioning System Fix Data * 123519 Fix taken at 12:35:19 UTC * 4807.038,N Latitude 48 deg 07.038' N * 01131.000,E Longitude 11 deg 31.000' E * 1 Fix quality: 0 = invalid * 1 = GPS fix (SPS) * 2 = DGPS fix * 3 = PPS fix * 4 = Real Time Kinematic * 5 = Float RTK * 6 = estimated (dead reckoning) (2.3 feature) * 7 = Manual input mode * 8 = Simulation mode * 08 Number of satellites being tracked * 0.9 Horizontal dilution of position * 545.4,M Altitude, Meters, above mean sea level * 46.9,M Height of geoid (mean sea level) above WGS84 * ellipsoid * (empty field) time in seconds since last DGPS update * (empty field) DGPS station ID number * *47 the checksum data, always begins with * */ double latitude; double longitude; int tmp, hour, minute, second, num ; if(GPGGAstr[0] == '$') { tmp = getComma(1, GPGGAstr); hour = (GPGGAstr[tmp + 0] - '0') * 10 + (GPGGAstr[tmp + 1] - '0'); minute = (GPGGAstr[tmp + 2] - '0') * 10 + (GPGGAstr[tmp + 3] - '0'); second = (GPGGAstr[tmp + 4] - '0') * 10 + (GPGGAstr[tmp + 5] - '0'); sprintf(buff, "UTC timer %2d-%2d-%2d", hour, minute, second); Serial.println(buff); tmp = getComma(2, GPGGAstr); latitude = getDoubleNumber(&GPGGAstr[tmp]); tmp = getComma(4, GPGGAstr); longitude = getDoubleNumber(&GPGGAstr[tmp]); sprintf(buff, "latitude = %10.4f, longitude = %10.4f", latitude, longitude); Serial.println(buff); tmp = getComma(7, GPGGAstr); num = getIntNumber(&GPGGAstr[tmp]); sprintf(buff, "satellites number = %d", num); Serial.println(buff); } else { Serial.println("Not get data"); } } void setup() { // put your setup code here, to run once: Serial.begin(115200); LGPS.powerOn(); Serial.println("LGPS Power on, and waiting ..."); delay(3000); } void loop() { // put your main code here, to run repeatedly: Serial.println("LGPS loop"); LGPS.getData(&info); Serial.println((char*)info.GPGGA); parseGPGGA((const char*)info.GPGGA); delay(2000); } ```