【Tutorial】Arduino相容!利用Intel SE C1000讓Arduino揚聲器產生不同的Tone

作者:賴建宏

之前幾篇關於SE C1000的文章,可以看出來不管是Intel原廠版本,還是國產MtM的都各有千秋,問題是不少人後來問我到底怎樣容易上手?嗯……這也難怪!畢竟大家用Arduino習慣了,遇到一個走不同路線的奇才,這到底該怎麼辦,相信不管是誰都傷腦筋。

所以這篇就以自製一個超級簡單的GPIO著手,從一開始到怎樣看懂SE C1000跟Arduino元件的對應關係來釐清。我們為了簡化,就挑一個Arduino專題上常見的揚聲器,透過程式產生不同頻率的音調,來看如何橫跨兩個平台。

所需料件

  • Intel SE C1000原廠開發板
  • Micro USB手機通訊與充電線一條
  • Arduino常見上面有電晶體的那種 (三根腳的)小型揚聲器
  • 公對母杜邦線三條

開發過程

請先下載Intel SE C1000 Evaluation Kit的使用手冊電路圖這兩個檔案,很多人可能沒看,其實說得還蠻詳細的,有時間的話建議詳細讀看看。接著開啟我們的開發工具 – Intel ISSM。

STEP1:Update ROM Image回到出廠值

STEP2:新增一個SE C1000專題

STEP3:一樣用QMSI就好,因為QMSI可是Intel Quark量身訂製的。

STEP4:設定平台

 STEP5:用LED_Blink為基礎建立一個專題

STEP6:找到原廠說明書看Arduino接腳如何對應SE C1000

然後,打開使用手冊,在第29頁的地方會說到Arduino Header Pin Mapping,這個表是以Arduino Uno為例,把Arduino Uno的腳位實際上是接到QMSI指定的腳位,以及Sensor Subsystem的腳位;千萬記得所有腳位都有其對應關係,需要找到喔!因為Intel SE C1000的複雜度比起一般的單晶片高很多,因此幾乎所有的程式一開頭,都有腳位多工器Pin Mux的設定,這也是很多人一開始忽略的地方。

這次我們挑選D9,請把揚聲器的三條公對母杜邦線如下表接線:

揚聲器

Intel SE C1000開發板

VCC

VCC
GND

GND

IN

D9 (GPIO1)

 

STEP7:把SE C1000的LED Blink範例的腳位修改,也就是把D9對上SE C1000的Pin

最後就是音調;其實音調的形成,就是利用不同頻率的訊號產生輸出而已,從物理學的角度來看,一個Square wave有高有低,頻率與時間的關係剛好就是倒數,因此我就以DO、RE、MI、FA、SO、LA、SI七個音的大概頻率基準,透過clk_sys_udelay()這個函數來產生延遲間隔。特別要說明的是,clk_sys_udelay()的參數單位是μs,而不是Arduino常用的ms,兩者的差距有1000倍喔!

我做的範例程式碼如下:

<< main.c >>
#include "clk.h"
#include "qm_gpio.h"
#include "qm_pinmux.h"
#include "qm_pin_functions.h"

#define PIN_OUT 1
#define TONE_PIN_ID (QM_PIN_ID_9)

/*
* T = 1/f, so the tone will be generate in us unit
*/
#define DO 3816
#define RE 3401
#define MI 3030
#define FA 2865
#define SO 2551
#define LA 2272
#define SI 2024

static void pin_mux_setup(void)
{
qm_pmux_select(TONE_PIN_ID, PIN_OUT);
}

static void playTone(int us, int times)
{
int half = us / 2; //For a square wave, high and low
int i;

for(i=0; i<times; i++)
{
qm_gpio_set_pin(QM_GPIO_0, PIN_OUT);
clk_sys_udelay(half);
qm_gpio_clear_pin(QM_GPIO_0, PIN_OUT);
clk_sys_udelay(half);
}
}

int main(void)
{
static qm_gpio_port_config_t cfg;

/* Set the GPIO pin muxing. */
pin_mux_setup();

/* Set the GPIO pin direction to out and write the config. */
cfg.direction = BIT(PIN_OUT);
qm_gpio_set_config(QM_GPIO_0, &cfg);

while(1)
{
playTone(DO, 500);
clk_sys_udelay(200000);
playTone(RE, 500);
clk_sys_udelay(200000);
playTone(MI, 500);
clk_sys_udelay(200000);
playTone(FA, 500);
clk_sys_udelay(200000);
playTone(SO, 500);
clk_sys_udelay(200000);
playTone(LA, 500);
clk_sys_udelay(200000);
playTone(SI, 500);
clk_sys_udelay(200000);
}
}

展示影片:

結語

其實不管哪一個開發板,都會有其應用特性!你若打算發揮它的特性,除了收集相關的技術資料進行消化外,再來就是日積月累地累積操作的熟練度。因此,我想應該不會再有那麼多人排斥Intel SE C1000、Intel D2000這樣的開發板了吧,畢竟不同的板子能做到的事情不一樣,並沒有好壞之分。


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

加入好友

賴建宏

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

Author: 賴建宏

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

Share This Post On

Submit a Comment

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