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

잊을만하면 새로운 일이 생기는 뮤직박스 펀처 소식입니다. 

1월은 최근 국내판매한 2대에 연속으로 AS건이 많이 생겨서 참 면목이 없었습니다. 

보내기 전에는 잘 되던게 보내고 나면 문제가 생기는 일들은 많이 있지만 이번에는 특히 심했네요

어쨋건 그 부분은 간신히 마무리를 했고 외국에서 추가 주문도 들어와서 이제 9번째 기기를 만들고 있습니다. 

 

 

 

 

 

이 동영상을 보셨을지 모르겠는데 유튜브 조회수 1.7억회에 이르는 Wintergatan의 마블머신 영상입니다. 

현재 저 기기는 지역 음악박물관에 전시된 상태이고 새로 Mable machine X를 만드는 영상을 유튜브에 올리고 있죠. 

기계와 음악의 조합이 흥미로워서 관심있는 분들은 채널 구독하시는 것도 좋을 것 같습니다

 

 

 

 

 

영상을 보면 타자기 등 음악기기가 아닌 기기로도 실험적인 연주를 많이 하시던데 

그중에 이 뮤직박스 연주기가 있습니다. 

 

 

 

 


From: SebastiaanJansen
Date: Feb 12, 2021. 1:54 PM
Subject: Wintergatan music box puncher

Hi!

My is Sebastiaan and I'm part of Martin's Marble Machine X engineering team. Currently we're revisiting the music box Martin made a long time ago and wanted to make an automatic puncher.

Are you willing to do a meeting with us to show how you've done the project?

Thanks in advance!

With kind regards,

Sebastiaan

 

오늘 그 팀에서 instructables 리플로 연락이 왔네요.

대화가 될지는 모르겠습니다만 일단 이메일 연락처를 줬습니다. 

뭔가 또 새로운 일이 시작될 것 같아서 기대되는군요. 

728x90
728x90

저번주에 조립이 거의 끝나고 의뢰인 Valerio Rossit 에게 메일을 보냈습니다. 

며칠후면 조정이 끝나고 보낼 수 있을 것 같다고요. 

혹시 사용이 어렵진 않냐 물어보길래 로터리 스위치 하나밖에 안 달려있으니 걱정말라고 했습니다. 

그리고 지난번 프랑스 의뢰인에게 보냈던 메뉴얼을 보냈죠. 

 

그랬더니 답장이,

[혹시 이거 30노트밖에 안되는건가요? 전 15노트가 필요한데요]

 

 

 

???????

 

 

 

당황속에 30노트로만 만들었다고 했습니다.

그제서야 자기가 제대로 안봤다고 자기는 꼭 15노트가 필요한데 어떻게 안되겠냐고 하더군요. 

뮤직박스를 제작하는 사업을 하는데 손펀칭하다 죽어나는 중이라더군요. 

 

그래서 좀 고민을 해봐야 겠다 했습니다. 

 

 

의의로 간단히 해결이 되더군요. 

종이 감지 센서 위치를 반대로 옮기고 15노트 길이에 맞게 분리 가능한 가로대를 하나 추가했습니다. 

소프트웨어는 손댈 필요 없이 그대로 작동했습니다. 

 

 

 

 

 

 

요렇게 막대기 하나만 꽂으면 간단하게 15노트 사용이 가능합니다. 

 

 

 

그런데 다시 30노트 종이를 끼워보니 위치가 영 다르네요.

확인해 보니 15노트 종이는 국내제작인데 30노트랑 종이의 여백 폭이 미묘하게 다르더군요. 

이걸 수정할 순 있지만 시간이 또 걸릴테고요.

발레리오씨는 15노트만 필요하다고 했으니 일단 이번 작업은 여기까지 하려고 합니다. 

 

 

 

 

 

 

728x90
728x90

이탈리아 아저씨가 주문한 펀처를 거의 다 만들어 가는 와중에 이거 15노트 안되냐고 물어왔습니다. 

안된다고 했더니 자기는 15노트만 필요하다는군요. 

어떻게 좀 안되겠냐고 되기만 하면 2대 사겠다고 부탁을 합니다. 

정말 손으로 구멍뚫기 싫어하시는 듯 합니다.... 

 

일단 연구해보마 했습니다.

musicboxmanics에서 15노트 dxf 포맷을 다운받아 보니 기계에선 이상없이 읽어들입니다. 

어찌보면 당연한 것이 XY좌표계만 있으면 되니 15노트건 30노트건 되는거겠죠. 

 

 

그러니 15노트 종이가 들어가기만 하면 되는데 센서 위치의 문제가 있습니다. 

 

 

 

 

 

위에서 본 모습입니다. 종이 좌표상 왼쪽 아래가 0,0 위치가 됩니다. 
센서는 Y축 방향으로 좌표상 위쪽에 있습니다. 

센서가 반대로 아래쪽에 있다면 종이의 Y축 원점은 15노트나 30노트나 같습니다.

하지만 센서가 올라가 있는만큼 15노트 종이는 위로 올라가야 합니다. 

그래서 종이의 Y좌표 원점이 각각 따로 존재하게 되는 것이죠. 

 

 

 

 

 

 

생각같아서는 전체 재설계하고 싶긴 한데 그럴 시간은 없죠. 

일단 종이 감지 센서를 반대쪽으로 옮기고 가운데에 가로막대를 하나 끼울 수 있게 했습니다. 

이렇게 하면 30노트는 그대로 사용하고 15노트 사용시 막대를 끼워 칸막이를 만들고 종이를 끼우면 됩니다. 

 

 

 

 

728x90
728x90

메이커페어에 출품했던 3대분은 국내에 2대, 프랑스에 1대 판매가 되었습니다. 

최초 3대분은 재고처리에 목표가 있어서 거의 원가에 가까운 금액에 판매가 되었습니다. 

장기적인 동작에 문제가 있을지는 모르겠으나..

여태 고장났다고 연락온적은 없으니 잘 되고있는거라 생각중입니다. 

 

 

 

 

프랑스 판매 이후 러시아와 브라질 분도 연락이 왔는데 판매는 안됐고요. 

이번엔 이탈리아에서 연락이 왔네요. 

 

뮤직박스 제조 판매를 하시는 분인데 악보 펀칭이 너무 힘들다고;; 구매를 원하시더군요. 

기존 완성품 판매 후 혹시나 하고 3D 출력물은 1대분 재고를 뽑아놓은지라 제작완료후 거래하기로 했습니다. 

 

 

 

1차 제작버전과 거의 달라진점은 없지만 펀칭된 종이 찌꺼기가 잘 배출되도록 배출구 형상을 바꾸고

별도 DC 강압회로를 달아 안정적으로 5V 전원을 공급할 수 있도록 했습니다. 

 

 

연휴동안 작업해서 이탈리아로 보내야 겠네요

728x90
728x90

말씀드렸다시피 기존 소지품이 판매가 되었습니다. 

보내드리기 전에 점검하다가 보니 수정해야 할 부분들이 생겨 많이 수정을 하게 됐네요

기다려주신 구매자분들께 감사드립니다. 

 

 

 

오른쪽같이 통로가 좁으면 가끔 종이가 꽉 끼어서 내려오지 않는 경우가 있습니다. 

왼쪽처럼 넓게 수정했습니다. 

 

 

 

 

 

종이가 통로에 끼면 뚫리긴 하는데 뜯어지질 않아서 그대로 붙어있게 됩니다. 

수정후에는 잘 떨어져서 쓰레기통으로 잘 모입니다. 

 

 

 

 

 

조립하고 작동테스트하다가 5V 레귤레이터가 탔습니다.

원래 발열이 엄청 심하던 상황이라 작동되더라도 수명이 길지는 않을 것 같아 수정에 들어갔습니다. 

확인해 보니 LM1117이 감당해야 하는 전류량이 너무 높더군요. 

 

 

 

 

 

 

센서와 칩 별로 별도의 LM1117을 배당해서 전류를 여유있게 쓰도록 해봤습니다. 

발열은 줄었으나 LCD가 제대로 나오지 않는 문제가 발생. 

이틀에 걸쳐 원인을 찾았으나 모르겠더군요. 

 

 

 

 

 

LM1117 DC Step down converter를 사용해서 12V -> 5V로 별도 전원을 만들어주었습니다. 

잘 되네요

 

 

 

 

 

 

 

며칠동안 고생은 했지만 그래도 기존에 미흡하고 불안했던 부분이 다 수정되어 좋군요. 

 

 

728x90
728x90

뮤직박스 카페와 인스트럭터블스의 제작기 말미에

메이커페어 출품 기기를 처분한다고 써놨는데요.

딱히 팔아서 이득을 남기려는 목적은 없었습니다.

다만 이게 1대분 재료비가 20만원에 육박한 물건이다 보니 3대를 끌어안고 있느니 팔리면 다행이다 싶었죠. 

부품 상태로 보관하면 언젠가 또 쓰긴 하겠지만 보관도 일이고요. 

판매 가격도 거의 재료비+조립공임 정도로 올려놨는데 그래도 한개씩 한개씩 없어지긴 했군요. 

 

2대가 거의 동시에 팔렸는데 1대는 프랑스에서, 1대는 국내에서 연락이 왔습니다. 

출고전 전부 재검수하고 있습니다.

전시회때는 계속 분해조립하다 보니 록타이트 등을 바르지 않고 조립한 볼트가 많아요. 

살짝 높이 변경과 볼트구멍 위치가 변경된 버전이 있는데

그 부품끼리도 섞여있어서 다 뒤집어엎고 록타이트 발랐습니다. 

 

 

 

 

 

하판 부품은 하나 모자라서 출력.

날씨가 추워서 브림은 최대한 넓게 잡고 출력하는 중입니다. 

 

며칠간은 이거 조정하는데 써야겠네요

728x90
728x90

 

이번주에 메이커페어라 마지막 조정을 하고 있습니다. 

악보 선택과 펀칭, 뮤직박스 연주까지 연속으로 찍어봤습니다. 

 

728x90
728x90

현재 펀처의 작동방식은 위와 같은데 다소 문제가 있습니다. 

리밋 스위치 1개로 작동을 체크하다 보니 감지하는 것이 확실하지 않습니다. 

적절한 타이밍을 잡는 튜닝이 없으면 제대로 움직이지 않게 되죠. 

데이터를 공개할 생각이다 보니 튜닝 난이도가 없도록 해야겠더군요.

 

 

 

 

 

 

리밋 스위치를 위아래로 배치해 포지션 감지가 확실하도록 할 생각입니다. 

 

 

 

 

 

 

또 수정입니다. PCB 버전이 벌써 3.5가 됐네요. 

 

 

 

자료 공개를 염두에 두고 만들기 시작했습니다만

슬슬 사람들이 만들 수 있을까 의심이 들기 시작합니다. 

728x90
728x90

instructables에 글도 올리고 10월에 있을 메이커페어 용으로 계속 조립 진행을 하고 있습니다. 

최근에 계속 펀칭 모터가 작동을 안하는 사태가 발생해서 고생을 했습니다. 

 

 

2대의 기기가 같은 증상이라 회로를 의심했으나 아무리 확인해봐도 정상이더군요. 

테스트 코드를 돌려봤는데 아두이노에서 컨트롤 신호는 전부 정상으로 나옵니다. 

하지만 L298N 칩에서 출력이 나오질 않습니다. 

그래서 이번엔 PCB를 의심했으나 PCB는 이전에는 제대로 작동했던 것을

약간만 수정해서 새로 주문한 것이라 이것도 용의선상에서 벗어났습니다. 

 

 

 

 

어제 알리에서 새로 주문한 L298칩이 도착해서 브레드보드에 꽂아 테스트코드를 돌려봤습니다. 

 

 

 

 

허무하게도 잘 돌아가더군요

 

 

 

 

 

 

범인을 잡았습니다. 

 

 

 

 

 

 

이제 다시 진행이 가능할 듯 합니다. 

728x90
728x90

개인적으로 혼자 만들어 쓰는것과 표준화 시키는건 참 난이도가 다르다는 생각을 요즘 많이 하게 됩니다. 

하나 만들때는 갖고 있는 부품들로 해결할수 있었습니다. 

하지만 공개 여부를 생각하고 만들어 보면 지금은 팔지 않는다던가 만들기 힘들다던가 하는 물건들이 많군요.

 

 

 

 

 

처음 사용했던 모터는 비싸서 비슷한 대체품을 구매했더니 이건 미묘하게 토크가 모자라 펀칭을 못합니다. 

그래서 다시 22RPM짜리로 새로 구매해서 배송되느라 시간이 많이 걸리네요

 

 

 

 

 

 

1602LCD도 여러개인데 볼트 구멍도 다르고 높낮이도 다르군요

LCD 장착부 수치를 고정할수가 없습니다.

이건 뭐 만드는 사람이 알아서 잘라 붙이던지 해야겠네요

 

 

 

 

 

 

 

 

케이블 길이도 지정해줘야하고요

 

 

 

 

 

 

 

 

 

스텝모터가 안 돌아서 일주일간 이유를 찾았습니다. 

모터를 바꿔보고 드라이버를 바꿔보고 했는데 이상하게 DRV8825드라이버와 저 모터만 궁합이 안좋네요

 

 

 

 

 

 

왼쪽부터 계속 업그레이드 되고 있습니다. 성능적으로는 다 비슷하지만요. 

 

 

 

 

 

펀처 구멍을 철판을 잘라붙여야 해서 제작 난이도가 있었는데

프로파일에 끼우는 M3 사각너트를 활용하면 된다는 사실을 깨달았습니다. 

드릴날을 잘라 끼워야 하는 것도 알리에서 구매 가능한 2.5mm 샤프트를 쓸 수 있을지 테스트해볼 예정이고요

 

 

종이를 밀어주는 실리콘 롤러도 몇년전 다이소에서 구매했던 것이라

더이상 구할 수 없어 대체품을 테스트해보는 중입니다. 

정말 자잘한 수정거리가 많아서 골치가 아프네요

728x90
728x90

10월 메이커페어에 출품신청하기도 했고 겸사겸사 instructables 에 올리려고 메뉴얼 작성중입니다. 

영어로 일일이 설명하기도 어렵고 단계별로 사진을 엄청 찍어야 해서 많이 번거롭네요

애초에 동영상 메뉴얼을 만들걸 그랬다 하는 생각도 드는군요. 

 

그나저나 새로 만든 보드로 조립하니 왠지 Y축 스텝모터가 안움직이는군요

원인찾느라 고생하고 있습니다. 

728x90
728x90

완성도를 높이기 위한 마지막 수정작업을 했습니다. 

보드를 2개로 나눠 LCD는 전면부에 엔코더 스위치와 같이 배치했습니다. 







실측하여 3D 작업을 합니다. 








부품을 배치하고 3D 출력해서 마무리지을 생각입니다. 


728x90
728x90

새 기판이 도착하자마자 작업을 시작했습니다. 









역시나 버그가 있네요. NANO에서 MEGA2560 으로 변경하면서 핀을 그대로 둔게 있었습니다. 








일단 테스트 코드를 넣어서 좌표대로 잘 펀칭이 되는지 확인해봤습니다. 







많은 펀칭중에 문제가 생기진 않는지 테스트해보는 코드를 넣었습니다. 






일단 정상적으로 잘 됩니다.

일부 구멍이 비뚤어져 있는데 펀칭중에 위치가 틀어지더군요.

확인해 보니 벨트가 느슨해져 있어서 모터를 당겨서 고정했습니다. 







같은 종이를 같은 펀칭으로 2번 돌려봤는데 후반부가 늘어지는 문제가 있네요

종이를 굴리는 부분이 미끄러지는것 같아 이동 속도를 좀 느리게 수정했습니다. 









https://musicboxmaniacs.com/explore/melody/super-mario-brothers_51/ 의 마리오 주제가를 테스트해봤습니다. 

펀칭 위치를 추출하고 정렬하는 시간이 좀 오래 걸리더군요. 






599개의 펀치가 있으며 정렬하는데 거의 8분 가량이 걸렸습니다. 

bubble sort 를 사용하기 때문에 정렬 속도가 느립니다.









음계 위치에서 약간 비뚤어져 펀칭이 되고 있습니다. 
원점 위치를 바로잡아 봐도 마찬가지네요. 
종이를 잡아주는 레일 부분의 가로 여유가 문제를 일으키는군요. 
이건 나중에 설계 수정하고 재출력해야 하는 부분이라 당장은 어쩔수가 없습니다. 






이런 부분은 음이 아예 안 나올 것 같습니다. 








펀치 599개를 뚫는 데 걸리는 시간입니다. 







대략 3.5미터 정도 되는 것 같습니다. 








펀칭 쓰레기들..  







전체 과정을 찍어봤습니다. 









**수정할 사항

1. 회로를 기구 하단에 내장 가능하도록 만들기.

2. 벨트 고정이 단단하게 되도록 설계 수정. 

3. 종이 레일을 좀 더 길게/좁게 해서 종이가 비틀어지지 않도록. 

4. 종이 눌러주는 부분 좀 더 두껍게 제작. 

5. 전원 스위치 추가


728x90
728x90



기구물에 컨트롤러를 연결했습니다. 
기판에 버그가 약간 있어서 점퍼를 몇개 날렸네요.
기구 부분은 몇번씩 수정을 하면서 손봤던거라 딱히 문제는 없습니다. 
센서들도 잘 동작하는군요.
종이 감지 센서가 롤러의 앞쪽에 있어서 종이가 롤러를 통과한 뒤에 센서에 닿도록 되어 있습니다.
이 부분은 지금 보니 센서를 먼저 닿고 롤러에 닿거나 센서를 앞뒤로 2개 배치했어야 한다는 생각이 드네요. 
큰 문제는 아니니 나중에 수정 기회가 생기면 그때 해봐야겠습니다. 






모터 테스트를 하고 영점잡기 등 초기화 코드를 몇개 넣었더니 아두이노가 오동작하기 시작합니다. 

코드가 많이 길어지기도 했고(700Line) 업로드할때마다 메모리 부족 경고가 뜨더군요. 

더이상 테스트도 힘들 지경이라 잠시 멈춰두고 주문한 PCB가 도착한 다음에 작업을 해야겠습니다. 





728x90
728x90


Mega2560 보드를 새로 주문해 놓고 일단은 아두이노 나노로 진행을 하고 있습니다. 

변수가 모자라는 부분은 나중에 MEGA 보드에서 늘리면 되기 때문에 바로 적용을 할 수 있죠. 





음표 3개짜리 악보를 만들어 테스트용으로 사용하고 있습니다. 






데이터를 모두 불러들여 정상적으로 기록된 것을 볼 수 있습니다. 

저 데이터는 사실 전부 inch 값이기 때문에 25.4를 곱해야 mm 단위로 변합니다. 

나중에 한줄만 추가하면 되므로 일단은 그냥 사용하고 있습니다. 






X좌표값이 크기 순서대로 되지 않는 경우 순서대로 정렬을 해야 합니다. 

그래야 종이에서 처음부터 순서대로 펀칭을 하게 되겠죠.

지난 포스트(링크) 를 참조해서 정렬을 해 봤습니다. 

위쪽이 정렬되지 않은 데이터고 아래쪽이 정렬된 데이터입니다. 

첫번째 XY(1.44 , 1.41) 가 두번째 데이터에서는 맨 아래쪽으로 이동한 것을 볼 수 있습니다.








여기까지 작업한 후의 동작화면입니다. 

이제는 실제로 모터를 동작하며 펀칭 동작으로 들어가게 되겠죠. 

여태 카페에서 작업을 잘 했는데 몰입하기 좋아서 참 많이 도움이 됐습니다. 

이제는 모터를 돌려야 하니 집에서 계속해야겠네요


728x90
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

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


지난 글에 박정식님이 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

+ Recent posts