許多人知道,LinkIt ONE用的是聯發科的晶片,但LinkIt ONE系統板是聯發科與深圳Seeed Studio合作實現的,Seeed Studio除了設計與銷售LinkIt ONE外,其實也針對LinkIt ONE推出一個Grove起步者套件、前菜套件(Starter Kit)。
Seeed Studio其實有針對Arduino推出Grove前菜套件,也有針對Intel IoT(指Galileo、Edison)推出前菜套件,也有名為ARDX的前菜套件(針對Arduino),或者針對LinkIt ONE的Sidekick基礎套件,總之很多。
而LinkIt ONE的Grove套件,裡頭有10種感測器(大陸叫傳感器,有些則翻譯成感應器、感知器),以及一片Grove Base Shield,Base Shield這片電路板,直接與LinkIt ONE原有的類比、數位等接腳連接,而Base Shield這片電路板上有許多連接器,用來連接LinkIt ONE本有的數位輸出/輸入、類比輸入、I2C介面等。
由於Base Shield上採行一致、標準化的連接器,套件內的10個感測器也採行一致的連接頭,因此只要將感測器接到Base Shield上,就可以完成LinkIt ONE與感測器的連接,進而運作,但前提是要接到正確類型的接腳,以及接到正確的編號腳位才行。
這麼做的好處是,LinkIt ONE的初學者,不用麵包板,也不用親自剝線、複雜接線,就能夠儘快體驗、感受感測器的功效作用,對學習很方便,也很適合做概念驗證(POC)、原形品(Prototype)。
而10種感測器中,第一個被筆者相中的,是體積最大最顯眼的「粉塵傳感器/塵埃感測器/Dust Sensor」,本次就針對這個感測器的特性與運作,進行更多說明。
LinkIt ONE x Dust Sensor
Seeed Studio/Grove Starter Kit for LinkIt ONE/Dust Sensor,是用一家SCA(Shinyei Corporation of America)的PPD4NS,可以量測每0.01立方英呎(約等於283毫升)的空間內,有多少個直徑大於1微米的塵埃數量。有的塵埃感測器是以每單位空間內的塵埃重量來算,但在這裡的這個感測器,是以數量來算。
直徑1微米,也讓人想到所謂PM 2.5(塵埃微粒小於2.5微米)的量測,但相關說明資料有提到,這個感測器的量測不等同於PM 2.5的量測,然顆粒大小接近,量測出來的值可略作參考。
塵埃感測器感測之後,會進行類比、數位轉換,而後再由LinkIt ONE接收數位資訊即可。雖然是數位資訊,但卻是以脈寬調變方式給予資訊,而且是以低脈波的週期時間來代表顆粒數的多寡。
也就是說,以30秒為一個週期,30秒內,塵埃感測器輸出多久時間的低電位,就表示有多少的顆粒數,低電壓準位的輸出時間,稱為Low Pulse Occupancy Time,簡稱LPO。量測的最小時間單位是1微秒。
而量測到週期時間(Duty Cycle)後再進行查表,就可以知道大致的顆粒數量,例如8%約是4,500顆,5%約是2,700顆,不過這也只是個概略值,仍有一定的正負差距。
上述為理論,以下為實務,要正確使用Grove塵埃感測器,首先要感測器正面朝上;然後上頭有兩個旋鈕,出廠前已經調整好,不要再去調它;之後給予感測器電力,記得給予5V電力,3.3V是不夠的,Grove Base Shield上可以切換是要給予5V電力或3.3V,請選前者。
另外,第一次使用記得先讓感測器預熱3分鐘,以及請在攝氏45度以下、濕度95度以下的環境內使用,濕度幾乎一定可行,但溫度可能要稍微注意一下。值得注意的是,感測器耗電約90mA(毫安培),約450mW(毫瓦)的耗電,若日後期望以電池運作,電池電容量與使用時間必須先估算一下。
最後很簡單,只要把感測器的紅色線路接5V,黑色線路接0V,使感測器有電力運作,並將黃色線路接LinkIt ONE的D8接腳(其他數位接腳並設定為輸入模式,也是可以)就可以了。將範例程式用Debug埠載入到LinkIt ONE後,按下重置鈕,再切換到Modem埠,打開串列監視器,設定為9600 baud、Carriage Return,就可以看到每30秒一次的塵埃顆粒值了。
以下為範例程式,在GitHub上也可找到:
Interface to Shinyei Model PPD42NS Particle Sensor
Program by Christopher Nafis
Written April 2012
http://www.seeedstudio.com/depot/grove-dust-sensor-p-1050.html
http://www.sca-shinyei.com/pdf/PPD42NS.pdf
JST Pin 1 (Black Wire) => Arduino GND
JST Pin 3 (Red wire) => Arduino 5VDC
JST Pin 4 (Yellow wire) => Arduino Digital Pin 8
*/
int pin = 8;
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms = 30000;//sampe 30s ;
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;
void setup() {
Serial.begin(9600);
pinMode(8,INPUT);
starttime = millis();//get the current time;
}
void loop() {
duration = pulseIn(pin, LOW);
lowpulseoccupancy = lowpulseoccupancy+duration;
if ((millis()-starttime) > sampletime_ms)//if the sampel time == 30s
{
ratio = lowpulseoccupancy/(sampletime_ms*10.0); // Integer percentage 0=>100
concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve
Serial.print("concentration = ");
Serial.print(concentration);
Serial.println(" pcs/0.01cf");
Serial.println("\n");
lowpulseoccupancy = 0;
starttime = millis();
}
}</pre>
- Sony強力加持!樹莓派發表專屬AI攝影機 - 2024/10/28
- 【Qualcomm Inside】12TOPS Edge AI單板RUBIK Pi規格剖析 - 2024/10/20
- TinyML潛力股!MicroFlow挑戰TensorFlow Lite for Microcontrollers - 2024/10/15