정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두캠(OV2640) 쉴드와 HC-06, Grove MP3 모듈 사용시 SD카드에 사진 저장 오류
he | 2016-12-17

안녕하세요 HC-06하고 Grove MP3 Player와 Arducam 쉴드 + OV2640을 사용해서

블루투스로 값을 쏴주면 노래를 재생하거나 사진을 찍는 기능을 구현하려고 하였습니다.

 

Arducam에 나온 예제는 셔터버튼을 누르는 그런 예제들이라서

 

블루투스로 제어하려고 코드를 조금 고쳐서 함수로 만들었는데, 오류가 발생합니다.

 

그냥 고친 함수만 아두이노에 올려서 사용하면 별 문제없이 찍히는데,

 

블루투스랑 MP3를 같이 연결해서 사용하려하면 오류가 발생하네요.

 

 

코드를 여러가지로 고쳐봤는데 크게 두가지 오류 입니다. 

 

먼저 첫번째는 캡쳐는 되는데 fifo 값을 SD카드에 기록중에 뭔가 오류가 나서

 

JPEG가 D9 FF로 안끝나서 계속 While문을 도는 오류구요.

 

 

두번째로는 현재 코드로 돌리면 SD카드에 파일 만드는게 실패해서

 

시리얼 모니터에 Open File Failed라고 나옵니다.

 

 

제 생각엔 제가 핀을 잘 못 설정해줘서 SD카드에 저장하는게 오류가 나는 것 같은데,

 

데이터시트를 봐도 잘모르겠어서 질문 드립니다. 

 

 

 

그리고 혹시 핀 선언 문제가 맞다면, 그걸 편집해서 MP3랑 사진을 같은 SD카드로 제어하는게 가능할까요?

MP3모듈하고 아두캠 쉴드에 각각 SD카드를 장착하는 부분이 있어서 현재는 두개로 동작중인데,

하나로 합칠 수 있으면 관리하기 편할 것 같아서요..ㅎㅎ

 

#include <SoftwareSerial.h>
#include <MP3Player_KT403A.h>
#include <Servo.h>
#include <SD.h>
#include <Wire.h>
#include <ArduCAM.h>
#include <SPI.h>
#include "memorysaver.h"

 

#if defined(__arm__)
  #include <itoa.h>
#endif

#define SD_CS 9
const int SPI_CS = 10;

 

SoftwareSerial mp3(5, 6);
SoftwareSerial BTS(A2, A3);

Servo servo1;
Servo servo2; 
 
ArduCAM myCAM(OV2640,SPI_CS);

 

char str[8]={};
byte buf[256]={};
static int i = 0;
static int k = 0;
uint8_t temp = 0, temp_last = 0;
File file;
  
void setup()
{
  Serial.begin(115200);

  mp3.begin(9600);
  BTS.begin(9600);   
  
  servo1.attach(3);
  servo2.attach(4);
  
  uint8_t vid,pid;
  
#if defined(__SAM3X8E__)
  Wire1.begin();
#else
  Wire.begin();
#endif   

    pinMode(SPI_CS, OUTPUT);
    SPI.begin(); 
    SD.begin();
    
  myCAM.rdSensorReg8_8(OV2640_CHIPID_HIGH, &vid);
  myCAM.rdSensorReg8_8(OV2640_CHIPID_LOW, &pid);  

  myCAM.set_format(JPEG);
  myCAM.InitCAM();
}

 

void loop()
{
  int pos = 0;
  int count = 0;
  int MAX = 3;
  char recvChar = 0;  
    
    while(BTS.available())
    {
        recvChar = BTS.read();
    }
    
    Serial.println( recvChar );

 

    switch (recvChar)
    {
      
        case '1':
            SpecifyMusicPlay(0, 1);
            Serial.println("Specify the music index to play");
            recvChar = 0;
            break;
        case '2':
            PlayPause();
            Serial.println("Pause the MP3 player");
            recvChar = 0;
            break;
        case '3':
            PlayResume();
            Serial.println("Resume the MP3 player");
            recvChar = 0;
            break;
        case '4':
            PlayNext();
            Serial.println("Play the next song");
            recvChar = 0;
            break;
        case 'c':
          recvChar = 0;
          Capture_JPG();       
          break;          
        case 'w':
          for(pos=0;pos<=150;pos+=1)
           servo1.write(pos);
           delay(5);
           recvChar = 0;
           break;
        case 'f':
        for(pos=0;pos<180;pos+=1)
           servo2.write(pos);
         recvChar = 0;
          break;
        default:
            break;
    }
    delay(300); 
}

void Capture_JPG()
{
  int trig = 0;
  delay(500);
  trig = 1;
  
  if(trig)
  {
  myCAM.flush_fifo();    
  myCAM.clear_fifo_flag();        
  myCAM.start_capture();
  Serial.println("Start Capture"); 
  while(!myCAM.get_bit(ARDUCHIP_TRIG ,CAP_DONE_MASK));
  Serial.println("Capture Done!");  
  }
  delay(500);
  
  k = k + 1;
  itoa(k, str, 10); 
  strcat(str,".jpg");
  file = SD.open(str,O_WRITE | O_CREAT | O_TRUNC);
  
  if (! file) 
  { 
    Serial.println("open file failed"); //오류 1
    return;
  }
  
  i = 0;
  temp = myCAM.read_fifo();
  buf[i++] = temp;
  
  
  while( (temp != 0xD9) | (temp_last != 0xFF) ) //오류 2
  {
    temp_last = temp;
    temp = myCAM.read_fifo();
    if(i < 256)
      buf[i++] = temp;
    else
    {
      file.write(buf,256);
      i = 0;
      buf[i++] = temp;
    }
  }
  
  if(i > 0)
    file.write(buf,i);
  
  file.close(); 
  myCAM.clear_fifo_flag();  
  delay(500); 
}

이전글   |    앱인벤터와 아두이노 측정값에 따른 알람에 대해 문의드립니다!... 2016-12-15
다음글   |    안녕하세요 2016-12-18