No Code AI(肉寇)AI自動化兩日精通|實體6小時+線上6小時
|

【Project】用 LinkIt 7697 製作跌倒偵測裝置

   

作者:賴建宏

希望利用智慧手環解決長照困境/來源

緣起

看到聯發科推出 LinkIt 7697 這功能強大的開發板,卻只拿來做遙控車?實在是暴殄天物! LinkIt 7697 的強項在於處理器效能和記憶體,遠比大多數 Arduino 系列用的 8 bits ATMEL 328 系列更快又更大,當然把功能比較複雜的演算效果加上去,讓它更有看頭!

來看看 LinkIt 7697 與 Arduino Uno 簡單的比較表:

LinkIt 7697 / Arduino Uno 比較表

還有,別忘了 LinkIt 7697 上面附帶有 BLE 以及 WiFi 的無線電通訊機能,如果你想用 Arduino UNO 來做無線電加值服務的效果,還得另外花錢去買 Adapter 哩!

要讓它演算效果強,有一大堆的應用可行,想了想覺得適合 LinkIt 7697 的大概就是 Arduino 這類的裝置,但又要用之前 Arduino 這類可能比較麻煩的裝置來做,才突顯 LinkIt 7697 的價值。智慧長期看照裝置就是個不錯的選擇,而且國際期刊跟研討會很多這方面的內容。

所以 MakerPRO 社團的總主筆歐文向我提起這個構想,開始往智慧長期看照這方面的裝置下手,參考坊間有許多與跌倒偵測裝置有關的產品,比如智慧手環,就是第一個標的啦!

參考了幾篇國際期刊以後,心中大概有了譜,打算使用 LinkIt 7697 加上一個 MPU6050 的模組,來做出一個偵測跌倒信號的功能雛形。

如何用LinkIt 7697做出跌倒偵測裝置?

材料需求

  • 
LinkIt 7697一個
  • MPU6050模組一個
  • 母對母杜邦線四條

硬體跳線

LinkIt 7697 / Arduino Uno 硬體跳線

原理說明

簡單來說,就是利用加速度在 XYZ 三個軸上,對時間 t 微分(設定一個固定間隔時間)所得的XYZ變量之強度值(XYZ三個軸上的值,這一次與前一次的差,再代公式)進行分析比對(跟一個設定好的值比大小)。是不是相當口語化呢?不用微積分又簡單易懂。

至於那求強度值公式⋯⋯嘿嘿嘿,也是小孩都算得出來:

求強度值公式

如果你有興趣去翻國際期刊,可以看到有些人把角速度(自己騰空旋轉的改變程度)也考慮進去(公式一樣!就只是把 ax、ay、az 換成 gx、gy、gz 而已)。總之,就是在一段時間內,若偵測到強度超過設定的值,就判定成跌倒⋯⋯

大概又會有人被期刊上那些眼花撩亂的數學式給騙了吧,其實那些國際期刊跟研討會的文獻寫的主題,就是:用什麼樣的數據收集方法(自己編一套自己的計算公式)來決定強度值應該設定多少,才算是跌倒(叫很多研究生去表演怎樣跌倒,然後把三項數據收集起來,套自己編的公式算)⋯⋯OK!懂了喔?

程式碼

<< fall.ino >>

#include “I2Cdev.h”

#include “MPU6050.h”

#include “Wire.h”

MPU6050 accelgyro;

int16_t ax, ay, az;

int16_t gx, gy, gz;

int time_interval = 500;    //500ms

unsigned long current, lastTime = 0;

int16_t prev_accx = 0;

int16_t prev_accy = 0;

int16_t prev_accz = 0;

float acc_upv = 2.8;  //The thresholds for fall detection

void setup()

{

  Wire.begin();

  Serial.begin(115200);

  accelgyro.initialize();

  accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

  prev_accx = ax;

  prev_accy = ay;

  prev_accz = az;

  lastTime = millis();

}

void loop()

{

  current = millis();                 //Set for every interval

  if(current – lastTime >= time_interval)

  {

    lastTime = current;

    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

    

    float accx = ((ax – prev_accx) / 16384) * ((ax – prev_accx) / 16384);

    float accy = ((ay – prev_accy) / 16384) * ((ay – prev_accy) / 16384);

    float accz = ((az – prev_accz) / 16384) * ((az – prev_accz) / 16384);

    Serial.print(accx); Serial.print(“\t”);

    Serial.print(accy); Serial.print(“\t”);

    Serial.print(accz); Serial.println();

    if( sqrt(accx + accy + accz) > acc_upv )

      Serial.println(“GOT!!!”);

    prev_accx = ax;

    prev_accy = ay;

    prev_accz = az;

  }

}

 

影片說明與展示

結語

在計算上,運用 LinkIt 7697 比起 Arduino UNO 更加簡單!我的間隔時間設 0.5 秒,強度值就參考國際期刊的 2.8 ,坊間有很多這類商品,看完本文你也可以自己完成後,拿來跟坊間的商品比較看看。當然,若加上一些像是通訊功能,以及與 Android 手機 App 之間交換訊息的加值功能,你的商品就會更有賣點哦!

(責任編輯:林佳盈)

◎加入我們的Line,獲得更多及時文章更新&活動資訊→

加入好友

參考資料:國際期刊與研討會文獻

A. Inclusive Smart Cities and Digital Health, 第108到187頁

B. Evaluation of waist-mounted tri-axial accelerometer based fall-detection algorithms during scripted and continuous unscripted activities, Journal of Biomechanics, Elsevier

賴建宏

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author: 賴建宏

社群稱號為「賴桑」的他,以電子電機的背景,熱衷於OSHW的應用開發與實作。取得台北科技大學電子所博士學位,目前主推「農林漁牧大業」計畫的迷你型魚菜共生系統開發。

Share This Post On
468 ad

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *