作者:賴建宏
前陣子從MakerPRO到手一顆小小的PSRAM,並被賦與一個任務:想想看有沒有適合的應用?這顆PSRAM是由來揚科技開發的LYONTEK 64M PSRAM,特色是具有相對高速的傳輸率及儲存容量,適合做隨身型裝置的暫存記憶體。Jack大大已先做了一個電子看板(教學文請參考:【Tutorial】用Arduino Mini Pro打造低成本迷你電子看板)。我在想:「還有沒有什麼其它的應用,是不需要保存完整的數據資料,而是將緩衝的數據資料做運算然後再輸出的?」
在和歐大聊過之後,回到家在網路上隨意翻找一番,結果找到關於心音與肺音聽診方面的文章,果然還是有的——那就是聽診器。長期看護的應用,很多時候不要求一個瞬間的變化量,而是長期去觀察變化。例如:更動藥品後,對病患的心臟有沒有什麼影響,且醫師或病患並不會想要過程中每一點的電子訊號,而是想要這些電子訊號處理完成後的結果,好比說心搏的強度、心跳的頻率範圍等。
所需材料
- Arduino Pro Mini (CPU: 328,上面有LDO) 3.3V@8MHz
- Lily writer Arduino
- 來揚LYONTEK 64M PSRAM
- 電容式麥克風 (建議最好買品質比較好的,信號失真度比較低)
硬體線路

所需要的硬體線路(圖片:賴建宏提供,廖庭儀製圖)
※請注意:電源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在醫學工程的應用場景持續擴展。想了解更詳細的過程,可參考示範影片哦!
(責任編輯:廖庭儀)
- 【開箱評測】用Mbed上手開發DSI 2599開發板 - 2020/08/03
- 【OpenVINO™教學】自製麵包影像辨識POS機的應用 - 2019/12/24
- 【邊緣運算】OpenVINO好夥伴 — athena A1 Kit x86單板 - 2019/11/18
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!