文章類型
開發平台
解決方案
關注主題
文章類型
開發平台
解決方案
關注主題

【Tutorial】PSRAM版心音取樣器製作小撇步

作者:賴建宏

 

前陣子從MakerPRO到手一顆小小的PSRAM,並被賦與一個任務:想想看有沒有適合的應用?這顆PSRAM是由來揚科技開發的LYONTEK 64M PSRAM,特色是具有相對高速的傳輸率及儲存容量,適合做隨身型裝置的暫存記憶體。Jack大大已先做了一個電子看板(教學文請參考:【Tutorial】用Arduino Mini Pro打造低成本迷你電子看板)。我在想:「還有沒有什麼其它的應用,是不需要保存完整的數據資料,而是將緩衝的數據資料做運算然後再輸出的?」

在和歐大聊過之後,回到家在網路上隨意翻找一番,結果找到關於心音與肺音聽診方面的文章,果然還是有的——那就是聽診器。長期看護的應用,很多時候不要求一個瞬間的變化量,而是長期去觀察變化。例如:更動藥品後,對病患的心臟有沒有什麼影響,且醫師或病患並不會想要過程中每一點的電子訊號,而是想要這些電子訊號處理完成後的結果,好比說心搏的強度、心跳的頻率範圍等。

所需材料

  1. Arduino Pro Mini (CPU: 328,上面有LDO) 3.3V@8MHz
  2. Lily writer Arduino
  3. 來揚LYONTEK 64M PSRAM
  4. 電容式麥克風 (建議最好買品質比較好的,信號失真度比較低)

硬體線路

所需要的硬體線路(圖片:賴建宏提供,廖庭儀製圖)

※請注意:電源VCC都是3.3V,一般Arduino大多是5V,如果是採用一般Arduino,在來揚PSRAM間一定要有Level Shifter才行。

表格來源:賴建宏提供,廖庭儀重製

表格來源:賴建宏提供,廖庭儀製表

表格來源:賴建宏提供,廖庭儀製表

電容式麥克風透過A0把電子訊號傳入,再以FIR低通濾波器將電子訊號進行低通濾波,之後兩者都存入PSRAM。等到取樣至指定的數量後,就用Serial Plotter繪製出來兩者的變化波型。

原理說明

首先,本範例需要一個Arduino library,請從這裡下載。這個是一個以程式達成濾波的函數庫!當然,如果改用電容與電阻元件,也可以辦到,例如一般常見的RC低通濾波器,就可以用以下的電路達成。

低通濾波器的特性就是:只要輸入的電子訊號低於設定的頻段,那就可以通過,否則就會衰減到很小,而透過以下的公式能夠調整到想要的頻率,這也是我們電子工程師慣用的方法之一。

用程式達到濾波的方法,其實道理就是每次取樣多少個數據,將這些數據都乘以一個值,最後把這些相乘的結果加總,就是FIR的基本原理。但在設計濾波器上還有個更重要的觀念:如果你要取樣的訊號假設為100Hz,也就是每0.1秒一筆,那麼你的濾波器記得最少也要200Hz,也就是能0.05秒一筆才行完整取樣,這就是奈奎斯特定律。

程式碼

#include <firFilter.h>

#include <SPI.h>

 

#define PSRAM_CE 10

#define PSRAM_SI 11

#define PSRAM_SO 12

#define PSRAM_SCK 13

 

#define MAX_NUM 1000    // 打算用PSRAM存幾筆,每一筆都有原始和濾波

unsigned long i;

 

#define sensorPin A0      //pin number to use the ADC

int sensorValue = 0;

 

firFilter Filter;  // 低通濾波器

int filtered;       // 被濾波的結果

 

void setup() {

// put your setup code here, to run once:

Serial.begin(115200);

 

// Ready the PSRAM

pinMode(PSRAM_CE, OUTPUT);

SPI.begin();

SPI.setBitOrder(MSBFIRST);

SPI.setDataMode(SPI_MODE0);

SPI.setClockDivider(SPI_CLOCK_DIV2);

 

// Ready FIR low pass filter

Filter.begin();

}

 

void loop() {

// put your main code here, to run repeatedly:

digitalWrite(PSRAM_CE, LOW);  // Enable PSRAM

 

SPI.transfer(0x02); // 命令代碼02表示寫入

SPI.transfer(0);    // Start at 0x000000 in PSRAM

SPI.transfer(0);

SPI.transfer(0);

for(i=0; i<MAX_NUM; i++)  // Sample and filter, store the original and filtered into PSRAM

{

sensorValue = analogRead(sensorPin);    //read the sensor value using ADC

filtered = Filter.run(sensorValue);   // 進行低通濾波,相乘的值由程式庫提供

 

SPI.transfer(sensorValue >> 8);   delay(1);

SPI.transfer(sensorValue & 0xFF); delay(1);

SPI.transfer(filtered >> 8);      delay(1);

SPI.transfer(filtered & 0xFF);    delay(1);

 

delay(1);   // 延遲總時間盡可能接近一半取樣時間,可以自己調整

}

 

digitalWrite(PSRAM_CE, HIGH); // Disable the PSRAM

 

delay(1000);

 

/*

* Now, ready the result back

*/

 

digitalWrite(PSRAM_CE, LOW);  // Enable the PSRAM

 

SPI.transfer(0x03); //Read

SPI.transfer(0);    // Start at 0x000000 in PSRAM

SPI.transfer(0);

SPI.transfer(0);

for(i=0; i<MAX_NUM; i++)

{

sensorValue = SPI.transfer(0);

sensorValue <<= 8;

sensorValue |= (SPI.transfer(0) & 0xFF);

 

filtered = SPI.transfer(0);

filtered <<= 8;

filtered |= (SPI.transfer(0) & 0xFF);

 

Serial.print(sensorValue);

Serial.print(” “);

Serial.println(filtered);

}

 

digitalWrite(PSRAM_CE, HIGH);   // Disable the PSRAM

}

 

結尾

很多醫學工程或者長期看照的機電整合場域,可能會做到頻譜分析,Arduino的微控制器ATMEL MEGA328的Flash記憶體是還夠,但是RAM嘛……卻只有少少的2KB!?這也正是很多這類應用沒辦法只靠Arduino的原因,如果能利用PSRAM當Buffer,那倒是能試試是否有機會讓Arduino在醫學工程的應用場景持續擴展。想了解更詳細的過程,可參考示範影片哦!

(責任編輯:廖庭儀)

賴建宏

賴建宏

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

上一篇: | 下一篇:

468 ad

我想回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *

成城共創股份有限公司版權所有、轉載必究.Copyright(c) 2017 MakerPRO