Wikipedia 維基百科

搜尋結果

2019年4月1日 星期一

Arduino筆記 - 準備開發環境

取得Arduino板子與USB傳輸線
首先,你必須先準備一張Arduino板子與一條USB傳輸線: 要購買Arduino板子,可以到國外網站http://www.sparkfun.com購買,或是到Arduino.TW樂園藝科資訊商城或者是露天拍賣這幾個台灣網站購買.Arduino的板子有很多種版本,用Arduino UnoArduino Duemilanove或是Diecimila都可以,一張板子大約30塊美金左右。
圖片 圖片 

下載Arduino開發環境
到Arduino官方網站arduino.cc下載軟體.Arduino軟體不需要安裝,下載後解開壓縮檔即可使用,解壓縮之後,雙擊arduino.exe就可以啟動主程式.Arduino的軟體介面如下: 
圖片 
連接控制板與安裝驅動程式
Arduino的板子可以透過USB供電,不需要另外接電源將USB傳輸線一端接到電腦,一端接到Arduino的板子後,會出現FTDI驅動程式安裝畫面: 按下「下一步」,接著要指定驅動程式的位置.Arduino軟體裡已經內附FTDI驅動程式,直接把位置指定到“Arduino-00xx \ drivers \ FTDI USB Drivers”後開始進行安裝,例如我用的版本是Arduino-0021,所以我指定“C:\ arduino -0021-drivers \ FTDI USB Drivers“: 安裝完成的畫面: 打開”裝置管理員“,檢查Arduino連接在哪個COM端口。以我的電腦為例,我的Arduino板子接在COM4: 
圖片 

圖片 

圖片 

圖片 
開啟並編譯blink範例程式
雙擊Arduino.exe啟動Arduino主程式,點選文件>示例> 1.Basics> Blink打開Blink範例程式: 接著按下驗證這個按鈕編譯程式,假如程式語法沒有錯誤,畫面下方的狀態列會出現“Done Compiling。”的訊息: 
圖片 
圖片
圖片 
選擇Arduino控制板
工具> Board選擇跟你所用的Arduino對應的板子。我用的是Arduino Duemilanove,所以我選擇“Arduino Duemilanove或Nano w / ATmega328”這個選項: 
圖片 
選擇串口
工具>串口選擇COM端口,以我的電腦為例,我的Arduino板子接在COM4上,所以我選擇COM4: 
圖片 
上傳程式
最後圖片按下上傳這個按鈕,等候幾秒鐘,應該會看到板子上的RX和TX兩個燈號會快速地閃爍,如果上傳成功,狀態列會出現“完成上傳。”的訊息: 上傳完畢後,經過幾秒鐘後,板子上銷13(L)的燈號(黃色的燈號)就會開始閃爍,如果是的話,代表你的Arduino開發環境已準備好,可以開始學習寫Arduino程式了: 
圖片 

圖片 
參考資料

ARDUINO : 用藍芽控制馬達

 

2019年3月28日 星期四

Arduino的練習:光敏電阻

之前以可變電阻控制呼吸燈的循環時間,這篇要以光敏電阻(光電阻,光電池,光敏電阻)控制LED的明滅。

電路圖(Fritzing格式)與程式原始碼,可在此下載

電路圖:

LED,長腳接腳位13,短腳接GND。

光敏電阻,一腳接5V,另一腳接到腳位A0與10k ohm電阻,電阻的另一腳接地。// 






從腳位A0讀取光敏電阻的值。// 
以腳位13控制LED。
無效設置(){ 
  Serial.begin(115200); 
  pinMode(A0,INPUT); 
  pinMode(13,OUTPUT); 
 
  digitalWrite(13,LOW); 


int pr_min = 400; 

void loop(){ 
  //以及analogRead()讀取光敏電阻的值,會回傳0~1023之間的值.int 


  pr = analogRead(A0); 

  //並且把值輸出到序列埠,請用手遮蔽光敏電阻,看看變化

  .Serial.println(pr); 

  //若大於這個值,熄滅LED,若小於就點亮。
  //請視需求修改pr_min.digitalWrite 
  (13,pr> pr_min?LOW:HIGH); 
 
  延遲(1000); 


完成後,當外界光線強時,光敏電阻會讀到較大的值,LED就會熄滅;外界光線弱時,會讀到較小的值,LED就會亮起。


參考資料:

Arduino筆記:讀取/寫入SD卡資料

如果要在Arduino紀錄感測元件接收的數值,除了透過網路模組送出以外,開發板本身並不像Raspberry Pi有外接SD或Micro SD卡的介面,可以儲存在記憶卡上,要寫入資料到SD卡上,就必須透過SPI的介面,才能將感測的資料寫入SD卡。

我先測試一下SD卡的模組是否能讀取/寫入檔案,如果可以,再改接網絡擴展模組W5100,看看相同的程式是否能存取W5100擴展板上Micro SD卡的資料?結果如何呢?


[材料]

•Arduino Uno x 1 
•SD卡模組x1 
•連接線x 6條

[接線圖]

•注:上圖DI代表SD卡模組MOSI,DO代表SD卡模組MISO 

•SD卡模組連接線路 
SD 卡模組
Arduino的
GND
GND
+ 5V
5V
CS
針腳4
MOSI
第11針
SCK(CLK)
第13針
味噌
第12針
SPI匯流排規定了4個保留邏輯訊號介面:( 維基百科
•SCLK(串行時鐘):串行時鐘,由
主機發出•MOSI(主輸出,從輸入):主機輸出從機輸入訊號,由主機發出
•MISO(主輸入,從輸出):主機輸入從機輸出訊號,由從機發出
•SS(從機選擇)或片選(CS):由主機發出,低電位有效

有關SPI的說明,可參考這篇:「Raspberry Pi筆記(二):GPIO接腳與I2C及SPI安裝」。

[SD庫]

SD類
•初始設定SD卡及函式庫:SD.begin(cspin)
    cspin(選項):Arduino連接SD卡模組SS或CS的Pin腳

•檢查括號內的檔案名稱是否存在:exists()

•建立目錄:SD.mkdir(filename)

•開啟檔案:SD.open(文件路徑,模式)
   模式:FILE_READ開啟唯讀檔案,從檔案開始處讀取。
               FILE_WRITE開啟讀寫檔案,從檔案最後處開始寫入

•移除檔案:SD.remove(文件名)

•移除目錄:SD.rmdir(filename)

文件類
•關閉檔案:file.close()

•將數據字串寫到檔案中,不跳行:file.print(data)

•將數據字串寫到檔案中,不跳行:file.println(數據)

•將數據字串寫入檔案中:file.write(數據)

[程式]

我參考Arduino IDE的兩個範例cardinfo跟踪文件,試著在SD卡上,顯示SD卡的相關資訊,再建立一個檔案,寫入測試文字後,關閉檔案。以下是執行的測試程式:

#include <SPI.h>
#include <SD.h>

檔案myFile;

//設定SD庫功能變數:

Sd2Card卡;
SdVolume量;
SdFile root;

const int chipSelect = 4;

void setup(){

  Serial.begin(9600); //開啟通訊串列埠開啟
  while(!Serial){//等待串列埠連線
  }

  // -----------寫入檔案
  Serial.print(“\ n等待SD卡就緒......”);

  if(!SD.begin(4)){
    Serial.println(“失敗!”);
    返回;
  }
  Serial.println(“成功!”);

  myFile = SD.open(“card.txt”,FILE_WRITE); //開啟檔案,一次僅能開啟一個檔案
  
  if(myFile){//假使檔案開啟正常
    Serial.print(“寫入card.txt ...”);         
    myFile.println(“測試將數據寫入SD卡......”); //繼續寫在檔案後面
    myFile.close(); //關閉檔案
    Serial.println(“完成!”);
  } else {
    Serial.println(“\ n打開文件錯誤”); //無法開啟時顯示錯誤
  }
  
   // -----------顯示SD卡資訊

  if(!card.init(SPI_HALF_SPEED,chipSelect)){
    Serial.println(“初始化失敗。檢查:SD卡”);
    返回;
  } else {
    Serial.println(“=============卡信息==================”);
  }

  //顯示SD卡類型

  Serial.print(“卡片類型:”);
  switch(card.type()){
    案例SD_CARD_TYPE_SD1:
      Serial.println(“SD1”);
      打破;
    案例SD_CARD_TYPE_SD2:
      Serial.println(“SD2”);
      打破;
    案例SD_CARD_TYPE_SDHC:
      Serial.println(“SDHC”);
      打破;
    默認:
      Serial.println(“不明”);
  }

  //現在我們將嘗試打開'volume'/'partition' - 它應該是FAT16或FAT32
  if(!volume.init(card)){
    Serial.println(“找不到FAT16 / FAT32分區。”);
    返回;
  }

  //顯示類型和FAT空間大小
  uint32_t volumesize;
  Serial.print(“卷類型為FAT”);
  Serial.println(volume.fatType(),DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster(); //簇是塊的集合
  volumesize * = volume.clusterCount(); //我們會有很多集群
  volumesize * = 512; // SD卡塊總是512字節
  Serial.print(“Volume size(bytes):”);
  Serial.println(volumesize);
  Serial.print(“卷大小(Kbytes):”);
  volumesize / = 1024;
  Serial.println(volumesize);
  Serial.print(“卷大小(Mbytes):”);
  volumesize / = 1024;
  Serial.println(volumesize);

  Serial.println(“卡上找到的\ n文件(名稱,日期和大小,以字節為單位):”);
  root.openRoot(體積);

  //列出卡片中包含日期和大小的所有文件
  root.ls(LS_R | LS_DATE | LS_SIZE);

  Serial.println(“=================完成=====================”);
}

void loop(){//在Setup()執行完成後,就等結束 
}

[執行結果]

換上W5100網路擴展板,程式一個字元都不需要更改,可以讀取擴展板上的SD卡資料。我的SD卡上有中文名稱,就會顯示部分中文沒問題,但大多數變成亂碼。檔案列表第一個card.txt就是測試時寫入的檔案。

[參考資料]

•Arduino.cc:SD庫
天花板隨記 Arduino筆記(16):讀取/寫入SD卡資料