<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 雪犁機(jī)器人的設(shè)計(jì)與實(shí)施

          雪犁機(jī)器人的設(shè)計(jì)與實(shí)施

          作者: 時(shí)間:2023-08-30 來源:電子產(chǎn)品世界 收藏

          就在幾周前,我們?cè)谶@個(gè)博客中展示了電動(dòng)掃雪機(jī)的制造商版本,類似于許多小商店里的那種。事實(shí)上,我們的是一種特殊的履帶,是傳統(tǒng)掃雪機(jī)的縮小版,但可以通過索尼PS2控制器輕松進(jìn)行無線電控制。在第一篇文章中,我們描述了該項(xiàng)目的硬件,即機(jī)械和電子控制器,并解釋說它完全基于Arduino Uno。在這篇文章中,我們將描述要加載到Arduino上的固件,以執(zhí)行所有所需的功能,操作驅(qū)動(dòng)電機(jī),控制刀片,并根據(jù)通過無線電接收的命令打開/關(guān)閉前投影儀。

          本文引用地址:http://www.ex-cimer.com/article/202308/450054.htm

          snow

          簡(jiǎn)要概述

          掃雪機(jī)的電氣和電子部分基于Arduino Uno Rev.3,它擁有三個(gè)護(hù)罩和與這些卡的接口:

          PCBWAY

          電機(jī)驅(qū)動(dòng)器DRI0018;

          繼電器電路RELAY1CH;

          DC/DC轉(zhuǎn)換器升壓STEPUP30VADJ。

          安裝在Arduino上的防護(hù)罩是控制三個(gè)線性電機(jī)的電機(jī)防護(hù)罩,用于管理刀片的移動(dòng),以及允許您與控制臺(tái)PlayStation 2(PS2)接口的PS2SHIELD;后一種屏蔽要求通過將其插入連接器來安裝RX-PS2,它是一個(gè)2.4 GHz的無線電接收器,用于接收來自上述控制臺(tái)的特定命令。

          電路中使用的所有電路板和元件都可以在我們的商店購(gòu)買。電源由兩個(gè)7.2 Ah的鉛凝膠電池組成:我們?cè)趦烧叩闹悬c(diǎn)取12伏,而在該系列的負(fù)極和正極之間取24伏。

          使用12伏電壓,我們?yōu)锳rduino供電,Arduino將通過其引腳條為屏蔽的邏輯供電;LED(內(nèi)部配備限制電阻器)將指示Arduino何時(shí)開啟。

          12伏電壓也用于馬達(dá)護(hù)罩的電源部分;事實(shí)上,考慮到三個(gè)線性執(zhí)行器的高吸收,直接從Arduino獲得12V是不明智的:您必須選擇將外部電源連接到適當(dāng)?shù)亩俗覲WR。

          每個(gè)線性致動(dòng)器由一個(gè)12 Vdc的齒輪電機(jī)組成,該電機(jī)使用蝸桿沿其長(zhǎng)度來回移動(dòng)軸(最大偏移5 cm)。致動(dòng)器的動(dòng)態(tài)負(fù)載為50 kg,最大速度為1.3 cm/s。在不移動(dòng)時(shí),它最多可支撐約250公斤,扭矩螺釘確保即使在沒有動(dòng)力的情況下也能保持軸的位置。

          當(dāng)發(fā)動(dòng)機(jī)達(dá)到最大伸展和收縮時(shí),兩個(gè)限位開關(guān)會(huì)停止發(fā)動(dòng)機(jī),而二極管在達(dá)到極限點(diǎn)后允許反向。執(zhí)行機(jī)構(gòu)由金屬制成,并進(jìn)行密封,以防止灰塵和水進(jìn)入,這是在雪地中操作的強(qiáng)制性條件。

          24V電源線用于為掃雪機(jī)的部分供電,即牽引和投影(可選)部分:第一部分基于電源電機(jī)驅(qū)動(dòng)器DRI0018,用四根電線連接到相應(yīng)的Arduino數(shù)字線。模塊的輸出端子連接用于牽引的兩個(gè)24伏馬達(dá)。

          除了發(fā)動(dòng)機(jī)控制器外,24伏還為L(zhǎng)ED投影儀的部分供電,無論您是否安裝,其照明都會(huì)根據(jù)我們掃雪機(jī)電子設(shè)備中的光刻膠檢測(cè)到的環(huán)境照明條件進(jìn)行調(diào)整。

          投影儀設(shè)計(jì)為在220 Vac下工作,然而,由于上沒有此電壓,為了避免使用逆變器,我們對(duì)投影儀進(jìn)行了修改,打開投影儀,移除AC/DC,并將電源LED的兩根電線連接到DC/DC轉(zhuǎn)換器(代碼:STEPUP30VADJ);后者是一個(gè)開關(guān)可調(diào)輸出電壓調(diào)節(jié)器,應(yīng)該對(duì)其進(jìn)行調(diào)諧,以提供合適的電流,使LED在大約10瓦的功率下工作。

          從遙控器接收數(shù)據(jù)是分配給屏蔽PS2SHIELD的任務(wù),為此,制造商提供了我們?cè)贏rduino草圖中集成的特定庫(kù)。屏蔽執(zhí)行命令接收和解碼;2.4GHz無線電單獨(dú)提供(RX_PS2),必須插入屏蔽的連接中。

          // Sketch Open Source Snow Plow Robot 
          // by Vittorio Loschiavo
          
           
          #include <Shield_PS2.h>
          
          //declare class objects
          PS2 ps2=PS2();                    //PS2 class object: ps2
          
          int FOTORES = A0;    
          int RELAY = 13;      
          int sensorValue = 0;  
          
          int ALZAPALA = 12;      
          int ONALZAPALA = 11;    
          int RUOTAPALA = 2;       
          int ONRUOTAPALA = 3;     
          
          int E1 = 5;  //MOTORE 1 SPEED CONTROL M1_PWM
          int E2 = 6;  //MOTORE 2 SPEED CONTROL M2_PWM
          int M1 = 4;  //MOTORE 1 DIRECTION CONTROL M1_EN
          int M2 = 7;  //MOTORE 2 DIRECTION CONTROL M2_EN
          
          int counter=0;
          int stato=0;
          int val=0;
          int velo=0;
          int motori=0;
          
          void setup()
          {
            Serial.begin(9600);
             ps2.init(9600, 8, 9);   //initialize the main board to use desired (baudrate, rx, tx)
                                     //for Arduino Mega use RX:10, TX: 11 for software serial
                                     //for Arduino Leonardo use pin 8, 9, 10, 11 as RX and TX for software serial
                                      
            pinMode (FOTORES, INPUT);                          
            pinMode (RELAY, OUTPUT); 
            pinMode (RUOTAPALA, OUTPUT);
            pinMode (ALZAPALA, OUTPUT);
            pinMode (ONRUOTAPALA, OUTPUT);
            pinMode (ONALZAPALA, OUTPUT); 
            pinMode (E1, OUTPUT);
            pinMode (M1, OUTPUT);
            pinMode (E2, OUTPUT);
            pinMode (M2, OUTPUT);
            stato=0;
                
          }
          void loop(){
              motori=0;
            if( ps2.getval(p_up)==0 || ps2.getval(p_joy_lu)==100) { 
              Serial.println("AVANTI");    //
              analogWrite (E1,velo);      //PWM Speed Control
            digitalWrite(M1,HIGH);        //
            analogWrite (E2,velo);        //
            digitalWrite(M2,HIGH);       ///
            motori=1;  
                }
            if (ps2.getval(p_down)==0 || ps2.getval(p_joy_ld)==100) { 
              Serial.println("INDIETRO");  
             analogWrite (E1,velo);
            digitalWrite(M1,LOW);   
            analogWrite (E2,velo);    
            digitalWrite(M2,LOW); 
            motori=1;    
                }  
            if (ps2.getval(p_right)==0 || ps2.getval(p_joy_lr)==100){ 
              Serial.println("DESTRA"); 
             analogWrite (E1,velo);
            digitalWrite(M1,HIGH);    
            analogWrite (E2,velo);    
            digitalWrite(M2,LOW); 
            motori=1;  
              }
            if (ps2.getval(p_left)==0 || ps2.getval(p_joy_11)==100) { 
              Serial.println("SINISTRA");    //
               analogWrite (E1,velo);      //
            digitalWrite(M1,LOW);          //
            analogWrite (E2,velo);         // 
            digitalWrite(M2,HIGH);        //
            motori=1;                     // 
                 }
            if (ps2.getval(p_triangle)==0) { 
              Serial.println("TRIANGOLO"); // 
              if (velo<250)              // 
          {                              //
             velo=velo+25;              // 
             }                          //
          else                          // 
          {                            //
          ps2.vibrate(2, 255);         // 
          delay(500);                  // 500 ms
          ps2.vibrate(2,0);            // 
           }                           // 
            analogWrite (M1, velo);    //
              analogWrite (M2, velo);   // 
           Serial.println(velo);       
                }
            if (ps2.getval(p_cross)==0) { // 
              Serial.println("X");        // 
              if (velo>0 && velo<=250)    // 
          {                               // 
            velo=velo-25;                // 
             }
          else 
          {
          //non fa niente
          } 
              analogWrite (M1, velo);
              analogWrite (M2, velo);
             Serial.println(velo);
                }
            if (ps2.getval(p_circle)==0) {
              Serial.println("CERCHIO");
              if (stato==0)
              {                               // 
               stato=stato+1;
               delay(100);
               Serial.println(stato); 
               digitalWrite(RELAY, HIGH);
               ps2.vibrate(2, 255);         // 
              delay(500);                  // 500 ms
              ps2.vibrate(2,0);            // 
              delay(500);
              ps2.vibrate(2,255);
              delay(500);
              ps2.vibrate(2,0);
                }
          else 
          {
          stato=0;
          delay(100);
          Serial.println(stato); 
          digitalWrite(RELAY, LOW);
          ps2.vibrate(2, 255);         // 
              delay(500);                  // 500 ms
              ps2.vibrate(2,0);            // 
          } 
               }
            if (ps2.getval(p_square)==0) { //
              Serial.println("QUADRATO");
                digitalWrite(E1,0); 
            digitalWrite(M1,LOW);    
            digitalWrite(E2,0);   
            digitalWrite(M2,LOW);  
            velo=0;
               }
            if (ps2.getval(p_l1)==0) {
              Serial.println("L1");
              digitalWrite (ONALZAPALA, HIGH);  //
          digitalWrite (ALZAPALA, LOW);     //
             }
           if (ps2.getval(p_l1)==1) {
              Serial.println("L1");
             digitalWrite (ONALZAPALA, LOW);  //
          digitalWrite (ALZAPALA, LOW);     //
               }
            if (ps2.getval(p_l2)==0) {
              Serial.println("L2");
               digitalWrite (ONRUOTAPALA, HIGH);  //
          digitalWrite (RUOTAPALA, LOW);     //
                   }
                    if (ps2.getval(p_l2)==1) {
          Serial.println("L2");
          digitalWrite (ONRUOTAPALA, LOW);  //
          digitalWrite (RUOTAPALA, LOW);     //
               }
            if (ps2.getval(p_r1)==0) {
              Serial.println("R1");
              digitalWrite (ONALZAPALA, HIGH);  //
          digitalWrite (ALZAPALA, HIGH);    //
                 }
            if (ps2.getval(p_r2)==0) {
              Serial.println("R2");
              digitalWrite (ONRUOTAPALA, HIGH);  //
          digitalWrite (RUOTAPALA, HIGH);    //
               }
            if (ps2.getval(p_start)==0) {
              Serial.println("START");
                  }
            if (ps2.getval(p_select)==0) {
              Serial.println("SELECT");
                          }
            if (motori==0) { // 
                 analogWrite (E1,0); 
            digitalWrite(M1,LOW);    
            analogWrite (E2,0);    
            digitalWrite(M2,LOW);
          }
            sensorValue = analogRead(FOTORES);
            Serial.println(sensorValue); 
           if (sensorValue<30 || stato==0) {
             // {  
              digitalWrite(RELAY, HIGH);
                  }
          else 
          {
            digitalWrite(RELAY, LOW);  
          delay(100);  
          {
            //non fa niente
            }
          }
          }

          好吧,在總結(jié)了掃雪機(jī)的制作和特性后,我們可以繼續(xù)討論你最感興趣的東西:固件,也就是要上傳到Arduino Uno中的草圖,這樣它就可以控制掃雪機(jī),并將PlayStation 2控制器發(fā)送的命令傳給他。

          的固件相對(duì)簡(jiǎn)單;為了理解它的結(jié)構(gòu)是合適的,首先,花幾個(gè)字在受控屏蔽上,特別是在PS2屏蔽上。事實(shí)上,關(guān)于馬達(dá)屏蔽,我們?cè)谄渌恼轮幸呀?jīng)講了很多,因?yàn)槲覀冊(cè)诟鞣N項(xiàng)目中都使用過它,所以我們只想說,它的管理涉及我們已經(jīng)計(jì)劃在草圖中包括的特殊庫(kù),需要PWM信號(hào)和“啟用”邏輯級(jí)別。我們介紹了Shield PS2的相關(guān)功能以及專用庫(kù)的主要功能。

          該屏蔽允許您使用Playstation 2的無線控制器(或有線控制器),允許遠(yuǎn)程控制機(jī)器人或其他設(shè)備;因?yàn)樗脑O(shè)計(jì),可以與Arduino Uno Rev 3、Duemilanove、Mega和Leonardo一起使用。它配備了一個(gè)重置按鈕來鏡像Arduino的,帶有跳線來設(shè)置各種波特率(9600、57600、115200 bps),以及一個(gè)狀態(tài)LED和跳線來選擇用于TX和RX數(shù)據(jù)的引腳,以替代UART默認(rèn)值。

          我們說Arduino Uno引腳D0和D1與硬件串行匹配,它們的含義分別是TX和RX。但是,可以通過軟件重新分配TX和RX線路,通過加載適當(dāng)?shù)膸?kù)New software Serial將它們分配給其他引腳(TX:引腳1、3、9、11–RX:0、2、8、10),這允許在其他硬件資源(或其他屏蔽)尚未使用的其他數(shù)字I/O對(duì)上模擬串行端口。

          請(qǐng)注意,如果您使用串行硬件(D0,D1)的引腳,請(qǐng)記住在開始對(duì)Arduino Uno進(jìn)行編程之前,將PS2連接器從Shield上拔下。

          fig_1

          PS2屏蔽能夠通過適當(dāng)?shù)膸?kù)識(shí)別和管理PS2控制器的所有按鈕和模擬棒。每個(gè)模擬操縱桿(左和右)有兩個(gè)軸(X和Y)和兩種輸出格式:模擬1和2。在“模擬輸出1”格式中,每個(gè)操縱桿有兩個(gè)變量:X軸和Y軸。根據(jù)操縱桿的移動(dòng)方式,您可以得到一個(gè)從0到255的輸出值,對(duì)應(yīng)于操縱桿的位置。

          Y軸:

          ?中心位置(中性),值為128。

          ?向上推,數(shù)值從128變?yōu)?

          ?按下,數(shù)值從128變?yōu)?55。

          X軸:

          ?中心位置(中性),值為128。

          ?向左推,數(shù)值從128變?yōu)?。

          ?向右推,數(shù)值從128變?yōu)?55。

          Fig_2

          在“輸出模擬2”中,每個(gè)操縱手柄有四個(gè)變量(上、下、左和右)。當(dāng)用戶在一個(gè)方向上移動(dòng)操縱桿時(shí),4個(gè)變量的值從0變?yōu)?00。左右操縱手柄各有四個(gè)獨(dú)立變量。

          對(duì)于PS2控制器按鈕管理,只需檢查我們感興趣的按鈕的狀態(tài)并讀取返回值,即可:

          ?如果按下按鈕,則為0;

          ?如果未按下按鈕,則為1。

          例如,如果我們想知道您是否按下了“UP”按鈕,我們必須編寫以下聲明:

          ps2.getval(p_up)==0

          也可以將“p_up”替換為相應(yīng)的十進(jìn)制值,在本例中為“4”。

          屏蔽PS2還能夠處理PS2控制器中的兩個(gè)小型發(fā)動(dòng)機(jī),這兩個(gè)發(fā)動(dòng)機(jī)決定振動(dòng)(左和右):相關(guān)命令需要兩個(gè)字節(jié)的數(shù)據(jù),第一個(gè)字節(jié)指示哪個(gè)電機(jī)必須振動(dòng),而下一個(gè)字節(jié)(第二個(gè)字節(jié))指示發(fā)動(dòng)機(jī)狀態(tài)或速度。

          為了使用處理來自PS2控制器的命令的屏蔽,我們使用了shield_PS2.h庫(kù)。在草圖的開頭,我們包含了語句“#include<shield_PDS2.h>”,該庫(kù)需要正確控制屏蔽。

          讓我們繼續(xù)看LED投影儀的控制,它通過Arduino Uno Rev3模擬引腳A0進(jìn)行操作,該引腳連接到檢測(cè)環(huán)境光的光刻膠;當(dāng)照明低于閾值時(shí),草圖激活投影儀,或者更確切地說,它向卡RELAY1CH提供高邏輯狀態(tài),該卡包含由邏輯電平激活的繼電器。在我們的項(xiàng)目中,我們使用閉合和常開之間的交換,并通過它觸發(fā)為投影儀供電的DC/DC轉(zhuǎn)換器的電源,因此當(dāng)Arduino Uno(通過其數(shù)字引腳13)進(jìn)入邏輯狀態(tài)1時(shí),繼電器發(fā)出咔噠聲并閉合上述觸點(diǎn),打開LED投影儀。



          關(guān)鍵詞: 雪犁 機(jī)器人

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();