小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

物聯(lián)網(wǎng):使用MRAA發(fā)揮平臺(tái)輸入輸出能力

 HadarFu 2015-09-08

目錄

1. 摘要

本白皮書(shū)將介紹 MRAA API 的一般用法,該 API 可大大簡(jiǎn)化各類(lèi)設(shè)備的使用,例如:

  • 模擬輸入
  • 數(shù)字輸入與輸出
  • 脈寬調(diào)制 (PWM)
  • 內(nèi)部集成兩線式總線 (I2C) 設(shè)備
  • 使用通用異步收發(fā)器 (UART) 硬件的設(shè)備

與完整程序示例不同,本文主要節(jié)選部分 C 代碼來(lái)驗(yàn)證 MRAA API 的核心原則。 為 充分掌握本文的信息,您應(yīng):

  • 熟知 Linux 操作系統(tǒng)和 C 編程語(yǔ)言。
  • 基本了解數(shù)字電子學(xué)和 GPIO 的用法。
  • 擁有待使用設(shè)備的規(guī)格表。

: 關(guān)于代碼編譯或鏈接,以及如何將軟件安裝于特定平臺(tái),本 文將不予介紹。

2. MRAA 概述

MRAA(讀作 em-rah)是用 C 語(yǔ)言編寫(xiě)的低級(jí)別通用庫(kù)。 MRAA 旨在提取與平臺(tái)(比 如英特爾? Galileo 或英特爾? Edison 開(kāi)發(fā)板)基本 I/O 功能訪問(wèn)和控制相關(guān)的詳細(xì)信 息,并將其轉(zhuǎn)化為單個(gè)、簡(jiǎn)潔的 API。 請(qǐng)參閱下文,了解詳細(xì)信息:

  • MRAA 可作為 Linux 通用輸入/輸出 (GPIO) 設(shè)備頂端的轉(zhuǎn)換層。 盡管 Linux 提供豐富的基礎(chǔ)設(shè)施來(lái)控制 GPIO,其用于處理 GPIO 的通用指令也非常標(biāo)準(zhǔn),但 使用難度相對(duì)較大。
  • 根據(jù)定義,平臺(tái)之間各具差異。 他們擁有不同的功能、針腳編號(hào)和 GPIO 類(lèi)型。 例如,更換平臺(tái)后,GPIO 針腳可能無(wú)法支持相同類(lèi)型的功能。 某個(gè)特定平臺(tái)可 能根本沒(méi)有針腳。 另外, GPIO 在平臺(tái)上的配置方式也取決于不同因素。 例如,一種 GPIO 針腳使用模式可能會(huì)影響其他針腳的其他使用模式,或影響其他針腳的使用。 因此 ,MRAA 可降低程序開(kāi)發(fā)的復(fù)雜度,因?yàn)樗膳c其他軟件一起使用來(lái)創(chuàng)建獨(dú)立于平臺(tái)的代 碼。
  • : 盡管 MRAA 可用于編寫(xiě)?yīng)毩⒂谄脚_(tái)的代碼,開(kāi)發(fā)人 員仍然負(fù)責(zé)確保代碼足夠耐用,以適應(yīng)平臺(tái)的各種局限性。

2.1. 獲取 MRAA API 和 API 文檔

MRAA 數(shù)據(jù)包已安裝于英特爾 Galileo 和 Edison 硬件,可直接鏈接至您的代碼,如 下所述。 您還可獲取英特爾源代碼庫(kù)的最新版本。

如欲獲取 API 文檔,請(qǐng)?jiān)L問(wèn): http://iotdk.intel.com/docs/ma ster/mraa/

2.2. GPIO 針腳名稱(chēng)

本白皮書(shū)中引用了各種不同的“針腳”。 這些硬件針腳通常以編號(hào)的形式 加以引用。 針腳編號(hào)還可加上前綴,比如 “D” 代表數(shù)字, “A” 代表模擬。 例如,“D0” 指數(shù)字針腳 0, “A3” 指模擬輸入針腳 3。 針腳還能夠以類(lèi)似 GPIO6 的形式引用,它表示 GPIO 針腳 6,無(wú)需用 “D” 或 “A” 指代模擬或數(shù)字。

2.3. MRAA 一般用途

創(chuàng)建代碼之前,需遵循下列指南:

  1. MRAA 庫(kù)必須鏈接至您的軟件。 通常情況下,您必須用語(yǔ)句初始化 MRAA, 比如:
    1mraa_result_t rv;
    2rv = mraa_init();
    3if (rv != MRAA_SUCCESS)
    4    <report the error, insert your own code below>
    5    . . .
  2. 許多 MRAA 函數(shù)返回 mraa_result_t 值。 您 必須確認(rèn)該特定函數(shù)是否成功運(yùn)行。
  3. 本文中的示例不提供檢錯(cuò)功能。 強(qiáng)烈推薦對(duì)所有函數(shù)進(jìn)行錯(cuò)誤檢查。
  4. 初始化后,您應(yīng)向 MRAA 說(shuō)明特定針腳將用于特定目的。 本文后續(xù)使用的 代碼示例將舉例說(shuō)明該行為。
  5. 完成后(退出程序之前),您應(yīng)告知 MRAA 釋放針腳,以便清除所有內(nèi)部狀 態(tài)。 本文后續(xù)使用的代碼示例將舉例說(shuō)明該行為。

2.4. MRAA Include 文件

用于 MRAA 的主要 Include 文件為 mraa.h,以及所有 獨(dú)立于設(shè)備的 Include 文件,例如:

  • 模擬設(shè)備包含:

#include <mraa.h>
#include <mraa/aio.h>

  • 數(shù)字設(shè)備添加:

#include <mraa/gpio.h>

3. 使用 MRAA 和模擬設(shè)備

模擬設(shè)備提供數(shù)據(jù)的方法是將電壓電平從 0 更改為支持的最高電壓。 這種數(shù)據(jù)通常 被稱(chēng)為模擬基準(zhǔn)電壓 (AREF)。 例如,模擬壓力傳感器可提供一開(kāi)始為 0 (表示無(wú)壓力 ),然后隨壓力的增加而上升時(shí)的電壓數(shù)據(jù)。 傳感器的電壓隨后由名為模擬數(shù)字轉(zhuǎn)換器 (ADC) 的設(shè)備進(jìn)行解析并轉(zhuǎn)換為數(shù)值。 然后,控制該傳感器的軟件讀取由 ADC 生成的數(shù) 值。

解析模擬傳感器的數(shù)據(jù)時(shí),您需要了解以下信息。 下列幾點(diǎn)將在下文逐一進(jìn)行介紹。

  1. 電壓基準(zhǔn) (AREF) 值
  2. ADC 的分辨率
  3. 如何解析數(shù)據(jù)(取決于傳感器類(lèi)型)

3.1. 電壓基準(zhǔn)

電壓基準(zhǔn)通常為直流電 3.3 伏或 5.0 伏。 然而,基準(zhǔn)電壓可能各有差異,因?yàn)橛行?平臺(tái)(比如英特爾? Edison開(kāi)發(fā)板)支持您生成針對(duì)該平臺(tái)的自定義 AREF,無(wú)需使用其 內(nèi)置 AREF。 因此,在獲取此類(lèi)設(shè)備的有效數(shù)據(jù)前,您需要了解它的 AREF。

3.2. 模擬數(shù)字轉(zhuǎn)換器 (ADC) 分辨率

ADC 分辨率非常重要,因?yàn)樗鼪Q定了測(cè)量值的精準(zhǔn)度。 英特爾平臺(tái)使用的所有 ADC 均支持 1024 (10 比特)的分辨率,而且在英特爾? Edison 開(kāi)發(fā)板的案例中分辨率高達(dá) 4096 (12 比特)。

您可以確定大概的電壓“階躍”,即 AREF 值除以 ADC 分辨率之后的數(shù)值 。 您的應(yīng)用隨后將使用該數(shù)值。 電壓階躍的確定方法是:AREF 5.0 伏除以 ADC 分辨 率 1024 。 相除后的結(jié)果即為 ADC 返回的階躍,約為 4 毫伏。

5.0 / 1024.0 = 0.00488 伏

3.3. 解析數(shù)據(jù)

根據(jù)以上信息,您可確定設(shè)備的模擬輸入針腳所顯示的大概電壓電平。 ADC 分辨率越 高,電壓測(cè)量值將越精確。

3.4. 模擬示例

Grove 濕度傳感器 (http://www./depot/Grove-Moisture-Sensor-p- 955.html) 是典型的簡(jiǎn)單模擬設(shè)備。 從根本上來(lái)說(shuō),它是一個(gè)可根據(jù)檢測(cè)到的濕度 改變模擬輸入針腳的電壓電平的電阻器。 下列示例展示了傳感器連接 A0 針腳后的工作原理。 下列代碼示例顯示了如何初始化 MRAA 和 A0 針腳、讀取和打印該值,然后發(fā)布針腳:

01int main()
02{
03    /* initialize MRAA */
04    mraa_init();
05    /* create an MRAA analog context */
06    mraa_aio_context m_aio;
07    /* initialize A0 for use as an analog input */
08    m_aio = mraa_aio_init(0);
09 
10    /* read the value, an integer */
11    int value;
12    value = mraa_aio_read(m_aio);
13 
14    /* print the value */
15    printf(“The value returned was: %d\n”, value);
16 
17    /* now release (close) the pin and exit */
18    mraa_aio_close(m_aio);
19    return(0)   ;
20}

如果 ADC 分辨率為 1024 (10 比特),返回值將介于 0-1023 之間。 該數(shù)值解析方 法取決于傳感器的設(shè)計(jì)。 以 Grove 濕度傳感器為例,假設(shè) ADC 分辨率是 10 比特, 數(shù) 據(jù)表將針對(duì)干燥、半潮濕和潮濕等屬性值提供下列數(shù)值范圍:

  • 0-300 = 干燥
  • 300-700 = 半潮濕
  • 700+ = 潮濕

重點(diǎn)提示: 傳感器各不相同,因此并非所有傳感器都可輕松解碼 。 請(qǐng)注意以下要點(diǎn):

  1. 有些傳感器“神經(jīng)過(guò)敏”(其輸出電壓上下波動(dòng))。 如果是這 種情況,可能需要選取幾個(gè)樣本讀數(shù),然后計(jì)算平均值。
  2. 如果要編寫(xiě)用于不同平臺(tái)的 MRAA 驅(qū)動(dòng)程序,那么您必須在代碼中列明準(zhǔn)確 的 AREF 電壓值,如果有可能,還需列明 ADC 分辨率,這在計(jì)算時(shí)將會(huì)用到。 否則,返 回的數(shù)據(jù)可能無(wú)法使用。 在上述示例中,我們無(wú)需知道 AREF 電壓,但這點(diǎn)不適用其他 比較復(fù)雜的模擬設(shè)備。 部分設(shè)備要求具有精確的 AREF 電壓和 ADC 分辨率數(shù)值,以便確 定傳感器的輸出。

4. 使用 MRAA 和數(shù)字設(shè)備

數(shù)字設(shè)備可用于處理高低電平值,低電平值表示較低的電壓電平,而高電平值表示較 高的電壓電平。 只能夠表示兩種狀態(tài)。 例如,在 5.0v 的系統(tǒng)中,低電平可能表示 0v ,高電平可能表示 5.0v。 然而,高電平通常由 1 表示,低電平由 0 表示。

數(shù)字設(shè)備可設(shè)置為輸入或輸出設(shè)備。 如果用作輸入設(shè)備,您可使用 MRAA 讀取數(shù)字針 腳,并返回表示電壓高低狀態(tài)的值。 相反,寫(xiě)入數(shù)字設(shè)備將引發(fā)數(shù)字針腳跳變至低電平 狀態(tài)或高電平狀態(tài)。

MRAA 可提供 API 用于讀寫(xiě)數(shù)字針腳的狀態(tài)。 此外,還可將用戶(hù)提供的中斷處理程序 連接至數(shù)字輸入設(shè)備。 中斷處理程序?qū)⒂诘?9 頁(yè)予以介紹。 如欲使用 MRAA 的數(shù)字輸 入和輸出設(shè)備,您需要?jiǎng)?chuàng)建頭文件:

#include <mraa/gpio.h>

4.1. 數(shù)字輸入示例

選擇簡(jiǎn)單的數(shù)字輸入設(shè)備為例,比如按鈕式開(kāi)關(guān)。 當(dāng)按下開(kāi)關(guān),針腳將顯示高電壓電 平,否則,顯示低電壓電平。

01int main()
02{
03    /* initialize MRAA */
04    mraa_init();
05 
06    /* create an MRAA digital context */
07    mraa_ai o_context m_aio;
08 
09    /* initialize D2 for use as a digital pin */
10    m_gpio = mraa_gpio_init(2);
11 
12    /* configure the digital pin as an input */
13    mraa_gpio_dir(m_gpio, MRAA_GPIO_IN);
14 
15    /* read the value into an integer */
16    int value = mraa_gpio_read(m_gpio);
17 
18    /* print the value */
19    if (value != 0)
20        printf(“The button is being pushed\n”);
21    else
22        printf(“The button is not being pushed\n”);
23 
24    /* now release (close) the pin and exit */
25    mraa_gpio_close(m_gpio);
26    return(0);
27}

如上所示,這相當(dāng)簡(jiǎn)單明了。 還請(qǐng)注意如何使用 mraa_gpio_dir() 告知 MRAA 將針腳配置為輸入。 數(shù)字針腳既可用于輸入,也可 用于輸出,這與僅能用于輸入的模擬針腳不同。

4.2. 中斷處理程序

在有些情況下,您不希望用重復(fù)讀取數(shù)字針腳的方式確定其狀態(tài)。 以發(fā)動(dòng)機(jī)上的傳感 器為例,該傳感器用于計(jì)算發(fā)動(dòng)機(jī)的轉(zhuǎn)速 (RPM)。 在這種情況下,重復(fù)讀取針腳(設(shè)備 )以不斷檢測(cè)其變化不僅耗費(fèi)精力,而且容易犯錯(cuò)。

MRAA 可幫助創(chuàng)建中斷處理程序,并將其連接至針腳。 此時(shí),如果針腳的狀態(tài)/轉(zhuǎn)換發(fā) 生某種特定變化(從低電平跳變至高電平,或從高電平跳變至低電平),MRAA 可確保您 的中斷處理程序得以調(diào)用。

有了這種功能,您可輕松編寫(xiě)簡(jiǎn)單的計(jì)數(shù)函數(shù),并告知 MRAA 在出現(xiàn)特定轉(zhuǎn)換時(shí)調(diào)用 這種函數(shù)。 下面舉例說(shuō)明如何計(jì)數(shù)從高電平到低電平的跳變,并將這些跳變保留在計(jì)數(shù) 器中。

01/* first, create our counting variable */
02volatile int counter = 0;
03 
04/* Now our simple counting function. */
05/* This will be our interrupt handler. */
06void intrHandler(void *arg)
07{
08    counter++;
09}
10 
11/* now in our main() function */
12 
13int main()
14{
15 
16    /* initialize MRAA */
17    mraa_init();
18 
19    /* create an MRAA digital context */
20    mraa_aio_context m_aio;
21 
22    /* initialize D2 for use as digital pin */
23    m_gpio = mraa_gpio_init(2);
24 
25    /* configure the digital pin as an input */
26    mraa_gpio_dir(m_gpio, MRAA_GPIO_IN);
27 
28    /* now, setup an interrupt handler. */
29    /* Our function (intrHandler()) above will */
30    /* be called whenever the pin goes from */
31    /* HIGH to LOW */
32     */
33    mraa_gpio_isr(m_gpio, MRAA_GPIO_EDGE_FALLING, intrHandler, NULL);
34 
35    /* sleep for 5 seconds, and then print out the current */
36    /* value of counter */
37    sleep(5);
38 
39    printf(“Counter = %d\n”, counter);
40 
41    /* now, stop the interrupt handler and cleanup */
42    mraa_gpio_isr_exit(m_gpio);
43 
44    /* now release (close) the pin and exit */
45    mraa_gpio_close(m_gpio);
46    return(0);

在上述示例中觀察:

  • 可變關(guān)鍵字重點(diǎn)標(biāo)示的計(jì)數(shù)變量。 這一點(diǎn)非常重要。 可變關(guān)鍵字能夠向 C 編譯器說(shuō)明,這種變量可在不通知編譯器的情況下進(jìn)行更改,以防 止編譯器在處理變量時(shí)進(jìn)行某種優(yōu)化。 如果沒(méi)有可變關(guān)鍵字,編譯器可能會(huì)認(rèn)為變量無(wú) 需進(jìn)行更改,并進(jìn)行優(yōu)化,由此造成上述示例中的值為 ‘0’。 所有中斷處 理程序所控制的或暴露在中斷處理程序外部的變量均應(yīng)標(biāo)示為可變變量。
  • 除 MRAA_GPIO_EDGE_FALLING之外,mraa_gpio_isr() 還可支持 MRAA_GPIO_EDGE_RISING (以檢測(cè)從低到高的跳變),以及 MRAA_GPIO_EDGE_BOTH(以檢測(cè)兩種跳變)。
    : 并非所有平臺(tái) 都支持上述跳變。 如要確定支持哪種跳變,最常用的方法是檢查 mraa_gpio_isr() 的返回值。
  • 傳遞給 mraa_gpio_isr() 的最后一個(gè)自變量 為可選用戶(hù)提供的指針值。 該自變量將供應(yīng)給中斷處理程序 intrHandler (),作為其唯一的自變量。 我們?cè)谏鲜鍪纠胁恍枰@項(xiàng)功能,因此僅 傳遞 NULL。
  • 調(diào)用 mraa_gpio_isr_exit() 將禁用中斷處理 程序,強(qiáng)力推薦進(jìn)行此項(xiàng)操作以清理和避免出現(xiàn)意外情況。
  • 僅一條中斷處理程序?qū)δ硞€(gè)特定針腳有效。 針腳總數(shù)取決于中斷處理程序 ,同時(shí)也是平臺(tái)所特有的,盡管使用三種中斷處理程序(MRAA_GPIO_EDGE_RISING、 MRAA_GPIO_EDGE_FALLING 或 MRAA_GPIO_EDGE_BOTH)。 這是需要經(jīng)常對(duì) MRAA 函數(shù)的返 回值進(jìn)行錯(cuò)誤檢查的另一原因。

4.3. 數(shù)字輸出示例

正如您所想象的,數(shù)字輸出非常簡(jiǎn)單明了。 下列示例可使數(shù)字針腳在 1 秒鐘的休眠 期間跳變于高 (1) 低 (0) 之間。 類(lèi)似這種特性可用于連接至針腳時(shí)的 LED 閃爍。

01int main()
02{
03    /* initialize MRAA */
04    mraa_init();
05 
06    /* create an MRAA digital context */
07    mraa_aio_context m_aio;
08 
09    /* initialize D13 for use as a digital pin */
10    m_gpio = mraa_gpio_init(13);
11 
12    /* configure the digital pin as an output */
13    mraa_gpio_dir(m_gpio, MRAA_GPIO_OUT);
14 
15    /* now run in a loop 10 times, blinking the output each second */
16    int i;
17    for (i=0; i<10; i++)
18    {
19        /* turn output on (HIGH) */
20        mraa_gpio_write(m_gpio, 1);
21        sleep(1);
22        /* turn output off (LOW) */
23        mraa_gpio_write(m_gpio, 0);
24        sleep(1);
25    }
26 
27 
28    /* now release (close) the pin and exit */
29    mraa_gpio_close(m_gpio);
30    return(0);
31}

正如您所見(jiàn),將 MRAA 用于數(shù)字 I/O 非常簡(jiǎn)單。 中斷處理稍微復(fù)雜一些,不過(guò)只要 您注意合理使用共享于中斷處理程序外部的變量的可變關(guān)鍵字,其在多種應(yīng)用中的使用也 會(huì)非常簡(jiǎn)單和方便。

5. 使用 MRAA 和脈寬調(diào)制 (PWM) 與數(shù)字設(shè)備

脈寬調(diào)制 (PWM) 是一種數(shù)字輸出。 PWM 針腳的輸出由兩部分組成,分別為周期和占 空比:

  • 周期指脈沖產(chǎn)生的頻率。
  • 占空比表示該周期在高電平狀態(tài)中所占的比例。

例如,如果您將周期和占空比分別設(shè)置為 2 毫秒和 50%,那么您的重復(fù)模式將為 1 毫秒高電平和 1 毫秒低電平電平,然后該周期會(huì)不斷重復(fù)。 這可用于完成各種不同的功 能,比如可通過(guò)調(diào)節(jié)占空比調(diào)暗 LED 或控制發(fā)動(dòng)機(jī)的速度。

5.1. 一般使用規(guī)則

  • MRAA 能夠?qū)?shù)字輸出配置為 PWM 輸出。 檢查您的平臺(tái)并找出可用作 PWM 輸出的 GPIO,這一點(diǎn)非常重要。 具體可用作 PWM 輸出的 GPIO 將因平臺(tái)而異。
  • 平臺(tái)所容許的周期長(zhǎng)度各不相同,因此,必須對(duì) MRAA 調(diào)用進(jìn)行錯(cuò)誤檢查。
  • 有些設(shè)備在使用時(shí)會(huì)對(duì)周期長(zhǎng)度提出一些要求。 例如,伺服發(fā)動(dòng)機(jī)通常要 求周期長(zhǎng)達(dá) 20 毫秒。
  • 使用 MRAA 的 PWM 設(shè)施所需的標(biāo)題為:

    #include <mraa/pwm.h>

5.2. PWM 示例

我們將在下列示例中脈沖調(diào)節(jié) LED 的亮度。 我們所采用的做法是:將周期設(shè)置為 10 毫秒,每隔 100 毫秒增加或降低占空比。

01int main()
02{
03    /* initialize MRAA */
04    mraa_init();
05 
06    /* create an MRAA PWM context */
07    mraa_pwm_context m_pwm;
08 
09    /* initialize D3 for use as a digital pin */
10    m_pwm = mraa_gpio_init(3);
11 
12    /* set the period to 10ms */
13    mraa_pwm_period_ms(m_pwm, 10);
14 
15    /* set the initial duty cycle to 0 */
16    mraa_pwm_write(m_pwm, 0.0);
17 
18    /* enable PWM output */
19    mraa_pwm_enable(m_pwm, 1);
20/* now run in a loop 10 times, dimming or brightening /*
21    /* the LED every 100ms */
22    int i;
23    float duty = 0.0;
24    for (i=0; i<10; i++)
25    {
26        /* first, start at 0% duty cycle and increase to 100% */
27        for (duty= 0.0; duty < 1.0; duty+=0.1)
28        {
29            mraa_pwm_write(m_pwm, duty);
30            usleep(100000);
31        }
32        sleep(1);
33        /* now decrease it to 0% */
34        for (duty= 1.0; duty > 0.0; duty-=0.1)
35        {
36            mraa_pwm_write(m_pwm, duty);
37            usleep(100000);
38        }
39        sleep(1);
40    }
41 
42    /* disable PWM output and clean up */
43    mraa_pwm_enable(m_pwm, 0);
44 
45    mraa_pwm_close(m_pwm);
46    return(0);
47    }

在上述示例中觀察:

  • 我們使用了mraa_pwm_write(),它可接受 0.0 (關(guān)閉,占空比 0%) - 1.0(開(kāi)啟,占空比 100%)之間的浮點(diǎn)值。
  • MRAA 還可提供一套函數(shù)支持您直接指定脈寬,無(wú)需通過(guò)時(shí)間比例(占空比 )。 對(duì)于某些在周期以及輸出必須為高電平的周期內(nèi)的時(shí)間量方面有特殊要求的傳感器 來(lái)說(shuō),這一功能可發(fā)揮巨大作用。
  • MRAA 可提供各種不同的函數(shù),并使用秒、(上述示例中使用的)毫秒和微 秒為單位設(shè)置周期。 MRAA 還可提供函數(shù)支持您用一個(gè)函數(shù)調(diào)用同時(shí)設(shè)置周期和占空比。
  • 您可能會(huì)遇到一個(gè)常見(jiàn)問(wèn)題,即平臺(tái)是否支持設(shè)備要求的周期。 如果基礎(chǔ) 硬件不支持您設(shè)置的周期,MRAA 將返回相應(yīng)的錯(cuò)誤代碼。

6. 使用 MRAA 和 I2C

使用 I2C 時(shí),請(qǐng)牢記以下幾點(diǎn):

  • I2C 為兩線式雙向總線,運(yùn)行頻率為 100Khz、400Khz,和 3.4Mhz。
  • I2C 由 2 條信號(hào)線組成: SCL(時(shí)鐘)和 SDA(數(shù)據(jù))。
  • I2C 設(shè)備的地址必須是特定 I2C 總線上的唯一地址。多臺(tái)設(shè)備可同時(shí)連接 至一條特定總線,但每臺(tái)設(shè)備必須有唯一的地址,一次只允許一臺(tái)設(shè)備進(jìn)行通信。
  • 除地址外,I2C 設(shè)備通常有一套可進(jìn)行讀寫(xiě)的寄存器(有時(shí)稱(chēng)為指令) 通 信和控制就是通過(guò)這些可讀寫(xiě)特定設(shè)備的寄存器來(lái)進(jìn)行。
  • 使用 MRAA 的 I2C 設(shè)備所需的標(biāo)題為:

    #include <mraa/i2c.h>

6.1. I2C 示例

在下列示例中,我們將查詢(xún)實(shí)時(shí)時(shí)鐘 I2C 設(shè)備模塊 (DS1307),并以秒為單位讀取寄 存器 (0x00)。 我們將 MRAA I2C 環(huán)境設(shè)置為 I2C 總線 0,使用 0x68 的 I2C 地址,然 后以秒為單位讀取寄存器,并每隔一秒輸入 10 秒。

重點(diǎn)提示: 許多 I2C 設(shè)備對(duì)如何讀寫(xiě)設(shè)備的數(shù)據(jù)提出了不同的要 求。 請(qǐng)參閱設(shè)備規(guī)格,了解更多信息。

01int main()
02{
03    /* initialize MRAA */
04    mraa_init();
05 
06    /* create an MRAA I2C context */
07    mraa_i2c_context m_i2c;
08 
09    /* initialize I2C on bus 0 */
10    m_i2c = mraa_i2c_init(0);
11 
12    /* now run in a loop 10 times, reading the seconds */
13    /* register and printing it.*/
14    int i;
15    for (i=0; i<10; i++)
16    {
17        char buf;
18 
19        /* always specify the address */
20        mraa_i2c_address(m_i2c, 0x68);
21        /* read in 1 byte.  mraa_i2c_read() always reads */
22        /* starting at register 0x00 */
23        mraa_i2c_read(m_i2c, &buf, 1);
24 
25        printf(“The seconds returned was: %d\n”, buf);
26        sleep(1);
27    }
28    mraa_i2c_stop(m_pwm);
29    return(0);
30 }

在上述示例中觀察:

  • 我們使用了 mraa_i2c_read(),從寄存器 0x00 開(kāi)始讀取。 如需更高級(jí)的使用模式,MRAA 可提供更多可在特定寄存器中進(jìn)行讀寫(xiě) 或讀/寫(xiě)字(16 比特)數(shù)據(jù)的函數(shù)。 使用方法的選擇取決于您的設(shè)備和軟件要求。
  • 讀取字?jǐn)?shù)據(jù)時(shí),您可能需要調(diào)換返回的字節(jié)(取決于您的設(shè)備)。
  • 設(shè)備所適用的訪問(wèn)方式各不相同。 例如,我們?cè)囉眠^(guò)的一臺(tái)設(shè)備無(wú)法正常 使用 mraa_i2c_read(),而要求 mraa_i2c_read_byte_data()。 可能需要進(jìn)行進(jìn)一步試驗(yàn)。

7. 使用 MRAA 和通用異步收發(fā)器 (UART)

請(qǐng)回顧:

  • 基于 UART 的設(shè)備基本上都是標(biāo)準(zhǔn)串口設(shè)備,比如我們過(guò)去采用 COM 端口 連接計(jì)算機(jī)時(shí)所使用的設(shè)備。 通常情況下,這種連接為全雙工連接,并以特定的速度( 波特率)運(yùn)行。 許多傳感器常見(jiàn)的波特率為 9600(每秒 9600 比特)。
  • 實(shí)際上,您有兩根線: TX(用于發(fā)送數(shù)據(jù))和 RX(用于接收數(shù)據(jù))。 然 而使用大多數(shù)傳感器時(shí),您可以使用不同的電壓電平,而非根據(jù) RS232 標(biāo)準(zhǔn)編譯的 COM 端口所使用的電壓電平。 這些電壓通常為 5.0v 或 3.3v,而 RS232 COM 端口使用的電 壓通常在 -15v - +15v 之間。 請(qǐng)勿將這種低壓傳感器直接連接至 COM 端口,除非為傳 感器廠商特別支持的傳感器, 否則會(huì)造成設(shè)備損壞。
  • MRAA 可提供一種機(jī)制,即數(shù)字針腳 D0 和 D1(基于英特爾? Galileo 或英 特爾? Edison 開(kāi)發(fā)板)可路由至硬件輔助的 UART,從而支持軟件輕松讀取或?qū)?shù)據(jù)寫(xiě)入 UART 可訪問(wèn)的設(shè)備。 MRAA 設(shè)置合適的針腳路由后,您可以使用標(biāo)準(zhǔn) Linux 讀 () 寫(xiě) () 通過(guò) /dev/ttyX 端口與該設(shè)備進(jìn)行通信。

: MRAA 將僅安排合適的針腳路由以連接硬件 UART;您的軟件 負(fù)責(zé)打開(kāi)和設(shè)置正確的 TTY 設(shè)備并開(kāi)始通信。

  • 使用 MRAA 的 UART 設(shè)備所需的標(biāo)題為:

#include <mraa/uart.h>

7.1. UART 示例

在下列示例中,我們將使用連接至針腳 D0 和 D1 的基于虛構(gòu) UART 的傳感器。 在 MRAA 中對(duì) UART 進(jìn)行編號(hào),即 UART 0。

打開(kāi)設(shè)備后,您要正確地啟用和禁用不同的行規(guī)則(Linux 內(nèi)核自動(dòng)將其應(yīng)用于串行 設(shè)備),這一點(diǎn)非常重要。 為此,我們可包含名為 setupTTY() 的函數(shù),然后打開(kāi) TTY 設(shè)備。

01int setupTTY(int fd, speed_t baud)
02{
03  if (fd < 0)
04    return 0;
05   
06  struct termios termio;
07 
08  /* get current modes */
09  tcgetattr(fd, &termio);
10 
11 /* setup for a 'raw' mode.  8bit, 1 stop bit, no parity, */
12 /* no echo or special character handling, */
13 /* no flow control or line editing semantics. */
14 
15  cfmakeraw(&termio);
16 
17  // set our baud rates
18  cfsetispeed(&termio, baud);
19  cfsetospeed(&termio, baud);
20 
21  // make it so
22  if (tcsetattr(fd, TCSAFLUSH, &termio) < 0)
23    {
24      fprintf(stderr, “%s\n”, “tcsetattr failed”);
25      return 0;
26    }
27 
28  return 1;
29}
30 
31/* now our main function */
32?
33int main()
34{
35    /* initialize MRAA */
36    mraa_init();
37 
38    /* create an MRAA UART context */
39    mraa_uart_context m_uart;
40 
41    /* initialize UART 0 (pins D0 and D1 used for TX and RX) */
42    m_uart = mraa_uart_init(0);
43 
44    /* now that we have our context, query MRAA */
45    /* to get the file name of the TTY device we need to open. */
46 
47    char *devPath = mraa_uart_get_dev_path(m_uart);
48 
49    /* if this fails, we can go no further */
50    if (!devPath)
51    {
52        fprintf(stderr, “%s\n”, “Could not get device path”);
53        return 0;
54    }
55 
56    /* now that we have a device path, open it and set it up */
57    int fd;
58    if ((fd = open(devPath, O_RDWR)) == -1)
59    {
60        fprintf(stderr, “%s\n”, “Could not open device path”);
61        return 0;
62    }
63 
64    /* now we are almost ready, call setupTTY() and from then on */
65    /* we can read/write to the device normally. */
66    /* We assume a baud rate of 9600/ */
67if (!setupTTY(fd, B9600))
68    {
69        fprintf(stderr, “%s\n”, “Could not setup TTY port”);
70        return 0;
71    }
72 
73    /* now we can use standard read and write calls */
74    /* read(fd, ...) or write(fd, …) */
75 
76    /* when we are done, close the device and exit */
77    close(fd);
78 
79    return(0);
80}

在上述示例中觀察:

  • 使用基于 UART 的設(shè)備大體包括使 MRAA 正確設(shè)置針腳、向 MRAA 請(qǐng)求設(shè)備 路徑、打開(kāi)并初始化設(shè)備路徑,然后使用標(biāo)準(zhǔn) Unix* 讀 () 寫(xiě) () 調(diào)用。
  • 如果沒(méi)有可供讀取的內(nèi)容,直接使用讀 () 寫(xiě) () 將會(huì)受阻。 為避免出現(xiàn) 這種現(xiàn)象,在大多數(shù)情況下,您希望創(chuàng)建一種函數(shù),可在讀取前檢查是否有數(shù)據(jù)提供。 使用 select() 系統(tǒng)調(diào)用可實(shí)現(xiàn)這一點(diǎn)。 以 UPM wt5001 驅(qū)動(dòng)程序?yàn)槔?這項(xiàng)功能可作為 dataAvailable() 的方法 實(shí)施。
  • 在本示例中,我們假設(shè)波特率為最常見(jiàn)的 9600。 Linux 系統(tǒng)頭文件定義了 'B9600' 常量,當(dāng)然,也可提供其他波特率。 您需要根據(jù)所使用的設(shè)備選擇 正確的波特率。
  • 本示例中所使用的 setupTTY() 函數(shù)假定最常 見(jiàn)的情況。 通常您不會(huì)運(yùn)行對(duì)此有其他要求的設(shè)備,不過(guò)這點(diǎn)需要注意。

8. 結(jié)束語(yǔ)

MRAA 可簡(jiǎn)化英特爾? Galileo 或英特爾? Edison 開(kāi)發(fā)板等平臺(tái)的基本 I/O 功能的訪 問(wèn)與控制流程。  MRAA 是一個(gè)功能強(qiáng)大的通用庫(kù),可為這類(lèi)平臺(tái)提供一致的用法來(lái) 使用模擬、數(shù)字、PWM、I2C 和 UART 設(shè)備。 對(duì)于任何人的物聯(lián)網(wǎng)工具箱來(lái)說(shuō),這都是一 款關(guān)鍵的補(bǔ)充產(chǎn)品。

關(guān)于 ICS

基于對(duì)驅(qū)動(dòng)程序、操作系統(tǒng)以及物聯(lián)網(wǎng)傳感器的深入了解,Integrated Computer Solutions (ICS) 融合了全面的專(zhuān)業(yè)知識(shí)和工程經(jīng)驗(yàn),可開(kāi)發(fā)出能夠滿足消費(fèi)者期望并包 含創(chuàng)新、易用接口的定制型嵌入式系統(tǒng)。 ICS 可在應(yīng)對(duì)工程設(shè)計(jì)挑戰(zhàn)的同時(shí),降低復(fù)雜 性、成本和冗余,并縮短開(kāi)發(fā)時(shí)間。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多