', { cookie_domain: 'auto', cookie_flags: 'max-age=0;domain=.tistory.com', cookie_expires: 7 * 24 * 60 * 60 // 7 days, in seconds }); '[완료]Arduino Projects' 카테고리의 글 목록 (2 Page) :: MakerLee's Workspace
728x90

전체 과정에서 제일 힘들 것으로 생각 되었던 부분들이 어느정도 해결되었습니다. 

1.파일 이름을 읽어서 리스팅하고

2.파일을 선택하면 해당 파일을 읽어서 펀칭 좌표를 스캔해 저장하고

3.저장된 자료를 순서대로 정렬하는 것입니다. 


지금은 2번 과정의 마무리에 있는데요.

펀칭 좌표는 float x,y로 저장되며 펀칭할 구멍에 따라 계속 데이터를 저장해 주어야 합니다. 

https://musicboxmaniacs.com/ 에서 여러 파일을 받아 확인해보니 음표가 많으면 6~700 정도 되고

적으면 1~200개 정도인듯 합니다. 


그래서 float x[1000], y[1000]으로 설정하면 메모리 부족으로 업로드가 안되더군요. 


100개로 줄여봤더니 간신히 올라가는데 메모리의 93%를 써버립니다. 






이미 예견했던 부분이긴 합니다. 라이브러리가 많거든요.

특히 SD 라이브러리가 아무것도 없는 상태에서도 메모리의 절반을 넘게 먹고 들어갑니다. 

변수를 선언할때 최대한 필요한 것만 최소한으로 하도록 노력해봤는데 

float 2천개씩 들어가니 별무소용이네요. 

좌표값 저장 뿐 아니라 데이터를 이용해 펀칭하기까지 계속 이어져야 하기 때문에 스케치 용량도 부족합니다. 







결국 하드웨어의 교체 말고는 답이 없습니다. 







스케치 공간은 엄청 남아돌고 변수 공간도 충분합니다. 








회로를 전부 다시 짜야하는군요.. 





728x90
728x90
보통 전자회로에서는 간단하게 신호음(삐~)을 내는 부저를 다는 경우가 있습니다. 
제일 흔한게 아마 PC 부팅시 나는 비프음이겠죠. 
아두이노에서도 tone()명령어를 이용해 부저를 이용할 수 있도록 되어 있습니다. 
뮤직박스 펀처니만큼 간단한 멜로디를 넣어주려 했는데 테스트 코드를 넣어보니 음질이 아주 나쁘네요. 
애초에 음질 따질만한 물건이 아니긴 합니다만 그래도 혹시나 하고 피에조 부저로 변경해 보니 훨씬 낫습니다. 






갖고있던 부저는 모델명으로 찾아보니 마그네틱 부저입니다. 

즉 우리가 흔히 아는 스피커처럼 코일로 자기장을 발생시켜 소리를 내도록 되어 있습니다. 

반면 피에조(piezoelectric:압전) 부저는 반도체의 압전 효과를 이용하는 물건이죠. 







둘다 애초에 소리를 잘 내기 위한 물건은 아니지만 피에조 쪽이 소리는 더 낫네요.  


728x90
728x90

현재 파일을 선택하고 그 파일을 불러들이는 것까지 진행중입니다. 







그런데 파일을 읽어보니 역시나 쉽게 넘어가지는 않는군요. 


왼쪽은 DXF 파일을 에디터에서 직접 읽어들였을 경우이고

오른쪽은 해당 파일을 읽어서 시리얼로 출력한 경우입니다. 

아두이노에서는 인코딩 문제로 사람이 보기 편하게 출력되지는 않는단 얘기죠.






ASCII코드표를 참조해 봅니다. 


DXF 파일의 첫줄이 

  0  -> (공백,공백,0)

두번째 줄이 

SECTION 입니다. 


아스키 코드에서는 첫줄이

32, 32, 48

두번째 줄이

83, 69, 67, 84, 73, 79, 78 이겠군요.


 



시리얼로 들어온 값과 다시 비교해 보겠습니다. 

32, 32, 48 이 있고

그다음 Line Finish 를 뜻하는 10 이 있고

SECTION의 아스키 코드 83 (S), 69(E), 67(C), 84(T), 73(I), 79(O), 78(N) 

이후 다시 Line Finish의 10 이 있습니다. 


다행히 해석 자체는 어렵지 않을 것 같습니다. 

펀칭 데이터는 이전 포스트(링크) 에서 썼듯이

CIRCLE 텍스트만 찾아내면 됩니다. 








CIRCLE 이니까

67 (C), 73 (I), 82 (R), 67 (C), 76 (L), 69 (E) 를 찾아내고 그 이후에

10(LF) 을 4개 지난 후 나오는 데이터들이 X좌표값이고

다시 10(LF)를 2개 지난 후 나오는 데이터들이 Y좌표값이 됩니다. 







확인을 위해 첫번째 CIRCLE을 찾아 데이터를 비교해 보았습니다. 

여기서 X좌표는 9.23413793103 입니다. 



9.23413793103의 데이터를 시리얼로 나온 쪽에서 찾아보니 위와 같습니다. 

57 : 9

46 : .

50 : 2

51 : 3

52 : 4

49 : 1

51 : 3

55 : 7

57 : 9

51 : 3

49 : 1

48 : 0

51 : 3


과 같습니다. 일치하는군요. 

소수점 2자리 이하는 무시할 계획입니다. 





728x90
728x90

요즘 열심히 작업중입니다만 딱히 포스팅을 하지 않은 이유는 매일 이런거 수정이나 하고 있어서 딱히 쓸게 없네요. 

현재 330줄 정도 되는 코드입니다.  

SD 카드에서 DXF 확장자 파일만 읽어서 화면에 표시하고 선택하는 부분까지 완성이 됐네요. 

이제 선택한 파일을 읽어들여서 펀칭좌표 분석하고 sort하고 실제 펀칭하는 부분까지 작성을 해야 하니 

소프트웨어만 따졌을 때 한 1~20% 정도 진행이 된 것 같습니다. 

파일 읽어들여서 펀칭데이터 정리하는 것만 끝나면 큰 문제는 거의 해결이 되겠지요. 







1602 Character LCD로 바꾸길 잘했다는 생각이 듭니다. 폼은 좀 안나지만... 



728x90
728x90

처음에만 해도 이걸로 멋지게 한글을 이용해 디스플레이하려고 생각했는데요. 

인코더 스위치니(쓸줄모름) SD카드 모듈이니(쓸줄모름) 여기다가 한글 디스플레이 모듈까지 적용하려니 머리가 터질 것 같더군요.








그래서 안되겠다 하고 일단 한번 써봤던 I2C OLED로 변경하였습니다. 









라이브러리 도큐먼트 읽다 보니 새 라이브러리가 나왔네요. 

읽다보니 좀 더 쓰기도 편하고 장점이 많아 보여 테스트해봤습니다. 









UTF-8 도 지원하고 한글폰트도 하나 들어있네요

신기해서 바로 테스트해봤습니다. 









모든 글자가 다 들어있는게 아니라서 "꽐턕" 이런 글자를 넣어봤더니 디스플레이되지 않네요. 

그래도 기본적인 글자는 다 들어있어서 이걸로 한글 사용도 가능하겠더군요. 







하지만 라이브러리만으로 메모리 용량을 넘어버리는 비극이 생기는군요.

폰트 데이터까지 포함하기 때문에 용량을 많이 차지하게 되니 용량을 적게 차지하는 폰트를 찾아봤습니다. 

하지만 여러가지 실험 결과 폰트를 제외하고도 SD 라이브러리와 함께 하니 용량이 이미 위험수준입니다. 










핵심에는 다가가지도 못하고 여러모로 다른 곳에서 걸리적거리니 시간낭비가 너무 심합니다. 

결국 I2C 1602 LCD로 교체해버렸습니다. 이건 정말 코딩이 쉬우니 좀 진행을 빨리 할 수 있지 않을까 합니다. 




728x90
728x90

아두이노 스케치를 짜다 보니 TFT-LCD 관련해서 디버깅할 거리가 많았습니다. 

아무래도 이걸 다 해결하려다 보면 정작 메인 코드는 언제 손댈지 모르겠더군요. 

재빨리 스키메틱에서 ESP32와 LCD 관련 부품들을 전부 덜어냈습니다. 







DIP 스위치 등도 점퍼 납땜으로 변경해서 좀 더 단순하게 바꿨습니다. 

혹시 나중에 또 PCB를 수정하게 된다면 아두이노 나노 대신 micro를 사용하거나 할 것 같습니다. 

그외엔 딱히 덜어낼 만한 부품은 이제 없네요. 








좀 집중해서 스케치 짜고 싶은데 영 시간이 안나네요;;



728x90
728x90

현재 스케치를 짜기 전에 대략 구조를 생각하면 다음과 같습니다. 


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!



일단 이중에서 파일 이름만 읽어들여 화면에 띄워야 할 텐데 그 부분을 어떻게 처리해야 하는지 모르겠네요.





728x90
728x90


방금전에 주문을 넣었습니다. 

매번 보드 이미지를 볼 때마다 뭔가 정리되지 않은 느낌이 팍팍 드는데 어떻게 깔끔하게 하는지는 잘 모르겠네요.









이번 작업에는 다소 기록적인 일이 있었습니다. 

남는 핀이 단 한개도 없다는 사실이죠!


일단 TFT-LCD로 가는 핀 1

스텝 드라이버 2개 각각 DIR/STEP 핀 4

스텝 드라이버 Enable 핀 1

DC 드라이버 제어용 핀 3

SD 카드로 연결되는 핀 4

입력용 엔코더 스위치로 연결되는 핀 3

센서 2


이렇게 하고 나니 핀이 딱 하나가 남았습니다. 

웬지 아쉬워서 뭐에 쓸까 하다가 

그래 어차피 음악과 관련된 툴이니 소리내는게 좋겠어 하고 피에조를 하나 달았습니다. 


덕분에 프로그래밍할때 골치를 엄청 썩게될것 같긴 하네요. 










이제와서 다시한번 보니 괜히 너무 복잡하게 갔나 걱정도 됩니다.

한글로 표시해보겠다고 집어넣은 TFT-LCD만 빼면 40%쯤은 덜어낼 수 있을 것 같기도 합니다. 







앞면






뒷면




jlc-pcb.com 에서는 100*100mm 이내 사이즈의 pcb는 가격이 매우 저렴하다보니

사이즈가 맞지 않을 경우 무리하게 좁은 공간에 욱여넣는 경우가 많습니다. 

다행히 이번에는 그럭저럭 편하게 사이즈 안에 들어가는군요. 


728x90
728x90

Kopenproject의 도두가이님이 배포하신 소스는 OLED 기준입니다. 

TFT-LCD를 사용하고 싶으면 일단 ESP8266보드에 올라가는 펌웨어를 변경해야 합니다. 

korean_display_controller.ino 의 28번째 라인을 보면 






이렇게 int active_display_index = 0;  이라고 되어 있는 부분을 볼 수 있습니다. 

이 숫자가 0이면 OLED 디스플레이로 설정이 되어 있는 상태입니다. 

이 숫자가 2 혹은 4이면 TFT-LCD 인데 제가 갖고있는 모델은 2로 해야 했습니다. 







그리고 아두이노에 TFT-LCD용 예제를 다시 올리고 연결하면 예제화면이 잘 표시되는 것을 볼 수 있습니다. 



728x90
728x90

연말에 잡다한 일이 많다보니 좀 늦었습니다. 


지난 글에 박정식님이 DXF 포맷을 사용해보는 게 어떻겠냐고 아이디어를 주셨는데요. 










musicboxmanics(링크)는 뮤직 박스 관련된 잘 만들어진 커뮤니티 겸 쇼핑몰입니다. 









홈페이지에 악보 편집 기능이 있어 midi 파일을 올려 뮤직박스 악보를 편집하는 것도 가능하고 다른 사람이 올린 악보를 사용하는 것도 가능합니다. 









이 악보를 다른 포멧으로 변환하는 것도 가능한데 midi나 mp3 같은 사운드 포맷도 가능하고 출력용 pdf 포맷도 됩니다. 









이번에 볼 것은 이 DXF 포맷인데요. 

DXF 포맷은 Autodesk 사의 AUTOCAD 용 도면 프로그램 포맷입니다. 













파일을 에디터로 열어보면 이런 모습입니다. 

HEX 코드로 가득해서 눈으로 봐선 뭔지도 몰랐던 MIDI 포맷보다는 그래도 뭔가 언어같다는 느낌을 주고 있습니다. 










DXF 포맷에 대한 레퍼런스를 찾아 열심히 몇시간동안 공부를 했습니다.











하지만 다시 찾아보니 Autodesk 한국어 페이지(링크)에서 한글로 된 설명이 있네요





한나절 내내 읽어보니 DXF 파일은 내부에서 헤더와 클래스, 블럭과 테이블 등으로 나뉘어 지고

그 안에서 각종 변수로 이것저것 정의한다는 것을 알 수 있었습니다.

치수의 정밀도라던가, 인치단위인지 mms 단위인지, 도면의 방향과 크기 등을 선언하고

각종 치수에 대한 변수를 저장하고 뭐 그런것들입니다. 









하지만 그딴건 여기엔 전혀 쓸데없지요..







이렇게 저장된 오르골 악보의 DXF 파일을 설계 프로그램에서 열어보면 대충 이런 모습입니다. 

그러면 대략 도면에서 선과 원을 그리는 코드가 있으며, 그중에서 우리에게 필요한 건 원을 그리는 코드뿐이라는 추측이 가능합니다. 











원을 그리는 코드는 그 이름 그대로 CIRCLE 입니다. 











에디터에서는 위와 같이 보이는데요. 






주석을 달면 대략 위와 같습니다. 

이중에서도 중요한 것은 원의 중심점 X,Y 좌표 뿐이죠. 










40(반지름) 의 아랫줄에 있는 반지름값 0.0345를 0.5로 고쳐 보았습니다. 








원래 도면에서는 이런 모습이었습니다. 









반지름값을 고친 모습입니다. 






이것으로 DXF 포맷을 대략적으로 해석해 보았습니다. 

이것도 전체적으로 이해하기에는 좀 어려운 점이 있지만 그래도 MIDI 파일에 비교하면 훨씬 읽기 쉽습니다. 

그리고 전체 구조를 이해할 필요 없이 그냥 CIRCLE의 중심점만 찾으면 되기 때문에 아두이노에서 해석하기에는 엄청 편할 것 같습니다. 




728x90
728x90

여러가지 다른 작업들을 좀 하다 보니 진행이 좀 느려졌습니다. 




CR-10S 가 슬슬 말썽을 부려서 CoreXY를 이참에 수리했고요.

수리하는김에 옥토프린트도 추가하고 제대로 정비하고 있습니다.








화초 모종 관리용으로 식물 LED 등 컨트롤러를 제작하고 있습니다. 

RTC를 DS1307 사용했다가 온갖 삽질을 하고 시간만 버렸는데 DS3231 사용하니 쓰기도 쉽고 오차도 없고 좋네요









미디 파일을 건드리면서 펀칭용 악보를 하나 출력해 봤습니다. 

이걸 보니 문득 다른 생각이 들더군요.


제가 하려는 작업은 간단하게 말하자면

MIDI -> 해석 -> 펀칭 이죠. 


자료를 찾아보니 이 해석 과정이 (제게는) 그리 쉽지가 않습니다. 

 

https://musicboxmaniacs.com/ 이 사이트에서 미디 파일을 업로드하면 바로 위와 같은 펀칭용 악보를 생성해 주기에

이렇게 출력된 악보를 그냥 펀칭만 해주는 식으로 만들어도 되지 않을까? 하는 생각이 들었습니다.


출력된 악보의 펀칭 위치에 검은 점이 찍히니 그걸 스캔해서 그 위치를 펀칭해주는 기계가 되는거죠. 






IR 센서로 급조해봤으나 위치 정밀도가 개판이라 바로 던져버렸습니다. 









레이저 + CDS 센서 조합으로 종이를 관통하는 빛의 세기를 측정하도록 해 봤습니다. 

이 경우에는 약간 오차가 있지만 조금만 다듬으면 도트의 유무를 특정할 수 있더군요.


미디 파일에서 바로 펀칭하는 것 보다야 덜 편리하지만 그래도 힘든 부분이 많이 줄어들긴 하겠네요.

이것까지 같이 만들긴 힘들고 일단은 가능하다는 점만 체크하고 넘어갑니다. 




728x90
728x90

저 링키지lingkage 부분은 미끄러지기 때문에 부싱을 넣으려고 생각했습니다. 









이런 물건입니다. 









한두개 구매하긴 뭐하고 직구하면 언제 도착할지 모르니 3mm 볼트에 너트 2개 조여넣고 돌려가며 갈았습니다. 








동그랗게 갈아낸 너트를 부싱 대용으로 사용했습니다. 

겉에는 그리스를 발라줬고요









펀칭 홀은 주문을 할까 했는데 작고 간단해서 주문하기도 뭐하더군요. 

괜히 공임비용만 날릴 것 같아 집에서 철판을 찾다보니 책 받침대가 적당해 보여서 잘라냈습니다. 










두께도 적당하고 아주 강판도 아니라서 혼자 가공할 수 있었습니다. 









작아서 사포질이 힘들어 출력물로 고정대를 만들었습니다. 















에폭시 본드로 접착했습니다. 굳을 때까지 펀치를 찔러넣은채로 둬야 홀에 딱 맞겠죠







본드가 굳은 뒤 손으로 작동해보면서 손으로 눌러보니 펀칭이 깔끔하게 잘 됩니다. 기쁘네요.











회로부분이 없으니 그냥 모터에 12V 찔러넣고 작동시켜봤습니다. 

깔끔하게 펀칭이 너무 잘 돼서 진짜 신이 나더군요. 











종이 찌꺼기는 쓰레기통으로 잘 들어갑니다. 










펀치 모터의 작동은 위와 같습니다.  

일정 위치에서 왕복을 해야 하기 때문에 캠 구조를 응용해서 마이크로 스위치를 누르도록 했습니다. 

펀치가 중간일때는 신호가 OFF 되고 위나 아래일때는 신호가 ON 됩니다. 

모터를 정방향으로 돌리고 신호ON->신호OFF 가 되면 펀칭 위치이므로 여기서 모터를 정지시키고

모터를 역방향으로 돌리고 신호ON->신호OFF 가 되면 상승 위치이므로 모터를 정지합니다. 







이제 회로를 짜야 하는데 디스플레이를 뭘로 할까 고민중입니다. 

일단 16*4 chracter LCD는 너무 커서 제외하고.. 

Nokia5110 LCD 가 맘에 들긴 하는데 1.8 TFT LCD는 miniSD 어댑터가 달린 물건이라 간단하니 좋네요. 
데모보드 만들면서 좀 고민을 해 봐야겠습니다. 

728x90
728x90

이제 더 수정할 게 없는 느낌이긴 한데 설마 그럴린 없겠지요. 





리니어 베어링을 빼고 일반 베어링이 그냥 레일을 타도록 만들었습니다. 










생각보다 훨씬 부드럽게 잘 움직이네요!











하지만 볼트머리가 걸릴줄은 몰랐죠

수정 출력했습니다. 










아이들 풀리의 구조를 깜박한 결과 볼트 머리를 꽉 조이면 베어링이 눌려 잘 돌아가지 않는 상황이 발생했습니다. 









기둥 높이를 낮춰 너트 2개로 볼트를 고정하도록 변경했습니다.










종이 급지롤러도 나쁘진 않았지만 출력시 좀 더 깔끔하게 나오도록 수정하고 

간격을 약간 수정해서 잘 맞아떨어지도록 바꿨습니다. 

실리콘 링은 같은 물건을 더 구할 수 없는 관계로 실리콘 호스를 잘라 사용할 계획입니다. 









이부분 뭔가 맘에 안든다고 이전 포스팅에 올렸죠. 












괜히 스위치를 2개 쓸 필요 없다는 사실을 깨달았습니다. 훨씬 깔끔하네요











DC 드라이버를 구매해서 테스트해보는 중입니다. 

전체 컨트롤러에는 스텝 드라이버 2개와 DC 드라이버 1개가 들어가게 되고

뭘로 할지 아직 모르겠는 LCD 와 입력용 스위치, SD카드 모듈이 들어갈 예정입니다. 





728x90
728x90

3차 출력물을 조립해보는 중입니다. 

이제 좀 끝이 보인다는 생각이 드네요










페이퍼 급지대도 잘 작동합니다. 

미묘하게 뻑뻑한 부분이 있긴 한데 롤러 부분만 약간 수정하면 될 것 같습니다. 









타이밍 벨트 장력이 영 안맞아서 아예 고정홀을 무지 길게 해버렸더니 편하군요










이 부분 조립하다가 멈칫.....

리니어 베어링 쓸 필요가 있나....???? 하는 심각한 의문에 빠져들었습니다. 










여태 출력한게 아쉽기는 합니다만 리니어 베어링을 쓰면서 지지대도 별도로 필요하고

베어링 홀더 구조도 따로 만들어야 했고 분해 조립도 어려웠던 단점들이 떠올라 수정했습니다. 











출력물로 된 레일 위를 그냥 베어링이 달리는 구조로 변경했습니다. 

수직 방향 베어링만 집어넣었는데 글을 쓰면서 생각하니 수평방향 베어링도 넣을 걸 그랬다는 후회가 드는군요.

조립해보고 이상하면 4차 출력까지 가야겠지요










펀칭 모터의 위아래로 리밋 스위치를 넣었습니다. 

좀 예쁘게 집어넣고 싶었는데 한참 생각해봐도 안되더군요. 

이럴땐 디자이너랑 협업하면 좋겠다는 생각이 드네요





728x90
728x90

프린터가 탈조나기 시작해서 모든 부품을 다 뽑진 못했습니다. 

구매한 이후로 거의 쉴틈없이 출력을 해서 지금까지 13롤인가 사용했더니 부품 내구도가 팍팍 떨어지기 시작하네요







M3 너트 폭을 5.5mm 로 했더니 꽉 끼는 부분이 생깁니다. 

모든 구멍을 6mm 로 수정. 






타이밍 벨트 길이도 안맞네요. 

모터를 아래로 내리는건 한계가 있어서 옆으로 밀도록 했는데 그것도 짧군요. 

아예 20mm 까지 옆으로 이동할 수 있게 수정했습니다. 

이외에도 종이 칸막이가 너무 조여서 다시 약간 넓히고, 롤러 사이의 간격을 약간 줄여서 종이를 꽉 물도록 변경했습니다. 










링키지 구조로 펀치를 프레스하도록 하고 시범적으로 조립해 봤습니다. 







기어드 DC 모터의 힘이 세서 파트가 부러져 버리는군요. 

저 부분에도 모터가 과하게 돌지 않도록 리밋 센서를 넣어야 하는데 아직 설계 반영은 하지 않았습니다. 

일단 빨리 프린터부터 수리를 해야겠네요


728x90
728x90

확인을 위해 출력해 봤습니다. 수정사항이 얼마나 나올지 모르겠네요.







서포트 제거하나 부러졌습니다. 수정사항은 아니긴 한데 다음번에는 좀 주의해야 할듯. 









스텝모터 들어가는 부분을 안 만들어놨군요.

공간도 약간 뻑뻑합니다.










리니어 베어링 블럭은 잘 들어갑니다. 









그렇지만 M3 너트 홀 두께가 모자라서 안들어가는군요. 일단은 가열해서 넣어봤습니다. 









제대로 확인을 안했네요. 두 홀의 사이즈가 다릅니다. 









페이퍼 롤러는 어느정도 작동은 하나 바닥과의 마찰로 제대로 움직이지 않습니다. 
설계에서 많은 변경을 해야할 듯 하네요.








종이 가이드 간격을 줄여서 종이가 딱 맞게 해야 할듯. 








타이밍 벨트 풀리를 끼우는 기둥에 가운데 부분만 살짝 올려서 베어링 내륜만 닿도록 해야 겠습니다. 

그냥 와샤로 끼우니 마찰이 심하군요.







펀치 모듈이 움직일 때 볼트가 걸리는군요.








벨트 장력정도로 약간 당겨보니 바닥판이 휩니다. 

지지대를 세워야겠습니다. 







홈에 타이밍 벨트를 끼우고 당겨보니 슬슬 빠져버리는군요.

간격 조정하고 톱니를 만들어야겠습니다. 







1차 수정한 전체적인 모습입니다. 








전체적으로는 종이 롤러 모듈이 제일 많이 변경됐습니다. 

롤러가 2개로 위아래 배치해서 종이가 걸리지 않도록 했습니다. 








앞부분은 펀치 모듈 안쪽까지 들어가는 판을 연장해서 혹시나 종이가 들뜨지 않도록 합니다. 

약간 휑해보여서 음표를 넣었습니다. 








일단 캠cam 구조로 펀치를 하도록 했는데 구조상 너무 모터가 위쪽으로 올라가네요.

링키지linkage 구조로 바꿀까 합니다. 

토크가 충분한지 몰라서 일단은 캠 구조로 테스트해볼 생각입니다. 



728x90
728x90

일부 수정후 리밋 스위치와 Fillet, Cut 을 추가했습니다. 

디자인 감각은 없지만 모서리마다 적당한 R값만 추가해도 참 완성도가 달라보입니다.









이제부터는 약간씩 실물을 보면서 수정작업을 해야하는지라 출력을 걸었습니다. 

밑바닥 부품이 사이즈가 큰지라 필라멘트가 무지하게 소비됩니다.










그림에서 파란색으로 선택된 부분이 펀치핀입니다. 








원래 이렇게 생긴 물건이죠.

뮤직박스를 구매하면서 기본으로 하나 주기는 했는데 이걸 기계에 장착하는건 불가능합니다. 

잘라서 쓸까도 생각했는데 다른 부품으로 대치 가능할 것 같다는 생각을 했습니다. 








드릴입니다. 

펀치핀은 2.4mm 굵기라 2.5mm 드릴날이 비슷하겠더군요.








세공용 조각기에 다이아 디스크를 물려 갈아주려 합니다. 








몇번 시도끝에 대충 모양이 나왔습니다. 







얇은 철판이 더 좋을것 같긴 한데 드릴프레스 없이 뚫는건 힘드니 그냥 3T 알루미늄판을 뚫어봤습니다. 









손으로 센터를 맞추기는 힘들지만 그럭저럭 뚫리는걸 봐선 가능성이 충분해 보입니다. 

아래 구멍은 2.5mm 보다는 굵어야 할 것 같네요.









검색해보니 저와 완전히 같은 작업을 먼저 한 분들이 있군요. 

기구설계능력은 부족하신듯

프로그램 뭐 썼나 참조가 될까 해서 열심히 봤더니 블로그 링크에 소스가 공개되어 있군요. 

그런데 제가 생각한 방향과는 좀 다르네요.  

저는 MIDI 파일 자체를 아두이노에서 스캔해서 해석하는 방법을 생각하고 있었습니다. 

저분들은 PC 프로그램에서 MIDI 파일을 아두이노용 펀칭 데이터 TXT로 컨버팅하고 그걸 이용해서 펀칭하는군요.

저는 일단 MIDI 파일 그대로 사용하는 방식으로 해보려 합니다. 







728x90
728x90

간만에 좀 여유있게 쉬는 날이라 카페에서 한나절 내내 설계를 잡았습니다. 

집중이 잘 돼서 기분좋게 진도가 쭉쭉 잘 나가더군요
리밋 스위치나 컨트롤 보드 등 전자부품은 빼고 기본설계가 하루만에 끝났네요.









종이 밀어주는 롤러를 테스트 출력해봤습니다. 

수정이 거의 필요 없게 잘 나왔네요.

실리콘 고리를 끼워서 롤러로 사용하는 구조입니다. 

실리콘 고리는 다이소 일반 옷걸이에 끼워 옷이 미끄러지지 않도록 하는 물건입니다. 

소형 바퀴 등에 쓰면 좋겠다 하고 사놨더니 여기에 딱 좋네요. 


728x90
728x90






좌우 스트로크 최소 60mm 확보해야 함. 

펀처 모듈은 DC 기어드 모터와 펀처 핀 등의 부품이 달린 채로 움직여야 하므로 안정성 확보 

=> 연마봉/베어링 사용. 

펀쳐 부분은 테스트 모듈을 구조를 달리하여 몇개 만들어봐야 할 듯. 

위와 같은 구조에서는 측면으로 밀리는 힘이 가해지므로 제대로 눌리지 않을 수 있다. 

더불어 모터가 수직 위로 올라가야 하므로 덩치가 커진다. 

부품 배치를 최적화해서 최대한 작게 만들것. 




728x90
728x90

펀처 부분의 아이디어 스케치입니다.

구멍 뚫는 부품은 위아래가 정확하게 맞물려야 합니다.
펀처가 위아래로 작동하면서도 아래쪽 구멍에 딱 맞물리게 들어가야 한다는 제작상의 난관을 해결할 방법을 찾는 중입니다.







겸사겸사 펀처 프레스 역할을 할 서보모터 모델링을 해 봤습니다.
fusion360은 아직 solidworks처럼 손에 익진 않지만 그래도 기본모델링은 이제 그럭저럭 할만하군요


728x90
728x90

5V와 GND, 그리고 아두이노 우노의 D3핀을 ESP8266 보드의 RX 핀으로 연결해줍니다. 

ESP8266보드에는 LM1117-3.3이 있어 전원을 다운그레이드해 사용합니다. 










이제 제공받은 자료\korean_display_uno\oled 폴더의 oled.ino를 열고 

아두이노 우노에 업로드합니다. 












멋지게 잘 나오네요. 더치커피머신 업그레이드할때 써먹어 봐야겠습니다. 




728x90
728x90


먼저 ESP8266 보드에 폰트를 올리는 작업을 해야 합니다. 





https://github.com/esp8266/arduino-esp8266fs-plugin/ 에서 아래쪽 하단을 보면 설치 방법이 나와 있습니다. 


release page를 눌러 최신 릴리즈를 다운로드 합니다. 







다운로드한 파일의 압축을 풀면 ESP8266FS 폴더가 나오는데 이 폴더채로 arduino 설치폴더 아래의 tools 폴더에 복사해 줍니다. 








이후 Arduino IDE를 실행해 보면 [툴] 메뉴 아래에 [ESP8266 Sketch Data Upload] 메뉴가 생긴 것을 볼 수 있습니다. 











https://cafe.naver.com/kpopenproject# 카페의 도두가이님께 받은 자료를 열면 

korean_display_controller 폴더 안에 korean_display_controller.ino 파일이 있습니다. 






FTDI 프로그래머와 ESP8266을 위와 같이 연결합니다.  








이때 보드 설정은 이와 같습니다. 

저는 처음에 Flash Size:"4M(1M SPIFFS)" 로 했다가 계속 폰트가 업로드되지 않아 고생을 했는데

3M SPIFFS로 하면 됩니다. 






업로드하기 전 FLASH 스위치을 누른채로 RESET 스위치를 누릅니다. 

그리고 RESET 스위치를 떼고 다시 FLASH 스위치를 뗍니다.

이렇게 해야 ESP8266 보드가 업로드 가능한 상태가 됩니다. 








그리고 업로드하면 위와 같이 업로드가 완료됩니다. 






이제 폰트 데이터를 업로드할 차례입니다. 

아까와 마찬가지라 ESP8266 보드의 FLASH 스위치와 RESET 스위치를 눌러 업로드 준비를 한 후

[툴] 메뉴를 눌러 [ESP8266 Sktech Data Upload]를 눌러줍니다. 

이때 폰트 파일이 들어있는 data 폴더가 sktech 폴더 아래에 있어야 합니다. 

하지만 기본적으로 도두가이 님이 제공하주신 스케치에는 data 폴더가 들어있기에 그대로 업로드하면 됩니다.






이렇게 폰트 데이터 업로드가 끝났습니다. 

저는 이상하게도 서너번 오류가 났는데 계속 재시도하니 정상적으로 업로드하는데 성공했습니다. 


728x90
728x90


아두이노 카페에 글을 올렸더니 PWM 주파수를 변경하면 소리가 안난다는 정보를 알려주셨습니다. 

일단 검색해보니 관련자료가 꽤 있군요. 


https://forum.arduino.cc/index.php?topic=60945.0
https://etechnophiles.com/change-frequency-pwm-pins-arduino-uno/


메이커페어 준비로 바쁘긴 한데 시간나는대로 이것도 해봐야겠습니다. 

728x90
728x90

제작완료된 컨트롤러는 미세한 고주파음이 나는 문제가 있었습니다. 
이게 약간만 주변이 시끄러우면 안들리는 정도입니다만 그래도 신경이 쓰이긴 하더군요.





그런데 알고보니 컴퓨터에 쓰이는 팬 중 4pin으로 된 것들은 아예 PWM 컨트롤이 가능하다더군요.

3pin 짜리는 한쪽이 RPM 체크용(1회전시마다 Gnd로 떨어짐) 인 것은 알고 있었습니다. 

하지만 4pin 짜리가 PWM 용인것을 이번에 알고 나니 제 회로에 쉽게 적용 가능하겠더군요.






기존 회로에서 FET를 거치지 않고 바로 PWM 선에 연결해보니 잘 됩니다.
초저속에서 미약하게 디리릭 소리가 나긴 합니다만 귀를 기울이기 전에는 안들리는군요.





4핀 용으로 회로를 수정했습니다. 아두이노 스케치는 그대로입니다. 

Smart_Fan_Controller.ino

Auto_Fan_Controller_V3.0.sch

Auto_Fan_Controller_V3.0.brd 





728x90
728x90


아두이노에서 OLED나 그래픽 LCD 등을 사용할 경우 한글을 출력하려면 비트맵 이미지를 만들어 뿌리는 수밖에 없는 줄 알았습니다. 

하드웨어적으로 구현이 안되기 때문인데 그래서 별도의 컨트롤러를 사용하는 방법이 있더군요.

해당 작업을 하신 분이 본인의 카페에서 자료를 공개해 주셨습니다. 


카페의 주소는 https://cafe.naver.com/kpopenproject 입니다. 



이런 A to Z 까지 자세하게 설명된 PDF가 120페이지짜리입니다;;

저도 내용은 잘 이해하지 못하겠지만 ESP8266보드를 이용해서 폰트와 여러 한글처리 명령어를 집어넣고

아두이노에서 신호를 보내면 ESP보드가 이미지 처리를 해서 화면에 한글을 뿌려 주는 것 같습니다. 










OLED과 그래픽 LCD, TFT LCD까지 전부 구현하셨습니다. 



신청하면 메일로 자료를 보내주신다 하여 기쁘게 자료를 받았습니다. 

압축한 상태에서 무려 42MB짜리 데이터입니다. 이런걸 막 나눠주시다니.. 

샘플로 제작한 보드도 신청자에게 보내주시려고 하시더군요. 

하지만 저는 제 쓸모에 맞게 보드를 따로 만들고 싶어서 스키메틱을 찾아봤더니 없었습니다.

대신 fritzing 파일이 있길래 열어봤습니다. 



Fritzing 파일은 손댈수가 없어서 EagleCad로 재작업하기로 결정했습니다. 







Fritzing 스키메틱은 정리가 안되어 있어서 눈으로 보드파일 레이아웃 쫓아가며 선 따느라 시간이 좀 걸렸습니다. 

분명히 버그가 있을 것 같지만, 일단 PCB를 주문해서 테스트해보려 합니다. 





그런데 왠일인지 JLCPCB 사이트가 뻗었네요. 내일 다시 주문해야겠습니다. 


728x90
728x90

생각난 아이디어가 있어 잊기전에 기록해둔다. 


이런 펀칭 오르골은 재미있긴 한데 한번 써보니 

음악을 종이에 옮겨서 펀칭하는게 엄청 중노동이라 한두번 해보면 다시는 하지 않게 됨. 



자동으로 할 수 있지 않을까 생각이 들었는데 조금 생각해 보니 충분히 가능할 것 같다. 

일단 음악 자체를 MIDI 포맷으로 변경하는 작업을 해야 하는데

스마트폰 앱에서 녹음된 파일을 자동으로 MIDI 파일로 추출한다거나 

아이폰용 GarageBand 같은 앱을 써서 아예 MIDI로 녹음한다더나 하는 것도 가능.





하여간 잘은 모르겠지만 아두이노용 MIDI 라이브러리도 있으니 아두이노에서 MIDI 데이터를 컨트롤 할 수 있는건 확실하다. 






MIDI 포맷을 잠시 읽어봤는데 결국 저장되는 파일은 HEX 값이라 읽고 분석하고 해석도 가능하겠다. 


그렇다면 이 파일을 읽어들인후 컨버팅해서 오르골의 구멍을 뚫어야 할 위치를 계산해 낼 수 있다. 

최종적으로 스텝모터와 펀치를 이용해 오르골에 자동으로 펀칭을 해서 악보를 완성해 내는게 가능할 것임. 





참조링크 

https://www.instructables.com/id/Send-and-Receive-MIDI-with-Arduino/

https://www.youtube.com/watch?v=mJb_a3R1Stk : MIDI 데이터를 USB를 통해 아두이노에게 전달하는 부분 참조용. 

728x90
728x90

내부에 부품들을 고정하고 외부전원으로 테스트 해봤습니다. 

이상이 없으니 이제 배터리 결합으로 들어갑니다. 







내부의 전원스위치는 2단 6p 스위치라 약간 꼼수를 부렸습니다. 

전원을 켤 때는 배터리가 직렬로 연결되며 전원을 끄면 각 배터리가 병렬로 연결되면서 충전회로와 연결됩니다.

(**그림이 살짝 헷갈리는데 2번 배터리 (+)극의 파란색 전선은 스위치 2곳과 배터리 (+)극에 모두 연결되어있습니다)

1cell 충전회로로 충전이 가능하고 PCM이 없는 배터리를 사용해도 셀간 전압이 심하게 틀어질 가능성이 적습니다. 








아주 옛날에 만들었던 충전회로입니다. 여러개 만들었는데 이게 마지막이네요










1.부팅시 Hello 스크롤 후 배터리 전압 표시.

2.일정시간이 지나도록 손잡이를 잡지 않으면 슬립모드 변경(20초쯤)

3.전압이 낮으면 히터를 끄고 저전압 표시(bAt)




힘들었던 글루건 내부가 생각보다 매우 좁아서 엄청 갈아내야 했고 

PCB까지 두번이나 재작업해서 시간이 많이 걸린 부분이었네요


한편으로 LED 세그먼트와 쉬프트 레지스터 사용법을 더 잘 알게되어 배운 게 많은 작업이었습니다.

728x90
728x90

처음 만들었던 PCB는 조립해보니 글루건에 아슬아슬하게 들어가지가 않더군요..

여기저기 최대한 갈아내봤지만 불가능했습니다. 








새로 만들었습니다. 아두이노 보드와 결합식이 아니라 아예 원보드입니다. 

그리고도 더 작게 만드느라 전원부는 따로 만들었습니다. 







전체 면적은 비슷하지만 폭을 줄여서 글루건 내부에 잘 들어가도록 했습니다. 









기판을 하나로 줄여서 두께도 많이 줄었습니다.








ISP 핀까지 빼버렸기에 선을 따서 부트로더를 구워줍니다. 








스케치를 업로드해 보니 문제없이 잘 됩니다. 




728x90
728x90

이번에도 Attiny85 핀을 빼서 UNO에 연결후 디버깅 했습니다. 

Attiny85 로만 작업하면 어디가 문제인지 알 수 없는 부분이 많은데 

UNO로 작업하면 시리얼 모니터가 가능해서 정말 편합니다. 







중간에 실수해서 LM1117 과 FET 태워먹긴 했는데 전부 해결하고 잘 되는군요.

문제가 하나 있는데 PWM 스위칭 때문에 고주파음이 살짝 납니다. 

아주 거슬릴 정도는 아니라서 소음문제 해결은 나중을 기약하려 합니다. 


Smart_Fan_Controller.ino

Auto_Fan_Controller_V2.6.brd

Auto_Fan_Controller_V2.6.sch 



728x90
728x90

3D 프린팅한 케이스에 에폭시 퍼티를 넣어서 히터를 고정하고 굳혀봤습니다. 







이후 몇번 실험을 해봤는데 온도반응이 너무 느려서 안되겠네요

금속 케이싱을 하고 싶었지만 히터가 충분히 들어갈 두께로 알루미늄 가공하기엔 너무 벅찰 것 같아 고민을 했습니다.








글루건 테스트용으로 초소형 PTC 히터를 구매했던게 생각나서 꺼내봤습니다. 





 

접촉면적도 딱 적절하고 그대로 히터와 박막센서를 감싸서 사용하려고 합니다. 









히터를 그대로 사용하니 온도반응이 매우 빠르고 좋군요

3D 프린터용 히터를 그냥 사용하는 것도 감안해 봤습니다만 

이 PTC 히터는 여기 아니면 쓸곳이 없을 것 같아 잉여부품 정리용으로 써버리려 합니다. 








마무리로 아두이노 우노용 코드를 ATTINY85 로 되돌리고 업로드했습니다. 










아두이노 3CH 온도센서(링크) 로 작동을 확인해 봅니다. 

온도센서 오차 때문인지 45도 정도로 유지가 되는군요.




가변저항으로 10도 내외 조정이 가능합니다. 

빠르게 온도가 올라가면서도 5~6초 정도에 온도가 안정화 되네요. 

이제 케이스 설계만 해서 출력하고 조립하면 될 것 같습니다. 



Bite_Away.brd

Bite_Away.sch

Bug_Bite_Helper.ino 


728x90

'[완료]Arduino Projects > DIY Bite Away' 카테고리의 다른 글

전기 버물리 #3  (0) 2018.06.10
전기 버물리 #2  (1) 2017.09.01
전기 버물리 #1  (0) 2017.09.01

+ Recent posts