2016年3月31日 星期四

Socket Option : TCP_NODELAY


Linux Socket Option : TCP_NODELAY


int init_socket(mqtt_broker_handle_t* broker, const char* hostname, short port, int keepalive)
{
int flag = 1;

// Create the socket
if((socket_id = socket(PF_INET, SOCK_STREAM, 0)) < 0)
return -1;

// Disable Nagle Algorithm
if (setsockopt(socket_id, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(flag)) < 0)
return -2;

struct sockaddr_in socket_address;
// Create the stuff we need to connect
socket_address.sin_family = AF_INET;
socket_address.sin_port = htons(port);
socket_address.sin_addr.s_addr = inet_addr(hostname);

// Connect the socket
if((connect(socket_id, (struct sockaddr*)&socket_address, sizeof(socket_address))) < 0)
return -1;

// MQTT stuffs
mqtt_set_alive(broker, keepalive);
broker->socket_info = (void*)&socket_id;
broker->send = send_packet;

return 0;
}

Disable Nagle Algorithm:  
為了提升TCP傳送效率, 不要送一點資料就送出一個TCP/IP封包, 若只送1 byte , 先不看MAC層header 光TCP+IP Header 就有40byte了, overhead 太大, 所以Nagle 這個人, 就提一個方法, 累積一定的大小才送..
if there is new data to send
  if the window size >= MSS and available data is >= MSS
    send complete MSS segment now
  else
    if there is unconfirmed data still in the pipe
      enqueue data in the buffer until an acknowledge is received
    else
      send data immediately
    end if
  end if
end if


2016年3月28日 星期一

TCP RTO計算方式




When TCP sends a segment it maintains a timer, waiting for the other end to acknowledge reception of the segment. If an acknowledgment isn't received in time, the segment is retransmitted.


這個timer 就是RTO (Retransmission TimeOut) ,它的時間並不是固定的, 而是依當下的網路擁塞程度做動態的調整。


To compute the current RTO, a TCP sender maintains two state variables, SRTT (smoothed round-trip time) and RTTVAR (round-trip time variation).

init : RTO=3 秒

1) 取得第一個RTT後, RTO 計算如下

SRTT <- R
RTTVAR <- R/2 
RTO <- SRTT + max (G, K*RTTVAR)

其中 K = 4 , clock granularity of G seconds. (G: 100ms~500ms )

2) 之後每收到一個RTT,  RTO 計算如下

RTTVAR <- (1 - beta) * RTTVAR + beta * |SRTT - R'|
SRTT <- (1 - alpha) * SRTT + alpha * R'
RTO <- SRTT + max( G, K * RTTVAR )
其中 alpha = 1/8, beta = 1/4,
若 RTO小於1s, 則進位至1秒


When segment 4 is transmitted 2.4 ms later, it cannot be timed, since the timer for this connection is already in use. 


  1. 在TCP中,同一時間下只能處理一個 RTT 的量測程序。
  2. Retransmission Timer只有一組
  3. 有重送(retransmit)過的封包的RTT不可以拿來計算, 因為沒有辦法知道所收到的確認封包(Ack) 第一次送出的封包回覆的還是重送的封包回覆的
https://tools.ietf.org/html/rfc2988
   (5.1) Every time a packet containing data is sent (including a
         retransmission), if the timer is not running, start it running
         so that it will expire after RTO seconds (for the current value
         of RTO).
         每次送出封包,若當時timer沒啓動,則要啓動

   (5.2) When all outstanding data has been acknowledged, turn off the
         retransmission timer.
         若送出的全都封包, 已全部都有ACK回來, 關閉 timer
(5.3) When an ACK is received that acknowledges new data, restart the retransmission timer so that it will expire after RTO seconds (for the current value of RTO).
        若有ACK回來是回應新封包 (即非dup ACK), 則 timer須更新,使得再經過RTO秒後會發生timeout


   When the retransmission timer expires, do the following:
   (5.4) Retransmit the earliest segment that has not been acknowledged
         by the TCP receiver.
        timeout 發生了, 把Window還沒被ACK的(Outstanding Packet)全部重送
            

   (5.5) The host MUST set RTO <- RTO * 2 ("back off the timer").  The
         maximum value discussed in (2.5) above may be used to provide an
         upper bound to this doubling operation.
          把RTO乘以2 (RTO <- RTO * 2 )

   (5.6) Start the retransmission timer, such that it expires after RTO
         seconds (for the value of RTO after the doubling operation
         outlined in 5.5).
      timer再重新啓動,使得再經過RTO秒後會發生timeout

例子, 


當SYN區段傳送出去時,RTTM、RTTS、及 RTTD 尚未有值,而 RTO 的值被設定為 3 秒。

2.當SYN+ACK區段抵達,其 R 被量測後為 1.5 秒,其變數的值如下所示:


R = 1.5
SRTT = 1.5
RTTVAR = 1.5 / 2 = 0.75 
RTO = 1.5 + 4 . 0.75 = 4.5



3.當第一個資料區段傳送出去時,一個新的 RTT 量測程序被啟動。請注意,當傳送端傳送ACK區段時並不會啟動 RTT 量測程序,因為它不會消耗序號也不會啟動計時器。第二個資料區段也不會啟動 RTT 量測程序,因為已經有一個量測程序正在進行中。最後一個ACK區段的抵達被用來計算下一個 RTTM 的值。儘管最後一個ACK區段是用來回應兩個資料區段 ( 累計式 ),它的抵達完成了第一個區段之R的值。其變數的值如下所示:


RTT = 2.5
SRTT = 7/8 (1.5) + 1/8 (2.5) = 1.625
RTTVAR = 3/4 (0.75) + 1/4 |1.625 − 2.5| = 0.78
RTO = 1.625 + 4 (0.78) = 4.74



2016年3月26日 星期六

V2V (Vehicle-to-Vchicle) 車聯網


關鍵的M2M應用--V2V (Vehicle-to-Vchicle) 車聯網


捷銳行動 Cloud Fleet 結合3G Cloud GPS Vehicle Tracker (CT-02) 實現車聯網解決方案。

CT-02傳輸車輛位置及其他GPS資訊到Cloud Fleet 平台。Cloud Fleet 車隊管理平台,可即時監控追踨車輛及產生數據報表,顯示如航跡記錄、每輛車的行駛公里數、某定點停留時間、車輛怠速時間,報表可用來評估車隊績效及成本控管,燃料費用、統計高速公路通行費用等。

若再加一個符合OBD-II 或EUOBD  的儀表板車上診斷裝置,可額外收集並傳輸車輛自己本身的資訊,如行車速度、引擎轉速、電壓、瞬間百公里油耗、百公里平均油耗、水箱水溫等,可進一步進行資料分析,如駕駛行為分析或商業成效分析。例如,能預測可能拋錨前就先進廠保養,以減少意外的拋錨次數,進而降低整體營運成本。

關鍵詞:V2V、M2M、V2I、IoT、OBD-II、Fleet management、車隊管理

2016年3月24日 星期四

快速呈現你的專題內容



為快速呈現你的專題內容,一定會用系統架構圖、軟體流程圖等來呈現自己所做的內容,但常常不知如何來呈現,所以這裡整理幾個不錯示意圖供大家參考。

任何說明都比不上圖, 記住"字不如表, 表不如圖"



系統架構圖或硬體架構圖: 呈現系統的全貌






2016年3月21日 星期一

使用XMPP進行遠端設備控制



物聯網(Internet of Things, IOT)時代的興起,不僅人跟人之間可以透過網路相互聯繫外,人跟物品、物品與物品之間,也可以透過網路環境互通。當許多設備或物品都可以連上Internet時,我們開始思考著一件事,如果可以用即時通訊(Instant Messaging,簡稱IM)軟體,如LINE、Google Hangout之類的軟體和我們的機器進行對話,不就可以達成即時的Internet遠端設備監控。本組的專題就對此一機制將它具體實現。


關鍵詞: Instant Messaging, IoT, M2M, XMPP, 物聯網

2016年3月15日 星期二

銀髮幼童健康定位手環



隨時瞭解老人心跳以及溫度的狀態,當超過預期符合的範圍,能夠透過簡訊傳送至親人手機,再將老人及時位置用 3G 網路推播至伺服器網站,親人可以上網站或用手機 APP 觀看資訊位置 主要功能 :


1. GPS 定位
2. 心跳
3. 溫度
4. SOS 緊急求救以及推播簡訊
5. 網站及手機觀看資訊


關鍵詞:SIM5320E、GPS、 3GPP、SMS、Lua、PHP、MYSQL、AT Command






無線遙控自走車



本專題基於Raspberry Pi 實做出一個多功能之無線WiFi探測車,並可使用Web控制。我們利用一顆L293D完成H-橋式(H-Bridge)電路以驅動兩個DC馬達並分別透過PWM訊號來控制馬達轉速,以達到不同方向控制的目的。由於車體各位置載重不同、馬達本身可能的誤差及左右車輪受的摩擦力可能不同,會使車體直線前進變成一個要解決的問題。我們運用了自動控制的PID反饋的機制,利用實際測得的車輪轉速(RPM,rounds per minute),和目前的轉速作比較後,來調節下一次PWM的訊號輸出,促使2顆馬達轉速達到一致。為了量測車輪實際轉速,我們在左右車輸的側邊加裝光遮斷器(Photoswitch),利用計數光遮斷數來推算出車輪轉速。在我們圓型車體,我們透過個超音波距離感測器,進行前端障礙物偵測。車體上,利用Raspberry Pi USB界面連接802.11 WiFi Dongle及Webcam,達到遠端即時監看畫面。

關鍵詞:Raspberry pi、Embedded Linux、H-Bridge、WiFi、L293D、Encoder、PWM、Photoswitch、PID、自動控制





2016年3月14日 星期一

Zigbee 無線自動燈光及溫度調控系統



Zigbee 無線自動燈光及溫度調控系統
本專題中我們以嵌入式Linux實做出智慧家庭系統整合平台。為實現本系統我們實作了主控台基於DMA-6410L (Samsung S3C6410)系統、燈光調控器(基於PIC16F916),並結合TI CC2430 Zigbee通訊模組及溫度感測器、PIR紅外線人體感測器及紅外線發射器。利用Zigbee無線傳輸與燈光調控器溝通以控制燈光明亮程度。燈光調控器也提供溫度、人體移動偵測回報主系統,主系統將透過紅外線發射器遙控電風扇或冷氣機運轉強弱,以控制舒適的室內溫度,另外有人體移動發生時,亦可自動控制房間的燈光,讓家中老人在夜間能安全行動。

本系統也可以利用4x2 keypad按鍵或LCD觸控面板做為使用者的操作介面,控制燈光亮度,風扇或冷氣的強弱。還提供Web Server功能,讓家人利用網路遠端遙控家中電燈,冷氣、風扇,或其他電器。

關鍵詞: IEEE 802.15.4 Zigbee、無線感測網路、TRIAC, PIR, IR Remote Control






關鍵詞: IEEE 802.15.4 Zigbee、無線感測網路、TRIAC, PIR, IR Remote Control

Raspberry Pi應用-結合RS485工業控制通訊介面技術




Raspberry Pi 這一類的開源硬體問世以來, 基於其軟硬體開源的精神之下,降低了一般使用者與青少年 兒童學習電腦的門檻。讓資訊工程與電子軟硬體整合的學習 走出大學教育單位的象牙塔!

Raspberry Pi 以一個小型個人電腦的系統成功地整合了MCU 的GPIO功能。在多樣化的程式語言與豐富的函式庫支援下,開闢了一個異於傳統嵌入式系統開發的生態系,開發者們得以使用各式高階語言實作控制 GPIO 功能並透過溝通 I2C、SPI、UART 通訊介面而可以將整合各式功能IC。加上USB介面,讓開發者們得以輕易整合應用各類USB設備。從工業控制的角度來看Raspberry Pi 結合了GPIO功能之後,更將成為市場內的一個嶄新新元素。突破以往可程式化邏輯控制器(PLC)的功能限制,如缺乏高階語言支持、過於簡易的GUI(HMI)介面、硬體功能難以擴充、數學運算支援不足...等等,使得程式化控制整合各式裝置,變得更為輕易,而得以發展更為多樣化的工控系統。配合 UART 或 USB 介面,Raspberry Pi 輕易地擴充RS232、RS422、RS485 通訊介面,並配合開源 Modbus 通訊協定函示庫與 Raspberry Pi 本身對於網路通訊功能優異的支援,開發者們將可以利用各種程式語言來開發與拓展工業控制與大數據運算應用來達成工業4.0。

此次講座我們將分享 Raspberry Pi 如何整合 RS485 與 modbus RTU 通訊協定。 並利用 C 或 python 來做開發整合,輕易整合支援 RS485 RTU 通訊介面的裝置。配合 艾鍗科技研發的 Raspberry Pi Education Kit 無線通訊、藍牙通訊、液晶字元顯示模組、各類基礎GPIO功能,輕易模擬各式GPIO開關元件,讓你在桌上就可以練習工控系統開發。非常適合對於工控有興趣的 Maker族群快速上手、迅速整合各類工控裝置,專注於各類創意的發想。

GPS + Google fusion table 雲端應用






即時地震預警系統



在地震波的偵測,我們使用三聯科技生產的Palert地震P波警報器來偵測地震P波功能。我們的主機與Palert之間的通訊採Modbus TCP工業標準通訊協定,來得知P波訊號及地震的強度。主機上配有LCD即時顯示地震目前所偵測到的地震強度, 若震度達五級以上時, 蜂鳴器會持續發出聲響並透過GSM 模組 (SIMCom SIM900)發送地震發生之時間、震度相關的地震預警簡訊給使用者。
關鍵詞: Raspberry Pi、Palert 地震儀、Modbus TCP、P-Wave、SIM900、SMS PDU模式



2016年3月13日 星期日

Raspberry Pi 移植即時作業系統FreeRTOS




在本次專題研究探討中, 我們以 Rasberry Pi 2 為硬體平台, 一開始先經由移植開源 U-boot 以了解CPU初始化程序及硬體初始化程序,接著以bare-metal 方式來開發Raspberry Pi 週邊界面的驅動程式,如 GPIO、UART及I2C 。

從 U-boot 移植的經驗, 我們不僅熟悉了ARM 組合語言,也了解到ARM 開機程序為何? 初始化中斷向量表為何意? Assembly Code要如何進入到C Code ? Startup Code 為何意 ? Linker Script 角色為何?

接著我們研究FreeRTOS 這套即時作業系統架構及如何將FreeRTOS移稙到各種不同硬體平台上。經由code的層層剖析,了解到任何平台都必須促使FreeRTOS在timer ticker中斷處理函式能正確被觸發, 如此FreeRTOS中的context switch 機制才可正確運作,以達到其Multi-tasking 多工的角色。

我們成功了移植FreeRTOS 到Raspberry Pi 上, 我們也藉由執行FreeRTOS 的API,如xTaskCreate(), vTaskDelay(),xSemaphoreCreateBinary() , 來實測FreeRTOS 的多工與排程等功能。

關鍵詞: Raspberry Pi, FreeRTOS, ARM Cortex-A7,uboot, Bare-metal 閞發, I2C, UART, SPI

 arm bootloader



Raspberry Pi 智能風扇


用Raspberry Pi 設計一個智能風扇,它不僅可以使用IR紅外線來控制風扇轉速外, 還可以依據偵側到的環境溫度而自動調整風扇轉速。
關鍵詞: Raspberry PI, PWM, IR Remote, LIRC






自平衡機器人的研究和實作



自平衡機器人的研究和實作
The Magic behind Self-Balancing Robot


專題的動機來自於 Dean Kamen 發明的兩輪電動代步車 ~ Segway。當人踏在上面時,可以自動平衡保持直立,且會根據整體重心的改變而產生前進或後退的靈活移動。因停靠方便、外型酷炫、操作容易,在歐美地區已造成一股流行。

主要的目標是完成一具有自我維持平衡能力的兩輪機器人。我們以STMicroelectronics STM32-F3 (ARM Cortex-M4 core @72MHz ) 當作開發平台,左、右兩輪各搭配有齒輪箱的直流馬達,底板正中央放置慣性感測元件,最上層安裝可充電式電池組。藉由Accelerometer 和 Gyroscope分別量測車身的傾斜角&角速度,並利用Encoder量測馬達轉動的位置或速度,根據前三者加總的即時資訊當成PID控制器的輸入,建立兩輪車各種模式的狀態;經運算後再以PWM訊號和驅動器輸出調整馬達轉速,使機器人具備平衡、同步、定速定位、前進/後退、左右轉彎等功能。

第一階段為實現保持動態平衡以及兩輪同步操作、第二階段為實現藍芽遙控的前進/後退和差速轉向。過程中整合了感測物理量的擷取、Kalman濾波器的訊號處理、馬達驅動&控制的技術,充份地展現了韌體&硬體的緊密結合,[系統架構圖]見Figure.2。



Keywords:  Self-Balancing, 慣性感測, Kalman濾波器, PID控制器,STM32-F3,ARM Cortex-M4,Accelerometer,Gyroscope




系統架構


成品圖

Slide:




Demo:




2016年3月12日 星期六

用Raspberry Pi 完成一個智慧型六足機器人



用Raspberry Pi完成一個智慧型六足機器人。


六足機器人的基本結構,基本上包含機器人本體結構、Raspberry Pi 控制核心、馬達驅動板、電力系統。首先,針對機器人本體結構,每一足將有3顆伺服馬達,故六足共有18顆伺服馬達使六足機器人可以達到所有可能的走行模式。馬達驅動板的部份,我們以2個PCA9685模組(I2C界面具16通道PWM輸出)來進行18顆伺服馬達的控制。 在電力系統的部份,由於六足機器人在所有的伺服馬達同時動作時,消耗約4A電流,故我們串聯了3顆18650電池,以提供12.6v電壓及最大電流輸出6A作為主要的電力來源。系統中再以LM2596及LM1117進行不同的DC-DC轉換,以提供系統其他部件所需的5V及3.3V 工作電壓。另外,馬達驅動電源部份,使用了XL4015恆壓模組,使伺服馬達具備穏定電壓源而能夠更穏定靈活轉動。 最後,Raspberry Pi控制核心主要為軟體設計的部份,我們完成了一個低階的PWM馬達驅動程式與一個高階並行控制運動演算法,使六足機器人能進行基本的直線、橫移與旋轉等運動行為。

為使六足機器人更具智慧,我們加入了超音波感測器以進行障礙物偵側、也加入USB Webcam 使六足機器人具備即時影像串流的能力並且再其底部加入一顆伺服馬達使Webcam鏡頭能左右轉向。另外,也加入PIR人體感測器,一旦偵測到人時, Webcam會立即拍下畫面,並傳送照片檔到雲端相簿。


最後,我們設計一個 Android APP並以Wi-Fi通訊方式來控制六足機器運動控制、其中即時影像串流的能力以Android Webview來實現,而手機對雲端相簿的存取則Android volley來完成。


關鍵詞:六足機器人Raspberry Pi,PCA9685,I2C,PWM,Servo motor, LM2596,LM358,XL4015,Android APP,webview,volley



2016年3月8日 星期二

BeMicroCV Ki 規格




BeMicroCV Ki Board是採用 Cyclone V E FPGA,這是 FPGA帶有Processor 的邏輯,也就是 所謂的SoC FPGA。下圖為Altera SoC FPGA 產品 Roadmap,

左: BeMicroCV Kit ; 右為艾鍗I/O子卡

2016年3月7日 星期一

mini PIC 實驗板 ( PIC18F46J50)



miniPIC版本和WenPIC 最大差別在於留出更多pin 腳, 可以更有彈性連接各種想要實驗的模組
此為WengPIC




miniPIC 規格:
  • MCU 規格:位元微控制器  PIC18F46J50
  • Program Memory64KB
  • RAM Bytes4KB
  • Digital Communication Peripherals2-UART, 2-A/E/USART, 2-SPI, 2-I2C2-MSSP(SPI/I2C)
  • Capture/Compare/PWM Peripherals2 ECCP
  • Timers2 x 8-bit
  • 3 x 16-bit ADC13 ch, 10-bit
  • Comparators2
  • USB (ch, speed, compliance)1, Full Speed, USB 2.0
  • Temperature Range(C) -40 to 85
  • Operating Voltage Range (V)2 to 3.6
  • Pin Count44
  • XLPYes
  • Cap Touch Channels13
mini PIC 實驗板 ( PIC18F46J50) 

檔案下載: 



2016年3月3日 星期四

vi 沒有High light 程式語法



因為Raspberry Pi 沒有裝vim , 使得讀或寫程式沒有vim, 很不習慣

所以自行安裝囉~

sudo apt-get install vim

裝完後開啓C程式編輯, 程式語法沒有high light

自己手動編輯此檔/usr/share/vim/vimrc ,此檔為vim開啓時都會去讀取的設定參數


vim /usr/share/vim/vimrc 

" 開啓語法high light
syntax on
" 設定tab鍵等於4個空白鍵
set tabstop=4
" 設定tab鍵等於4個空白鍵
set nu


===常用命令整理===
/keyword       //向下搜尋keyword字串
n                    //向下搜尋前一个搜尋字串
N                   //向上搜尋前一个搜尋字串
set nu             //顯示行號
set nonu         //取消顯示行號
dd                 //刪除當前行
yy                //複製當前行
p                  //貼上
q!            //離開vi/vim
wq!         //存檔離開


2016年3月1日 星期二

什麼是RSSI、SNR、dbm ?



http://www.ti.com/product/CC2500

Low Cost, Low-Power 2.4 GHz RF Transceiver Designed for Low-Power Wireless Apps in the 2.4 GHz ISM B

Device TypeSmart RF Transceiver   
Flash (KB)0   
RAM size (KB)1^ 2^ 4   
Min VCC1.8   
Max VCC3.6   
RX Current (Lowest) (mA)13.3   
Data Rate (Max) (kbps)500   
Modulation TechniquesOOK^2-FSK^GFSK   
Sensitivity (Best) (dBm)-104   
TX Power (Max) (dBm)1   
USB 2.0No   
Key Software FeaturesSimpliciTI Supported   
RatingCatalog   

Receiver Sensitivity (單位: dbm) :這個愈小表示其接收訊號靈敏度愈好。如有一個energy 是-130dbm, Sensitivity 為-140 dbm 的RF, 可以收到感知此訊號, 而Sensitivity 為-120dbm 則感知不到此訊號。



RF power : 功率單位用mW表示, 但常用log表示,在數線上才好表示 dbm 。 dBm=10*log(pf/1mw)

用來表示兩訊號的倍數/比值關係,如SNR (Signal to Noise Ratio)。可以用 Power, 但常用dB來示gain或 decay倍數關係, 如原始訊號被放大一倍, , 用log表示, 則會是說增加了3db
dB=10*log(pf/pi)

 0dBm = 1 mW, 10 dBm = 10 mW, 20 dBm = 100 mW, 30 dBm = 1 W

log2=0.3010, 10*log(2)=3db
每增加3db 就是功率增加(gain)一倍x2,  所以功率增加6db就是power x4
每滅少3db 就是功率減少(loss)一倍x0.5, 所以功率減少6db就是power /4



用成log,的另一個好處理是, 訊號可以用放大或縮小都可以用加減法來運算。

log(AB)=logA+logB
log (A/B)=logA-logB
Received Power (dbm) = Transmitted Power (dbm) + Gains (db) − Losses (db)
signal -53dbm, noise -90dbm, SNR= -53-(-90)=37db
一般Wi-Fi 品質叫做好, 那SNR 至少 20db (signal是noise旳100倍)




RSSI(Received Signal Strength Indication)是指接收的信號強度指示(in dbm ),用來判定鏈結的品質。

RSSI (Recieved Signal Strength Indicator) is a common name for the signal strength in a wireless network environment. It is a measure of the power level that a RF client device is receiving from an access point, for example. RSSI is the relative signal strength in a wireless environment and can be measured in any unit of power. It is often expressed in decibels (db), or as percentage values between 1-100, and can be either a negative, or a positive value.

The closer the figure is to zero, the better. For example, RSSI of -65 is better than -85. As a general example, a good signal would be -50 dbm, a reasonable would be -75, and a bad one would be -90, while -100 would provide no service at all.

To get a meaniful measurement of a good quality signal, you would have to subtract the noise on the line from that signal power level and consider the difference. A higher difference of signal to noise indicates better signal.



Wi-Fi 發射TX功率,美國 FCC/ 台灣NCC 規範 100mW (20dbm), 通常接收到時的功率只有-50 dbm (因為訊訊在中間傳輸時會loss)