可視化WIFI遙控搬運(yùn)機(jī)器人之服務(wù)器搭建
發(fā)布時(shí)間:2015-02-23 責(zé)任編輯:sherryyu
【導(dǎo)讀】本設(shè)計(jì)主要研究基于WIFI網(wǎng)絡(luò)的可視化無線遙控搬運(yùn)機(jī)器人,利用WIFI網(wǎng)絡(luò)高速傳輸實(shí)時(shí)視頻圖像采集,通過機(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ò)的可視化無線遙控搬運(yùn)機(jī)器人,利用WIFI網(wǎng)絡(luò)高速傳輸實(shí)時(shí)視頻圖像采集,通過機(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)用程序編寫等方面來講述本設(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)核版本為Linux2.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來模擬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)制,通過調(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,通過調(diào)節(jié)PWM0和PWM1的占空比來控制伺服電機(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ǎng)卡采用RTL8188芯片,為使該設(shè)備能夠正常工作需要進(jìn)行驅(qū)動(dòng)程序移植。
①從RTL官網(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)上,故需要做如下修改:
說明目標(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ù)測量需要ADC驅(qū)動(dòng)的支持。由于系統(tǒng)中已含有該驅(qū)動(dòng),故只需要在編譯內(nèi)核時(shí)選擇上即可。
3.4 AP熱點(diǎn)搭建
3.4.1 AP熱點(diǎn)簡介
AP是(Wireless) Access Point的縮寫,即(無線)訪問接入點(diǎn)。無線設(shè)備可以通過它來接入到無線網(wǎng)絡(luò)。RTL8188支持AP熱點(diǎn)模式,采用這種方式可以讓機(jī)器人成為AP熱點(diǎn),然后用帶WIFI功能的設(shè)備來進(jìn)行連接。
3.4.2 Hostapd簡介
Hostapd即Host Access Point,其是Linux系統(tǒng)中無線訪問接入點(diǎn)的守護(hù)進(jìn)程。它可以將無線網(wǎng)卡設(shè)置為AP模式,并且支持多種加密方式,提供了設(shè)備接入的身份驗(yàn)證。在實(shí)際的使用期間,我們需要對(duì)其配置文件進(jìn)行相應(yīng)的修改。本設(shè)計(jì)中采用Hostapd來結(jié)合RTL8188網(wǎng)卡完成AP熱點(diǎn)的搭建。
[page]
3.4.3 DHCP簡介
DHCP(Dynamic Host Configuration Protocol)是一種動(dòng)態(tài)主機(jī)配置協(xié)議。它主要采用UDP協(xié)議來為接入到網(wǎng)絡(luò)中的設(shè)備分配IP地址以及進(jìn)行一些參數(shù)配置。本設(shè)計(jì)中通過配置其配置文件并啟用該服務(wù)來為接入機(jī)器人的WIFI設(shè)備分配IP地址,有效的避免了多個(gè)設(shè)備接入時(shí)的地址沖突問題。
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簡介
V4L2(即Video for linux 2)是Linux 內(nèi)核中針對(duì)UVC免驅(qū)視頻設(shè)備的編程框架,它提供了一系列通用的接口來實(shí)現(xiàn)Linux中對(duì)視頻設(shè)備的訪問,其編程模式如下:
圖 3-2 V4L2編程模式
Linux2.6.38內(nèi)核中自帶了該驅(qū)動(dòng),在使用時(shí)只需要在編譯內(nèi)核時(shí)將V4L2選項(xiàng)勾選上即可。
[page]
3.5.2 LIBJPEG簡介
Libjpeg是一個(gè)包含了JPEG圖像的編碼,解碼等功能的開源庫,其完全采用C語言來進(jìn)行編寫。
3.5.3 Mjpgstreamer簡介
MJPGstreamer是主要運(yùn)行在Linux系統(tǒng)上的一款運(yùn)用多線程技術(shù)的輕量級(jí)視頻服務(wù)器軟件。它是一款采用C語言進(jìn)行開發(fā)的開源軟件,其代碼簡潔,注釋清晰,組件功能明確,銜接清晰,可以移植到不同的計(jì)算機(jī)平臺(tái)。整個(gè)程序主要以模塊化的方法來進(jìn)行構(gòu)建,每個(gè)功能模塊又被稱為組件(plug-in),用戶可以根據(jù)自己的需要來選擇輸入組件和輸出組件。它可以實(shí)現(xiàn)從一個(gè)單一的輸入組件獲取到圖像數(shù)據(jù)來通過多個(gè)輸出組件將圖像進(jìn)行輸出[ ]。下圖為Mjpgstreamer的組件:
圖 3-3 MJPG-streamer組件
本設(shè)計(jì)選用input_uvc作為輸入組件來使用V4L2從攝像頭獲取圖像數(shù)據(jù),經(jīng)JPEG庫對(duì)數(shù)據(jù)進(jìn)行編碼之后,通過選用output_http作為輸出組件來輸出圖像數(shù)據(jù)。output_http組件實(shí)現(xiàn)了一個(gè)符合HTTP1.0標(biāo)準(zhǔn)的web服務(wù)器,用戶可以使用HTTP協(xié)議獲取視頻信息。
3.5.4 libjpeg移植
移植libjpeg庫主要是用于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í)庫存放的目錄,shared是編譯成動(dòng)態(tài)庫,static是編譯成靜態(tài)庫。
④修改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庫,存放于/root/h264/app/jpeg目錄下。
⑦將libjpeg庫移動(dòng)到目標(biāo)平臺(tái),完成libjpeg移植。
3.5.5 Mjpgstreamer移植
MJPGstreamer作為本設(shè)計(jì)中的視頻采集服務(wù)器,其移植過程如下:
①下載Mjpgstreamer源代碼,本設(shè)計(jì)采用mjpg-streamer-r63.tar.gz。
②解壓mjpg-streamer-r63.tar.gz,并進(jìn)入代碼根目錄。
③修改plugins/input_uvc/Makefile:
指定交叉編譯器:
CC = arm-linux-gcc
指定libjpeg庫:
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ù)器簡介
由于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ì)通過編寫CGI腳本來完成服務(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文件來配置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腳本簡介
圖 3-4 CGI程序應(yīng)用原理
3.7.2 命名管道簡介
命名管道是一種實(shí)現(xiàn)無關(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ì)控制命令簡單,因此客戶端與服務(wù)器間數(shù)據(jù)通訊主要采用HTTP GET方法,服務(wù)器CGI應(yīng)用程序可以在環(huán)境變量QUERY_STRING中獲取字符串形式的控制命令。本設(shè)計(jì)中采用“標(biāo)志+參數(shù)”的方式設(shè)置控制命令,單個(gè)命令字的總長度為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é)從客戶端獲得命令字然后通過命名管道將控制命令發(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ù)返回,否則就將命令字寫入到命名管道供服務(wù)程序來進(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);//打開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ù)程序通過命名管道通訊
/* 向管道寫入數(shù)據(jù) */
if((nwrite=write(cmd_fd,cmd,11))==-1)
fprintf(stdout, "write cmd failen");
close(cmd_fd);
/*讀取壓力值,并返回給客戶端*/
adc_fd=open("/dev/adc",0);//打開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ī)器人初始化,讀取電量值并將電量值通過LED來進(jìn)行提示,讀取命名管道獲得命令字并將其解析執(zhí)行。主要的流程圖如下:
圖 3-6 服務(wù)程序流程圖
如圖3-6所示,本設(shè)計(jì)中的服務(wù)程序采用多進(jìn)程程序設(shè)計(jì)方式,其子進(jìn)程每60S采集一次電源電量信息并更新電量指示燈顯示,主進(jìn)程采用阻塞讀的方式讀取命名管道來等待客戶端發(fā)送命令,獲得命令之后對(duì)命令進(jìn)行解析并調(diào)用驅(qū)動(dòng)程序來執(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ù)電量來用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頁面提供接口的一個(gè)腳本程序。它可以通過標(biāo)準(zhǔn)輸入(STDIN)來從WEB服務(wù)器獲得數(shù)據(jù),經(jīng)處理之后可以通過標(biāo)準(zhǔn)輸出(STDOUT)來將數(shù)據(jù)返回給WEB服務(wù)器,從而實(shí)現(xiàn)對(duì)客戶端數(shù)據(jù)的接收處理。本設(shè)計(jì)采用這種方式實(shí)現(xiàn)機(jī)器人控制命令的接收,以及返回機(jī)器人傳感器數(shù)據(jù)信息。CGI程序應(yīng)用原理如下圖所示:
特別推薦
- 兆易創(chuàng)新GD32F30x STL軟件測試庫獲得德國萊茵TüV IEC 61508功能安全認(rèn)證
- 芯科科技第三代無線開發(fā)平臺(tái)引領(lǐng)物聯(lián)網(wǎng)發(fā)展
- MSO 4B 示波器為工程師帶來更多臺(tái)式功率分析工具
- 艾為電子推出新一代高線性度GNSS低噪聲放大器——AW15745DNR
- 瑞薩發(fā)布四通道主站IC和傳感器信號(hào)調(diào)節(jié)器, 以推動(dòng)不斷增長的IO-Link市場
- e絡(luò)盟現(xiàn)貨供應(yīng) Abracon 新推出的 AOTA 系列微型鑄型電感器
- 加賀富儀艾電子推出支持Wi-Fi 6和藍(lán)牙的無線局域網(wǎng)/藍(lán)牙組合模塊
技術(shù)文章更多>>
- 數(shù)字驅(qū)動(dòng)工業(yè),智能賦能制造 AMTS & AHTE SOUTH CHINA 2024同期會(huì)議全公開!
- 團(tuán)體觀展招募!104CEF開啟組團(tuán)觀眾通道,解鎖更多禮遇
- 觸摸式OLED顯示屏有望重新定義汽車用戶界面
- 用Python自動(dòng)化雙脈沖測試
- 揭秘電動(dòng)汽車中直流鏈路電容器的奧秘(上)
技術(shù)白皮書下載更多>>
- 車規(guī)與基于V2X的車輛協(xié)同主動(dòng)避撞技術(shù)展望
- 數(shù)字隔離助力新能源汽車安全隔離的新挑戰(zhàn)
- 汽車模塊拋負(fù)載的解決方案
- 車用連接器的安全創(chuàng)新應(yīng)用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
電阻觸控屏
電阻器
電阻作用
調(diào)速開關(guān)
調(diào)諧器
鼎智
動(dòng)力電池
動(dòng)力控制
獨(dú)石電容
端子機(jī)
斷路器
斷路器型號(hào)
多層PCB
多諧振蕩器
扼流線圈
耳機(jī)
二極管
二極管符號(hào)
發(fā)光二極管
防靜電產(chǎn)品
防雷
防水連接器
仿真工具
放大器
分立器件
分頻器
風(fēng)力渦輪機(jī)
風(fēng)能
風(fēng)扇
風(fēng)速風(fēng)向儀