현재 스케치를 짜기 전에 대략 구조를 생각하면 다음과 같습니다.
1.SD카드에서 파일 리스트 읽기.
2.리스트에서 파일 선택.
3.선택된 파일 읽어들여서 CIRCLE의 좌표만을 걸러내 변수에 입력.
4.좌표값을 X좌표 기준으로 정렬.
5.이후 순서대로 펀칭.
일단 4.좌표값을 X좌표 기준으로 정렬. 부분이 약간 어려울 것 같기도 해서 공부를 해 봤습니다.
페이스북 아두이노 포럼에 질문을 올렸더니 퀵소트와 구조체 정렬 등을 공부하면 될거라고 많이들 추천하시더군요.
그래서 관련자료를 찾아 읽고 있었습니다.
그러다가
라는 말에 버블정렬로 결정...
한번 읽어보니 바로 이해할 수 있더군요..
정렬속도나 뭐 그딴건 이 프로젝트에선 별 의미가 없으니..
int coordinateX[] = { 2, 7, 4, 6, 5, 3, 8, 10, 9, 11, 14, 12, 13 }; int coordinateY[] = { 6, 2, 78, 24, 2, 79, 54, 10, 9, 33, 88, 22, 35 }; void setup(){ Serial.begin(9600); } void loop() { sort(coordinateX,sizeof(coordinateX)/sizeof(int)); //Pass in the values and the size. Serial.print("size of array = "); Serial.println(sizeof(coordinateX)/sizeof(int)); Serial.print("Sorted Array: "); for(int i=0; i<13; i++) { Serial.print("("); Serial.print(coordinateX[i]); Serial.print(","); Serial.print(coordinateY[i]); Serial.print(") "); }
Serial.println(""); Serial.print("Max Number: "); Serial.print(coordinateX[12]); Serial.println(""); Serial.print("Min Number: "); Serial.print(coordinateX[0]); Serial.println(""); while(1){ //delay(10000); //Make sure we have enough time to see the output before starting the demo again. }
} void sort(int a[], int size) { for(int i=0; i<(size-1); i++) { for(int j=0; j<(size-(i+1)); j++) { if(a[j] > a[j+1]) { int t = a[j]; a[j] = a[j+1]; a[j+1] = t; t = coordinateY[j]; coordinateY[j] = coordinateY[j+1]; coordinateY[j+1] = t; } } } } |
bubble sort 예제를 참조해서 X, Y 데이터를 집어넣고 X 기준으로 정렬하는 코드를 짜 봤습니다.
size of array = 13 Sorted Array: (2,6) (3,79) (4,78) (5,2) (6,24) (7,2) (8,54) (9,9) (10,10) (11,33) (12,22) (13,35) (14,88) Max Number: 14 Min Number: 2 |
쉽게 정렬이 됐네요.
그래서 이제 SD 카드에서 파일 리스트를 읽어 정렬하는 부분을 시도해 봤습니다.
/* Listfiles This example shows how print out the files in a directory on a SD card The circuit: * SD card attached to SPI bus as follows: ** MOSI - pin 11 ** MISO - pin 12 ** CLK - pin 13 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN) created Nov 2010 by David A. Mellis modified 9 Apr 2012 by Tom Igoe modified 2 Feb 2014 by Scott Fitzgerald This example code is in the public domain. */ #include <SPI.h> #include <SD.h> File 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("Initializing SD card..."); if (!SD.begin(4)) { Serial.println("initialization failed!"); while (1); } Serial.println("initialization done."); root = SD.open("/"); printDirectory(root, 0); Serial.println("done!"); } void loop() { // nothing happens after setup finishes. } void printDirectory(File dir, int numTabs) { while (true) { File entry = dir.openNextFile(); if (! entry) { // no more files break; } for (uint8_t i = 0; i < numTabs; i++) { Serial.print('\t'); } Serial.print(entry.name()); if (entry.isDirectory()) { Serial.println("/"); printDirectory(entry, numTabs + 1); } else { // files have sizes, directories do not Serial.print("\t\t"); Serial.println(entry.size(), DEC); } entry.close(); } } |
예제는 위와 같고
실행하면 아래와 같이 나옵니다.
Initializing SD card...initialization done. SYSTEM~1/ WPSETT~1.DAT 12 INDEXE~1 76 DOREMI.MID 0 TEST.TXT 73 DADDY.DXF 46622 DOREMI.DXF 7439 done! |
일단 이중에서 파일 이름만 읽어들여 화면에 띄워야 할 텐데 그 부분을 어떻게 처리해야 하는지 모르겠네요.
'[완료]Arduino Projects > Music Box 악보 자동 펀처' 카테고리의 다른 글
디스플레이로 삽질하다가 엎어버렸네요 (0) | 2019.02.05 |
---|---|
뮤직박스 악보 펀처 PCB V2.0 (0) | 2019.01.24 |
뮤직박스 악보 펀처 PCB V1.0 (2) | 2019.01.03 |
Midi 해석 대신 DXF 포맷 해석해보기 (6) | 2018.12.30 |
여러가지 테스트. (6) | 2018.11.15 |