찬찬히 로봇 메이커 :: 찬찬히 로봇 메이커
반응형

알고리즘을 공부하면서 알고리즘의 종류가 매우 많다는 것을 알게 되었다. 하지만 백준 알고리즘 사이트(www.acmicpc.net/), 또는 코드 플러스 같은 강의 사이트를 보면 문제의 종류가 정해져 있다는 것을 알 수 있다.

 

이번에는 기본적인 산수문제를 어떻게 하면 깔끔(?)하거나 빠르게 풀 수 있는지를 알아보자.

 

알고리즘을 공부하면 가장 먼저 보는 문제의 종류가 있다. 백준 알고리즘 사이트에서는 수학으로 분류된 문제이다.

(www.acmicpc.net/problemset?sort=ac_desc&algo=124)

처음에는 간단한 계산 문제처럼 보이지만 나중에는 좀 생각하고 풀어야하는 문제들이 많은데 그중에서도 좀 어려운 유형을 분류해보았다.

 

1.  기본 산수

1부터 n까지 더한 값, 곱한값, 팩토리얼, 등등 기본적인 산수를 물어보거나 약수의 개수, 소수 등 특징적인 숫자를 묻는 문제이다. 이런 문제들은 유형을 외워서 생각하는 시간도 아깝게 풀어버리면 편하다.

 

예를 들면 팩토리얼은 재귀함수 형태로 만들면 쉽게 구할 수 있다. 마치 처음 c언어 시작하면 #include<stdio.h> 쓰는 것처럼 외우면 자연스럽게 나온다.

ex)

int factorial(int x)

{

    if(x==1)

        return 1;

    if(x>1)

       return x*factorial(x-1);  //x*(x-1)*(x-2)*...*1이 된다.

}

하지만 팩토리얼 문제 중에 팩토리얼의 약수, ~의 갯수 등을 구하는 문제가 나오면 팩토리얼의 특성을 구해서 풀어야 한다. 왜냐하면 팩토리얼은 기본적으로 숫자가 커지기 때문에 50!같은 경우는 unsigned int에 들어가지도 않는다. 그런데 숫자의 범위가 1000까지라고 한다면 아마 코테 시간동안 1000!을 돌리지도 못할 것 같다. 이런 경우는 1*2*...*n이라는 특성을 가지고 for문을 돌려 풀어야 한다.

ex) 

for(int i=2;i<n;i++)    //2부터 시작

{

    tmp=i;   // i가 바뀌면 안되므로 tmp에 저장

    while(1)

    {

        if(tmp%5==0)

        {

            cnt++;

 

        }

 

        tmp = tmp/5;

        if(tmp<=1)

             break;

    }

    

}

이런 식으로 팩토리얼의 약수 중 5의 갯수를 구한다든가 할 수 있다.

 

 

 

 

약수의 갯수는 그냥 구하기는 쉽지만 빠르게 구하는 방법이 하나 있다. 바로 약수는 2개씩 짝지어진다는 점이다.

예를 들면 6의 약수는 2와 3이 있는데 2는 무조건 3이랑 짝지어진다는 점이다. 즉 하나의 약수는 다른 하나와 짝지어진다. 그런데 2의 제곱은 4로 6보다 작으므로 6은 2가 아닌, 2와 짝지어지는 다른 하나의 약수가 더 있다는 사실을 알 수 있다.

그러면 9는 어떨까? 9는 1과 3과 9가 약수인데, 3의 제곱이 9가 되므로 3은 짝이 3으로 중복이 되므로 약수가 1개이다.

이 사실을 바탕으로 코드를 작성할 수 있다.

ex)

for(int i=1;i*i<=n;i++) // i제곱이 n보다 작거나 같은 경우만 돌아감.

{

    if(n%i==0) // i가 약수일 때.

    {

        cnt++;

        if(i*i<n) // i가 중복이 안되고 하나의 쌍을 가질 때.

           cnt++; // 한 번 더 카운트 

    }

}   

이렇게 하면 cnt가 약수의 개수가 된다. 1과 자기 자신 포함. 이렇게 코드를 작성하면 i가 1부터 n이 아닌 1부터 n/2만 탐색을 하므로 절반의 시간 이득이 생긴다.

 

이렇게 기본 산수문제는 문제를 많이 풀다보면 생기는 몇 가지를 외워서 빠르게 풀면 시간 단축을 할 수 있다. 

 

 

※틀린 부분은 댓글로 올려주시면 수정하겠습니다. ^^

반응형
반응형

마이크로마우스 외관

마이크로 마우스 PCB를 만든 지 한 달이 지났다. 이제 센서와 모터 다 잘 나온다는 것을 확인을 하고 흡착을 시도하는데...

 

일단 유튜브에 impeller fan 이라고 치면 흡착을 할 수 있는 fan을 그리는 법이 나온다. 그걸 참고하여 fan을 디자인해서 3D 프린터로 제작을 했다. 모터는 소형 드론용 모터를 사용했고 밑의 스커트는 0.5mm 정도 되는 비닐과 3M 두꺼운 양면테이프를 사용해서 만들었다. 처음에는 그냥 양면테이프로 했었는데 떨어지려고도 하고 많이 불안했다. 그러다가 다른 마우스 하시는 분들의 블로그를 봤는데 배운 점을 토대로 다시 해서 이렇게 되었다.

 

현재는 마우스 총 무게 약 180g에  약 300g의 힘으로 빨아드리는 것을 확인했다. 일본의 마이크로마우스 선수의 영상에서는 마우스 총 무게 115g에 500g이상의 힘을 빨아들이는 것을 확인할 수 있다. 그리고 흡착 모터를 테스트하는 용도로 만들어져 있기 때문에 흡착 모터용 레귤레이터가 대충 달려있으며 그와 관련된 것들이 엉성하게 디자인되어있다. 그래서 무게 중심이 엉망이다. ㅠㅠ

 

흡착테스트

 

이대로 테스트 했을 때는 아직 속도를 많이 올리지는 못했다. 일단 흡착 모터 출력이 약한 감도 있고 전체적인 무게도 무겁다. 그리고 양 옆의 너비도 너무 넓게 제작이 되어 제어도 편하지 못하고... 아무래도 추후에 다시 도전해야겠다. M4로 만들어야 흡착 모터를 설치할 공간이 나올 것 같다.

반응형
반응형

지난 포스트에서 pads layout에서 cam 파일을 만드는 것까지 하였다. 이제 어떻게 맡기나 살펴보자.

내가 사용하는 가장 싼 pcb 샘플 회사 JLCPCB에 들어가서 quote now를 누르면 

Add your gerber file이라고 되어있는 곳에 지난번에 만든 zip파일을 올린다. 그러면 미리보기와 층, 사이즈를 자동으로 설정해준다. 살펴보고 괜찮으면 주문하면 된다. 주문할 때는 bc카드로 결제하면 편하다.

미리보기를 확인하고 구멍은 잘 뚤렸는지, 글씨는 잘 써지는지를 확인하고 주문을 하면 된다. 여러 설정이 있으니 자신에 맞게 하면 되는데 나는 가장 싼 설정으로 했다. 또한 pcb 색상은 검정을 선택했다. 역시 검간지...

 

추가 요금 없는 기본 설정으로 주문했다.

주문하니 10일 정도만에 중국에서 경기도까지 배송이 되었다. 친구들은 1주일 만에 되기도 하는 모양이다. FedEx가 추가 요금이 없고 더 빠르다는 이야기도 있다. 어쨌든 이렇게 하여 pcb 만들기가 완료되었다. 처음에는 제대로 작동은 될까 걱정이 되었지만 소자 몇 개 붙이고 전원을 넣으니 바로 되어서 문화충격을 겪었다. 이렇게 편할 줄이야~~ 센서부까지 잘 나와서 다행이었다. 이제 마우스로 흡착 테스트를 할 수 있게 되었다. bb

반응형
반응형

배선과 gnd까지 모두 연결해주었다면, 오류 검사를 통과했다면 이제 제품을 맡기면 된다. 그냥 pcb를 만들 수도 있고, 샘플 pcb를 만들 수도 있는데 차이를 모르겠다. 확실한 것은 싼 게 있고 비싼 게 있다는 것이다. 나는 샘플 pcb 제작회사 중에 가장 싼 JLCPCB에서 주문을 하였다. pcb 최소 단위가 5장인데 내 pcb 크기가 커서 추가 요금이 발생해서 18달러 조금 넘게 나왔다. 약 2만 원 정도 나온 셈이다. 

같은 거버파일을 올렸을 때 나오는 가격 차이. 왜 이렇게까지 차이가 나는지는 모르겠다. 왼쪽에 배송비 11달러를 더해도 반값....

거버 파일만 제대로 만든다면 바로 주문을 넣을 수 있다. 그러면 거버 파일을 만드는 법을 알아보자.

 

file-cam... 을 들어가면 아래 그림과 같은 창이 뜬다. 여기서 add를 통해 맡길 파일을 생성해준다. 파일의 종류는 배선과 pour가 담긴 파일, 땜하는 부분이 있는 solder파일, text와 부품 위치와 이름이 그려지는 slikscrean, 드릴, outline 이 있다. 각 층의 정보가 담긴 파일을 따로 보내는 것이다.

cam 파일 만드는 창

홈페이지에 보면 파일 이름을 이렇게 보내주면 좋다고 나와있다. 

top layer를 만든다고 하면, 

이렇게 이름을 짓고(output file의 이름을 맞춘다), routing/ split plane에서 top을 선택해준다. 그리고 option에서 offset을 100 X 100을 해준다. preveiw에서 제대로 되었는지 확인한다.

이렇게 나머지 층도 각각 document type을 설정해서 해주면 된다. board outline 빼고는 각자의 type이 존재한다. 주의할 점은 각 층마다 필요한 부분만 layer에서 추가해주어야 한다는 점이고, offset에서 모든 파일을 100 X 100으로 해주어야 한다는 것이다. 그리고 drill은 설명이 겹치지 않게 설명의 위치를 -90 정도 해주면 된다. 

그리고 outline은 따로 custom으로 만들어 layer top에서 board outline만 선택해서 만들어주면 된다.

silkcreen과 nc drill 파일이다. silkscreen은 실수로 top에 bottom까지 출력되어 수정이 필요하다.

이렇게 모든 파일을 만들었으면 모든 층 파일을 드래그해서 run을 하면 cpadsC:\PADS Projects\Cam 위치에 파일이 생성이 된다. 

이 파일들을 zip파일로 만들면 끝!~!~!

맡기려는 홈페이지에 들어가면 quote now가 있다. 이걸 누르면 주문하는 페이지가 있는데 여기서 이 zip 파일을 넣으면 미리보기를 할 수 있다. 가운데 구멍이 제대로 뚫리는지 확인하는 것이 좋다.

 

반응형
반응형

앞선 과정이 끝나 부품의 배치와 배선이 완료되었다면, 그리고 gnd 배선만 남겨두고 있다면 copper pour로 gnd를 깔아주어 PCB 판 전체적으로 gnd가 깔리게 만들어 준다. 이를 통해 전체 gnd의 전위를 같게 만들어주며 안정성을 더할 수 있다.

 

우선 gnd를 깔기 전에 다른 파일로 저장을 하는 것이 좋다. 예를 들어 PCB.pcb 파일이라면 PCB_1.pcb처럼 여분의 저장을 해두면 편하다. 왜냐하면 copper를 깔면 다시 되돌리기 귀찮기 때문이다. 사실 copper는 지우기 쉽지만 via stitch는 어떻게 지워야 하는지 모르겠다.

 

파일을 만들었으면 pcb 전체를 덮어주는 copper pour를 그려준다.

이렇게 초록색 네모 모양으로 덮었다. 하나는 TOP, 하나는 BOTTOM이다.

그린 후 properties에서 net assign을 gnd로, layer를 하나는 top, 하나는 bottom으로 해준다.

다 그렸다면 tool-pour manager에서 confirm flood operations 박스를 체크를 해제한 후 start를 누른다. 그러면 아래 그림처럼 깔끔하게 gnd가 깔리게 된다. 단축키 po를 통해 다른 선들을 고치기 편하게 할 수 있다.

 

 이 상태에서 우클릭에 select shapes를 선택하고 copper pour만을 선택하면 via stitch가 생성된다. 혹시 설정에 prevent errors가 안 되어있을 경우 안 보일 수 있다. 버전에 따라 다르다고 한다.

via stitch 전에 따로 저장을 추천한다. via stitch에 대한 설정은 설정에 via patterns에서 when stitiching shapes에서 그림과 같이 설정한다. via spacing은 via의 간격인데 적당히 설정해주면 된다. 

 

via stitich를 하면 위 그림처럼 gnd via가 반점처럼 생긴다. 이렇게 되어야 top의 gnd와 bottom의 gnd의 전위차가 사라지게 된다. 

이제 이 상태로 verify design을 통해 오류가 있는지 확인한다. clearance와 connectivity를 각각 확인해보면 되는데 connectivity에서 copper pour를 깔았음에도 gnd error가 뜬다면 copper pour가 해당 위치까지 닿지 않는 것이다. 그럴 때에는 따로 선을 이어주거나 다른 배선들을 옮겨서 다시 pour를 해주면 이어진다.

그림처럼 pour가 섬처럼 다른 곳과 연결이 안 될 수 있다. 그럴 때에는 뒷면과 via가 뚫리면 해결이 되지만 안된다면 gnd를 따로 연결해주어야 한다.

dip 타입은 대각으로 연결되어있는데, smd는 직각으로 연결되어 있는 것을 확인할 수 있다. 이 또한 설정에서 변경 가능하다. smd는 보통 핀이 촘촘히 되어있어서 직각이 연결하기 편하다!

 

여기까지 해서 gnd copper pour에 대해 알아보았다. 다음 포스팅에서 거버 파일을 만들어 제품을 맡기는 것까지 해보자. 

반응형

+ Recent posts