2014省機(jī)器人大賽相關(guān)文件集綿arduino教程_第1頁(yè)
2014省機(jī)器人大賽相關(guān)文件集綿arduino教程_第2頁(yè)
2014省機(jī)器人大賽相關(guān)文件集綿arduino教程_第3頁(yè)
2014省機(jī)器人大賽相關(guān)文件集綿arduino教程_第4頁(yè)
2014省機(jī)器人大賽相關(guān)文件集綿arduino教程_第5頁(yè)
已閱讀5頁(yè),還剩61頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

ArduinoLWZ一、Arduino編程語(yǔ) 2、常量 while語(yǔ)句和do…while語(yǔ) 運(yùn)算 函 數(shù)字I/O函 模擬I/O函 6、庫(kù)文件 二、Sabertooth電機(jī)驅(qū)動(dòng)模塊應(yīng)用實(shí) 1、工作模 Mode1:og Mode2:R/C Mode4:Packetized 2、應(yīng)用實(shí) PC軟件的編程思 、程序串 2同時(shí)控制小 三、TN901_TEST非接觸測(cè)溫模塊應(yīng)用實(shí) 1、TN901工作原 2、應(yīng)用實(shí) (2)溫度函 3、多個(gè)TN模塊的應(yīng)用實(shí) 四、氣體傳感器模塊應(yīng)用實(shí) 1、應(yīng)用實(shí) 五、火焰?zhèn)鞲衅髂K應(yīng)用實(shí) 1、應(yīng)用實(shí) PC軟件的編程思 七、舵機(jī)模塊應(yīng)用實(shí) 2、應(yīng)用實(shí) 八、綜合實(shí) 1、驅(qū)動(dòng)2臺(tái)舵機(jī)和電機(jī)的應(yīng)用實(shí) 2、測(cè)3個(gè)測(cè)溫度、驅(qū)動(dòng)電機(jī)的應(yīng)用實(shí) 3、測(cè)3個(gè)測(cè)溫度、驅(qū)動(dòng)2臺(tái)舵機(jī)和電機(jī)的應(yīng)用實(shí) 4、測(cè)2個(gè)氣體、2個(gè)火焰、3個(gè)測(cè)溫度、驅(qū)動(dòng)2臺(tái)舵機(jī)和電機(jī)的應(yīng)用實(shí) 5、尋線、測(cè)2個(gè)氣體、2個(gè)火焰、3個(gè)測(cè)溫度、驅(qū)動(dòng)2臺(tái)舵機(jī)和電機(jī)的應(yīng)用實(shí) 一、ArduinoArduino語(yǔ)言是建立在C/C++unsigned 或 :表示引腳的電平,HIGH=1表示高電平,LOW=0表示低電平INPUTOUTPUT:INPUT表示引腳輸入電平,OUTPUT 或false :true表示真、對(duì)、1,false表示假、錯(cuò)、0。注意:C語(yǔ)言區(qū)別大小寫字母。格式:if(條件為真 }if(a==2)b=4;if(a==2)注意:C語(yǔ)言用一個(gè)分號(hào); 例:if(a==1){ //當(dāng)變量a的值與1相等時(shí),執(zhí)行b=2,c=3 }if(a==2)b=2; //當(dāng)變量a的值與2相等時(shí),執(zhí)行b=2 //當(dāng)變量a的值與2不相等時(shí),執(zhí)行格式:for(初始值;循環(huán)條件;步進(jìn)語(yǔ)句){ for(i=1,b=0;i<=8;i++b++;初始化8b1i1循環(huán)內(nèi)容:{b++;}9i=9i<=8b++for(i=1,b=0;i<=5;i++)b++;初始化6i=6i<=5b++退出循環(huán)后,再執(zhí)行一次b++,因此最終b=6break continue語(yǔ)句:退出本次循環(huán),還會(huì)繼續(xù)后面的循環(huán)if(i=2) //i=2}if(i=2) //i=2}switchcase格式:switch(變量casecase2:}例:switch(a){ //當(dāng)變量a有多種情況時(shí)使用switchcase1: //當(dāng)a=1時(shí),執(zhí)行以下代碼 //switch語(yǔ)case //a=2時(shí),執(zhí)行以下 //switch語(yǔ)}格式:while(條件為真){ do }while(條件為真 } }while(i<1) 循環(huán)1次,結(jié)果i=1,b=1。=%自增 累積除+--與*<或-/>!非}例:void函數(shù)類型:void表示函數(shù)沒(méi)有返回值,intdigitalRead(pin):void void 例 //設(shè)置數(shù)字0號(hào)引腳為輸入模式 //1例 //設(shè)置數(shù)字0號(hào)引腳為高電平 intdigitalRead(pin):數(shù)字引腳的電平,函數(shù)結(jié)果為電平值,pin表示引腳號(hào)。例:a=digitalRead(0); //數(shù)字0號(hào)引腳電平,賦給變量a;b= intogRead(pin):模擬引腳的ADC值,函數(shù)結(jié)果為ADC值,pin表示引腳號(hào)。例:a=ogRead(0); //模擬0號(hào)引腳的ADC值,賦給變量a;b= ogRead(1); :延時(shí)函數(shù),單位是ms。2)delayMicroseconds(us):延時(shí)函數(shù),單位是us。min(x,y):求最小值。2)max(x,y):求最大值。3) 之間和fromHightoHigh之間。6)pow(base,exponent):開方函數(shù),baseexponent次方。7)sq(x):平方。int()sin(rad):正弦運(yùn)算,rad單位是弧度。2)cos(rad):余弦運(yùn)算,rad單位是弧度。3)tan(rad):正切運(yùn)算,rad單位是弧度。2)longrandom(max):隨機(jī)數(shù)函數(shù),返回?cái)?shù)據(jù)大于等于0,小于max。attachInterrupt(interrupt,mode)IO23,interrupt表示中斷口01,表示一個(gè)功能函數(shù),mode:LOW低電平中斷,CHANGE有變化就中斷,RISING上升沿中斷,F(xiàn)ALLING下降沿中斷。detachInterrupt(interrupt):中斷開關(guān),interrupt=1開,interrupt=0 noInterrupts():中斷Serialn.begin(speed):設(shè)置串口的波特率,speed9600,115200intSerialn.available():判斷串口的緩沖器是否收到數(shù)據(jù)。3)intSerialn.read() :串口收到的數(shù)據(jù)。4) :清空緩沖器。6)Serialn.println(data):串口輸出數(shù)注意:Serialn寫成Serial表示程序的串口,Serialn的n取值為電子積木的串口序號(hào)。 //設(shè)置程序的串口的波特率為9600 //設(shè)置COM1串口的波特率為9600 //設(shè)置COM2串口的波特率為:庫(kù)名 說(shuō) EEPROM讀寫程 LCD IO TWI/I2C LED LED二、Sabertooth2.1Sabertooth og轉(zhuǎn)。撥碼開關(guān)5處于DOWN則對(duì)模擬電壓的響應(yīng)是指數(shù)形式,處于UP則為線性形式。一般撥碼開關(guān)5處于UP,電機(jī)轉(zhuǎn)速比較容易控制。撥碼開關(guān)6處于UP則模擬電壓值輸入范圍為0-5V2.5V2.5V是正轉(zhuǎn),并且電壓越大轉(zhuǎn)速越快;小于2.5V6DOWN1.875V-3.125V。對(duì)于5V的單片機(jī),撥碼開關(guān)6建議處于UP。對(duì)于3.3V的單片機(jī),撥碼開關(guān)6只能處于DOWN。2.2Mode1單片機(jī)輸出經(jīng)過(guò)RC濾波器變成一個(gè)模擬電壓值傳給Sabertooth。建議頻率高于1000HZ。輸出連接到Sabertooth的S1接口則控制Motor1,連接到S2接口則控制2.3SabertoothMode2:R/CMode3:Simplified12UPDOWNMode345設(shè)置串2.4Mode36UP則單機(jī)模式,只2.4Mode38位數(shù)據(jù)位、無(wú)校驗(yàn)、1位停止位。SabertoothMode3是單字節(jié)串口通信模式,S1接口是串口接收端,S2接口是模塊片選端。單字節(jié)Motor2,128是全速反轉(zhuǎn),192是停止,255是全速正轉(zhuǎn);0Motor1和Motor2都停止。2.5SabertoothMode4:Packetized12DOWNMode44、56設(shè)置多機(jī)通信中從機(jī)的地址,具體看圖2.6Mode4的撥碼開關(guān)設(shè)置。2.6Mode49600波特率、8位數(shù)據(jù)位、無(wú)校驗(yàn)、1位停止位。Sabertooth的串口是TTL電平,對(duì)于連接到電腦需要外接RS-232。命令,參數(shù),校驗(yàn)。第二字節(jié)是地址,就是撥碼開關(guān)的對(duì)應(yīng)的Address值。15表示波特率設(shè)置:參數(shù)=1,波特率為參數(shù)=2,波特率為9600;參數(shù)=3,波特率為19200;2.6SabertoothCOMPC軟件傳過(guò)來(lái)的的控制小車運(yùn)動(dòng)命令。Sabertooth模塊連接到電子積木的COM1接口,處于工作模式Mode4:Packetizedserial,地址為130。Motor1連接小車前進(jìn)方向左側(cè)的兩臺(tái)電機(jī),Motor2Motor1Motor22.7Sabertooth{//控制電機(jī)1Serial1.print(130,BYTE);地址=130 //命令=0,Motor1 //效驗(yàn)=(130+0+0)&0x7F=130&0x7F=2delay(5);//延時(shí)5ms//控制電機(jī)2Serial1.print(130,BYTE);地址=130 //命令=4,Motor2 //效驗(yàn)=(130+4+0)&0x7F=134&0x7F=6}{char //控制電機(jī)1Serial1.print(130,BYTE);地址=130 //命令=0,Motor1 i=i&0x7F; //控制電機(jī)2Serial1.print(130,BYTE);地址=130 //命令=4,Motor2 i=i&0x7F; }{char //控制電機(jī)1Serial1.print(130,BYTE);地址=130 //命令=1,Motor1 i=i&0x7F; //控制電機(jī)2Serial1.print(130,BYTE);地址=130 //命令=5,Motor2 i=i&0x7F; },Motor2{char //控制電機(jī)1Serial1.print(130,BYTE);地址=130 //命令=0,Motor1正轉(zhuǎn) //參數(shù)=s,速度=s i=i&0x7F; //控制電機(jī)2Serial1.print(130,BYTE);地址=130 //命令=5,Motor2 i=i&0x7F; },Motor2voidturn_Lcharsvoidturn_L,參數(shù)chars{char //控制電機(jī)1Serial1.print(130,BYTE);地址=130 //命令=1,Motor1 i=i& delay(5);//延時(shí)5ms//控制電機(jī)2Serial1.print(130,BYTE);地址=130 //命令=4,Motor2 i=i&0x7F; }的調(diào)用。因此,上面定義了六個(gè)控制小車運(yùn)動(dòng)的函數(shù)(停止motor_stop、前進(jìn)advance、后退back_off、右轉(zhuǎn)turn_R、左轉(zhuǎn)turn_L。下面再講如何調(diào)用這些函數(shù)實(shí)現(xiàn)控制小車的運(yùn)動(dòng)。Sabertooth模塊。電子積木的初始化內(nèi)容只能放在函數(shù)setup()。由于用到串口COM連接PC、串口COM1連接Sabertooth模塊,所以需要對(duì)它void{ //連接Sabertooth模塊的串口COM1的波特率為9600 //程序的串口COM的波特率為9600 //延時(shí)1000msSerial1.print(170,BYTE);//Sabertooth模塊的初始化,其第一個(gè)字節(jié)必須是170 }【2】串口的確有接收到數(shù)據(jù)時(shí),再使用Serial.read(),并保存于變量val中,第1個(gè)字節(jié)是控制小車運(yùn)動(dòng)令。Serial.availableSerial.read()讀取數(shù)據(jù),并更新速度值(變量speed。①②③④void{charspeed; intval; //速度默認(rèn)值為 if(Serial.available())//①Serial.available()表示判斷串口COM是否接收到 //ifval=Serial.read();//②串行COM的數(shù)據(jù),控制小車運(yùn)動(dòng) //命令有多種情況,因而使用switch switchcase'W': advance(speed); //前進(jìn),速度為speed case'S': back_off(speed); //后退,速度為speed //控制后退的時(shí)間200ms case'A': //左轉(zhuǎn),速度為speed case'D': //右轉(zhuǎn),速度為speed case'L': case while(Serial.available()==0){}//③while循環(huán),強(qiáng)制要求接收第二個(gè)數(shù)據(jù),此數(shù)據(jù)為speed= switch //if }控制小車運(yùn)動(dòng)的鍵盤按鍵:前進(jìn)T、后退G、左轉(zhuǎn)F、右轉(zhuǎn)H、停止K、速度+、速度-這必須與電子積木程序的switch語(yǔ)句各種情況一一對(duì)應(yīng)。鍵盤按下T,則向串口發(fā)送字符W,電子積木在switch判斷出第一種情況,令小車前進(jìn)一下。GSswitch判斷出第二種情況,令小車后退一下。鍵FAswitch判斷出第三種情況,令小車左轉(zhuǎn)一下。鍵盤按下H,則向串口發(fā)送字符D,電子積木在switch判斷出第四種情況,令小車右轉(zhuǎn)一下。鍵盤按下K,則向串口發(fā)送字符L,電子積木在switch判斷出第五種情況,令小車停止。+(speed增加)-(speed減小)Mspeed,電子積木在switch判斷出第六種情況,設(shè)置小車速度。延時(shí)200ms的函數(shù),最后執(zhí)行停止函數(shù)。advance(speed); //前進(jìn),速度為speed 將loop函數(shù)中黃色底紋的語(yǔ)句或刪除。的方法很簡(jiǎn)單,在語(yǔ)句最前加“//”。voidloop(){charspeed; intval; //速度默認(rèn)值為 if(Serial.available())//①Serial.available()表示判斷串口COM是否接收到 //ifval=Serial.read();//②串行COM的數(shù)據(jù),控制小車運(yùn)動(dòng) //命令有多種情況,因而使用switch switchcase'W': advance(speed); //前進(jìn),速度為speed case'S': back_off(speed); //后退,速度為speed case'A': //左轉(zhuǎn),速度為speed case'D': //右轉(zhuǎn),速度為speed case'L': case while(Serial.available()==0){}//③while循環(huán),強(qiáng)制要求接收第二個(gè)數(shù)據(jù),此數(shù)據(jù)為speed=Serial.read(); switch //if }無(wú)線數(shù)傳模塊的通信協(xié)議:9600,N,8,1。PC程序通過(guò)無(wú)線數(shù)傳模塊控制小車。可參看實(shí)例Arduino2_3.pde。Arduino2_1.pde基礎(chǔ)上,添加無(wú)線數(shù)傳模塊,并連接到電子積木的串口COM2。注意選用足夠大功率的供電電源。因此,只需將實(shí)例Arduino2_1.pdeSerialSerial25處。void{ //連接Sabertooth模塊的串口COM1的波特率為9600 //連接無(wú)線數(shù)傳模塊的串口COM2的波特率為9600 Serial1.print(170,BYTE);//Sabertooth模塊的初始化,其第一個(gè)字節(jié)必須是170 }void{charspeed; intval; ))// //ifval=Serial2.read();//②串行COM的數(shù)據(jù),控制小車運(yùn)動(dòng) switchcase'W': advance(speed); //前進(jìn),速度為speed case'S': back_off(speed); //后退,速度為speed //控制后退的時(shí)間200ms case'A': //左轉(zhuǎn),速度為speed case'D': //右轉(zhuǎn),速度為speed case'L': case while(Serial2.available()==0){}//③while循環(huán),強(qiáng)制要求接收第二個(gè)數(shù)據(jù),此數(shù)據(jù)為speed=Serial2.read(); switch //if }實(shí)例Arduino2_1.pde是使用程序的串口COM通信控制小車的運(yùn)動(dòng);實(shí)例Arduino2_3.pdeCOM2通信控制小車的運(yùn)動(dòng)。現(xiàn)在只需合并兩個(gè)由于COM和COM2的作用在本實(shí)例中是一樣的。它們是關(guān)系,因此,一個(gè)一個(gè)地執(zhí)行——這里先執(zhí)行COM程序的if(Serial.available()){},再執(zhí)行COM2程序if(Serial2.available()){}。由于它們作用一樣,所以這兩個(gè)大括號(hào)里面的內(nèi)容是一樣的,只是Serial與Serial2有區(qū)別??蓞⒖磳?shí)例Arduino2_4.pde。程序的流程圖如下:COMCOM2void{ //程序的串口COM的波特率為9600 //連接Sabertooth模塊的串口COM1的波特率為9600 //連接無(wú)線數(shù)傳模塊的串口COM2的波特率為9600 Serial1.print(170,BYTE);//Sabertooth模塊的初始化,其第一個(gè)字節(jié)必須是170 }void{charspeed; intval; if(Serial.available())//①Serial.available()表示判斷串口COM是否接收到 //ifval=Serial.read();//②串行COM的數(shù)據(jù),控制小車運(yùn)動(dòng) switchcase'W': advance(speed); //前進(jìn),速度為speed case'S': back_off(speed); //后退,速度為speed //控制后退的時(shí)間200ms case'A': //左轉(zhuǎn),速度為speed case'D': //右轉(zhuǎn),速度為speed case'L': case speed=Serial.read(); switch //if))// //ifval=Serial2.read();//②串行COM的數(shù)據(jù),控制小車運(yùn)動(dòng) switchcase'W': advance(speed); //前進(jìn),速度為speed case'S': back_off(speed); //后退,速度為speed //控制后退的時(shí)間200ms case'A': //左轉(zhuǎn),速度為speed case'D': //右轉(zhuǎn),速度為speed case'L': case while(Serial2.available()==0){}//③while循環(huán),強(qiáng)制要求接收第二個(gè)數(shù)據(jù),此數(shù)據(jù)為speed=Serial2.read(); switch //if }三、TN901_TEST3.1TN引腳:D是數(shù)據(jù)引腳,C是時(shí)鐘引腳(TN輸出時(shí)鐘A是模塊片選引腳(低電平為選中,高電平為不選中第1字節(jié)Item:Item=0x4C,表示物體溫度;Item=0x66,表示Ambiamt第2字節(jié)MSB:溫度字節(jié);4Sum:Sum=(Item+MSB+LSB)&0xFF;第5字節(jié)CR:CR=0x0D1:物體溫度Item=0x4C,MSB=0x14,LSB=0x2A,Sum=(0x4C+0x14+0x2A)&0xFF=0x8A&0xFF=0x8A,溫度值=0x142A/16-273.15=49.475例2:Ambiamt溫度Item=0x66,MSB=0x12,LSB=0xC3Sum=(0x66+0x12+0xC3)&0xFF=0x13B&0xFF=0x3B,CR=0x0D。溫度值=0x12C3/16-273.15=27.03#defineClockPin16//TN_C引腳#defineDataPin17//TN_D引腳#defineTestPin18//TN_A引腳首先TN_A=0,模塊處于被選狀態(tài)。此時(shí),TN_C引腳才輸出,TN_D引腳才輸出值。電子積木需要讀出這兩根引腳的電平來(lái)溫度值。以下是根據(jù)圖3.2TN模塊SPI時(shí)序編非選中狀態(tài),TN_C停止輸出時(shí)鐘。voiddata_read(int*p)//void表示函數(shù)無(wú)結(jié)果,函數(shù)名稱data_read,int*p保存的5個(gè)字{intdigitalWrite(TestPin1,LOW); { //每個(gè)字節(jié)占8位,即8個(gè)時(shí){PinState= //延時(shí)100usPinState=digitalRead(DataPin1); if(1== tempData(tempData<<1&0xfe)+1;當(dāng)TN_D=高電平,左移1位并+1tempData=(tempData<<1&0xfe); PinState= }while(PinState!= //如果TN_C=低電平,繼}*p } //TN_A=1,不選中模塊,模塊停止輸出時(shí)}void{ //TN_A引腳輸入狀態(tài)digitalWrite(TestPin1,HIGH); //TN_A=1,非選中TN模塊 }void{intdata_buf[5 //保存讀出TN模塊的5inttempData //while的循環(huán)條件為1,即都循環(huán){}里的內(nèi) //while循環(huán) tempData=data_buf[1]<<8+data_buf[2]; //tempData=MSB<<8+LSB=MSB*256+LSBfloatrealTemp=(float)tempData/16-273.15;//轉(zhuǎn)換成溫度值,單位是攝氏度 通過(guò)串口 //while循環(huán)}TNC、DA678TNC、DA9、10116789void{ //TN1號(hào)模 digitalWrite(TestPin1,HIGH); //TN2號(hào)模 digitalWrite(TestPin2,HIGH); //TN3號(hào)模 digitalWrite(TestPin3,HIGH); }Arduino3_1.pdeTN模塊,可以為每個(gè)模塊寫一個(gè)獨(dú)kiinti可參看實(shí)例Arduino3_2.pde。//int*p保存的5個(gè)字節(jié),ClockPin是TN_C,DataPin是TN_D,TestPin是voiddata_read(int*p,intClockPin,intDataPin,int{intdigitalWrite(TestPin,LOW); { //每個(gè)字節(jié)占8位,即8個(gè)時(shí){PinState= PinState=digitalRead(DataPin); if(1== tempData(tempData<<1&0xfe)+1;當(dāng)TN_D=高電平,左移1位并+1tempData=(tempData<<1&0xfe); PinState= }while(PinState!= //如果TN_C=低電平,繼}*p } //TN_A=1,不選中模塊,模塊停止輸出時(shí)}void{intdata_buf[5 //保存讀出TN模塊的5inttempData=0; floatrealTemp; //while的循環(huán)條件為1,即都循環(huán){}里的內(nèi) //while循環(huán)//TN1號(hào)模data_read(data_buf,ClockPin1,DataPin1,TestPin1);//溫度值,并保存于數(shù)組data_buf中tempData=data_buf[1]<<8+data_buf[2]; //tempData=MSB<<8+LSB=MSB*256+LSBrealTemp=(float)tempData/16-273.15; //TN2號(hào)模data_read(data_buf,ClockPin2,DataPin2,TestPin2);//溫度值,并保存于數(shù)組data_buf中tempData=data_buf[1]<<8+data_buf[2]; //tempData=MSB<<8+LSB=MSB*256+LSBrealTemp=(float)tempData/16-273.15; //TN3號(hào)模data_read(data_buf,ClockPin3,DataPin3,TestPin3);//溫度值,并保存于數(shù)組data_buf中tempData=data_buf[1]<<8+data_buf[2]; //tempData=MSB<<8+LSB=MSB*256+LSBrealTemp=(float)tempData/16-273.15; //while循環(huán)}與實(shí)例Arduino3_2.pde相比,此實(shí)例中每個(gè)TN模塊擁有一個(gè)獨(dú)立溫度的函數(shù)??蓞⒖磳?shí)例Arduino3_3.pde。//TN1模voiddata_read1(int*p)//void表示函數(shù)無(wú)結(jié)果,函數(shù)名稱data_read1,int*p保存的5個(gè)字{intdigitalWrite(TestPin1,LOW); { //每個(gè)字節(jié)占8位,即8個(gè)時(shí){PinState= //延時(shí)100usPinState=digitalRead(DataPin1); if(1== tempData(tempData<<1&0xfe)+1;當(dāng)TN_D=高電平,左移1位并+1tempData=(tempData<<1&0xfe); PinState= }while(PinState!= //如果TN_C=低電平,繼}*p } //TN_A=1,不選中模塊,模塊停止輸出時(shí)}//TN2號(hào)模voiddata_read2(int*p)//void表示函數(shù)無(wú)結(jié)果,函數(shù)名稱data_read1,int*p保存的5個(gè)字{intdigitalWrite(TestPin2,LOW); { //每個(gè)字節(jié)占8位,即8個(gè)時(shí){PinState= //延時(shí)100usPinState=digitalRead(DataPin2); if(1== tempData(tempData<<1&0xfe)+1;當(dāng)TN_D=高電平,左移1位并+1tempData=(tempData<<1&0xfe); PinState= }while(PinState!= //如果TN_C=低電平,繼}*p } //TN_A=1,不選中模塊,模塊停止輸出時(shí)}//TN3號(hào)模voiddata_read3(int*p)//void表示函數(shù)無(wú)結(jié)果,函數(shù)名稱data_read1,int*p保存的5個(gè)字{intdigitalWrite(TestPin3,LOW); { //每個(gè)字節(jié)占8位,即8個(gè)時(shí){PinState= //延時(shí)100usPinState=digitalRead(DataPin3); if(1== tempData(tempData<<1&0xfe)+1;當(dāng)TN_D=高電平,左移1位并tempData=(tempData<<1&0xfe); PinState= }while(PinState!= //如果TN_C=低電平,繼}*p } //TN_A=1,不選中模塊,模塊停止輸出時(shí)}void{intdata_buf[5 //保存讀出TN模塊的5inttempData=0; floatrealTemp; //while的循環(huán)條件為1,即都循環(huán){}里的內(nèi) //while循環(huán)//TN1號(hào)模 tempData=data_buf[1]<<8+data_buf[2]; //tempData=MSB<<8+LSB=MSB*256+LSBrealTemp=(float)tempData/16-273.15; //TN2號(hào)模 tempData=data_buf[1]<<8+data_buf[2]; //tempData=MSB<<8+LSB=MSB*256+LSBrealTemp=(float)tempData/16-273.15; //TN3號(hào)模 tempData=data_buf[1]<<8+data_buf[2]; //tempData=MSB<<8+LSB=MSB*256+LSBrealTemp=(float)tempData/16-273.15; //while循環(huán)}void{ 串 的波特率為}void{intval;{ 以十進(jìn)制形式發(fā)送模擬值,并發(fā)送回車換 //延時(shí)}}void{ 串 的波特率為}void{intval;{ 以十進(jìn)制DEC形式發(fā)送模擬值,并發(fā)送回車換 以十進(jìn)制DEC形式發(fā)送模擬值,并發(fā)送回車換 //延時(shí)}}5.1void{ //串口COM的波特率為pinMode(1 //數(shù)字引腳1輸}void{intval;{ //火焰?zhèn)鞲衅鬏敵瞿M //通過(guò)串口COM發(fā)送回PC if(val<600)digitalWrite(1,HIGH);//如果模擬值<600,則數(shù)字引腳1輸出高電平elsedigitalWrite(1,LOW); //否則數(shù)字引腳1輸出低電平 //}}void{ //串口COM的波特率為}void{intval;{ //1號(hào)火焰?zhèn)鞲衅鬏敵瞿M //通過(guò)串口COM發(fā)送回 //以十進(jìn)制形式發(fā)送模擬值,并發(fā)送回車換 //2號(hào)火焰?zhèn)鞲衅鬏敵瞿M信 //通過(guò)串口COM發(fā)送回 //以十進(jìn)制形式發(fā)送模擬值,并發(fā)送回車換 //}}六、DF-miniLTV3DF-miniLTV3尋線模塊工作電源+5V,是根據(jù)紅外線對(duì)反射原理(深色反射弱,淺色反射強(qiáng))1cm1電機(jī)。尋線傳感器連接到電子積木的數(shù)字引腳3、4和5??蓞⒖磳?shí)例Arduino6_1.pde。intIRR=3;//定義右側(cè)尋線傳感器接口intIRM=4;//定義中間尋線傳感器接口intIRL=5;//定義左側(cè)尋線傳感器接口void{ //連接Sabertooth模塊的串口COM1的波特率為9600 //延時(shí)1000msSerial1.print(170,BYTE);//Sabertooth模塊的初始化,其第一個(gè)字節(jié)必須是170 pinMode(IRR,INPUT);//設(shè)置右側(cè)尋線傳感器接口輸入pinMode(IRM,INPUT);//設(shè)置中間尋線傳感器接口輸入pinMode(IRL,INPUT);//設(shè)置左側(cè)尋線傳感器接口輸入}void{intchar { //右側(cè)尋線傳感器接口電平 if(l==HIGH&&m==LOW&&r==HIGH) advance elseif(l==LOW&&m==HIGH&&r==HIGH) //左轉(zhuǎn),速度為speedelseif(l==HIGH&&m==HIGH&&r==LOW) //右轉(zhuǎn),速度為speed }}【4】 ,三個(gè)尋線模塊安裝太近,能同時(shí)對(duì)著黑線【5】l=m=LOW,r=HIGH,左中尋線模塊安裝太近,能同時(shí)對(duì)著黑【6】l=r=LOW,m=HIGH,左右尋線模塊安裝太近,能同時(shí)對(duì)著黑【7】m=r=LOW,l=HIGH,右中尋線模塊安裝太近,能同時(shí)對(duì)著黑 Arduino6_1.pde的(1(2)一樣。void{ //程序的串口COM的波特率為9600 //連接Sabertooth模塊的串口COM1的波特率為9600 //延時(shí)1000msSerial1.print(170,BYTE);//Sabertooth模塊的初始化,其第一個(gè)字節(jié)必須是170 pinMode(IRR,INPUT);設(shè)置右側(cè)尋線傳感器接口輸入pinMode(IRM,INPUT);//設(shè)置中間尋線傳感器接口輸入pinMode(IRL,INPUT);//設(shè)置左側(cè)尋線傳感器接口輸入}void{intval;char //isIR=1啟動(dòng)尋線,isIR=0charspeed;//小車的運(yùn)動(dòng)速度speed=64;//速度默認(rèn)值為64{ if(l==HIGH&&m==LOW&&r==HIGH) advance elseif(l==LOW&&m==HIGH&& //符合情況【3 elseif(l==HIGH&&m==HIGH&& if(Serial.available())//Serial.available()COM //if //串行COM的數(shù)據(jù),控制小車運(yùn)動(dòng) //switch switchcase val= if(val=='1') //如果第二個(gè)數(shù)據(jù)為1 switch //if //while}ZP1(=0x31,電子積木在switch判斷出第七種情況,0(=0x30位置是靠控制(脈沖寬度調(diào)制)信號(hào)的占空比來(lái)實(shí)現(xiàn)的。標(biāo)準(zhǔn)信號(hào)的周期固定20ms0.5~2.5ms的正脈沖寬度和舵機(jī)的轉(zhuǎn)角-90度~+90度相對(duì)應(yīng)。舵機(jī)轉(zhuǎn)動(dòng)時(shí)電要接到外部供電。USB供電已經(jīng)不足夠了。舵機(jī)根據(jù)控制信號(hào)腳上不同占空比的,會(huì)旋轉(zhuǎn)到固定角度。如果這個(gè)的占空比存在微小變化,舵機(jī)在固定角度左右微小抖動(dòng);如果這個(gè)存在較大變化(周期不固定或者占空比不固定7.1Arduino提供了一個(gè)很好的舵機(jī)調(diào)用函數(shù)庫(kù),可以讓Arduino任意IO口控制舵機(jī)??蓞⒖磳?shí)例Arduino7_1.pde。最后用sevon.write(w)控制轉(zhuǎn)動(dòng)角度w。#include<Servo.h>//舵機(jī)庫(kù)頭文件Servoservo1; //1號(hào)舵機(jī)Servo Servo void{ servo2.attach(16);//2號(hào)舵機(jī)使用16號(hào)引servo3.attach(17);//3號(hào)舵機(jī)使用17號(hào)引}void{staticintcharch=Serial.read();//COM的數(shù)據(jù)case //ASCII碼轉(zhuǎn)成數(shù)字,再case //數(shù)據(jù)后帶a1 case //數(shù)據(jù)后帶b2 case //數(shù)據(jù)后帶c3 }例如:電子積木收到串口數(shù)據(jù):85a18590b2900~180-90~+90非庫(kù)形式產(chǎn)生周期為20ms的,主要放在loop函數(shù),利用循環(huán)改變引腳電平來(lái)實(shí)現(xiàn)的??蓞⒖磳?shí)例Arduino7_2.pde。如果loop函數(shù)還有其它地方消耗時(shí)間,這非常影響到的周期和占空比,特別是這種消耗時(shí)間還是不固定的。這樣對(duì)舵機(jī)產(chǎn)生影響了。1:loop(){servopulse(sp1,sa1,sp2,sa2);}servopulse20ms的方波。特別注意,串口命令會(huì)消耗一些時(shí)間,令程序產(chǎn)生周期大于20ms的。因此,1、2、3、4號(hào)舵機(jī)分別連接到電子積木的數(shù)字引腳、、、。注意選用足夠大功servopin1=15;//定義舵機(jī)接口數(shù)字servopin2=16;//定義舵機(jī)接口數(shù)字servopin3=17;//定義舵機(jī)接口數(shù)字servopin4=18;//定義舵機(jī)接口數(shù)字sp1、sa11號(hào)舵機(jī)的數(shù)字引腳、角度級(jí)別。sp2、sa22號(hào)舵機(jī)的數(shù)字引腳、角度級(jí)別。sp3、sa33號(hào)舵機(jī)的數(shù)字引腳、角度級(jí)別。sp4、sa44號(hào)舵機(jī)的數(shù)字引腳、角度級(jí)別。這里將角度180度劃分為10級(jí),級(jí)別分別為0-9。首先,引腳spn輸出高電平delayMicroseconds(220)spndigitalWrite(spn,LOW)。驅(qū)動(dòng)2臺(tái)舵機(jī)的函數(shù):voidservopulse(intsp1,intsa1,intsp2,intsa2)//定義一個(gè)脈沖函{char //1號(hào)舵機(jī)接口電平至 //2號(hào)舵機(jī)接口電平至 // //1.98ms的脈 if(j==sa1)digitalWrite(sp1,LOW);//1號(hào)舵機(jī)接口電平至if(j==sa2)digitalWrite(sp2,LOW);//2號(hào)舵機(jī)接口電平至} // //}voidservopulse(intsp1,intsa1,intsp2,intsa2,intsp3,int{char //1號(hào)舵機(jī)接口電平至 //2號(hào)舵機(jī)接口電平至 //3號(hào)舵機(jī)接口電平至 // //1.98ms的脈 if(j==sa1)digitalWrite(sp1,LOW);//1號(hào)舵機(jī)接口電平至if(j==sa2)digitalWrite(sp2,LOW);//2號(hào)舵機(jī)接口電平至if(j==sa3)if(j==sa3)digitalWrite(sp3,LOW);//3號(hào)舵機(jī)接口電平至} // //}voidservopulse(intsp1,intsa1,intsp2,intsa2,intsp3,intsa3,intsp4,int{char //1號(hào)舵機(jī)接口電平至 //2號(hào)舵機(jī)接口電平至 // //1.98ms

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論