[材料]
•Arduino Uno x 1
•SD卡模組x1
•連接線x 6條
•SD卡模組連接線路
SPI匯流排規定了4個保留邏輯訊號介面:( 維基百科)
•SCLK(串行時鐘):串行時鐘,由
主機發出•MOSI(主輸出,從輸入):主機輸出從機輸入訊號,由主機發出
•MISO(主輸入,從輸出):主機輸入從機輸出訊號,由從機發出
•SS(從機選擇)或片選(CS):由主機發出,低電位有效
有關SPI的說明,可參考這篇:「Raspberry Pi筆記(二):GPIO接腳與I2C及SPI安裝」。
•初始設定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(數據)
•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針
|
•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卡資料
沒有留言:
張貼留言