工程技術基礎知識培訓
content:
1. 認識Arduino
2. 學習常用元器件
3. C語言基本語法
/***************************************************************************************************/
/-----------------------------------------------------分界線-----------------------------------------------------/
/***************************************************************************************************/
一、 認識Arduino
1.什麼是arduino
Arduino 是一個開源電子原型平臺基於靈活、易於使用的平臺,這個平臺包含軟件和硬件。這是特意爲藝術家、設計師,業餘愛好者,和感興趣的人創建交互式對象和環境。
Arduino能通過各種各樣的傳感器來感知環境;通過控制燈光、馬達和其他的執行器來影響環境。板子上的微控制器可以通過Arduino的編程語言來編寫程序,編譯成二進制文件,燒錄進微控制器。對Arduino的編程是利用 Arduino編程語言和Arduino開發環境來實現的。基於Arduino的項目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上運行的軟件,他們之間進行通信 (比如 Flash, Processing, MaxMSP)來實現。
2.發明人及發明原因
Arduino是意大利人發明的硬件和軟件,它的核心開發團隊成員包括:Massimo Banzi,David Cuartielles,Tom Igoe,Gianluca Martino,David Mellis 和 Nicholas Zambetti。
當然Arduino的發展也是有故事的:
據說Massimo Banzi之前是意大利Ivrea一家學校的老師。他的學生經常抱怨找不到便宜好用的微控制器。 2005年冬天,Massimo Banzi跟David Cuartielles討論了這個問題。 David Cuartielles是一個西班牙籍晶片工程師,當時在這所學校做訪問學者。兩人決定設計自己的電路板,並引入了Massimo的學生 Mellis爲電路板設計編程語言。兩天以後,Mellis就寫出了程式碼。又過了三天,電路板就完工了。這塊電路板被命名爲Arduino。幾乎任何人,即使不懂電腦編程,也能用Arduino做出 很酷的東西,比如對感測器作出迴應,閃爍燈光,還能控制馬達。
後來他們將Arduino相關設計圖放在了網上,保持設計的開放源碼理念,在共享創意許可下,任何人都被允許生產電路板的複製品,還能重新設計,甚至銷售原設計的複製品。你不需要付版稅,甚至不用取得 Arduino 團隊的許可。唯一被保留的只有Arduino這個名字。它被註冊成了商標。如果有人想用這個名字賣電路板,那他們可能必須付一點商標費用給 Arduino 的核心開發團隊成員。
3.arduino名字的由來
意大利北部一個如詩如畫的小鎮“Ivrea”,橫跨過藍綠色Dora Baltea河,它最著名的事蹟是關於一位受壓迫的國王。公元1002年,國王Arduin成爲國家的統治者,不幸的是兩年後即被德國亨利二世國王給廢掉了。今日,在這位無法成爲新國王的出生地,cobblestone街上有家叫“di Re Arduino”的酒吧紀念了這位國王。Massimo Banzi經常光臨這家酒吧,而他將這個電子產品計劃命名爲Aruino以紀念這個地方。
4.開源硬件和開源軟件
arduino板就是一種保持了開源理念的硬件,簡單來講就是將設計的原理圖進行公佈,而且允許生產電路板的複製品,能重新設計,銷售原設計的電路板。
開源軟件同樣也是將程序源碼進行開放,擁有開放的源代碼庫,可以免費調用,不需要重寫源代碼。
eg:
蘋果公司爲閉源:
IPhone–IOS
MAC BOOK–OS
IPad–IPadOS
google公司爲開源:
小米–MIUI OS
錘子–Smartisan OS
vivo–Funtouch OS
開源就是資源共享,開源的好處可見一斑,可以節省研發費用及研發時間,對社會發展起到很好的推動作用。
5.認識arduino Uno板
當前arduino官方發行了兩版外觀幾乎相同的arduino Uno板卡,唯一的不同在於芯片的封裝類型,當然使用起來幾乎一樣;我們就以arduino Uno板卡爲例對arduino硬件進行介紹。
Arduino Uno板卡採用芯片名稱爲ATMega328P,板子的右上角爲一個USB-B型串口,可直接通過串口線與電腦設備連接;左上角爲DC電源母座,可外接電源供電;另外整個板卡的外圍區域分爲3種不同類型的端口區域,分別爲power區域、DIGITAL區域及ANALOG區域。
6.arduino IDE的安裝及使用
我們統一使用的arduino IDE的版本,分別適用於windows系統和Linux系統,版本號分別爲1.8.6和1.8.7,可以在相應的系統下解壓直接打開軟件使用。
打開後的界面:
7.基本arduino編程語言使用
void setup 爲初始化函數,用來對需要使用的端口進行設置。
void loop 爲循環函數(主函數),用來循環執行寫入的命令。
我們需要通過串口線將PC機和Uno板進行連接,這被稱爲串口連接。我們可以通過串口線將我們編好的程序寫入Uno板,讓Uno板執行相應的命令。
首先通過LED燈來試一下。
/*************閃爍程序************/
void setup() //爲引腳設置輸入輸出模式
{
pinMode(2,OUTPUT); //設置2引腳爲輸出
pinMode(3,OUTPUT); //設置3引腳爲輸出
}//(只運行一次)
void loop() //進入循環
{
digitalWrite(2,HIGH); //2引腳置高位
digitalWrite(3,LOW); //3引腳置低位
delay(300); //延時300毫秒
digitalWrite(2,LOW); //2引腳置低位
digitalWrite(3,LOW); //3引腳置低位
delay(300); //延時300毫秒
}//(循環執行)
設置流水燈程序:
/**********流水燈程序*************/
void setup()
{
pinMode(2,OUTPUT); //設置爲輸出引腳
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}
void loop()
{
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
delay(300);
digitalWrite(2,LOW);
digitalWrite(3,LOW);
delay(300);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
delay(300);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
delay(300);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
delay(300);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
delay(300);
}
/******************************************************************************/
/------------------------------------分界線---------------------------------/
/******************************************************************************/
二、常用元器件的使用
/----------------------------------拓展板---------------------------------/
我把常用的元器件分爲兩種:一種叫做傳感器,一種叫做執行器。
傳感器是將外界的變化以電信號的方式傳輸回arduino板,得到反饋。
執行器是消耗arduino板的電能,改變外界的環境。
/----------------------------------------傳感器------------------------------------/
1.按鍵的使用
首先需要知道傳感器爲數字傳感器還是模擬傳感器,然後接到相應的針腳。
然後通過串口監視器得到傳感器的反饋值。
(串口監視器)
/*****************打印Hello!***********************/
void setup()
{
Serial.begin(9600) //初始化串口,一般波特率爲9600
}
void loop()
{
Serial.print("Hello!"); //串口打印
//Serial.println("Hello!"); //串口換行打印
}
/******************打印按鍵值***************************/
void setup()
{
Serial.begin(9600);
pinMode(4,INPUT);
}
void loop()
{
Serial.println(digitalRead(4));
}
按鍵上拉/下拉電阻
/******************************************************************************************************************************/
/----------------------------------------------------------------------------分割線---------------------------------------------------------------/
/******************************************************************************************************************************/
2.電位器的使用
判斷爲數字還是模擬傳感器
通過串口監視器進行觀察
/******************打印電位器值***************************/
void setup()
{
Serial.begin(9600);
pinMode(A0,INPUT);
}
void loop()
{
Serial.println(analogRead(A0));
}
觀察一下模擬信號的變化
3.超聲波的使用
超聲波的接線:
VCC - > 正極
GND - > 負極
Trig - > 輸出
Echo - > 接收
/******************************************************************************************************************************/
/-----------------------------------------------------------分割線--------------------------------------------------------/
/******************************************************************************************************************************/
超聲波原理:
/******************************************************************************************************************************/
/------------------------------------------------------------------分割線---------------------------------------------------------------/
/******************************************************************************************************************************/
超聲波的使用:
#include<SR04.h>
SR04 sr04(6,7); //ECHO & Trig
// 接收 & 發送
void setup()
{
pinMode(6,INPUT); //Echo
pinMode(7,OUTPUT); //Trig
Serial.begin(9600);
}
int distance;
void loop()
{
distance = sr04.Distance();
Serial.print(distance);
Serial.println(" cm");
}
需要用到一個 #include<> 來導入特定的庫文件
這裏導入的庫名叫SR04,是超聲波專用庫,".h"是它的後綴名。
並且需要用到“對象的實例化”-----SR04 sr04(6, 7);
各位可以把SR04這個庫比喻成一個蓋樓的圖紙,只有一個圖紙是不能住人的。
需要通過一個實例化把它變成一個實際可用的樓房,纔可以被我們使用。
庫其實就是開源項目的一個例子,我們想要使用一個複雜元器件,不需要弄清楚具體的原理,僅需要通過庫文件來使用它就可以。可見開源對我們的開發有着很大的好處。
4.庫文件的導入
/******************************************************************************************************************************/
/------------------------------------------------------------------分割線---------------------------------------------------------------/
/******************************************************************************************************************************/
/******************************************************************************************************************************/
/------------------------------------------------------------------分割線---------------------------------------------------------------/
/******************************************************************************************************************************/
5.LCD1602的使用及I2C通信
/******************************************************************************************************************************/
/------------------------------------------------------------------分割線---------------------------------------------------------------/
/******************************************************************************************************************************/
/******************************************************************************************************************************/
/------------------------------------------------------------------分割線---------------------------------------------------------------/
/******************************************************************************************************************************/
/******************************************************************************************************************************/
/------------------------------------------------------------------分割線---------------------------------------------------------------/
/******************************************************************************************************************************/
/******************************************************************************************************************************/
/------------------------------------------------------------------分割線---------------------------------------------------------------/
/******************************************************************************************************************************/
6.PWM脈寬調製信號
電位器控制燈亮度:
void setup()
{
pinMode(A0,INPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
digitalWrite(2,0);
}
int a,b;
void loop()
{
a = analogRead(A0);
b = map(a,0,1023,0,255);
analogWrite(3,b);
}
三 C語言基本語法
1.基本數據類型
補充一個類型:布爾類型 —> bool :True & False
2.數據運算
int flag;
自增運算:flag++;
自減運算:flag- -;
/******************************************************************************************************************************/
/----------------------------------------------------------------------------分割線---------------------------------------------------------------/
/******************************************************************************************************************************/
3 if的用法
按鍵控制燈程序:
/*********單按鍵控制燈*******/ (if-else語句)
void setup()
{
Serial.begin(9600); //初始化串口
pinMode(2,OUTPUT); //設置2號針腳爲輸出
pinMode(3,OUTPUT); //設置3號針腳爲輸出
pinMode(4,INPUT); //設置4號針腳爲輸入
}
void loop()
{
Serial.println(digitalRead(4)); //串口打印4號針腳數值
if(digitalRead(4)==LOW) //判斷如果4號針腳爲LOW(注意=和==的區別)
{
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
}
else //其他情況
{
digitalWrite(2,LOW);
digitalWrite(3,LOW);
}
}
/*********************雙按鍵控制燈********************/
void setup()
{
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
}
void loop()
{
if(digitalRead(4)==LOW)
{
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
}
if(digitalRead(5)==LOW)
{
digitalWrite(2,LOW);
digitalWrite(3,LOW);
}
}
/***********************單按鍵切換燈亮滅**********************/
void setup()
{
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,INPUT);
}
int flag = 0; //定義一個整型變量(要放在loop循環外面)
void loop()
{
if(digitalRead(4)==LOW)
{
flag = flag + 1; //flag在原來的基礎上加 1
delay(300); //延時防誤判
}
if (flag % 2 == 0) //判斷flag爲偶數(%爲取餘數)
{
digitalWrite(2,LOW);
digitalWrite(3,LOW);
}
if(flag % 2 == 1) //判斷flag爲奇數
{
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
}
}
5 for循環的使用
/******************************************************************************************************************************/
/----------------------------------------------------------------------------分割線---------------------------------------------------------------/
/******************************************************************************************************************************/
呼吸燈:
int i;//定義int(整型)變量i,用來循環
void setup()
{
pinMode(3,OUTPUT); //設置3號針腳作爲輸出針腳
}
void loop()
{
for(i=0;i<=255;i++) //使用for循環實現呼吸燈漸亮
{
analogWrite(3,i);//模擬量寫入當前的亮度級別
delay(10); //維持在亮度爲i的級別上10毫秒
}
for(i=255;i>=0;i--) //使用for循環實現呼吸燈漸滅
{
analogWrite(3,i);
delay(10);
}
}
6 while循環的使用
/******************************************************************************************************************************/
/------------------------------------------------------------------while和if的區別-------------------------------------------------------------/
/******************************************************************************************************************************/
7 子函數的用法
void setup()
{
pinMode(2,OUTPUT); //燈
pinMode(3,INPUT); //按鍵
}
void open();
void close(); //聲明函數
void loop()
{
if (digitalRead(3) == 0)
{
open();
}
else
{
close();
}
}
void open()
{
digitalWrite(2,0); //開燈
}
void close()
{
digitalWrite(2,1); //關燈
}