顯示具有 Arduino 標籤的文章。 顯示所有文章
顯示具有 Arduino 標籤的文章。 顯示所有文章

2013年3月31日 星期日

Ultrasonic Sensor!

const unsigned int PING_SENSOR_IO_PIN=7; //輸出
const unsigned int PING_SENSOR_IO_PIN2=8; //接收
const unsigned int BAUD_RATE=9600;
void setup(){
Serial.begin(BAUD_RATE);
}
void loop()
{
pinMode(PING_SENSOR_IO_PIN,OUTPUT); //輸出端
pinMode(PING_SENSOR_IO_PIN2,INPUT); //接受端
digitalWrite(PING_SENSOR_IO_PIN,LOW); //先設定低波
delayMicroseconds(2); //2微渺
digitalWrite(PING_SENSOR_IO_PIN,HIGH); //發射高坡
delayMicroseconds(5); //5毫秒
digitalWrite(PING_SENSOR_IO_PIN,LOW); //低波
const unsigned long duration=pulseIn(PING_SENSOR_IO_PIN2,HIGH);
//pulseln 假如回傳746, 746/29/2= 12cm
//因為超音波1秒343公尺,1/343=0.0029155 聲音前進一公分=29.155微秒
//為何又要/2呢? 因為 傳送+接收 =兩倍時間
if(duration==0)
{
Serial.println("Warning:we did not get a pulse from sensor");
}
else
{
Serial.println(duration); //可顯示 duration目前數值 經過計算 duration/29/2= CM
Serial.print("Distance to nearest object:");
Serial.print(microseconds_to_cm(duration)); //呼叫副程式(參數)
Serial.println("cm");
}
delay(100);
}
unsigned long microseconds_to_cm(const unsigned long microseconds) //副程式(帶入duration)
{
return microseconds / 29 / 2; //duration/29/2=return!!
}


腳位紀錄
HC-SR04
VCC=5V
Trig =output
Echo=intput
Gnd =Gnd

以下為Float 寫法


const unsigned int PING_SENSOR_IO_PIN = 7;
const unsigned int PING_SENSOR_IO_PIN2 = 8;
const unsigned int BAUD_RATE = 9600;
const float MICROSECONDS_PER_CM = 29.155;// 聲音一公分所需時間
const float MOUNTING_GAP = 0.2;
const float SENSOR_OFFSET = MOUNTING_GAP * MICROSECONDS_PER_CM * 2; //麵包版與SENSOR距離
void setup() {
Serial.begin(BAUD_RATE);
}
void loop() {
const unsigned long duration = measure_distance(); //呼叫1
if (duration == 0) //如果沒收到訊號時
Serial.println("Warning: We did not get a pulse from sensor.");
else
output_distance(duration);//收到訊號時 呼叫2 帶參數duration
}
const float microseconds_to_cm(const unsigned long microseconds)//副程式3
{
const float net_distance = max(0, microseconds - SENSOR_OFFSET);
//dutation=1502 -11.6=1490.4
return net_distance / MICROSECONDS_PER_CM / 2; //1490.4/29.155/2=25.559
}
const unsigned long measure_distance()//副程式1
{
pinMode(PING_SENSOR_IO_PIN, OUTPUT); //輸出模式
digitalWrite(PING_SENSOR_IO_PIN, LOW); //低頻
delayMicroseconds(2);
digitalWrite(PING_SENSOR_IO_PIN, HIGH); //高頻
delayMicroseconds(5);
digitalWrite(PING_SENSOR_IO_PIN, LOW); //低頻
pinMode(PING_SENSOR_IO_PIN2, INPUT); //定義接收端
return pulseIn(PING_SENSOR_IO_PIN2, HIGH);//利用pulseln方法 接收高頻
}
void output_distance(const unsigned long duration)//副程式2
{
Serial.print(duration);
Serial.print("Distance to nearest object: ");
Serial.print(microseconds_to_cm(duration)); //呼叫3 帶入 duration
Serial.println(" cm");
}

Using the Serial port!

const unsigned int LED_PIN = 13; //Declare LED_PIN= 13pin
const unsigned int BAUD_RATE = 9600; //BAUD RATE=9600
void setup()
{
pinMode(LED_PIN, OUTPUT); //Define this 13pin is output
Serial.begin(BAUD_RATE); // Using this "Serial.begin()" function to start the class
//You can specify the Baud Rate of the Arduino from the computer to exchange messages
//Usually we use 9600 bps。Of course, you can also use other speed
//But usually no more than115,200 bps..
}
void loop()
{
if (Serial.available() > 0) //Serial.available() whether a message is received?
//If the received data Will return the byte If no data is returned -1
{
int command = Serial.read(); //Declare "command" is "Serial.read()" ,
//using "Serial.read()" Read data
if (command == '1') // if typing 1
{
digitalWrite(LED_PIN, HIGH); // LED on!!
Serial.println("LED on"); //Serial show ON
}
else if (command == '2') //if typing 2
{
digitalWrite(LED_PIN, LOW); // LED off
Serial.println("LED off"); //Serial show OFF
}
else
{
Serial.print("Unknown command: "); //if typing any key!
Serial.println(command); // show any key
}
}
}

Arduino Basis functions

輸入輸出函數
pinMode(pin, mode)

將數位腳位(digital pin)指定為輸入或輸出。

範例 :

pinMode(7,INPUT); // 將腳位 7 設定為輸入模式


digitalWrite(pin, value)

將數位腳位指定為開或關。腳位必須先透過pinMode明示為輸入或輸出模式digitalWrite才能生效。

範例 :

digitalWrite(8,HIGH); //將腳位 8設定輸出高電位


int digitalRead(pin)

將輸入腳位的值讀出,當感測到腳位處於高電位時時回傳HIGH,否則回傳LOW。

範例 :

val = digitalRead(7); // 讀出腳位 7 的值並指定給 val


int analogRead(pin)

讀出類比腳位的電壓並回傳一個 0到1023 的數值表示相對應的0到5的電壓值。

範例 :

val = analogRead(0); //讀出類比腳位 0 的值並指定給 val變數


analogWrite(pin, value)

改變PWM腳位的輸出電壓值,腳位通常會在3、5、6、9、10與11。Value變數範圍0-255,例如:輸出電壓2.5伏特(V),該值大約是128。

範例 :

analogWrite(9,128); // 輸出電壓約2.5伏特(V)


unsigned long pulseIn(pin, value)

設定讀取腳位狀態的持續時間,例如使用紅外線、加速度感測器測得某一項數值時,在時間單位內不會改變狀態。

範例 :

time = pulsein(7,HIGH); // 設定腳位7的狀態在時間單位內保持為HIGH


shiftOut(dataPin, clockPin, bitOrder, value)

把資料傳給用來延伸數位輸出的暫存器,函式使用一個腳位表示資料、一個腳位表示時脈。bitOrder用來表示位元間移動的方式(LSBFIRST最低有效位元或是MSBFIRST最高有效位元),最後value會以byte形式輸出。此函式通常使用在延伸數位的輸出。

範例 :

shiftOut(dataPin, clockPin, LSBFIRST, 255);


//-----------------------------------------------------------------------------------------------------------
時間函數
控制與計算晶片執行期間的時間


unsigned long millis()

回傳晶片開始執行到目前的毫秒

範例:

duration = millis()-lastTime; // 表示自"lastTime"至當下的時間

delay(ms)

暫停晶片執行多少毫秒

範例:

delay(500); //暫停半秒(500毫秒)


delay Microseconds(us)

暫停晶片執行多少微秒

範例:

delayMicroseconds(1000); //暫停1豪秒

//-----------------------------------------------------------------------------------------------------------
數學函式
三角函數以及基本的數學運算


min(x, y)

回傳兩數之間較小者

範例:

val = min(10,20); // 回傳10


max(x, y)

回傳兩數之間較大者

範例:

val = max(10,20); // 回傳20


abs(x)

回傳該數的絕對值,可以將負數轉正數。

範例:

val = abs(-5); // 回傳5


constrain(x, a, b)

判斷x變數位於a與b之間的狀態。x若小於a回傳a;介於a與b之間回傳x本身;大於b回傳b

範例:

val = constrain(analogRead(0), 0, 255); // 忽略大於255的數


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

將value變數依照fromLow與fromHigh範圍,對等轉換至toLow與toHigh範圍。時常使用於讀取類比訊號,轉換至程式所需要的範圍值。


例如:

val = map(analogRead(0),0,1023,100, 200); // 將analog0 所讀取到的訊號對等轉換至100 – 200之間的數值。


double pow(base, exponent)

回傳一個數(base)的指數(exponent)值。

範例:

double x = pow(y, 32); // 設定x為y的32次方


double sqrt(x)

回傳double型態的取平方根值。

範例:

double a = sqrt(1138); // 回傳1138平方根的近似值 33.73425674438


double sin(rad)

回傳角度(radians)的三角函數sine值。

範例:

double sine = sin(2); // 近似值 0.90929737091


double cos(rad)

回傳角度(radians)的三角函數cosine值。

範例

double cosine = cos(2); //近似值-0.41614685058


double tan(rad)

回傳角度(radians)的三角函數tangent值。

範例

double tangent = tan(2); //近似值-2.18503975868

//-----------------------------------------------------------------------------------------------------------
亂數函式
產生亂數


randomSeed(seed)

事實上在Arduino裡的亂數是可以被預知的。所以如果需要一個真正的亂數,可以呼叫此函式重新設定產生亂數種子。你可以使用亂數當作亂數的種子,以確保數字以隨機的方式出現,通常會使用類比輸入當作亂數種子,藉此可以產生與環境有關的亂數(例如:無線電波、宇宙雷射線、電話和螢光燈發出的電磁波等)。

範例:

randomSeed(analogRead(5)); // 使用類比輸入當作亂數種子


long random(max)

long random(min, max)

回傳指定區間的亂數,型態為long。如果沒有指定最小值,預設為0。


範例:

long randnum = random(0, 100); // 回傳0 – 99 之間的數字

long randnum = random(11); // 回傳 0 -10之間的數字

//-----------------------------------------------------------------------------------------------------------
序列通訊
你可以在第五章看見一些使用序列埠與電腦交換訊息的範例,以下是函式解釋。


Serial.begin(speed)

你可以指定Arduino從電腦交換訊息的速率,通常我們使用9600 bps。當然也可以使用其他的速度,但是通常不會超過115,200 bps(每秒位元組)。


範例:

Serial.begin(9600);


Serial.print(data)

Serial.print(data, encoding)

經序列埠傳送資料,提供編碼方式的選項。如果沒有指定,預設以一般文字傳送。


範例:

Serial.print(75); // 列印出 "75"

Serial.print(75, DEC); //列印出 "75"

Serial.print(75, HEX); // "4B" (75 的十六進位)

Serial.print(75, OCT); // "113" (75 in的八進位)

Serial.print(75, BIN); // "1001011" (75的二進位)

Serial.print(75, BYTE); // "K" (以byte進行傳送,顯示以ASCII編碼方式) BYTE Arduino 1.0 已後不用


Serial.println(data)

Serial.println(data, encoding)

與Serial.print()相同,但會在資料尾端加上換行字元( )。意思如同你在鍵盤上打了一些資料後按下Enter。

範例:

Serial.println(75); //列印出"75 "

Serial.println(75, DEC); //列印出"75 "

Serial.println(75, HEX); // "4B "

Serial.println(75, OCT); // "113 "

Serial.println(75, BIN); // "1001011 "

Serial.println(75, BYTE); // "K "

int Serial.available()

回傳有多少位元組(bytes)的資料尚未被read()函式讀取,如果回傳值是0代表所有序列埠上資料都已經被read()函式讀取。

範例:

int count = Serial.available();


int Serial.read()

讀取1byte的序列資料

範例:

int data = Serial.read();


Serial.flush()

有時候因為資料速度太快,超過程式處理資料的速度,你可以使用此函式清除緩衝區內的資料。經過此函式可以確保緩衝區(buffer)內的資料都是最新的。

範例:

Serial.flush();

My first blinking LED program

const unsigned int LED_PIN=13;
const unsigned int PAUSE=500;

//Declare2個const常數 unsigned無號數 int 0 to 65535

//LEDPIN=13pin腳位置

//PAUSE=Setting500毫秒PAUSE Time



void setup() //將會初始化 ARDUINO開發版的所有連接的裝置只執行一次

{
pinMode(LED_PIN,OUTPUT);


//設定13pin 為輸出
}


void loop() //LOOP將會持續呼叫

{
digitalWrite(LED_PIN,HIGH);


//13pin為 高電位
delay(PAUSE);


//延遲500毫秒
digitalWrite(LED_PIN,LOW);


//13pin為 低電位
delay(PAUSE);


//延遲 500毫秒
}