2012年12月24日 星期一

利用藍牙模組達到兩台arduino互相通訊

我所實驗用的藍牙模組為
P-BSMi Silver 藍牙模組



我所使用的板子為 Arduino MEGA 2560


ARDUINO 官方提供的藍牙接線圖
照著官方提供之藍牙接線圖,接完後

我們開始設定兩塊arduino端的程式
藍牙通訊的關係為 Master - Slave
選定一塊arudnio版作為我們的master端
並編寫程式

** 程式流程說明 我們的master端 會尋找指定的配對對象
當配對成功後, slave端會先傳送'y' 字元 給master端
當master端收到後作為確認後 進入autosend()副程式 開始傳送'a' 's' 'd' 三個字元給slave端的藍牙

當slave端收到後 會依照收到的順序做不一樣的led明滅方式
'a' 做五次明滅
's' LED恆亮
'd' LED恆滅
//Master code
/************
Created 2012
by 許肇驛 Hsu Chao-YI
E-mail: ps2steve2005@hotmail.com 
This code is use for communication between BT and BT with each arduino board
***********/
char cometemp;
void setup() {
  Serial3.begin(9600);
  Serial3.print("$$$");
  delay(100);
  Serial3.println("SM,1");  
  delay(100);
  Serial3.println("C,00066648548F");
  delay(100);
  Serial3.println("---");
}
void loop(){
  if(Serial3.available())
{
  cometemp = Serial3.read();
  if (cometemp ='y'){
    autosend();
}
else {
 Serial.print("Can't no find the bluetooth device.");
 Serial.print("Try again after 5 seconds..");
 delay(5000);
 Serial3.print("$$$");
  delay(100);
  Serial3.println("SM,1");  
  delay(100);
  Serial3.println("C,00066648548F");
  delay(100);
  Serial3.println("---");
}
}
}
void autosend(){
Serial3.print('a');
Serial.print("Sent a. ");
delay(300);
Serial3.print('s');
Serial.print("Sent s. ");
delay(300);
Serial3.print('d');
Serial.print("Sent d");
delay(300);
}



 
 Hello SyntaxHighlighter
 

 

 


程式註解:
Serial.available()  - serial收到訊息

$$$ - 依照RN42官方指令說明書 為進入命令模式

SM,<5,4,3,2,1,0> -設定此藍牙模組的模式
 (0=slave, 1=master,2=trigger, 3=auto, 4=DTR, 5=ANY) 
 Example :  “SM,1”  設定藍牙模組為master端   
C,<address> -設定要指定去配對的藍牙模組, address為另外一端的mac位址
---     -離開命令模式exit command mode
Serial.print() -
print東西 藉由serial腳,因為我的藍牙模組 是接在Serial3腳為 因此若要print東西給那個pin腳上所插的東西 就只要改成Serial.print
 這裡有兩個Serial(Serial, Serial3) 我使用Serial是因為想要在 serial

 monitor上也可以顯示
Serial.println() -  跟 Serial.print 一樣,只是多了換行的功能。
Serial3.read - 讀取Serial3 腳位接收到的資料
delay() - ()裡面的數字單位為毫秒 , 一秒=1000毫秒 因此若要delay 一秒 就是 delay(1000)

//Slave code
/************
Created 2012
by 許肇驛 Hsu Chao-YI
E-mail: ps2steve2005@hotmail.com 
This code is use for communication between BT and BT  with each arduino board.
***********/
int ledPin= 13;
char  cometemp;
void setup() {
  pinMode(ledPin,OUTPUT);
  Serial.begin(9600);
  Serial.print("$$$");
  delay(100);
  Serial.println("SM,0");
  delay(100);
  Serial.println("---");
}
void loop()
{
if( Serial.available())
{ 
    Serial.print('y');
    cometemp= Serial.read();
    switch(cometemp){
  case a:
   for(int i=0;i<=5;i++){
   digitalWrite(ledPin,HIGH);
   delay(400);
   digitalWrite(ledPin,LOW);
   delay(300);}
   break;
  case s:
   digitalWrite(ledPin,HIGH);
   delay(5000);
   break;
  case d:
   digitalWrite(ledPin,LOW);
   delay(5000);
   break;}
}}


當在尋找配對的裝置時 會紅燈閃爍


配對成功後會顯示綠燈



'參考: Arduino Bluetooth
         RN-42指令
    Arduino MEGA2560

2012年12月16日 星期日

開放原始碼

Open Source

起源: 
      開放原始碼的行為活動最早可以回朔到1960 年代。當時,售賣大型電腦的廠商如IBM,把一些軟體及原始碼一併送給客戶,讓客戶能夠因不同需求而自行更改軟體。

    定義:

由 Bruce Perens(曾是 Debian 的領導人之一)定義如下:
  • 自由再散布(Free Distribution):允許獲得原始碼的人可自由再將此原始碼散佈。
  • 原始碼(Source Code):程式的可執行檔在散佈時,必需以隨附完整原始碼或是可讓人方便的事後取得原始碼。
  • 衍生著作(Derived Works):讓人可依此原始碼修改後,在依照同一授權條款的情形下再散佈。
  • 原創作者程式原始碼的完整性(Integrity of The Author’s Source Code):意即修改後的版本,需以不同的版本號碼以與原始的程式碼做分別,保障原始的程式碼完整性。
  • 不得對任何人或團體有差別待遇(No Discrimination Against Persons or Groups):開放原始碼軟體不得因性別、團體、國家、族群等設定限制,但若是因為法律規定的情形則為例外(如:美國政府限制高加密軟體的出口)。

  • 對程式在任何領域內的利用不得有差別待遇(No Discrimination Against Fields of Endeavor):意即不得限制商業使用。

  • 散布授權條款(Distribution of License):若軟體再散佈,必需以同一條款散佈之。
  • 授權條款不得專屬於特定產品(License Must Not Be Specific to a Product):若多個程式組合成一套軟體,則當某一開放原始碼的程式單獨散佈時,也必需要符合開放原始碼的條件。
  • 授權條款不得限制其他軟體(License Must Not Restrict Other Software):當某一開放原始碼軟體與其他非開放原始碼軟體一起散佈時(例如放在同一光碟片),不得限制其他軟體的授權條件也要遵照開放原始碼的授權。
  • 授權條款必須技術中立(License Must Be Technology-Neutral):意即授權條款不得限制為電子格式才有效,若是紙本的授權條款也應視為有效。

自由軟體 (Free Software)

自由軟體基金會(FSF)所制定自由軟體的四個自由:
• 可以在任何目的之下自由地使用這些程式
• 可以自由地研讀這些程式是如何運作的,並且各
取所需
• 可以自由地在散佈拷貝版,以協助週遭的人
• 可以自由的修改程式,並且將改善的部份公開發
表,受惠整個社會

2012年12月14日 星期五

Arduino 遇見 LCD

Arduino 遇上 LCD
因為純粹不想一直看著電腦螢幕來做顯示,乾脆我們來接一塊LCD在arduino板子上吧 !

Liquid Crystal Display ( LCD )


LCD 2*16的腳位名稱


LCD與Arduino接線圖









新增範例: file>Example>LiquidCrystal>HelloWord


程式碼





























程式說明: 

#include <LiquidCrystal.h>    :  加入LCD函式庫

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);     :設定您所接的腳位(RS,E,D4,D5,D6,D7)

lcd.begin(16, 2);        :宣告lcd的列與行
lcd.print();                 : lcd顯示的字
lcd.setCursor(0,1) ;   : lcd的行數有兩行,第一行為0,第二行為1 。
                                     第二個數字是第幾列。
millis()                      :系統時間,單位為毫秒(ms),因為1000毫秒= 1秒
                                     因此顯示一秒只要把系統時間除於1000就會顯示秒了。

測試: 

我改了顯示的字,看你要顯示什麼就顯示什麼 =)
















P.S. 若要顯示字在第二行,須加上 lcd.setCursor(1, 0)lcdprint()出來。

參考: 

=====
若有問題,歡迎回覆,因為筆者我還在學習,一起交流。