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);
}
```