<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 消費電子 > 設計應用 > 基于A(yíng)RM智能家居控制器設計與實(shí)現

基于A(yíng)RM智能家居控制器設計與實(shí)現

——
作者:朱華生 馮祥勝 時(shí)間:2007-07-19 來(lái)源:微計算機信息 收藏

  如何將家庭里相對獨立的設備連接成一個(gè)系統,從而方便進(jìn)行本地和遠程控制?本文通過(guò)采用構成來(lái)實(shí)現這個(gè)目標。使用S3C2410、SIM100-E等元件來(lái)組成硬件平臺,再將Linux系統移植到硬件平臺上,然后設計好相應的驅動(dòng)程序和應用程序,最后將軟件下載到硬件平臺來(lái)對家電進(jìn)行本地和遠程控制。

  隨著(zhù)數字化家用電器的飛速發(fā)展,如何對家庭中相對獨立的家用電器進(jìn)行智能化管理和操作?這是人們非常關(guān)心的一個(gè)問(wèn)題。能夠將許多相對獨立的家用電器構成一個(gè)統一的系統,從而方便對家用電器進(jìn)行本地操作,也可通過(guò)互聯(lián)網(wǎng)或GPRS系統對家用電器實(shí)現遠程控制等等。本文主要討論智能家居控制的設計和實(shí)現。

  1 智能家居控制器的硬件設計

  在設計智能家居控制器時(shí),考慮到系統的穩定性和擴展性,因此將控制器硬件設計成核心板和控制板2部分。核心板主要用來(lái)構成一臺計算機系統,控制板主要是一些外圍接口。系統硬件如圖1所示。

圖1 智能家居硬件結構圖

  核心板采用三星公司生產(chǎn)的S3C2410微處理器。ROM采用SAMSUNG K9F1208芯片構成64M NAND FLASH,將FLASH芯片連接到系統的nGCS0,所以它的起始地址為:0x00000000。RAM采用2片HY57V561620AT-H構成64M ,將它連接到系統nGCS6,所以它的起始地址為:0x03000000。為了讓系統從NAND FLASH啟動(dòng),要將S3C2410的OM0和OM1引腳都接地。最后將S3C2410處理器的串口控制信號、USB主機控制信號、LCD控制信號、觸摸屏信號、數據總線(xiàn)、地址總線(xiàn)、控制總線(xiàn)、外部中斷等信號全部連接到核心板上的200芯插座上。

  GPRS模塊采用SIMCOM公司生產(chǎn)的SIM100-E芯片。通過(guò)第三個(gè)串口信號線(xiàn)TXD2和RXD2和處理器相連接。

  LCD直接由CPU來(lái)控制,不過(guò)要增加驅動(dòng)電路。

  觸摸屏采用4線(xiàn)電阻式,直接將它和CPU的nYPON、YMON、nXPON、XMON相連。

  傳感器接口的輸出信號連接到CPU的EINT9外部中斷引腳上,當傳感器接收到某個(gè)信號時(shí),就可以通過(guò)外部中斷引腳向CPU申請服務(wù)。

  家電控制接口的輸入控制信號連接到CPU的GPIO端口,當要對某個(gè)家電進(jìn)行控制時(shí),只需向指定的端口寫(xiě)入0或1,然后再由家電控制接口發(fā)遙控信號去控制相應的家電。

  2  智能家居控制器操作系統的移植及裁剪

  考慮到成本,以及系統對實(shí)時(shí)性的要求不高等因素,所以決定選用Linux操作系統。目前發(fā)行的Linux操作系統都能支持機的體系結構,所以只要根據平臺的具體結構進(jìn)行移植。移植主要包括建立交叉編譯環(huán)境、修改內核源碼、內核裁剪和內核編譯4等個(gè)環(huán)節。

  2.1 建立交叉編譯環(huán)境

  交叉編譯是指利用運行在某臺計算機上的編譯器編譯某個(gè)源程序生成在另一種結構計算機上運行的目標代碼的過(guò)程。編譯器的生成依賴(lài)于相應的函數庫,而這些函數庫又得依靠編譯器來(lái)編譯。建立交叉編譯環(huán)境就是將使用的編譯器(如:arm-linux-gcc)和函數庫(如:glibc)安裝到指定目錄,并使用configure配置好Makefile文件。

  2.2 修改內核源代碼

  修改內核源代碼主要包括啟動(dòng)代碼的修改、內核的鏈接及裝入、參數傳遞和內核引導幾個(gè)部分。Linux內核分為體系結構相關(guān)部分和體系結構無(wú)關(guān)部分。在Linux啟動(dòng)的第一階段,內核與體系結構相關(guān)部分首先執行,它會(huì )完成硬件寄存器設置,內存映射等初始化工作。

  然后把控制權轉給內核中與系統體系結構無(wú)關(guān)的部分。在移植工作中要修改的代碼主要集中在與體系結構相關(guān)的部分。ARM芯片的體系結構在arch/arm目錄下。首先根據芯片手冊修改boot/init.S文件中的:片選組基地址寄存器、DRAM存儲配置寄存器、DRAM片選寄存器、中斷屏蔽寄存器等。然后修改內核的鏈接及裝入ELF。最后將系統中可用頁(yè)面的數目、文件系統大小等信息以參數形式從啟動(dòng)代碼傳給內核,完成設置陷阱,初始化中斷,初始化計時(shí)器,初始化控制臺等一系列操作而使內核正常啟動(dòng)。

  2.3 內核裁剪和編譯

  內核裁剪是根據控制系統的要求將不需要的模塊從內核中裁剪了,Linux內核的裁剪有好幾個(gè)版本,可以使用命令make menuconfig對系統進(jìn)行裁剪。

  內核裁剪之后,最后要進(jìn)行交叉編譯生成內核映象文件zImage。具體命令如下:

  make clean   //清理編譯環(huán)境
    make dep    //編譯依賴(lài)文件
    make zImage  //編譯內核

  3 驅動(dòng)程序的設計

  智能家居控制器要多個(gè)設備驅動(dòng)程序,有的驅動(dòng)程序可以采用標準的驅動(dòng)程序,有的要專(zhuān)門(mén)設計。芯片SIM100-E是通過(guò)第三個(gè)串口與S3C2410相連的,所以可以直接使用標準的串口驅動(dòng)程序。傳感器接口和家電控制接口要設計專(zhuān)用的驅動(dòng)程序??刂破鞯奶幚砥魍ㄟ^(guò)外部中斷來(lái)檢測傳感器,通過(guò)GPIO端口來(lái)控制家電,雖然它們的工作原理有所不同,但驅動(dòng)程序設計的方法沒(méi)有很大差別,因為在Linux系統中設備驅動(dòng)程序有一個(gè)標準的框架,設計驅動(dòng)程序的大部分工作就是根據硬件結構來(lái)“填寫(xiě)”框架中的函數。主要的函數包括open()、read()、write()、ioctl()、release()、module_init()和module_exit()等等。

  下面以傳感器接口驅動(dòng)程序設計為例,簡(jiǎn)介驅動(dòng)程序的“填寫(xiě)”過(guò)程。

  3.1 設備初始化模塊和退出模塊

  設備初始化模塊的主要功能是:設置和申請中斷、向內核注冊設備等。設備退出模塊的主要功能是:釋放設備所占 
用的資源。具體函數如下:

  int __init s3c2410_int_init(void)
{┅
       set_external_irq(IRQ_EINT9, ┅);//設置外部中斷
       request_irq(IRQ_EINT9,demo_int_handler, ┅);//申請外部中斷
       ret = register_chrdev(0, DEVICE_NAME, &s3c2410_exio_fops); //申請主設備號
       devfs_int_demo= devfs_register(NULL, "int_demo", ┅); //注冊設備文件
┅}

  void __exit s3c2410_int_exit(void)
{┅
       free_irq(IRQ_EINT9,NULL);//釋放中斷
       devfs_unregister(devfs_int_demo); //刪除設備文件
       unregister_chrdev(exioMajor, DEVICE_NAME); //釋放主設備號
┅}

  3.2 打開(kāi)模塊和釋放模塊

  打開(kāi)模塊的主要功能是:初始化一些變量。具體實(shí)現函數如下:

  static int s3c2410_int_open(struct inode *inode, struct file *filp)
{     init_MUTEX(&demodev.lock);//初始化自旋鎖
       init_waitqueue_head(&(demodev.wait));初始化隊列
       MOD_INC_USE_COUNT;//使用計數加1
┅}
static int s3c2410_int_release(struct inode *inode, struct file *filp)
{     MOD_DEC_USE_COUNT; //使用計數減1
┅}

  3.3 讀數據模塊

  讀數據模塊的主要功能是:使線(xiàn)程休眼,然后等待中斷來(lái)喚醒。具體實(shí)現函數如下:

  static int s3c2410_int_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
{┅
       copy_to_user(buffer,(char *)&bak,sizeof(bak)); //內核態(tài)到用戶(hù)態(tài)
       interruptible_sleep_on(&demodev.wait);//進(jìn)入休眠
┅}

  3.4 中斷處理模塊

  中斷處理模塊的主要功能是:?jiǎn)拘颜谛菅鄣木€(xiàn)程。具體實(shí)現函數如下:

  static void s3c2410_int_handler(int irq, void *dev_id, struct pt_regs *reg)
{wake_up(&demodev.wait);//中斷喚醒
┅}

  驅動(dòng)程序設計完成后,再編寫(xiě)Makefile文件,通過(guò)make命令生成目標文件,最后利用insmod命令向內核加載驅動(dòng)程序。

  4  應用程序的設計

  為了提高應用程序的運行速度,以及程序運行的穩定性,所以將應用程序設計成多線(xiàn)程結構,如圖2所示。應用程序由7個(gè)線(xiàn)程和一個(gè)共享數據結構組成。

如圖2 應用程序結構框圖

  共享數據主要用于存放家電開(kāi)啟和關(guān)閉時(shí)間,發(fā)送短信的電話(huà)號和短信內容等信息。共享數據是通過(guò)2個(gè)設置線(xiàn)程來(lái)修改的。家電控制線(xiàn)程主要是根據控制數據、檢測短信線(xiàn)程的內容和操作線(xiàn)程的內容來(lái)進(jìn)行操作。發(fā)送短信線(xiàn)程主要是根據控制數據、檢測傳感器線(xiàn)程的內容和操作線(xiàn)程的內容來(lái)進(jìn)行操作。應用程序的具體內容如下。

  #include  &nb 
sp; //線(xiàn)程庫頭文件

int main()
{┅
  pthread_creat(&th_a,NULL,send_msg,0); //創(chuàng )建發(fā)送短信線(xiàn)程
pthread_creat(&th_b,NULL,control_driver,0); //創(chuàng )建家電控制線(xiàn)程

  pthread_join(th_b,&retval); //等待家電控制線(xiàn)程結束
pthread_join(th_a,&retval); //等待發(fā)送短信線(xiàn)程結束
┅}
/*發(fā)送短信線(xiàn)程*/
int send_msg()
{┅
       tty_init();   //初始化串口
       gprs_init();  //初始化GPRS模塊
       tty_writecmd(“at”,strlen(“at”));  //發(fā)送AT命令
       tty_writecmd(“at+cmgf=1”,strlen(“at+cmgf=1”));//發(fā)送修改字符集命令
       tty_write(“at+cmgs=”,strlen(“at+cmgs=”));     //發(fā)送短信命令
       tty_writecmd(msg.send_tel,strlen(msg.send_tel)); //發(fā)送電話(huà)號碼
tty_writecmd(msg.send_text,strlen(msg.send_text)); //發(fā)送短信內容
      tty_end(); 

      return 0;
}

  其它線(xiàn)程的設計方法有很多相似之處。應用程序設計完成之后,再經(jīng)過(guò)交叉編譯就可生成目標文件。

  5 結束語(yǔ)

  將移植好的系統、驅動(dòng)程序和應用程序下載到智能家居控制器上。經(jīng)過(guò)測試,系統具有操作方便、可靠性高和抗干擾能力強等優(yōu)點(diǎn)。本文的創(chuàng )新點(diǎn)是:通過(guò)智能家居控制器將家電、傳感器、手機等許多獨立的設備連接成為一個(gè)系統,從而方便本地和遠程控制。

  參考文獻:

  [1] 朱華生,胡凱利.基于Linux系統的HHARM9電機驅動(dòng)程序設計[J].南昌工程學(xué)院學(xué)報.2005,4:51-53.

  [2] 嚴厲平.智能家庭網(wǎng)關(guān)的研究與設計[J].微計算機信息.2005,2:14-16.

  [3] 朱華生,劉文軍.基于Linux下實(shí)時(shí)數據備份的研究[J].南昌水專(zhuān)學(xué)報.2004,4:57-58.

  [4] 朱華生,韓宇貞.計算機故障分析儀的設計[J].南昌水專(zhuān)學(xué)報.2003,2:34-36

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>