通過一個無人機代碼例程學會ardunio

 

第一部分:關於接線

1.首選在接收機的任意一個空置插口引出一個vcc和GND,直接連接arduino 5v 和GND,這時你的arduino就和飛機連成了一套系統,可以共同工作了。

2.接下來把接收機供給飛控的四根信號線從飛控上卸下,連接在arduino上的任意數字端口,我連接的是22,24,26,28,而這四根線的作用分別是AIL副翼,ELE升降,THR油門,RUD方向

下面具體解釋這四個名詞,其實這些詞都是固定翼飛機的,那麼在多旋翼無人機上的意思是什麼呢,很簡單,

AIL副翼信號:它是控制飛機在水平面俯仰的,也就是說當飛機俯下去的時候,飛機會產生一個向前的分解力,就會向前飛,向後仰的時候會分解一個向後的力飛機向後飛。

ELE升降:它其實不是真正控制無人機升降的,是和副翼一樣,不過是向左傾斜和向右傾斜而已,飛機就向左向右飛。

THR油門:其實是控制飛機起飛和下降的,油門大飛機就直升,油門小了就將下來了。

RUD方向:它是控制飛機水平轉動的,左轉右轉,飛機的方向改變,但位置不會變。

 

把這幾個接口接上arduino後,我們開始用arduino來看看這個信號的奧祕,其實它就是PWM信號,不信你直接接一個舵機去試試,舵機會隨着遙控的控制而轉動,那麼怎麼讀取這個PWM信號呢,我們從源代碼開始講!

#include<Servo.h>;
#define AIL1  22   //定義前後飛引腳爲22號
#define ELE2  24   //定義左右飛引腳爲24號
#define THR3  26   //定義升降引腳爲26號
#define RUD4  28   //定義左右轉引腳爲28
#define LED   13   //定義LED燈
unsigned long INAIL;   //定義四個輸入變量
unsigned long INELE;
unsigned long INTHR;
unsigned long INRUD;
int OUTAIL;            //定義四個輸出變量
int OUTELE;
int OUTTHR;
int OUTRUD;
Servo AIL;          
Servo ELE;
Servo THR;
Servo RUD;

void setup()
{  
  pinMode(AIL1,0);    //初始化引腳狀態
  pinMode(ELE2,0);
  pinMode(THR3,0);
  pinMode(RUD4,0);
  pinMode(LED,1);

  AIL.attach(4);
  ELE.attach(5);
  THR.attach(6);
  RUD.attach(7);

  Serial.begin(9600);
}
void loop()
{
  digitalWrite(LED,1);
  INAIL = pulseIn(AIL1, 1);   //讀取之前定義的四個引腳狀態
  INELE = pulseIn(ELE2, 1);
  INTHR = pulseIn(THR3, 1);
  INRUD = pulseIn(RUD4, 1);

  OUTELE = map(INELE,1010,2007,47,144);  //計算
  OUTTHR = map(INTHR,1010,2007,47,144);
  OUTRUD = map(INRUD,1010,2007,47,144);
  
  AIL.write(OUTAIL);  //輸出
  ELE.write(OUTELE);
  THR.write(OUTTHR);
  RUD.write(OUTRUD);

  int dianya = analogRead(A0);   //讀取A0輸入值
  float wendu = dianya * (5.0 / 1023.0*100);    //計算溫度
  Serial.print("AIL=");
  Serial.print(INAIL);
  Serial.print(" ELE=");
  Serial.print(INELE);
  Serial.print(" THR=");
  Serial.print(INTHR);
  Serial.print(" RUD=");
  Serial.print(INRUD);
  Serial.print(" wendu=");
  Serial.println(wendu);      

  digitalWrite(LED,0);
  delay(5);

}

 

第二部分:編程函數:https://www.arduino.cc/reference/en/#functions

附基礎教程系列:https://www.arduino.cn/thread-76154-1-1.html

 

Arduino自帶的Servo函數及其語句,先來介紹一下舵機函數的幾個常用語句吧。

1、attach(接口)——設定舵機的接口,只有9或10接口可利用。

2、write(角度)——用於設定舵機旋轉角度的語句,可設定的角度範圍是0°到180°。

3、read()——用於讀取舵機角度的語句,可理解爲讀取最後一條write()命令中的值。

4、attached()——判斷舵機參數是否已發送到舵機所在接口。

5、detach()——使舵機與其接口分離,該接口(9或10)可繼續被用作PWM接口。

注:以上語句的書寫格式均爲“舵機變量名.具體語句()”例如:myservo.attach(9)。//可以定義舵機接口,9或10

Arduino自帶的Servo函數庫只可以同時控制兩個模擬舵機。而且最好接到數字9 、 10腳上。想控制多個舵機就要使用到Arduino的Pwm功能了。

下面介紹幾個常用函數:

pinMode()

[數字I / O]

描述

將指定引腳配置爲輸入或輸出。有關引腳功能的詳細信息,請參見(數字引腳)的說明。

從Arduino 1.0.1開始,可以使用模式INPUT_PULLUP使能內部上拉電阻。此外,INPUT模式明確禁用內部上拉。

句法

pinMode(pin, mode)

參數

pin:要設置其模式的引腳編號

modeINPUTOUTPUT,或INPUT_PULLUP。(有關功能的更完整說明,請參閱(數字引腳)頁面。)

返回

沒有

示例代碼

該代碼使得數字銷13 OUTPUT與切換之HIGHLOW

void setup()
{
  pinMode(13,OUTPUT); //將數字引腳13設置爲輸出
}

void loop()
{
  digitalWrite(13,HIGH); //設置數字引腳13
  延遲(1000); //等一下
  digitalWrite(13,LOW); //將數字引腳13設置爲關閉
  延遲(1000); //等一下
}

pulseIn()

[高級I / O]

描述

讀取引腳上的脈衝(HIGH或者LOW)。例如,如果valueHIGHpulseIn()等待從銷去LOWHIGH,開始計時,然後等待銷去LOW並停止定時。返回脈衝的長度(以微秒爲單位)或放棄,如果超時內未收到完整脈衝,則返回0。

該功能的時間已經憑經驗確定,並且可能在較長脈衝中顯示錯誤。適用於長度爲10微秒至3分鐘的脈衝。

句法

pulseIn(pin, value)

pulseIn(pin, value, timeout)

參數

pin:要讀取脈衝的引腳編號。(INT)

value:要讀取的脈衝類型:HIGHLOW。(INT)

timeout(可選):等待脈衝開始的微秒數; 默認是一秒(無符號長)

返回

脈衝的長度(以微秒爲單位),如果在超時之前沒有脈衝開始,則爲0(無符號長整數)

示例代碼

該示例計算了引腳7上脈衝的持續時間。

int pin = 7;
unsigned long duration;

void setup()
{
  pinMode(pin, INPUT);
}

void loop()
{
  duration = pulseIn(pin, HIGH);
}

digitalWrite()

[數字I / O]

描述

將數字HIGHLOW值寫入數字引腳。

如果引腳已配置爲OUTPUTwith pinMode(),則其電壓將設置爲相應的值:5V(或3.3V板上3.3V)HIGH,0V(接地)LOW

如果引腳配置爲a INPUTdigitalWrite()將使能(HIGH)或禁用(LOW)輸入引腳上的內部上拉。建議設置pinMode()INPUT_PULLUP使能內部上拉電阻。有關更多信息,請參閱數字引腳教程。

如果未設置pinMode()OUTPUT,並將LED連接到引腳,則在呼叫時digitalWrite(HIGH),LED可能顯得暗淡。如果沒有明確設置pinMode()digitalWrite()將啓用內部上拉電阻,它就像一個大限流電阻。

句法

digitalWrite(pin, value)

參數

pin:引腳號

valueHIGHLOW

返回

沒有

示例代碼

該代碼使得數字銷13的OUTPUT和由之間交替切換它HIGHLOW以一秒的步伐。

void setup()
{
  pinMode(13,OUTPUT); //將數字引腳13設置爲輸出
}

void loop()
{
  digitalWrite(13,HIGH); //設置數字引腳13
  延遲(1000); //等一下
  digitalWrite(13,LOW); //將數字引腳13設置爲關閉
  延遲(1000); //等一下
}

備註和警告

模擬輸入引腳可用作數字引腳,稱爲A0,A1等。

 

map()

描述

將數字從一個範圍重新映射到另一個範圍。也就是說,fromLow的值將被映射到toLow,值從hightoHigh,值介於兩者之間,等等。

不會將值限制在該範圍內,因爲超出範圍的值有時是有意義且有用的。該constrain()函數可以之前或此功能後使用,如果限制範圍是期望的。

注意,任一範圍的“下限”可以大於或小於“上限”,因此該map()函數可以用於反轉數字範圍,例如

y = map(x, 1, 50, 50, 1);

該函數也很好地處理負數,所以這個例子

y = map(x, 1, 50, 50, -100);

也是有效的,效果很好。

map()函數使用整數數學,因此當數學可能表明它應該這樣做時,不會生成分數。分數剩餘部分被截斷,並且不是圓形或平均的。

南叔的表述:map函數其實就是歸一化,可以歸到任意區間

句法

map(value, fromLow, fromHigh, toLow, toHigh)

參數

value:要映射的數字

fromLow:值的當前範圍的下限

fromHigh:值的當前範圍的上限

toLow:值的目標範圍的下限

toHigh:值的目標範圍的上限

返回

映射的值。

示例代碼

/* Map an analog value to 8 bits (0 to 255) */
void setup() {}

void loop()
{
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(9, val);
}

附錄

對於數學傾向,這是整個函數

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

 

第三部分:引腳說明

數碼針腳

Arduino上的引腳可配置爲輸入或輸出。本文檔解釋了這些模式下引腳的功能。雖然本文檔的標題涉及數字引腳,但重要的是要注意絕大多數Arduino(Atmega)模擬引腳可以以與數字引腳完全相同的方式進行配置和使用。

配置爲INPUT的引腳屬性

Arduino(Atmega)引腳默認爲輸入,因此當您將它們用作輸入時,不需要將它們顯式聲明爲帶有pinMode()的輸入。以這種方式配置的引腳被稱爲處於高阻抗狀態。輸入引腳對它們採樣的電路提出極小的要求,相當於引腳前面100兆歐的串聯電阻。這意味着將輸入引腳從一種狀態移動到另一種狀態所需的電流非常小,並且可以使這些引腳對於實現電容式觸摸傳感器,將LED讀取爲光電二極管或使用方案讀取模擬傳感器等任務非常有用比如RCTime。

然而,這也意味着,配置爲pinMode(引腳,INPUT)的引腳沒有連接到它們,或連接到它們的未連接到其他電路的引線,將報告引腳狀態看似隨機的變化,從而拾取電源噪聲環境,或電容耦合附近引腳的狀態。

上拉電阻,引腳配置爲INPUT

如果不存在輸入,通常將輸入引腳轉向已知狀態是有用的。這可以通過在輸入端添加上拉電阻(至+ 5V)或下拉電阻(對地電阻)來實現。對於上拉或下拉電阻,10K電阻是一個很好的值。

配置爲INPUT_PULLUP的引腳屬性

Atmega芯片內置20K上拉電阻,可通過軟件訪問。通過將pinMode()設置爲INPUT_PULLUP來訪問這些內置上拉電阻。這有效地反轉了INPUT模式的行爲,其中HIGH表示傳感器關閉,LOW表示傳感器開啓。

該上拉值取決於所使用的微控制器。在大多數基於AVR的電路板上,該值保證在20kΩ和50kΩ之間。在Arduino Due上,它介於50kΩ和150kΩ之間。有關確切值,請參閱電路板上微控制器的數據表。

將傳感器連接到配置有INPUT_PULLUP的引腳時,另一端應接地。在簡單開關的情況下,這會導致引腳在開關打開時讀取高電平,在按下開關時讀取低電平。

上拉電阻提供足夠的電流,使連接到已配置爲輸入的引腳的LED燈亮。如果項目中的LED似乎工作,但非常模糊,這可能是正在發生的事情。

上拉電阻由相同的寄存器(內部芯片存儲器位置)控制,控制引腳是高電平還是低電平。因此,當引腳爲INPUT時,配置爲使上拉電阻導通的引腳,如果引腳隨後通過pinMode()切換到OUTPUT,則引腳將配置爲高電平。這也適用於另一個方向,如果切換到帶有pinMode()的輸入,則保持高電平狀態的輸出引腳將設置上拉電阻。

在Arduino 1.0.1之前,可以通過以下方式配置內部上拉:

pinMode(引腳,INPUT); //設置引腳輸入
digitalWrite(pin,HIGH); //打開上拉電阻

注意:數字引腳13比其他數字引腳更難用作數字輸入,因爲它上面連有一個LED和電阻,焊接在大多數電路板的電路板上。如果你啓用其內部20k上拉電阻,它將掛在1.7V左右,而不是預期的5V,因爲板載LED和串聯電阻將電壓降低,這意味着它總是返回LOW。如果必須將引腳13用作數字輸入,則將其pinMode()設置爲INPUT並使用外部下拉電阻。

引腳的屬性配置爲OUTPUT

配置爲帶有pinMode()的OUTPUT的引腳被稱爲處於低阻抗狀態。這意味着它們可以爲其他電路提供大量電流。Atmega引腳可以爲其他器件/電路提供高達40 mA(毫安)的電流(提供正電流)或吸收(提供負電流)。這是足夠的電流,可以明亮地點亮LED(不要忘記串聯電阻),或運行多個傳感器,但電流不足以運行大多數繼電器,電磁閥或電機。

Arduino引腳上的短路或試圖從它們運行高電流器件會損壞或破壞引腳中的輸出晶體管,或損壞整個Atmega芯片。這通常會導致微控制器中的“死”引腳,但剩餘的芯片仍能正常工作。因此,最好將OUTPUT引腳連接到具有470Ω或1k電阻的其他器件,除非特定應用需要從引腳獲取最大電流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章