{"id":210,"date":"2014-01-26T22:06:31","date_gmt":"2014-01-26T13:06:31","guid":{"rendered":"http:\/\/goji2100.s199.coreserver.jp\/blog\/?p=210"},"modified":"2015-11-01T21:22:11","modified_gmt":"2015-11-01T12:22:11","slug":"arduino-unomega-2560-wav%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%81%ae%e5%86%8d%e7%94%9f","status":"publish","type":"post","link":"https:\/\/goji2100.com\/blog\/?p=210","title":{"rendered":"Arduino UNO\/Mega 2560 .WAV\u30d5\u30a1\u30a4\u30eb\u306e\u518d\u751f"},"content":{"rendered":"<p><em>Arduino UNO\/Mega 2560\u3067\u52d5\u4f5c\u3059\u308b.WAV\u30d5\u30a1\u30a4\u30eb\u518d\u751f\u30b9\u30b1\u30c3\u30c1\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002<br \/>\n.WAV\u30d5\u30a1\u30a4\u30eb\u306f\u3001\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u5909\u63db\u30a2\u30d7\u30ea\u3067\u300c8000Hz\/8bit\/Mono\u300d\u307e\u305f\u306f\u300c16000Hz\/8bit\/Mono\u300d\u5f62\u5f0f\u306b\u3057\u3066\u3001SD\u30ab\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059\uff08\u30b5\u30f3\u30d7\u30eb\u30b9\u30b1\u30c3\u30c1\u3067\u306f\u300ctest0001.wav\u300d\u3067\u3059\uff09\u3002<br \/>\nUNO\u3067\u306fD3pin\u3001Mega\u3067\u306fD9pin\u304b\u3089\u51fa\u529b\u3055\u308c\u307e\u3059\u306e\u3067\u7c21\u5358\u306a\u30ed\u30fc\u30d1\u30b9\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u901a\u3057\u3066\u30a2\u30f3\u30d7\u306b\u63a5\u7d9a\u3057\u307e\u3059\u3002<\/em><\/p>\n<p><!--more--><\/p>\n<pre class=\"lang:arduino decode:true\" title=\"WAVE2.ino\">\r\n#include &lt;SPI.h&gt;\r\n#include &lt;SD.h&gt;\r\n\r\n#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)\r\nconst int debugPort  =  8;  \/\/ debug port\r\nconst int soundPort  =  9;  \/\/ sound out\r\nconst int chipSelect = 53;  \/\/ SD CS\r\n#define BUFF_SIZE 512  \/\/ buffer size\r\n#else\r\nconst int debugPort  =  8;  \/\/ debug port\r\nconst int soundPort  =  3;  \/\/ sound out\r\nconst int chipSelect = 10;  \/\/ SD CS\r\n#define BUFF_SIZE 256  \/\/ buffer size\r\n#endif\r\n\r\nunsigned char  buffs[BUFF_SIZE * 2];\r\nvolatile unsigned short bufGP;  \/\/ buffer pointer for GET\r\nvolatile unsigned short bufPP;  \/\/ buffer pointer for PUT\r\n\r\nISR(TIMER2_OVF_vect)  \/\/ Timer2 overflow ISR\r\n{\r\n  static unsigned char intCnt = 0;\r\n\r\n  if (++intCnt &gt;= 4) {  \/\/ 8:8kHz, 4:16kHz\r\n    intCnt = 0;\r\n    if (bufGP != bufPP) {\r\n      OCR2B = buffs[bufGP]; \/\/ analogWrite(soundPort, buffs[bufGP]);\r\n      if (++bufGP &gt;= sizeof(buffs)) bufGP = 0;\r\n    }\r\n  }\r\n}\r\n\r\nvoid dispErr(int rc)\r\n{\r\n  while (1) {\r\n    for (int i = 0; i &lt; rc; i++) {\r\n      digitalWrite(debugPort, HIGH); delay(500);\r\n      digitalWrite(debugPort, LOW);  delay(500);\r\n    }\r\n    delay(2000);\r\n  }\r\n}\r\n\r\nint playWav(char *waveFile)\r\n{\r\n  File dataFile;\r\n\r\n  if (!(dataFile = SD.open(waveFile)))\r\n    return(2);  \/\/ can't open File.\r\n  bufPP = dataFile.read((void *)&amp;buffs[0], BUFF_SIZE);\r\n  if (bufPP &lt; 44) return(3);  \/\/ bad format.\r\n\r\n  bufGP = 44;\r\n  TIMSK2 |= _BV(TOIE2);  \/\/ Timer2 overflow interrupt enable\r\n\r\n  while (dataFile.available()) {\r\n    if (((bufPP &lt; bufGP) &amp;&amp; ((bufPP + BUFF_SIZE) &lt; bufGP)) || ((bufPP &gt; bufGP) &amp;&amp; ((bufPP - BUFF_SIZE) &lt; bufGP))) { digitalWrite(debugPort, HIGH); bufPP += dataFile.read((void *)&amp;buffs[bufPP], BUFF_SIZE); if (bufPP &gt;= sizeof(buffs)) bufPP = 0;\r\n      digitalWrite(debugPort, LOW);\r\n    }\r\n  }\r\n\r\n  while (bufGP != bufPP) ;\r\n  TIMSK2 &amp;= ~_BV(TOIE2);  \/\/ Timer2 overflow interrupt disable\r\n  dataFile.close();\r\n  return(10);\r\n}\r\n\r\nvoid setup()\r\n{\r\n  pinMode(debugPort, OUTPUT);\r\n  pinMode(soundPort, OUTPUT);\r\n  if (!SD.begin(chipSelect)) dispErr(1);  \/\/ can't open SD.\r\n  \/\/ Timer2 Setup\r\n  TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);  \/\/ Mode = 3(First PWM)\r\n  TCCR2B = _BV(CS20);  \/\/ Prescale factor = 1:1\r\n}\r\n\r\nvoid loop()\r\n{\r\n  dispErr(playWav(\"test0001.wav\"));\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Arduino UNO\/Mega 2560\u3067\u52d5\u4f5c\u3059\u308b.WAV\u30d5\u30a1\u30a4\u30eb\u518d\u751f\u30b9\u30b1\u30c3\u30c1\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\u3002 .WAV\u30d5\u30a1\u30a4\u30eb\u306f\u3001\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u5909\u63db\u30a2\u30d7\u30ea\u3067\u300c8000Hz\/8bit\/Mono\u300d\u307e\u305f\u306f\u300c16000Hz\/8bit\/Mono [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[25,13,15,14,16],"_links":{"self":[{"href":"https:\/\/goji2100.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/210"}],"collection":[{"href":"https:\/\/goji2100.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/goji2100.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/goji2100.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/goji2100.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=210"}],"version-history":[{"count":19,"href":"https:\/\/goji2100.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/210\/revisions"}],"predecessor-version":[{"id":630,"href":"https:\/\/goji2100.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/210\/revisions\/630"}],"wp:attachment":[{"href":"https:\/\/goji2100.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=210"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/goji2100.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=210"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/goji2100.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}