關於網路那些事...

網路行銷,SEO,網路趨勢,教學文章,網頁設計,生活時事

LinkIt Smart 7688 Duo 入門 從0到0.1

簡介

LinkIt Smart 7688 Duo 是聯發科的物聯網板塊

聯發科LinkIt Smart 7688 分別有 7688、7688 Duo 兩種

7688 Duo 使用的是OpenWrt,OpenWrt是適合於嵌入式裝置的一個Linux發行版。

7688 Duo 主要多了Arduino晶片(ATmega32U4 MCU),因此原則上rduino 的程式碼都可以在Duo上跑。
並且,7688 Duo硬體規格比Arduino Yun更好,內建有Wifi、支援C、Node.js、Python,售價也相當親民。

MPU (Microproccess unit)
主要負責邏輯運算,有搭配MB等級的RAM,可以跑完整的Linux

MCU (Microcontroller Unit)
ATmega32U4 MCU
輕量級的晶片,只能跑輕量的OS,例如Real-time OS、freeRTOS...

在7688只有一顆MPU(MT7688)晶片,負責運算邏輯。

在7688 Duo 則有MPU(MT7688)及MCU(ATMega32U4),所以可以接上更多real-time的裝置

mraa 是用C/C++寫的硬體相關協定程式庫,可以透過mraa,來用MPU控制各種硬體,並且支援Python、NodeJS..。
7688 預設就已經安裝mraa,所以可以直接使用他來控制GPIO、UART、SPI和PWM 等
這裡可以查詢到mraa API相關資訊 http://iotdk.intel.com/docs/master/mraa/python/mraa.html
GPIO http://iotdk.intel.com/docs/master/mraa/python/mraa.html#gpio

官方參考資源
官網位置 https://labs.mediatek.com/site/global/developer_tools/mediatek_linkit_smart_7688/whatis_7688/index.gsp
官方文件教學網頁
https://mediatek-labs.gitbooks.io/linkit-smart-7688/content/index.html
入門手冊 https://labs.mediatek.com/fileMedia/download/4ef033b8-80ca-4cdb-9ad6-1c23836c63de
開發手冊 https://labs.mediatek.com/fileMedia/download/87c801b5-d1e6-4227-9a29-b5421f2955ac

聯發科inkIt Smart7688軟體開發手冊
http://labs.mediatek.com/forums/forums/show/73.page
MCS篇 http://labs.mediatek.com/forums/forums/show/48.page

7688

7688 Duo

7688 Duo

7688 Duo與Arduino 接腳對照圖

(點圖放大)

附註

使用7688模擬器

在還沒有板子的情況,可以透過模擬器來熟悉7688
https://medium.com/maker-cup/%E6%B2%92%E6%9C%89%E6%9D%BF%E5%AD%90%E4%B9%9F%E5%8F%AF%E4%BB%A5%E7%8E%A9-7688-%E6%A8%A1%E6%93%AC%E5%99%A8-25cb7d082dd5#.j5viaa1un

開發量產相關參考資源

哈爸陪你問,是一個關於Macker量產相關的顧問團,可以在這邊找到一些問答資源
http://makerpro.cc/2015/09/hadadqa0918-maker-with-si/

底下則是學習7688 Duo的學習地圖


(來源)

開機與關機

只要接上電源,7688就會自動開機
關機或重新開機則需使用OpenWRT的語法
重新開機

reboot

關機

poweroff

或者

halt

Arduino 安裝與建議

適用Arduino IDE版本

目前測試Arduino IDE各種版本,能穩定支援7688 Duo的穩定版有
1.5.7
1.6.7
1.6.4 (這是目前使用的IDE)
可前往Arduino官網下載

用USB 安裝 7688 Duo img(解磚)

準備一支可以被格式化清空的隨身碟 在電腦裝置,按右鍵>格式化,並選 FAT32 格式
格式化完畢,至官網下載最新的 firmware
下載完畢會是一個 lks7688.img 的檔案,
將 lks7688.img 放到隨身碟

將隨身碟插入 7688,

先按住中間 wifi reset 按鈕不放,再按一下MPU reset並放開(wifi reset繼續按著),等五秒之後放開wifi reset

接著大約等五分鐘,讓系統重新安裝完畢

接著就可以正常使用

可以參考這裡

在7688 Duo 安裝Arduino

開啟Arduino IDE,並且接上7688 Duo

檔案/偏好設定/Addition Boards Manager URLs:貼上

http://download.labs.mediatek.com/package_mtk_linkit_smart_7688_test_index.json

工具/板子/board managers/
拉到最下面,安裝7688

工具/板子/
拉到最底下,選擇7688

工具/序列渠/
COM Linkit 7688
COM數字可能會因為USB孔而不同,不影響

與電腦連接

USB結合板子,插入電腦後,可以在裝置管理員裡面看到linkit smart 7688

13腳位閃爍

檔案/範例/01Basic/Blink

透過wifi連結內網及外網

連結內網,稱為AP(Access Point)模式
連結外網,稱為Station Mode

底下這張圖說明了,從7688 Duo開機後,wifi LED燈號變化所代表個意義

從筆電連結到7688 Duo

7688 Duo 配有內建wifi,因此,接上電源之後
就可以試著從筆電的wifi尋找 LinkIt_Smart_7688_XXXXXX
(XXXXXX:MAC位址(address)的後六碼)

點選之後,筆電就能透過wifi連到

開啟無線路由器的頁面

打開瀏覽器,輸入http://192.168.100.1 就可以看到"無線路由器的頁面"
(關於無鏈路由,可以參考這裡 認識你的無限好夥伴,瞭解無限路由器的7個基本功)
帳號預設:root
預設密碼:無。(可以自行設定)

更多詳細的用法,可以先參考這裡 【Tutorial】LinkIt Smart 7688 – OpenWRT操作篇

透過外網連到7688 Duo

切換AP/Station ,可以用手動方式設定 連結
也可以很簡單的從無線路由器管理頁面設定

首先,先透過AP連線到7688 Duo,接著開啟無線路由器頁面
進入頁面後,跟著下圖重新選擇外部Wifi

重新啟動完成,如果沒問題的話

這時7688 Duo就已經開始透過外網連線

這時,將筆電也切換成同樣的外網wifi,讓你的筆電跟7688 Duo位在同樣的網段,才能在從筆電連進7688 Duo

但是,這時不知道外網路由分配哪個port給7688 Duo,

可以透過 ipscan 掃描,列出網段所有IP,以及那些正在使用中

外往連線可以參考這篇

萬一外網wifi無法連結

假設,在無線路由器頁面設定外網,密碼輸入錯誤,或者其他不確定的原因

一直無法連上外網( 通常要耐心等待3分鐘 )

可以用下列方式重新設定返回AP模式
1.長按Wifi reset 20秒以上,放開後,橘色燈號會開始閃爍,表示正在重設定回AP模式。連線
2.解磚(factory reset),步驟可參考前面解磚說明

透過putty連結到7688 Duo

下載putty,不必安裝就可以直接啟用
或者,如果有裝git,則可以透過git bash連線

git bash連線方式:

ssh IP位置 -l 使用者名稱

putty連線方式
開啟後,如果是用內網,輸入192.168.100.1

外網則輸入外網IP

送出後,就可以連結到7688 Duo。

這時,輸入在上一步驟無線路由器的頁面設定的帳號密碼

透過外網更新7688 Duo系統

當連接上外網後,建議將7688 Duo系統進行更新。
可以參考底下 putty 連線方式

opkg update

並且安裝套件會用到的套件,例如nano文字編輯器、拍照程式

opkg install nano
opkg install fswebcam

安裝SCP 管理檔案

http://winscp.net/eng/index.php
安裝windows版本的 SCP
接著輸入7688 IP 使用者帳號、密碼
就可以連結到7688
可以像FTP一樣來管理檔案

Node.js

Node.js Hello world

在7688預設安裝了node.js,可以使用內建的編輯器-vim 來寫第一個node.js程式
首先,透過vim建立並開啟app.js檔案

vim app.js

輸入內容

console.log('Hello world');

當輸入完畢後,按Esc鍵之後,直接輸入 :wq 儲存並離開
接著執行這個檔案,就可以看到Hello world

node app.js
Node.js 控制 LED閃爍

Node.js要開發崁入式軟體,需要有其他軟體架構擴充

  1. PWM、GPIO、I2C...etc(libmraa)
  2. 跟MCU端溝通(node-serialport, firmata)
  3. USB device(node-hid)

7688 採用了OpenWRT OS
OpenWRT OS 有幾個重點玩法

  1. full stack wifi: AP mmode, station mode
  2. wifi router/gateway 玩法 3.超級豐富的package, driver community
    例如 >opkg update , >opkg install 套件名稱

Firmata 可以幫助7688 Duo與ATMega32U4溝通,而ATMega32U4可以跟arduino sensor溝通
透過這種方式 讓7688 Duo可以控制這些sensor

但Firmata 有幾個問題,讓他變成不是一個好pattern
1. 他把每個通道都打通,因此會占用MCU

  1. 所有運算都在MPU端,要去面臨把C轉成JS的問題。很多sensor廠商,只有C不提供JS parser 第2點還比較好克服,只要讓兩顆晶片各司其職。

有了libmraa 函式庫就可直接用高階Python 來控制GPIO. PWM, I2C , PSI(for 7688 not 7688 DUO)

建立myled.js檔案

vim myled.js

輸入內容

var ma = require('mraa');
var ledStatus = true;
var led = new ma.Gpio(44);//對應的是第13 腳位燈號
led.dir(ma.DIR_OUT);

function Loop(){
    led.write(ledStatus?1:0);
  ledStatus = !ledStatus;
  setTimeout(Loop, 400);
}
Loop();

執行

node myled.js
Node.js 啟用攝影

下方圖示是一般視訊串流傳輸的流程


在7688 Duo中,預設安裝了UVC class webcamMJPG-Streamer

首先,接上攝影機之後,我們要確定7688 Duo有偵測到攝影機
OS X和 Linux系統把每一個裝置都看成檔案,並放在dev路徑下
因此,先進入dev資料夾,並列出目錄中的檔案

cd /dev
ls

如果畫面中有出現Video0,就代表已經偵測到攝影機通訊渠

啟用攝影機

輸入底下mjpg指令。結尾& 可以在啟用攝影機後,仍可以輸入指令
如果輸入送出後,出現v4L2 Fatal Error,則輸入reboot重新開機

mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 640x480 -f 25" -o "output_http.so -p 8080 -w /www/webcam" &

觀看攝影畫面
從瀏覽器開啟 http://7688IP:8080位置

keyboard

hid 是一個keyboard driver api規格,node.js則可以載入node-hid,取得鍵盤訊號

var HID = require('node-hid');
var devices = HID.devices();
var hid = require('hidstream');
var keyboard = new hide.device('0002:0004:00', {parser: hid.parser.keyboard});

keyboard.on('data',function(data){
    console.log(data);
})

執行如果出現錯誤,可以console.log(devices),查看USB的path,在修改參數

Python

同樣,透過vim來產生一個python程式檔案

vim myproject.py

輸入這些內容

print ("Hello world! this is my first python")

當輸入完畢後,按Esc鍵之後,直接輸入 :wq 儲存並離開
接著執行這個檔案

python myproject.py

開機自動執行

linux 的rc.local ,可以在開機時執行一些動作

建立mediatek 帳密

https://mcs.mediatek.com/zh-TW/
https://mediatek-labs.gitbooks.io/linkit-smart-7688/content/mraa-nodejs.html
http://iotdk.intel.com/docs/master/mraa/node/classes/gpio.html

使用 MCSjs 讓 MCS 來操控 LinkIt smart 7688
https://iamblue.gitbooks.io/linkit-smart-nodejs/content/zh-TW/cloud/MCSjs.html

mkdir app
cd app
npm init
npm install mcsjs

MCS 物聯網策略

MCS(MediaTek Cloud Sandbox) 是聯發科雲端平台
目前直接透過一個實例來說明

MCS 遠端控制LinkitSmart

首先,在MCS雲端建立一個帳號,
接著,要來開發選項中,建立我們的原型及測試裝置
下方式簡易的通訊架構
放大

接著,開始一步步實作出來

一、在MCS 建立原型、通道及裝置
(1) 建立原型
選擇Linkit Smart7688 (MT7688),並填寫好相關內容之後,儲存。
(2) 替原型新增資料通道
選擇控制器。新增資料通道。
在填寫資料通道資料中,要留意"資料通道 Id"。
MCS會自動參考這個Id建立通道函式,在遠端呼叫時,就要填寫這個資料通道Id。


(3) 建立測試裝置
建立完成後,系統會自動產生一組DeviceId、DeviceKey

二、Linkit Smart 7688 環境配置
SSH連線到Linkit Smart之後,
我們先建立一個專案資料夾

 mkdir myapp
 cd myapp

接著在專案中初始化npm (Node package)
並且安裝mcsjs 套件

 init npm
 npm install mcsjs

建立檔案,並寫程式
myprototype.js

 nano myprototype.js

在檔案內寫入以下程式,並按ctrl+x 離開(選y儲存)

var mcs = require('mcsjs');

var myApp = mcs.register({
     deviceId: 'DZt3X12E', //填寫
     deviceKey: 'TdXgwy3gbvERFD',//填寫
});

myApp.on('AdamLinkitSmartChann', function(data, time) { //填寫
 if(Number(data) === 1){
     console.log('blink');
 } else {
     console.log('off');
 }
});

執行程式

 node myprototype

三、測試通訊
當我們寫好程式之後,前往MCS,並且點開測試裝置頁面
接著,點選開關,
當我們切換開關時,Linkit Smart 7688的終端機介面應該可以看到互相的反應

四、錯誤排解
假設在執行後,發現以下 TCP 錯誤訊息,
請先檢查deviceId、deviceKey 及資料通道 Id是否正確。
另外則是網路連線是否正常。

(node) warning: possible EventEmitter memory leak detected. 11 end listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at EventEmitter.addListener (events.js:179:15)
    at Socket.<anonymous> (/root/app/node_modules/mcsjs/index.js:46:20)
    at Socket.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
    at Socket.Readable.push (_stream_readable.js:126:10)
    at TCP.onread (net.js:538:20)

五、進階參考資料
範例
https://mediatek-labs.gitbooks.io/linkit-smart-7688/content/mraa-nodejs.html

GPIO
http://iotdk.intel.com/docs/master/mraa/node/classes/gpio.html

產品手冊
https://mediatek-labs.gitbooks.io/linkit-smart-7688/content/?key=84149961

資料分析
https://www.youtube.com/watch?v=K7o5OlRLtvU

API
https://mcs.mediatek.com/resources/latest/api_references/
http://blog.cavedu.com/programming-language/appinventor/%E5%8F%96%E5%BE%97-mediatek-cloud-sandbox-%E7%9A%84%E8%B3%87%E6%96%99%E9%BB%9E-json/

Game Pad
https://mcs.mediatek.com/resources/latest/tutorial/7688_gamepad_tutorial

使用 LinkIt Smart 7688 控制繼電器
http://blog.cavedu.com/%E7%89%A9%E8%81%AF%E7%B6%B2/linkit/linkit-%E4%BD%BF%E7%94%A8-linkit-smart-7688-%E6%8E%A7%E5%88%B6%E7%B9%BC%E9%9B%BB%E5%99%A8/

MCS 雲端控制LED

在D7腳位(也就是Gpio0) https://labs.mediatek.com/fileMedia/download/759415ff-8d0d-48ed-9f8e-eac57c58594e
作為這次LED測試的正極
接好線路,如下圖


並開始寫程式碼
試著執行看看
app.js

var mcs = require('mcsjs');
var m = require('mraa');
var myLed = new m.Gpio(0);// 7688 Duo - D7

myLed.dir(m.DIR_OUT); //set LED pinmode to output

var myApp = mcs.register({
     deviceId: 'DZt3X3QK',
     deviceKey: 'TdXgwy3gbvVFIOji',
});
// Replace the device ID and device Key obtained from your test device
// created in MCS.

myApp.on('AdamLinkitSmartChann', function(data, time) {
 if(Number(data) === 1){
     console.log('blink');
     myLed.write(1);
 } else {
     console.log('off');
     myLed.write(0);
 }
});

用MCS看7688視訊串流

https://iamblue.gitbooks.io/linkit-smart-nodejs/content/zh-TW/cloud/videoStream.html

https://makerpro_taiwan.gitbooks.io/diy-linklt-smart-7688duo-monitor-doll/content/

Arduino 與7688溝通

Arduino 與 nodejs溝通

TTY 代表打字機(TeleTYpe),通常各種類型的終端設備,都會使用tty來作為簡稱
要了解tty,可以參考這篇 http://www.coctec.com/docs/linux/show-post-120914.html

因為7688 duo的Linux晶片與Arduino晶片是用ttyS0來溝通[串列埠終端(/dev/ttySn),對應於DOS系統下的COM1]

電腦這邊,開啟arduino輸入開發編輯器,輸入以下指令
Arduino中,serial主要用來和其他電腦或設備溝通
Serial1.print() 或Serial.println() - 傳送資料到外部電腦

7688
每五秒會丟出12345數字

void setup() {
  Serial1.begin(9600);
}

void loop() {
  Serial1.print(12345);
  delay(5000);
}

在7688中建立nodeJs檔案
準備透過Serial Ports,讓NodeJs可以和Arduino溝通
sensor.js

var SerialPort = require("serialport").SerialPort;
var sp = new SerialPort("/dev/ttyS0",{
        baudrate: 9600
}, function(){
        console.log('Connect to arduino');
});

sp.on("open", function () {
        receivedData ="";
        console.log('serial port open');
        sp.on('data',function(data)
        {
                receivedData =data.toString();
                console.log('-----');
                console.log(receivedData);
                console.log(data[0]);
                console.log('----');

        });
});
~


Arduino 接收 nodeJs訊息

arduino

void setup() {
  Serial.begin(115200); // open serial connection to USB Serial port (connected to your computer)
  Serial1.begin(57600); // open internal serial connection to MT7688AN
                      // in MT7688AN, this maps to device
  pinMode(13, OUTPUT);
}
void loop() {
  int c = Serial1.read(); // read from MT7688AN  
  Serial.print(c);
  if (c != -1) {
    switch(c) {
      case '0': // turn off D13 when receiving "0"
        digitalWrite(13, 0);
        break;
      case '1': // turn off D13 when receiving "1"
        digitalWrite(13, 1);
        break;
     }
  }
  delay(500);
}

app.js

var SerialPort = require("serialport").SerialPort;
var i = "0";
var sp = new SerialPort("/dev/ttyS0",{ 
    baudrate: 57600 
}, function(){
    loop(sp,i);
});

function loop(sp,i){
    if(i=="1"){
        i="0";
    }else{
        i="1";
    }
    sp.write(i);
    setTimeout(function(){ loop(sp,i);},1000);
}

Arduino 接收 python 訊息

arduino

void setup() {
  Serial.begin(115200); // open serial connection to USB Serial port (connected to your computer)
  Serial1.begin(57600); // open internal serial connection to MT7688AN
                      // in MT7688AN, this maps to device
  pinMode(13, OUTPUT);
}
void loop() {
  int c = Serial1.read(); // read from MT7688AN  
  Serial.print(c);
  if (c != -1) {
    switch(c) {
      case '0': // turn off D13 when receiving "0"
        digitalWrite(13, 0);
        break;
      case '1': // turn off D13 when receiving "1"
        digitalWrite(13, 1);
        break;
     }
  }
  delay(5000);
}

py

import serial
import time

s = None

def setup():
    global s
    # open serial COM port to /dev/ttyS0, which maps to UART0(D0/D1)
    # the baudrate is set to 57600 and should be the same as the one
    # specified in the Arduino sketch uploaded to ATmega32U4.
    s = serial.Serial("/dev/ttyS0", 57600)

def loop():
    # send "1" to the Arduino sketch on ATmega32U4.
    # the sketch will turn on the LED attached to D13 on the board
    s.write("1")
    time.sleep(2)
    # send "0" to the sketch to turn off the LED
    s.write("0")
    time.sleep(2)

if __name__ == '__main__':
    setup()
    while True:
        loop()

如果你喜歡我們的文章內容,請在這裡按個讚



最新文章推薦