資料介紹
描述
在本主題中,我們將討論如何開始使用 Arduino 和 SD 卡(microSD 卡)的簡單 proteus 模擬。
我將在本主題的后面部分解釋如何閱讀有關 SD 卡的信息,以使您熟悉該概念。在本例中,我們將學習如何使用winimage軟件創建映像文件,并使用winimage和SD 庫選擇某些參數,如卷類型、可用空間和其他信息,并通過串行端口發送。然后我們將模仿 proteus 中的示例,以達到類似于實際實驗的最佳所需結果。
Arduino 的 SD 卡庫非常出色,它使與 SD 卡的交互非常簡單。使用 Arduino SD 庫可以讀取和寫入 SD 卡。它基于 William Greiman 的 sdfatlib。在普通 SD 和 SDHC 卡上,該庫支持 FAT16 和 FAT32 文件系統。對于文件名,它使用 8.3 短名稱。
SPI 用于在微控制器和 SD 卡之間進行通信,它位于數字引腳 11、12 和 13(在大多數 Arduino 板上)或 50、51 和 52(在某些 Arduino 板上)(Arduino Mega)。還需要第二個引腳來選擇 SD 卡。可以使用硬件 SS 引腳(大多數 Arduino 板上的引腳 10 或 Mega 上的引腳 53)或 SD.begin() 調用中指定的另一個引腳。
所需組件
硬件
- Arduino板
- 具有 FAT16 或 FAT32 文件系統的 SD 卡
- LM35
- 虛擬終端(作為串行監視器)
- PCF8574 I2C液晶接口模塊
- LM016L (LCD) 顯示器
- R1 & R2 = 10k 歐姆
軟件
- 變形蟲
- Arduino IDE
- Winimage
1.先決條件練習
在我們開始進行實際零件仿真之前,我們將通過簡單的下載、安裝和設置 Arduino IDE 和 Proteus 庫的練習來熱身。
一世。安裝 Winimage
我們的第一步是從 Internet 下載 winimage 并將下載路徑設置為便于以后訪問。根據系統要求,從官網選擇相應的 latest.exe 文件。
?
一世。在 IDE 中添加 SD 卡庫
現在我們將從 IDE 下載 SD 庫。請按照下圖所示的步驟了解有關如何下載適用于 Arduino IDE 的 SD 庫的更多信息。我們將使用這個庫來為 Arduino 編程 SD 卡模塊以存儲和檢索數據。
第 1 步:打開 Arduino IDE
?
第 2 步:轉到“草圖”>>“包含庫”>>“管理庫”
?
第 3 步:在搜索欄中搜索“SD”并從那里“安裝”
?
ii. 創建 Winimage 映像文件
下一步是使用 winimge.exe 軟件創建圖像文件。在這里,我們將從下載的文件夾中打開它,并將創建 2 MB 大小的文件。該文件將用于將 SD 卡模塊中的數據存儲為 .txt 格式。
使用 WinImage,您可以在硬盤驅動器或其他媒體上重新創建磁盤映像、查看其內容、提取基于映像的文件、添加新文件和目錄、更改格式以及對映像進行碎片整理。
按照下面的圖像來了解我們如何創建圖像文件。
保持 FAT 12/16 和其他參數不受影響,除了圖像大小。
對于這個例子,我們將使用 2 MB 的圖像文件,因此創建了相同的圖像,如下圖所示。我們為圖像文件命名為“Venuuu.IMG”
注意:保存文件時不要更改任何擴展名 (*.IMG)。
第一步:打開“winimage.exe”文件
?
第 2 步:單擊“確定”并繼續
?
第 3 步:轉到左上角的“文件”
?
第四步:點擊“新建”
?
第 5 步:點擊“選擇自定義圖像格式”
?
第 6 步:從下拉列表中選擇“4 (2048)”
?
第7步:保持一切原樣,然后單擊“確定”
?
第8步:現在點擊“文件”保存文件
?
第 9 步:現在將文件“另存為”到目標文件夾
?
?
?
1. 模擬與編碼
在成功設置了模擬所需的所有先決條件后,現在我們將深入研究在 proteus 中模擬 SD 卡模塊的實際部分。現在在 proteus 中打開新文件,然后從軟件列表中拖放所需的組件(參考下圖),因為我們在上面提到了所有組件的名稱。
在這里,我們使用 I2C (PCF8574) 將 LCD 連接到 Arduino,這允許使用較少數量的板上引腳。
在下一部分中,如下圖所示分配 SD 卡模塊中圖像文件的文件路徑,并選擇文件大小為 2 MB。
?
在這個階段,我們將在 proteus 模擬中的 SD 卡模塊中設置卡映像文件路徑(下圖相同)。
注意:請選擇與您創建的圖像文件相同的媒體大小(MB)。您可以根據需要創建任何大小的圖像文件。
?
?
?
2. 檢查 SD 卡的狀態
現在我們在 Arduino 中添加下面的草圖來了解 SD 卡模塊的狀態。
下面的草圖用于了解我們的 SD 卡是否正確連接到 Arduino。如果沒有找出原因并調試它。
上傳下面的草圖作為成功運行模擬的主要步驟。如果一切順利,如下圖所示,那么您就在正確的軌道上獲得最終結果。
// Interfacing Arduino with SD card example (get SD card info)
// include the SD library:
#include
#include
// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.print("\nInitializing SD card...");
// we'll use the initialization code from the utility libraries
// since we're just testing if the card is working!
if (!card.init()) {
Serial.println("initialization failed. Things to check:");
Serial.println("* is a card inserted?");
Serial.println("* is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
while (1);
} else {
Serial.println("Wiring is correct and a card is present.");
}
// print the type of card
Serial.println();
Serial.print("Card type: ");
switch (card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
// Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
if (!volume.init(card)) {
Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
while (1);
}
Serial.print("Clusters: ");
Serial.println(volume.clusterCount());
Serial.print("Blocks x Cluster: ");
Serial.println(volume.blocksPerCluster());
Serial.print("Total Blocks: ");
Serial.println(volume.blocksPerCluster() * volume.clusterCount());
Serial.println();
// print the type and size of the first FAT-type volume
uint32_t volumesize;
Serial.print("Volume type is: FAT");
Serial.println(volume.fatType(), DEC);
volumesize = volume.blocksPerCluster(); // clusters are collections of blocks
volumesize *= volume.clusterCount(); // we'll have a lot of clusters
volumesize /= 2; // SD card blocks are always 512 bytes (2 blocks are 1KB)
Serial.print("Volume size (Kb): ");
Serial.println(volumesize);
Serial.print("Volume size (Mb): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Gb): ");
Serial.println((float)volumesize / 1024.0);
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
// list all files in the card with date and size
root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop(void) {
}
?
3. 串行監視器輸出
一旦我們在 Arduino 中上傳程序,我們將在串行監視器中看到以下任何狀態。
1.如果沒有卡或Arduino無法連接到它,串口監視器將顯示以下消息:
2.如果我們用 FAT16 文件系統放置一個 2 MB 的圖像文件,我得到的結果如下所示:
4. 編程、上傳和存儲
現在我們將生成代碼并將其上傳到 Arduino,以從 LM35 傳感器獲取溫度值。帶有日期和時間的溫度值使用 winimage 存儲在 .txt 文件中。我們在這里使用 LCD 為用戶顯示溫度,而無需每次打開圖像中的 .txt 文件。
將程序保存在所需位置并上傳。作為參考,請使用下面的代碼了解更多信息。
上傳后運行模擬并等待一段時間在 SD 卡中存儲 10-20 個讀數。
以下是要上傳到 Arduino 板的最終草圖。參考以下代碼并將其保存在目標文件夾中。
?
#include
#include
#include
#include
#include
#define TIME_HEADER "T" // Header tag for serial time sync message
#define TIME_REQUEST 7 // ASCII bell character requests a time sync message
File myFile;
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
//const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
//LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
LiquidCrystal_I2C lcd(0x20,16,2);
void digitalClockDisplay(){
// digital clock display of the time
lcd.print("Time ");
lcd.print(hour());
Serial.print(hour());
printDigits(minute());
printDigits(second());
lcd.setCursor(0, 1);
lcd.print("Date ");
lcd.print(day());
lcd.print("/");
lcd.print(month());
lcd.print("/");
lcd.print(year());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
}
int printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
lcd.print(":");
if(digits < 10)
lcd.print('0');
lcd.print(digits);
return digits;
}
void processSyncMessage() {
unsigned long pctime;
const unsigned long DEFAULT_TIME = 1357041600; // Jan 1 2013
if(Serial.find(TIME_HEADER)) {
pctime = Serial.parseInt();
if( pctime >= DEFAULT_TIME) { // check the integer is a valid time (greater than Jan 1 2013)
setTime(pctime); // Sync Arduino clock to the time received on the serial port
}
}
}
time_t requestSync()
{
Serial.write(TIME_REQUEST);
return 0; // the time will be sent later in response to serial mesg
}
void setup() {
lcd.init();
lcd.init();
lcd.backlight();
Serial.begin(9600);
// set up the LCD's number of columns and rows:
if (!SD.begin(10)) {
Serial.println("initialization failed!");
return;
}
else{
Serial.println("initialization Success!");
}
myFile = SD.open("group.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
myFile.print("Date");
myFile.print(",");
myFile.print("Time");
myFile.print(",");
myFile.println("Temperature");
// close the file:
myFile.close();
}
else {
Serial.print("error");
}
while (!Serial) ; // Needed for Leonardo only
pinMode(13, OUTPUT);
setSyncProvider( requestSync); //set function to call when sync required
Serial.println("Waiting for sync message");
lcd.print("Loading.....");
lcd.clear();
}
void loop() {
if (Serial.available()) {
processSyncMessage();
}
if (timeStatus()!= timeNotSet) {
digitalClockDisplay();
}
if (timeStatus() == timeSet) {
digitalWrite(13, HIGH); // LED on if synced
} else {
digitalWrite(13, LOW); // LED off if needs refresh
}
int lm35_pin = A0;
float temperature = analogRead(lm35_pin);
temperature = (temperature*500)/1023;
File data_file = SD.open("group.txt", FILE_WRITE);
if (data_file) {
data_file.print(day());
data_file.print("/");
data_file.print(month());
data_file.print("/");
data_file.print(year());
data_file.print(",");
data_file.print(hour());
data_file.print(":");
// Serial.print(hour());
int p= printDigits(minute());
data_file.print(p);
data_file.print(":");
int m= printDigits(second());
data_file.print(m);
data_file.print(",");
data_file.println(temperature);
data_file.close();
}
else {
Serial.print("error");
}
delay(800);
lcd.setCursor(0, 0);
}
?
?
?
5. 導出 SD 卡數據
正如我們在模擬部分所做的那樣,現在讓我們看看數據是否存儲在圖像文件中。
讓我們打開“Venuuu.IMG”文件來查看圖像文件中的內容。
如下圖所示,我們可以看到在圖像文件中創建了名為“group.txt”的.txt文件。現在我們將通過雙擊它來導出文件。然后它會自動打開文件,我們可以看到里面存儲的溫度數據。
按照下圖重新創建實驗。
?
?
?
?
現在我們打開 excel 將文件轉換為 excel 格式,以便根據數據或任何其他我們想要的目的繪制圖形。
打開 .txt 文件并將分隔符設置為用逗號分隔以將數據分隔為列,然后根據需要繼續分析數據。
?
?
?
?
?
這都是關于使用 SD 卡模塊在 Proteus 中進行的簡單模擬。
感謝您閱讀本文,祝您有美好的一天!
- CEPARK SD卡模塊原理圖
- Arduino的DIY SD卡模塊
- SD卡2.0協議資料英文版 0次下載
- 基于SPI協議的SD卡讀寫說明 49次下載
- SD卡的99SE封裝庫免費下載 43次下載
- SD卡的99SE封裝庫免費下載 13次下載
- 使用單片機實現SD卡讀寫的資料和程序免費下載
- 如何實現單片機讀寫SD卡的底層驅動程序
- 如何使用單片機讀寫SD卡
- SD卡資料 7次下載
- SD卡要點說明 265次下載
- SD卡分類簡介
- SD卡命令解釋
- sd卡-mmc卡-CPU說明資料
- sd卡量產工具,下載
- 貼片式SD卡功能介紹【MK SD NAND】 385次閱讀
- sd卡是什么有什么用途 TF卡和SD卡有什么區別 3858次閱讀
- sd卡是什么有什么用途 TF卡和SD卡有什么區別 2015次閱讀
- SD卡的分類以及常見屬性 3686次閱讀
- TF卡和SD卡的區別有哪些? 8253次閱讀
- 怎么通過FPGA采取SD模式實現Micro SD卡的驅動 1691次閱讀
- SD/micro SD存儲卡介紹 1577次閱讀
- STM32G0開發筆記:SD卡模塊的使用方法 1983次閱讀
- 微雪電子SD卡存儲模塊簡介 1593次閱讀
- digilent全尺寸SD卡槽模塊簡介 2662次閱讀
- 微雪電子Micro SD卡 存儲模塊簡介 2765次閱讀
- 干貨 | SD卡/TF卡的PCB布局布線設計要求 2.5w次閱讀
- AT89C52單片機與SD卡實現通訊的設計方案 2996次閱讀
- spi讀取sd卡數據例程 8823次閱讀
- mmc卡和sd卡的區別是什么 4.7w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多