<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

雪犁機器人的設計與實(shí)施

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

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

本文引用地址:http://dyxdggzs.com/article/202308/450054.htm

snow

簡(jiǎn)要概述

掃雪機的電氣和電子部分基于A(yíng)rduino Uno Rev.3,它擁有三個(gè)護罩和與這些卡的接口:

PCBWAY

電機驅動(dòng)器DRI0018;

繼電器電路RELAY1CH;

DC/DC轉換器升壓STEPUP30VADJ。

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

電路中使用的所有電路板和元件都可以在我們的商店購買(mǎi)。電源由兩個(gè)7.2 Ah的鉛凝膠電池組成:我們在兩者的中點(diǎn)取12伏,而在該系列的負極和正極之間取24伏。

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

12伏電壓也用于馬達護罩的電源部分;事實(shí)上,考慮到三個(gè)線(xiàn)性執行器的高吸收,直接從Arduino獲得12V是不明智的:您必須選擇將外部電源連接到適當的端子PWR。

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

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

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

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

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

從遙控器接收數據是分配給屏蔽PS2SHIELD的任務(wù),為此,制造商提供了我們在A(yíng)rduino草圖中集成的特定庫。屏蔽執行命令接收和解碼;2.4GHz無(wú)線(xiàn)電單獨提供(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
  }
}
}

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

的固件相對簡(jiǎn)單;為了理解它的結構是合適的,首先,花幾個(gè)字在受控屏蔽上,特別是在PS2屏蔽上。事實(shí)上,關(guān)于馬達屏蔽,我們在其他文章中已經(jīng)講了很多,因為我們在各種項目中都使用過(guò)它,所以我們只想說(shuō),它的管理涉及我們已經(jīng)計劃在草圖中包括的特殊庫,需要PWM信號和“啟用”邏輯級別。我們介紹了Shield PS2的相關(guān)功能以及專(zhuān)用庫的主要功能。

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

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

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

fig_1

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

Y軸:

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

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

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

X軸:

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

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

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

Fig_2

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

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

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

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

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

ps2.getval(p_up)==0

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

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

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

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



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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>