可視化WIFI遙控搬運(yùn)機(jī)器人之服務(wù)器搭建
發(fā)布時(shí)間:2015-02-23 責(zé)任編輯:sherryyu
【導(dǎo)讀】本設(shè)計(jì)主要研究基于WIFI網(wǎng)絡(luò)的可視化無(wú)線遙控搬運(yùn)機(jī)器人,利用WIFI網(wǎng)絡(luò)高速傳輸實(shí)時(shí)視頻圖像采集,通過(guò)機(jī)器人安裝的傳感器實(shí)現(xiàn)數(shù)據(jù)采集。采用WIFI網(wǎng)絡(luò)通訊使得控制端多樣化,可用手機(jī),電腦等具備WIFI功能的設(shè)備進(jìn)行控制。這里主要講解可視化WIFI遙控搬運(yùn)機(jī)器人之服務(wù)器搭建。
本設(shè)計(jì)主要研究基于WIFI網(wǎng)絡(luò)的可視化無(wú)線遙控搬運(yùn)機(jī)器人,利用WIFI網(wǎng)絡(luò)高速傳輸實(shí)時(shí)視頻圖像采集,通過(guò)機(jī)器人安裝的傳感器實(shí)現(xiàn)數(shù)據(jù)采集。采用WIFI網(wǎng)絡(luò)通訊使得控制端多樣化,可用手機(jī),電腦等具備WIFI功能的設(shè)備進(jìn)行控制。此外,還可將機(jī)器人接入Internet實(shí)現(xiàn)更遠(yuǎn)距離的控制。本設(shè)計(jì)在S3C6410平臺(tái)上移植了Linux操作系統(tǒng)用于接收命令并對(duì)硬件設(shè)備進(jìn)行控制,其中移植了MJPGstreamer作為視頻服務(wù)器,移植了BOA服務(wù)器作為WEB服務(wù)器。本文將從硬件設(shè)計(jì),驅(qū)動(dòng)程序編寫(xiě),服務(wù)器移植,服務(wù)程序編寫(xiě),Android應(yīng)用程序編寫(xiě),Web應(yīng)用程序編寫(xiě)等方面來(lái)講述本設(shè)計(jì)的功能實(shí)現(xiàn)。
功能框圖
總體設(shè)計(jì)及硬件選型和電路部分:可視化WIFI遙控搬運(yùn)機(jī)器人(1):硬件部分
3 服務(wù)器搭建
3.1 服務(wù)器端功能框圖
圖3-1 服務(wù)器端功能框圖
3.2 Linux系統(tǒng)移植
核心板采用友善之臂公司提供的TINY6410,此核心板已提供Bootloader,Linux系統(tǒng),文件系統(tǒng)。使用時(shí)只需要根據(jù)實(shí)際的需要裁減Linux系統(tǒng)即可,本設(shè)計(jì)采用的Linux內(nèi)核版本為L(zhǎng)inux2.6.38,編譯平臺(tái)為Ubuntu12.04,交叉編譯器為arm-linux-gcc-4.5.1。
3.3 驅(qū)動(dòng)編寫(xiě)與移植
3.3.1 直流電機(jī)驅(qū)動(dòng)
由于S3C6410只帶有2路PWM輸出,而夾持器部分需要兩路PWM脈寬調(diào)制控制伺服舵機(jī),因此直流電機(jī)部分采用定時(shí)器2來(lái)模擬PWM調(diào)制。設(shè)置定時(shí)器2每100ms進(jìn)一次中斷,在定時(shí)器中進(jìn)行1~100計(jì)數(shù),因此PWM周期為10S,并有100個(gè)脈寬比可調(diào),滿足直流電機(jī)調(diào)速控制。
[page]
3.3.2 伺服電機(jī)驅(qū)動(dòng)
伺服電機(jī)需要采用脈寬調(diào)制,通過(guò)調(diào)節(jié)20ms周期內(nèi)的占空比可以指定伺服電機(jī)的旋轉(zhuǎn)角度,其對(duì)應(yīng)關(guān)系如下表:
表3-1 伺服電機(jī)占空比與旋轉(zhuǎn)角度的對(duì)應(yīng)關(guān)系
由于舵機(jī)的控制要求較高,本設(shè)計(jì)采用S3C6410自帶的PWM進(jìn)行控制.。設(shè)置PWM0和PWM1的周期為20ms,通過(guò)調(diào)節(jié)PWM0和PWM1的占空比來(lái)控制伺服電機(jī)進(jìn)行工作。
3.3.3 攝像頭驅(qū)動(dòng)
ZC301為免驅(qū)的UVC視頻設(shè)備,為了實(shí)現(xiàn)視頻的采集需要在編譯內(nèi)核時(shí)選擇上V4L2支持。
3.3.4 USB WIFI 驅(qū)動(dòng)
本設(shè)計(jì)中采用的這款USB無(wú)線網(wǎng)卡采用RTL8188芯片,為使該設(shè)備能夠正常工作需要進(jìn)行驅(qū)動(dòng)程序移植。
①?gòu)腞TL官網(wǎng)獲得RTL8188的最新驅(qū)動(dòng)程序,本文采用的是RTL819xSU_usb_linux_v2.6.6.0.20120405.tar.gz。
②在Ubuntu中利用命令tar -zxvf 將驅(qū)動(dòng)包解壓。
③進(jìn)入驅(qū)動(dòng)目錄并修改Makefile
④由于驅(qū)動(dòng)默認(rèn)移植平臺(tái)是I386_PC,而我們需要將其移植到S3C平臺(tái)上,故需要做如下修改:
說(shuō)明目標(biāo)平臺(tái):
將:CONFIG_PLATFORM_I386_PC = y
改為:CONFIG_PLATFORM_I386_PC = n
將:CONFIG_PLATFORM_ARM_S3C = n
改為:CONFIG_PLATFORM_ARM_S3C = y
指定交叉編譯器以及內(nèi)核路徑信息:
ifeq ($(CONFIG_PLATFORM_ARM_S3C), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
ARCH := arm
CROSS_COMPILE := /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-
KVER := 2.6.48_$(ARCH)
KSRC := /root/tiny6410/linux-2.6.38
Endif
⑤執(zhí)行Make命令得到8712u.ko即為所需驅(qū)動(dòng),將該文件移動(dòng)到目標(biāo)平臺(tái)加載即完成了USB WIFI驅(qū)動(dòng)程序的移植。
3.3.5 ADC驅(qū)動(dòng)
電源電量以及FSR壓力傳感器數(shù)據(jù)測(cè)量需要ADC驅(qū)動(dòng)的支持。由于系統(tǒng)中已含有該驅(qū)動(dòng),故只需要在編譯內(nèi)核時(shí)選擇上即可。
3.4 AP熱點(diǎn)搭建
3.4.1 AP熱點(diǎn)簡(jiǎn)介
AP是(Wireless) Access Point的縮寫(xiě),即(無(wú)線)訪問(wèn)接入點(diǎn)。無(wú)線設(shè)備可以通過(guò)它來(lái)接入到無(wú)線網(wǎng)絡(luò)。RTL8188支持AP熱點(diǎn)模式,采用這種方式可以讓機(jī)器人成為AP熱點(diǎn),然后用帶WIFI功能的設(shè)備來(lái)進(jìn)行連接。
3.4.2 Hostapd簡(jiǎn)介
Hostapd即Host Access Point,其是Linux系統(tǒng)中無(wú)線訪問(wèn)接入點(diǎn)的守護(hù)進(jìn)程。它可以將無(wú)線網(wǎng)卡設(shè)置為AP模式,并且支持多種加密方式,提供了設(shè)備接入的身份驗(yàn)證。在實(shí)際的使用期間,我們需要對(duì)其配置文件進(jìn)行相應(yīng)的修改。本設(shè)計(jì)中采用Hostapd來(lái)結(jié)合RTL8188網(wǎng)卡完成AP熱點(diǎn)的搭建。
[page]
3.4.3 DHCP簡(jiǎn)介
DHCP(Dynamic Host Configuration Protocol)是一種動(dòng)態(tài)主機(jī)配置協(xié)議。它主要采用UDP協(xié)議來(lái)為接入到網(wǎng)絡(luò)中的設(shè)備分配IP地址以及進(jìn)行一些參數(shù)配置。本設(shè)計(jì)中通過(guò)配置其配置文件并啟用該服務(wù)來(lái)為接入機(jī)器人的WIFI設(shè)備分配IP地址,有效的避免了多個(gè)設(shè)備接入時(shí)的地址沖突問(wèn)題。
3.4.4 Hostapd移植
①下載最新版的Hostapd源碼,本文使用的是Hostapd-2.0。
②將hostapd-2.0.tar.gz進(jìn)行解壓,并進(jìn)入到hostapd目錄
③對(duì)目錄下的.config做如下修改:
注釋掉:
CONFIG_DRIVER_HOSTAP=y
CONFIG_DRIVER_WIRED=y
CONFIG_DRIVER_MADWIFI=y
取消下面這項(xiàng)的注釋:
CONFIG_DRIVER_NL80211=y
④修改Makefile 指定交叉編譯器:
CC=arm-linux-gcc
⑤執(zhí)行Make命令,編譯得到hostapd及hostapd_cli
⑥將編譯得到的可執(zhí)行文件復(fù)制到目標(biāo)平臺(tái),即完成了Hostapd的移植
⑦按需要更改hostapd.config文件,本設(shè)計(jì)關(guān)鍵部分配置如下:
interface=wlan0
ctrl_interface=/var/run/hostapd
ssid=CarControl
channel=6
wpa=2
wpa_passphrase=12345678
...
driver=rtl871xdrv
beacon_int=100
hw_mode=g
ieee80211n=1
wme_enabled=1
ht_capab=[SHORT-GI-20][SHORT-GI-40]
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
max_num_sta=8
wpa_group_rekey=86400
⑧hostapd -B hostapd.config 啟動(dòng)Hostapd服務(wù)
3.4.5 DHCP移植
Linux2.6.38內(nèi)核中已含有DHCP支持,使用DHCP只需要修改DHCP配置文件udhcpd.conf,其中最關(guān)鍵部分如下:
# The start and end of the IP lease block
start 192.168.2.2
end 192.168.2.30
即修改了自動(dòng)分配IP地址的范圍,由于采用局域網(wǎng),需要將IP地址設(shè)置為同一網(wǎng)段,機(jī)器人采用的IP地址為192.168.2.1,因此將IP地址分配范圍作如上設(shè)置。啟動(dòng)hostapd后需要執(zhí)行udhcpd命令啟動(dòng)DHCP服務(wù),從而當(dāng)WIFI設(shè)備接入機(jī)器人時(shí)能自動(dòng)獲取到IP地址。
3.5 視頻服務(wù)器搭建
3.5.1 V4L2簡(jiǎn)介
V4L2(即Video for linux 2)是Linux 內(nèi)核中針對(duì)UVC免驅(qū)視頻設(shè)備的編程框架,它提供了一系列通用的接口來(lái)實(shí)現(xiàn)Linux中對(duì)視頻設(shè)備的訪問(wèn),其編程模式如下:
圖 3-2 V4L2編程模式
Linux2.6.38內(nèi)核中自帶了該驅(qū)動(dòng),在使用時(shí)只需要在編譯內(nèi)核時(shí)將V4L2選項(xiàng)勾選上即可。
[page]
3.5.2 LIBJPEG簡(jiǎn)介
Libjpeg是一個(gè)包含了JPEG圖像的編碼,解碼等功能的開(kāi)源庫(kù),其完全采用C語(yǔ)言來(lái)進(jìn)行編寫(xiě)。
3.5.3 Mjpgstreamer簡(jiǎn)介
MJPGstreamer是主要運(yùn)行在Linux系統(tǒng)上的一款運(yùn)用多線程技術(shù)的輕量級(jí)視頻服務(wù)器軟件。它是一款采用C語(yǔ)言進(jìn)行開(kāi)發(fā)的開(kāi)源軟件,其代碼簡(jiǎn)潔,注釋清晰,組件功能明確,銜接清晰,可以移植到不同的計(jì)算機(jī)平臺(tái)。整個(gè)程序主要以模塊化的方法來(lái)進(jìn)行構(gòu)建,每個(gè)功能模塊又被稱為組件(plug-in),用戶可以根據(jù)自己的需要來(lái)選擇輸入組件和輸出組件。它可以實(shí)現(xiàn)從一個(gè)單一的輸入組件獲取到圖像數(shù)據(jù)來(lái)通過(guò)多個(gè)輸出組件將圖像進(jìn)行輸出[ ]。下圖為Mjpgstreamer的組件:
圖 3-3 MJPG-streamer組件
本設(shè)計(jì)選用input_uvc作為輸入組件來(lái)使用V4L2從攝像頭獲取圖像數(shù)據(jù),經(jīng)JPEG庫(kù)對(duì)數(shù)據(jù)進(jìn)行編碼之后,通過(guò)選用output_http作為輸出組件來(lái)輸出圖像數(shù)據(jù)。output_http組件實(shí)現(xiàn)了一個(gè)符合HTTP1.0標(biāo)準(zhǔn)的web服務(wù)器,用戶可以使用HTTP協(xié)議獲取視頻信息。
3.5.4 libjpeg移植
移植libjpeg庫(kù)主要是用于Mjpgstreamer采集數(shù)據(jù)時(shí)壓縮編碼,移植步驟如下:
①下載libjpeg源碼,本文采用jpeg-9a。
②將jpeg-9a.tar.gz解壓,并進(jìn)入源碼根目錄。
③執(zhí)行如下命令配置編譯,生成編譯時(shí)所需要的Makefile文件。
./configure --prefix=/root/h264/app/jpeg --exec-prefix=/root/h264/app/jpeg --enable-shared --enable-static
命令中prefix是最后安裝時(shí)庫(kù)存放的目錄,shared是編譯成動(dòng)態(tài)庫(kù),static是編譯成靜態(tài)庫(kù)。
④修改Makefile文件,指定編譯時(shí)所需要的交叉編譯工具和環(huán)境:
CC = arm-linux-gcc -std=gnu99
AR = arm-linux-ar
CPP = arm-linux-gcc -std=gnu99 -E
⑤執(zhí)行make命令編譯代碼
⑥執(zhí)行make install命令產(chǎn)生libjpeg庫(kù),存放于/root/h264/app/jpeg目錄下。
⑦將libjpeg庫(kù)移動(dòng)到目標(biāo)平臺(tái),完成libjpeg移植。
3.5.5 Mjpgstreamer移植
MJPGstreamer作為本設(shè)計(jì)中的視頻采集服務(wù)器,其移植過(guò)程如下:
①下載Mjpgstreamer源代碼,本設(shè)計(jì)采用mjpg-streamer-r63.tar.gz。
②解壓mjpg-streamer-r63.tar.gz,并進(jìn)入代碼根目錄。
③修改plugins/input_uvc/Makefile:
指定交叉編譯器:
CC = arm-linux-gcc
指定libjpeg庫(kù):
input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo $(CC) $(CFLAGS) -ljpeg -L/root/h264/app/jpeglib/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
④修改主目錄以及plugins目錄下所有子目錄的Makefile,指定交叉編譯器:
CC = arm-linux-gcc
⑤執(zhí)行make命令,生成可執(zhí)行文件mjpg_streamer。
⑥將源碼目錄中的start.sh和目錄www拷貝到目標(biāo)平臺(tái)完成Mjpgsteramer移植。
⑦執(zhí)行如下命令可啟用Mjpgstreamer服務(wù):
./mjpg_streamer -i "./input_uvc.so -r 320x240 -f 25 " -o "./output_http.so -w www"
命令中指定輸入組件為input_uvc,并且配置采集分辨率為320*240,幀數(shù)為25fps。指定輸入組件為output_http,并且http服務(wù)器目錄為www。
[page]
3.6 BOA服務(wù)器搭建
3.6.1 BOA服務(wù)器簡(jiǎn)介
由于Mjpgstreamer服務(wù)器只能傳輸視頻信息,而本設(shè)計(jì)需要接收客戶端的控制命令并且得返回機(jī)器人的傳感器數(shù)據(jù)。因此得移植支持CGI應(yīng)用腳本的服務(wù)器。BOA服務(wù)器是一個(gè)可運(yùn)行在unix或linux下的非常小巧的單任務(wù)Web服務(wù)器,并且支持CGI腳本,廣泛應(yīng)用于嵌入式領(lǐng)域[ ]。本設(shè)計(jì)通過(guò)編寫(xiě)CGI腳本來(lái)完成服務(wù)器與客戶端的數(shù)據(jù)交換。
3.6.2 BOA服務(wù)器移植
BOA服務(wù)器的移植需要以下步驟:
①下載BOA服務(wù)器源碼,本文采用boa-0.94.13.tar.gz。
②解壓boa-0.94.13.tar.gz,并進(jìn)入到源碼根目錄。
③執(zhí)行命令./configure生成Makefile文件。
④修改Makefile文件,指定編譯時(shí)所需要的交叉編譯器:
CC=gcc改成CC = arm-linux-gcc
CPP = gcc –E改成CPP = arm-linux-gcc –E
⑤執(zhí)行make命令生成boa可自行文件
⑥將boa以及boa.conf移動(dòng)到目標(biāo)平臺(tái),即可完成BOA服務(wù)器移植。
⑦為了適應(yīng)本設(shè)計(jì)的需求,得修改boa.conf文件來(lái)配置boa服務(wù)器。本設(shè)計(jì)作出如下修改:
Port 80
User root
Group root
ErrorLog /dev/console
AccessLog /dev/null
ServerName CarControl
DocumentRoot /www
DirectoryIndex index.html
KeepAliveMax 1000
KeepAliveTimeout 10
MimeTypes /etc/mime.types
DefaultType text/plain
CGIPath /bin
AddType application/x-httpd-cgi cgi
此配置設(shè)置了服務(wù)器的端口號(hào),權(quán)限,服務(wù)器目錄連接數(shù)等參數(shù)。
3.7 服務(wù)器端程序設(shè)計(jì)
3.7.1 CGI腳本簡(jiǎn)介
圖 3-4 CGI程序應(yīng)用原理
3.7.2 命名管道簡(jiǎn)介
命名管道是一種實(shí)現(xiàn)無(wú)關(guān)進(jìn)程間通信的通信機(jī)制(IPC)。其本質(zhì)上為一個(gè)文件,因此通訊更加穩(wěn)定。命名管道遵循與先進(jìn)先出原則,并且是半雙工的,數(shù)據(jù)只能單向傳輸,若要實(shí)現(xiàn)雙向傳輸就得使用兩個(gè)管道。命名管道含有讀端和寫(xiě)端,并且支持阻塞讀。本設(shè)計(jì)中利用命名管道的特性,可以實(shí)現(xiàn)CGI程序與命令服務(wù)程序之間的數(shù)據(jù)交換。
[page]
3.7.3 控制命令設(shè)計(jì)
本設(shè)計(jì)控制命令簡(jiǎn)單,因此客戶端與服務(wù)器間數(shù)據(jù)通訊主要采用HTTP GET方法,服務(wù)器CGI應(yīng)用程序可以在環(huán)境變量QUERY_STRING中獲取字符串形式的控制命令。本設(shè)計(jì)中采用“標(biāo)志+參數(shù)”的方式設(shè)置控制命令,單個(gè)命令字的總長(zhǎng)度為5字節(jié),具體如下:
直流電機(jī)控制指令:
L0000~0200
R0000~0200
其中L,R分別代表左和右,將此命令參數(shù)減去100,負(fù)數(shù)為后退,0為停止,正數(shù)為前進(jìn)。其絕對(duì)值越大速度越快。
伺服電機(jī)控制命令:
C0250~1250
S0250~1250
其中C,S分別代表夾持和旋轉(zhuǎn)命令,參數(shù)250~1250代表脈沖寬度用以調(diào)整伺服電機(jī)旋轉(zhuǎn)位置(0°~180°)。
獲取電量命令:
POWER
當(dāng)CGI接收到此命令時(shí)將會(huì)把電源的電壓值返回給客戶端。
數(shù)據(jù)返回格式如下:
POW:0~1023
PRE:0~1023
其中POW,PRE分別代表電量,壓力,參數(shù)0~1023為從ADC中采集到的數(shù)據(jù)。
3.7.4 CGI程序流程圖
CGI程序主要負(fù)責(zé)從客戶端獲得命令字然后通過(guò)命名管道將控制命令發(fā)送給服務(wù)程序進(jìn)行處理,并且調(diào)用驅(qū)動(dòng)程序讀取機(jī)器人傳感器數(shù)據(jù)信息返回給客戶端。CGI程序流程圖如下:
圖 3-5 CGI程序流程圖
如圖3-5所示,本設(shè)計(jì)的CGI腳步先判斷客戶端的命令是否為索取電壓值得命令,如果是的話就讀取電源電壓數(shù)據(jù)并將數(shù)據(jù)返回,否則就將命令字寫(xiě)入到命名管道供服務(wù)程序來(lái)進(jìn)行讀取,并且讀取壓力傳感器的數(shù)據(jù)將其返回給客戶端。
3.7.5 CGI程序編寫(xiě)
CGI腳本的部分代碼如下:
int main()
{
...
buff = getenv("QUERY_STRING");//獲得指令
sscanf(buff, "%s", cmd);
...
/*讀取電壓值,并返回給客戶端*/
if(strcmp(cmd,"POWER")==0)
{adc_fd=open("/dev/adc",0);//打開(kāi)ADC驅(qū)動(dòng)
if(adc_fd<0)
fprintf(stdout, "open adc_device failen");
else
{if(ioctl(adc_fd,ADC_SET_CHANNEL,0) < 0)
fprintf(stdout, "ioctl adc_device failen");
else{len = read(adc_fd, adc, 4);//讀取ADC
if (len > 0)
{adc[len] = ''''''''?'''''''';
fprintf(stdout, "POW:%s",adc);//將電壓值返回
}
}
close(adc_fd);
}
}
else
{
cmd_fd=open(FIFO_CMD,O_WRONLY|O_NONBLOCK,0);//與服務(wù)程序通過(guò)命名管道通訊
/* 向管道寫(xiě)入數(shù)據(jù) */
if((nwrite=write(cmd_fd,cmd,11))==-1)
fprintf(stdout, "write cmd failen");
close(cmd_fd);
/*讀取壓力值,并返回給客戶端*/
adc_fd=open("/dev/adc",0);//打開(kāi)ADC驅(qū)動(dòng)
if(adc_fd<0)
fprintf(stdout, "open adc_device failen");
else
{
if(ioctl(adc_fd,ADC_SET_CHANNEL,1) < 0)
fprintf(stdout, "ioctl adc_device failen");
else
{
len = read(adc_fd, adc, 4);//讀取ADC
if (len > 0)
{
adc[len] = ''''''''?'''''''';
fprintf(stdout, "PRE:%s",adc);//返回壓力值
}
}
close(adc_fd);
}
}
return 0;
}
[page]
3.7.6 服務(wù)程序流程圖
服務(wù)程序主要完成機(jī)器人初始化,讀取電量值并將電量值通過(guò)LED來(lái)進(jìn)行提示,讀取命名管道獲得命令字并將其解析執(zhí)行。主要的流程圖如下:
圖 3-6 服務(wù)程序流程圖
如圖3-6所示,本設(shè)計(jì)中的服務(wù)程序采用多進(jìn)程程序設(shè)計(jì)方式,其子進(jìn)程每60S采集一次電源電量信息并更新電量指示燈顯示,主進(jìn)程采用阻塞讀的方式讀取命名管道來(lái)等待客戶端發(fā)送命令,獲得命令之后對(duì)命令進(jìn)行解析并調(diào)用驅(qū)動(dòng)程序來(lái)執(zhí)行相應(yīng)的命令,從而實(shí)現(xiàn)對(duì)機(jī)器人的控制。
3.7.7 服務(wù)程序編寫(xiě)
服務(wù)程序部分代碼如下:
/* 創(chuàng)建子進(jìn)程,用于每60S獲取電源電壓值 */
if(fork()==0)
{
while(1)
{
if(ioctl(adc_fd,ADC_SET_CHANNEL,0) < 0)
{perror("ioctl ADC device:");
exit(1);
}
char buffer[5];
int len = read(adc_fd, buffer, sizeof buffer -1);//讀取ADC
if (len > 0)
{
buffer[len-1] = ''''''''?'''''''';
printf("POW VALUE:%sn",buffer);
getpower=(float)StrToInt(buffer);
getpower=9.9*getpower/1024.0;
if(power==0)
power=getpower;
if(getpower<=power && power-getpower<0.2)
{
power=getpower;
if(power>8.1)//根據(jù)電量來(lái)用LED顯示
Show(5);
...
}
}
sleep(60);//1min
}
}
/* 主進(jìn)程,用于獲取命令并處理 */
else{
while(1)
{
memset(buff,0,sizeof(buff));
cmd_fd=open(FIFO_CMD,O_RDONLY);//readonly 阻塞
if(cmd_fd==-1)
{
perror("open");
exit(1);
}
if((nbytes=read(cmd_fd,buff,sizeof(buff)))>4)//讀取FIFO_CMD管道
{
buff[nbytes]=''''''''?'''''''';
//指令處理
receive_do(buff);
}
close(cmd_fd);
}
}
上述代碼中receive_do函數(shù)主要負(fù)責(zé)解析命令,并進(jìn)行處理。其代碼如下:
void receive_do(char buffer[])
{
int c,i;
int tmp=0;
c = (int)(nbytes+1)/5;
for(i=0;i {
tmp=(buffer[1+i*5]-''''''''0'''''''')*1000+(buffer[2+i*5]-''''''''0'''''''')*100+(buffer[3+i*5]-''''''''0'''''''')*10+(buffer[4+i*5]-''''''''0'''''''');//解析接收到的指令數(shù)據(jù)
switch(buffer[i*5])//處理指令
{
case ''''''''L'''''''':ioctl(dc_fd,LEFT_SET,tmp);
break;
case ''''''''R'''''''':ioctl(dc_fd,RIGHT_SET,tmp);
break;
case ''''''''C'''''''':ioctl(servo_fd,CLAMP_SET,tmp);
break;
case ''''''''S'''''''':ioctl(servo_fd,SPIN_SET,tmp);
break;
}
}
}
CGI即公共網(wǎng)關(guān)接口(Common GatewayInterface)它是一種WWW技術(shù)。CGI實(shí)質(zhì)是運(yùn)行在WEB服務(wù)器上面為客戶端HTML頁(yè)面提供接口的一個(gè)腳本程序。它可以通過(guò)標(biāo)準(zhǔn)輸入(STDIN)來(lái)從WEB服務(wù)器獲得數(shù)據(jù),經(jīng)處理之后可以通過(guò)標(biāo)準(zhǔn)輸出(STDOUT)來(lái)將數(shù)據(jù)返回給WEB服務(wù)器,從而實(shí)現(xiàn)對(duì)客戶端數(shù)據(jù)的接收處理。本設(shè)計(jì)采用這種方式實(shí)現(xiàn)機(jī)器人控制命令的接收,以及返回機(jī)器人傳感器數(shù)據(jù)信息。CGI程序應(yīng)用原理如下圖所示:
特別推薦
- 是否存在有關(guān) PCB 走線電感的經(jīng)驗(yàn)法則?
- 一文看懂電壓轉(zhuǎn)換的級(jí)聯(lián)和混合概念
- 第12講:三菱電機(jī)高壓SiC芯片技術(shù)
- 準(zhǔn) Z 源逆變器的設(shè)計(jì)
- 貿(mào)澤電子持續(xù)擴(kuò)充工業(yè)自動(dòng)化產(chǎn)品陣容
- 低功耗嵌入式設(shè)計(jì)簡(jiǎn)介
- 如何通過(guò)基本描述找到需要的電容?
技術(shù)文章更多>>
- 了解負(fù)電壓的概念
- 單個(gè)IC也能構(gòu)建緊湊、高效的雙極性穩(wěn)壓器
- ESR 對(duì)陶瓷電容器選擇的影響(下)
- 基于射頻無(wú)線電力傳輸供電的無(wú)電池資產(chǎn)跟蹤模塊的先進(jìn)監(jiān)控系統(tǒng)
- 步進(jìn)電機(jī)中的脈寬調(diào)制與正弦控制
技術(shù)白皮書(shū)下載更多>>
- 車(chē)規(guī)與基于V2X的車(chē)輛協(xié)同主動(dòng)避撞技術(shù)展望
- 數(shù)字隔離助力新能源汽車(chē)安全隔離的新挑戰(zhàn)
- 汽車(chē)模塊拋負(fù)載的解決方案
- 車(chē)用連接器的安全創(chuàng)新應(yīng)用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門(mén)搜索
圖像傳感器
陀螺傳感器
萬(wàn)用表
萬(wàn)用表使用
網(wǎng)絡(luò)電容
微波
微波功率管
微波開(kāi)關(guān)
微波連接器
微波器件
微波三極管
微波振蕩器
微電機(jī)
微調(diào)電容
微動(dòng)開(kāi)關(guān)
微蜂窩
位置傳感器
溫度保險(xiǎn)絲
溫度傳感器
溫控開(kāi)關(guān)
溫控可控硅
聞泰
穩(wěn)壓電源
穩(wěn)壓二極管
穩(wěn)壓管
無(wú)焊端子
無(wú)線充電
無(wú)線監(jiān)控
無(wú)源濾波器
五金工具