MCU+

2016年8月7日 星期日

ARM mbed client Code


What is mbed client?

ARM mbed Client is a library that provides the means to connect constrained embedded devices to mbed Device Connector Service, mbed Device Server and to mbed-enabled cloud services from our partners.


  • Manage devices on mbed Device Server.
  • Securely communicate with internet services over the industry standard TLS/DTLS.
  • Fully control the endpoint and application logic.

M2MInterface  --> register_object()          ----callback--> object_register()
                               unregistered_object()  ----callback--> object_unregister()
                               update_registration()    ----callback--> registration_updated()



M2MInterfaceObserver 類別上的5個Callback函式列表

virtual void bootstrap_done (M2MSecurity *server_object)=0
A callback indicating that the bootstap has been performed successfully. More...
virtual void object_registered (M2MSecurity *security_object, const M2MServer &server_object)=0
A callback indicating that the device object has been registered successfully to the LWM2M server. More...
virtual void object_unregistered (M2MSecurity *server_object)=0
A callback indicating that the device object has been successfully unregistered from the LWM2M server. More...
virtual void registration_updated (M2MSecurity *security_object, const M2MServer &server_object)=0
A callback indicating that the device object registration has been successfully updated on the LWM2M server. More...
virtual void error (M2MInterface::Error error)=0
A callback indicating that there was an error during the operation. More...
virtual void value_updated (M2MBase *base, M2MBase::BaseType type)=0
A callback indicating that the value of the resource object is updated by the server.Whenever there is a valid PUT operation for any of the resources, the application will receive a callback:


void error(M2MInterface::Error error){
        _error = true;
        String error_code;
switch(error) {
        case M2MInterface::ErrorNone:
             error_code += "M2MInterface::ErrorNone";
             break;
        case M2MInterface::AlreadyExists:
             error_code += "M2MInterface::AlreadyExists";
             break;

  .....


           }
        printf("\nError occured  : %s\n", error_code.c_str());
    }



There are two types of resources you can create
Dynamic: 值會改變, 當server 請求時要負責傳回值
Static: 值不改變
 configure different types of Objects, Object Instances and Resources 



mbed Client supports the following three features introduced in the subsequent chapters:

mbed docs

  1. ARM mbed Client Guide
  2. ARM mbed Client API




2016年8月4日 星期四

關於感測電路應用設計



感測電路應用設計即利用感測元件所進行電路設計

感測元件通常是利用半導體材料特性,對自然界的物理訊號 , 如光、聲音、壓力、溫度轉換成電氣訊號,而電氣訊號可能是電流、電阻、電壓的訊號。例如光敏電阻(Photocell)會因為光的強度不同,而產生阻值變化; 焦電式紅外線感知器為因為吸收紅外線而產生AC電壓變化。故感測電路設計即利用感測元件的電氣訊號變化來設計"適當"的電路。由於感測元件通常產生的電氣訊號(不論是電壓或電流)都很微小,所以大多數感測電路都會用到OP Amp, 將訊號加以放大。

不論感測元件是屬電流、電壓或電阻的元件,最終經由我們所設計的感測電路都必須是電壓輸出,因為MCU/ SoC 嵌入式系統的輸入端都是看電壓 (為何只看電壓, 而不看電流或電阻, 理由何在?? )。MCU會針對電壓的類比訊號,經由ADC元件轉成數值,即可進行後續運算/演算法處理。




感測電路設計的一個例子:

目標: 設計一個能自動點灯的照明設備

功能需求:

  • 可以調整感應距離 (即靈敏度) 
  • 每次觸發的延時時間
  • 感應距離最遠 7 公尺
  • 範圍可達 110 度角
  • 偵測到有人活動時,輸出電壓值 3.3V~5V; 否則輸出 0V
工程師要開始思考, 如何做到這些功能?

1) 有什麼樣感測元件以偵測到人?

 PIR (Passive Infrared Sensor )紅外線人體感應器,它主要的感應方法為利用溫度之變化,來感應人之移動。PIR內部焦電元件是強導電體。紅外線照射到強導電體元件上,元件會吸收紅外線產生熱及溫度變化。因溫升會使元件表面產生電荷 (此為焦電效應),後續再經電路進行感測處理後就能產生On/Off信號。
在自然界,任何高於絕對溫度(-273℃)時物體都將產生紅外光譜,不同溫度的物體,其釋放的紅外能量的波長是不一樣的,因此紅外波長與溫度的高低是相關的。人體體溫約在 37 度,所以會發出特定波長 10 微米左右的紅外線。


焦電型紅外線感應器

2) 如何對找到的這個感測元件進行功能設計(即感測電路設計)?


http://www.ittraining.com.tw/ittraining/index.php/course/hardware/ec

另外,可以增加一些功能,

  • 如具有調整觸發模式的Jumper :單次觸發,中間偵測有人在移動, 不會延長timer。重複觸發,若偵測仍有人在移動, 會延長timer時間。
  • 使用兩個可變電阻, 一個用來調整感應距離 (即靈敏度) ,另一個用來調整每次觸發的延時時間。


3) 那別人都是怎麼做的 ? 

一般常見的PIR模組

PIR 模組正面有一個 PE (聚乙烯) 做的平凸透鏡外罩, 用來聚焦紅外線,以增加感測範圍
中間為焦電型紅外線感應器 




PIR 模組的背面,兩個可變電阻可以調整參數
                              
                           

參考資料: 

  1. 焦電型紅外線感應器 規格書下載
  2. 更多資訊:: http://www.ittraining.com.tw/ittraining/index.php/course/hardware/ec








2016年8月2日 星期二

Raspberry Pi SSH免密碼登入


1) 下載 putty key-generator
2)在 windows 上 ,用 PuTTYgen: puttygen.exe 產生一對public/private key pair




2) 在SSH server  (Raspberry Pi):


將public key 的內容, 全部貼在該使用者 HOME目錄的~/.ssh/authorized_keys這個檔案內

mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys


ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAq8fOyBgW8NQQK/J8uz7Z9kHQAZLnYTNBcOLq1plTw+a6qRdxGtGW1c3j2s8CTEPzFyLHhjF4yQVBS9T71mKIBzuUREY5+IE7yVowj5/IfiCO+Dwhtrne6Id/O2yYdO1nDdZuepqBLcXSxncJrqT/+02DdIMl3Sh85exYhj6cQx7fc6zwP2V6c4+2eHTGCuyG7aob9ku/044od3UvOD0DZFZPyAgbdX5MPkHARjoH5LkeY+kaR6nnyiM7wpSvJXrzFNrdbkeWbkDPj7csTNFDPZcRgy+yxs3xy6z1VRbGQ3uGegXtqBuuAI36mA034CwylkSyDFTfEXl8F2jWZ2ta5w== root


3) SSH client (Windows)

在 putty 內設定,在Auth SSH, 指定剛儲存下來的private key檔案 (Save private key), 再次登入使用該user 去Login , 就不用再輸入密碼了






Note:

停用密碼認證的登入方式,只允許金鑰認證,可以修改 /etc/ssh/sshd_config ,

PasswordAuthentication no 
PubkeyAuthentication yes

# 更改後須再重新啓動SSH server
/etc/init.d/sshd restart
--------------------------------------------------


 若使用Goolge compute engine中, Linux 的登入方式只允許使用金鑰認證,  故必須在 "中繼資料" 新增SSH KEY, 貼上public key
.........................== <google 登入帳號>



2016年8月1日 星期一

brk, sbrk - change data segment size


brk, sbrk - change data segment size


brk and sbrk are basic memory management system calls used in Unix and Unix-like operating systems to control the amount of memory allocated to the data segment of the process.[1] 
These functions are typically called from a higher-level memory management library function such as malloc.
In the original Unix system, brk and sbrk were the only ways in which applications could acquire additional data space; later versions allowed this to also be done using the mmap call.

Function signatures and behavior



#include <unistd.h>

int brk(void *addr);

void *sbrk(intptr_t increment);

brk() and sbrk() change the location of the program break, which defines the end of the process's data segment (i.e., the program break is the first location after the end of the uninitialized data segment). Increasing the program break has the effect of allocating memory to the process; decreasing the break deallocates memory.

brk() sets the end of the data segment to the value specified by addr, when that value is reasonable, the system has enough memory, and the process does not exceed its maximum data size (see setrlimit(2)).

sbrk() increments the program's data space byincrement bytes. Calling sbrk() with an increment of 0 can be used to find the current location of the program break.