王伟强课程作品设计说明.docx
《王伟强课程作品设计说明.docx》由会员分享,可在线阅读,更多相关《王伟强课程作品设计说明.docx(7页珍藏版)》请在冰豆网上搜索。
![王伟强课程作品设计说明.docx](https://file1.bdocx.com/fileroot1/2022-11/24/f61f85c8-7f06-4480-be31-231f5ed6ceab/f61f85c8-7f06-4480-be31-231f5ed6ceab1.gif)
王伟强课程作品设计说明
2015-2016学年第二学期
Arduino课程作品说明书
作品题目:
arduino读写SD卡
班级软件14-1软件14-1
姓名王伟强吴洋
学号20140256942014025698
指导教师关明山
目录
第1章作品硬件设计2
1.1功能描述2
1.2模块说明2
1.3各个模块连接图4
第2章软件设计部分5
2.1软件执行流程、读写思想5
2.2软件源代码6
第1章作品硬件设计
1.1功能描述
系统由Arduino控制板(如图一)、杜邦线、SD卡读写模块、SD卡大卡卡托、喇叭组成。
Arduino连接SD卡读写模块,SD卡模块可读大卡也可通过SD卡卡托读小卡。
使用库文件,通过喇叭或者耳机可实现播放音频文件的功能,使用窗口监视器实现SD卡的读写功能。
1.2模块说明
Arduino,是一个基于开放原始码的软硬体平台,构建于开放原始码simpleI/O介面版,并且具有使用类似Java,C语言的Processing/Wiring开发环境。
在我看来arduino的编程十分简单,有一点C语言基础或者说没有,都可以进行教学。
对于刚刚上大学的没有一点基础的新生是一个很不错的选择,因为arduino可以做出许多十分有趣的创意产品,对他们的吸引力很强,可以调动他们的积极性,而且上手容易,成本低。
1.黄色部分是用来连接电脑的USB线的,用来给板子供电以及下载程序使用的。
2.紫色部分为电源部分,接上USB或者外部电源后可以从这个位置为扩展板,自己的面包板等供电。
当然反过来说不接USB与外部电源的话可以从这里给arduino供电。
3.浅绿色部分是数字逻辑输出口,可以按照你编写的程序来输出高电平(5V左右)或者低电平(0.3V左右),一共有13个数字IO口,编号从0~12。
4.蓝色部分为模拟输入口(ADC),可以用来测量模拟量的。
一共六个通道,编号从A0~A5。
黑色部分为外部供电输入,外部7V~12VDC输入。
当USB的500ma电流不够使用的时候可以接上使用。
一般是用不上的啦。
5.深绿色部分是指示灯。
USB和POWER分别指示的是使用外部供电还是USB供电。
L是给用户使用的指示灯,连接到逻辑输出的13号脚。
图
图一arduino模板
SD卡读写模块(如图二),SD卡是一种低电压的flash闪存产品,有标准的MMC/SPI两种操作模块(如图三)。
对于MMC操作模式,读写速度快,控制信号线多,操作复杂,对于SPI操作模块,速度慢,线少,操作相对简单。
SD卡读写模块内置文件系统、可直接进行文件读写的SD卡模块,适用于单片机系统实现大容量存储方案。
单片机使用模块,可直接进行目录遍历、目录创建、目录删除、文件创建、文件删除、文件修改、卡格式化等标准文件系统操作,无需了解SD卡内部存储结构及文件系统实现细节。
特别是随着SD卡在生活中的普及,嵌入式系统把读写SD卡功能集成到系统,成为一种趋势。
图二、SD卡读写模块
图三、SD卡模块各部分功能
SD卡模块技术规格(如图四、五)
1、支持标准FAT文件系统,模块操作的SD卡可直接插入电脑读写。
2、模块内置MicroSD卡插槽,用户也可以自己扩展其它存储卡插槽,支持各有类SD、MMC卡。
3、模块作为SPI从机与单片机通讯,SPI总线的最高速率可达4Mbps。
读SD卡文件的速度最高达128K字节/秒,写SD卡文件的速度最高达64K字节/秒。
4、模块支持的SD卡容量为2GBytes,超过2G的SD卡,则作为2G使用。
5、尺寸50mm*20mm,2.54mm间距通用排针,方便集成。
1.3各个模块连接图
图四、电路连接原理图
图五、实物连接图
第2章软件设计部分
2.1软件执行流程、读写思想
读写思想:
分别用杜邦线在4、11、12、13、D3.3v接口与SD卡读写模块进行连接,利用BillGreiman开发的SdFat.h和SdFatUtil.h头文件和库文件就可实现读写。
2.2软件源代码
附程序代码:
#include
// Callback target, prints output to serial
void DirCallback(char *buf) {
Serial.println(buf);
}
char AudioFileName[16];
// Create static buffer
#define BIGBUFSIZE (2*512) // bigger than 2*512 is often only possible on Arduino megas!
uint8_t bigbuf[BIGBUFSIZE];
// helper function to determine free ram at runtime
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ?
(int) &__heap_start :
(int) __brkval);
}
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!
Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print(F("Free Ram:
"));
Serial.println(freeRam());
// Setting the buffer manually for more flexibility
SdPlay.setWorkBuffer(bigbuf, BIGBUFSIZE);
Serial.print(F("\nInitializing SimpleSDAudio V" SSDA_VERSIONSTRING " ..."));
// If your SD card CS-Pin is not at Pin 4, enable and adapt the following line:
//SdPlay.setSDCSPin(10);
// Select between SSDA_MODE_FULLRATE or SSDA_MODE_HALFRATE (62.5kHz or 31.25kHz)
// and the output modes SSDA_MODE_MONO_BRIDGE, SSDA_MODE_MONO or SSDA_MODE_STEREO
if (!
SdPlay.init(SSDA_MODE_FULLRATE | SSDA_MODE_MONO)) {
Serial.println(F("initialization failed. Things to check:
"));
Serial.println(F("* is a card is inserted?
"));
Serial.println(F("* Is your wiring correct?
"));
Serial.println(F("* maybe you need to change the chipSelect pin to match your shield or module?
"));
Serial.print(F("Error code:
"));
Serial.println(SdPlay.getLastError());
while
(1);
} else {
Serial.println(F("Wiring is correct and a card is present."));
}
}
void loop(void) {
uint8_t count=0, c, flag;
Serial.println(F("Files on card:
"));
SdPlay.dir(&DirCallback);
ReEnter:
count = 0;
Serial.println(F("\r\nEnter filename (send newline after input):
"));
do {
while(!
Serial.available()) ;
c = Serial.read();
if(c > ' ') AudioFileName[count++] = c;
} while((c !
= 0x0d) && (c !
= 0x0a) && (count < 14));
AudioFileName[count++] = 0;
Serial.print(F("Looking for file... "));
if(!
SdPlay.setFile(AudioFileName)) {
Serial.println(F(" not found on card!
Error code:
"));
Serial.println(SdPlay.getLastError());
goto ReEnter;
} else {
Serial.println(F("found."));
}
Serial.println(F("Press s for stop, p for play, h for pause, f to select new file, d for deinit, v to view status."));
flag = 1;
while(flag) {
SdPlay.worker();
if(Serial.available()) {
c = Serial.read();
switch(c) {
case 's':
SdPlay.stop();
Serial.println(F("Stopped."));
break;
case 'p':
SdPlay.play();
Serial.println(F("Play."));
break;
case 'h':
SdPlay.pause();
Serial.println(F("Pause."));
break;
case 'd':
SdPlay.deInit();
Serial.println(F("SdPlay deinitialized. You can now safely remove card. System halted."));
while
(1) ;
break;
case 'f':
flag = 0;
break;
case 'v':
Serial.print(F("Status:
isStopped="));
Serial.print(SdPlay.isStopped());
Serial.print(F(", isPlaying="));
Serial.print(SdPlay.isPlaying());
Serial.print(F(", isPaused="));
Serial.print(SdPlay.isPaused());
Serial.print(F(", isUnderrunOccured="));
Serial.print(SdPlay.isUnderrunOccured());
Serial.print(F(", getLastError="));
Serial.println(SdPlay.getLastError());
Serial.print(F("Free RAM:
"));
Serial.println(freeRam());
break; } }}}