在线免费观看成年人视频-在线免费观看国产-在线免费观看国产精品-在线免费观看黄网站-在线免费观看精品

產(chǎn)品分類

當(dāng)前位置: 首頁(yè) > 工業(yè)控制產(chǎn)品 > 自動(dòng)化控制 > 機(jī)器人部件 > 操作機(jī)

類型分類:
科普知識(shí)
數(shù)據(jù)分類:
操作機(jī)

可視化WIFI遙控搬運(yùn)機(jī)器人之服務(wù)器搭建

發(fā)布日期:2022-04-18 點(diǎn)擊率:156

【導(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ù)器搭建。
 
可視化WIFI遙控搬運(yùn)機(jī)器人之硬件部分設(shè)計(jì)
http://www.cntronics.com/rf-art/80025732
 
本設(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)程序編寫,服務(wù)器移植,服務(wù)程序編寫,Android應(yīng)用程序編寫,Web應(yīng)用程序編寫等方面來(lái)講述本設(shè)計(jì)的功能實(shí)現(xiàn)。
功能框圖
功能框圖
 
總體設(shè)計(jì)及硬件選型和電路部分:可視化WIFI遙控搬運(yùn)機(jī)器人(1):硬件部分
 
3 服務(wù)器搭建
 
3.1 服務(wù)器端功能框圖
服務(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)編寫與移植
 
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)系如下表:
伺服電機(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的縮寫,即(無(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),其編程模式如下:
V4L2編程模式
圖 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)行編寫。
 
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的組件:
MJPG-streamer組件
圖 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ò)編寫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-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è)管道。命名管道含有讀端和寫端,并且支持阻塞讀。本設(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程序流程圖如下:
CGI程序流程圖
圖 3-5 CGI程序流程圖
 
如圖3-5所示,本設(shè)計(jì)的CGI腳步先判斷客戶端的命令是否為索取電壓值得命令,如果是的話就讀取電源電壓數(shù)據(jù)并將數(shù)據(jù)返回,否則就將命令字寫入到命名管道供服務(wù)程序來(lái)進(jìn)行讀取,并且讀取壓力傳感器的數(shù)據(jù)將其返回給客戶端。
 
3.7.5 CGI程序編寫
 
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ò)命名管道通訊
 
/* 向管道寫入數(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í)行。主要的流程圖如下:
服務(wù)程序流程圖
圖 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ù)程序編寫
 
服務(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)用原理如下圖所示:
&

下一篇: PLC、DCS、FCS三大控

上一篇: TI分享:2015年電力通

巨大欧美黑人XXXXBBBB| 国产亚洲精品第一综合另类灬| 国产精品露脸视频观看| 狠狠躁夜夜躁AV网站色| 久久婷婷人人澡人人喊人人爽| 欧美三级不卡在线播放| 少妇扒开粉嫩小泬视频| 亚洲国产天堂久久综合226| 最新亚洲春色AV无码专区| 大香伊人久久精品一区二区| 和儿媳妇在一起最幸福的句子| 妺妺和我裸睡玩我下春雨医生| 色老头精品午夜福利视频| 亚洲AV无码专区国产乱码APP| 在镜子面前看我是怎么爱你的| 成人午夜福利视频| 精产国品一二三产区区别在线观看 | 国产GAYSEXCHINA男同| 国内大量揄拍人妻在线视频| 免费无码又爽又刺激高潮的漫画| 色8激情欧美成人久久综合电| 亚洲国色天香卡2卡3卡4| BGMBGMBGM毛多多| 国产丝袜无码一区二区视频| 蜜桃中文字日产乱幕4区| 天美传媒MV免费观看软件特色| 亚洲人成人一区二区在线观看| AV天堂影音先锋AV色资源网站| 国产精品高清一区二区三区人妖| 久久无码国产专区精品| 色综合久久中文综合网| 亚洲熟妇另类久久久久久| 成年丰满熟妇午夜免费视频| 精品人妻一区二区三区三区换着玩 | 日日摸日日碰人妻无码老牲| 亚洲熟妇AV日韩熟妇在线| 成年女人毛片视频免费| 久久精品亚洲一区二区三区浴池 | 女女互磨互喷水高潮LES呻吟| 忘忧草在线影院WWW神马| 正在播放熟妇群老熟妇456| 国产精品XXX大片免费观看| 蜜桃色欲AV久久无码精品软件| 同学要做吗PO爱喝花茶的小酥肉 | 欧美老熟妇欲乱高清视频| 亚洲AV成人无码精品网站老司机| 97人妻碰碰碰久久久久| 激情五月丁香六月综合AVXXXX| 日本适合十八岁以上的护肤品| 亚洲最大成人AV在线天堂网| 国产成人亚洲精品青草| 女人下边水润紧致好处| 亚洲丰满性熟妇ⅩXXOOO| 成人亚洲综合AV天堂| 久久理论片午夜琪琪电影网| 无码精品A∨在线观看| FREESEX欧美喷水| 久久国产精品成人片免费| 天天躁日日躁AAAAXXXX| FREE紧VIDEOXX粗又长| 久久精品女人天堂AV| 无码人妻精品中文字幕免费东京热| 99久久精品国产一区二区三区| 精品动漫一区二区无遮挡 | 疯狂做爰XXXⅩ高潮69短| 美女高潮流白浆娇喘免费网站| 亚洲AV美国AV产亚洲AV图片| 粗大的内捧猛烈进出无码| 老熟女露脸内射正在播放| 亚洲VA中文字幕| 国产成人无码AV在线播放不卡| 人妻出轨无码AV| 一个吃我奶头两个舔我下面| 国产在视频线精品视频| 太大太长太粗太久太硬了| SEERX性欧美老妇| 免费毛片45分钟| 亚洲一码和欧洲二码的尺码区别 | 宝宝把腿抬起来靠墙上C| 老熟女@TUBEUMTV| 亚洲精品无码久久久久久| 国产免费无码一区二区视频 | 欧美 日韩 国产 成人 在线观看| 亚洲人成人无码.WWW石榴| 国产三级在线观看播放| 太太其实你也很想要的对吧 | 99精品国产福利在线观看| 教官在我腿间疯狂驰聘视频| 小宝贝下面的小嘴流水了| 东京热TOKYO综合久久精品| 人妻 中文无码 中出| 99国产精品99久久久久久| 老熟女高潮一区二区三区| 亚洲欧美另类在线观看| 好深好湿好硬顶到了好爽| 无码人妻丰满熟妇区BBBBXXXX| 丁香五月开心婷婷激情综合| 人人妻人人澡人人爽人人老司机| 99无码人妻一区二区三区免费| 毛茸茸的中国女BBW| 影音先锋亚洲成AⅤ人在| 久久精品饰品有限公司网站| 亚洲精品亚洲人成在线| 狠狠综合久久久久精品网站| 亚洲A∨精品无码一区二区| 国产精品女同久久久久电影院| 熟女精品视频一区二区三区| 丰满少妇XXXⅩBBBB视频| 撒尿PISSINGⅤIDEEO| 成人免费观看的A级毛片| 日本高清在线视频WWW色| 把腿张开让老子臊烂你的视频| 亲孑伦视频一区二区三区一| HD2LINODE日本成熟IP| 欧亚专线欧洲S码W MY| YW尤物AV无码点击进入福利| 漂亮人妻洗澡被公强BD| 阿娇被躁120分钟视频| 日本XXXX裸体XXXX自慰| 久久香蕉国产线看观看亚洲小说 | 亚洲AV之男人的天堂网站| 国产美女丝袜高潮白浆| 午夜亚洲WWW湿好大| 国产在线无遮挡免费观看| 亚洲H成年动漫在线观看网站| 娇小XXXXBXBⅨ黑人XX| 亚洲人成无码WWW久久久| 久久久久精品久久九九| 在线涩涩免费观看国产精品| 免费无码又黄又爽又刺激| A亚洲VA欧美VA国产综合| 日本成AⅤ人片日本伦| 芳芳好紧好滑好湿好爽| 无码AⅤ精品一区二区三区浪潮| 国产精品久久久久久超碰| 亚洲A∨无码一区二区| 精品国产一区二区三区久久久狼| 亚洲熟妇无码八V在线播放| 邻居少妇人妻HD高清大乳在线| 97久久欧美极品少妇XXXXⅩ| 日本丰满人妻熟妇BBBBB| 国产AV人人夜夜澡人人爽麻豆| 先锋中文字幕在线资源| 精品欧美一区二区三区久久久| 夜夜爽妓女8888视频免费观看 | 熟妇人交VIDEOS复古| 国产免费破外女真实出血视频| 亚洲国产精品一区二区制服| 久久综合久久鬼色| CHINA中国人CHINESE| 色翁荡息又大又硬又粗视频| 国产偷自一区二区三区| 亚洲日韩国产精品无码AV| 内射老妇女BBWXOGOD| 成人伊人亚洲人综合网站| 西西人体艺术图片| 久久天天躁拫拫躁夜夜AV| FREEZEFRAME丰满寡妇| 少妇无码人妻一区二区三区 | 欧美极品少妇XXXXⅩO69| 粉嫩Av网站在线观看| 亚洲AV无码一区二区三区DV| 久久婷婷五月综合色奶水99啪| av一区二区三区| 玩弄老太婆BBW视频| 精品亚洲欧美无人区乱码| ASIAN高潮.颤抖.抽搐BL| 少妇人妻AV无码专区| 激情内射人妻1区2区3区| 18禁黄无遮挡网站免费高清| 色婷婷婷亚洲综合丁香五月| 国内精品国产三级国产AV| 自拍日韩亚洲一区在线| 手机看片AV无码永久免费| 精品精品国产高清A级毛片| 97热久久免费频精品99| 无码精品人妻一区二区三区涩爱 | 久久久久夜色精品国产| 白嫩极品女粉嫩喷水视频的| 亚洲 都市 无码 校园 激情| 蜜乳一区在线视频| 国产成人精品亚洲精品| 艳妇乳肉豪妇荡乳XXX| 日韩精品一二三区| 精品久久久久久亚洲精品| W永久939W78W78W乳液| 亚洲AⅤ中文无码字幕色| 免费男同GAY片AV网站| 国产精品18久久久久久不卡| 影音先锋亚洲成AⅤ无码| 少妇人妻88久久中文字幕| 久久亚洲AV无码AV男人的天堂 | 97色精品视频在线观看| 无码人妻久久久一区二区三区 | 亚洲精品无码久久久久秋霞 | 与亲女洗澡时伦了| 欧洲精品不卡1卡2卡三卡| 久久国产乱子伦精品免费女人| 成人亚洲性情网站WWW在线观看 | 伊人久久精品亚洲午夜|