728x90

 일단 프로토타이핑 과정에서 3D 모델링을 완성하고, 센서와 코딩 과정을 진행하고 있었다. 하지만 내가 산 저가 센서로는 역 도립진자 로봇을 만들수가 없어 중간에 여기까지 중지하게 되었다. 

 

 대신 가지고 있는 재료로 만들수 있는게 밸런싱 로봇이 있어 이걸로 진행하고자 하였으나 하필이면 코로나 문제로 3D 프린팅을 할수도 없고, 가장 중요한 관성센서를 내가 납땜을 해야 할수 있으나 납땜 재료도 납땜 할수도 없어 어떻게 쓰질 못하겠더라..

 

 3D 모델링을 배웠으니 이번인 2D 캐드를 잠깐 보면 눈이 조금 트이지 않을까 싶어서 이글 캐드에 대해 찾아보았고 gcamp에서 다행이 이글캐드 입문 자료들을 정리해서 올려주신것을 찾았다.

 

 이 과정을 통해서 전자회로가 무엇인지 전원은 어떻게 주고, 어떻게 실장을 하는건지 이해할수 있게 될것같아 본 자료를 선정하게 되었다.

 

 아래의 링크는 이글캐드 입문 

 

https://www.g.camp/tag/Eagle_CAD

 

 

 

 

 

PCB

- Printed Circuit Board

- 절연판 위에 회로룰 형성시켜 그위에 실장된 부품을 전기적으로 연결시켜 동작시켜주는 기판

- 부품들의 전기적 연결 이외 동작시켜주게 함

- 부품과 PCB는 soldering을하여 연결

 * 보드는 휘어지거나 열에 변형되어선 안됨

 

https://en.wikipedia.org/wiki/Printed_circuit_board

 

 

SMT Surface Maunt technology

- 표면 실장 기술

- PCB위에 여러가지 부속품(반도체 등)을 장착하고 납땜 soldering하는 기술

- PCB위에 납땜하는 기술을 의미

 

https://m.blog.naver.com/PostView.nhn?blogId=santec&logNo=220289097763&proxyReferer=https:%2F%2Fwww.google.com%2F

 

SMT

 

 

SMD

- Surface Maunt Device

- 표면 실장 부품(소자)

- PCB 구멍이 아닌 패드에 납땜

 

SMD

 

 

 

DIP

- 다리가 있는 IC로 구멍에 끼울수있는 부품

 

DIP

 

Lead

- 저항, 콘덴서 처럼 다리가 긴 부품

LEAD

 

PCB 관련 용어

- 실크 스크린 Silk Screen : 회로, 부품의 위치와 방향 표기 등. 보드 양면에 인쇄 가능

- 패드 Pad : 인쇄 회로기판에서 부품을 보드에 납땜할수 있는 작은 구리 표면.

- 트랙 Track : PCB 두개 지점을 연결하는데 사용되는 전도성 경로. 전류에 따라 넓이가 달라질수있음.

   ex. 두개의 패드를 연결 or 패드와 비아를 연결

- 스루 홀 through hole : 부품을 삽입하여 도체와 도체간 연결 접속을 위한 구멍

- 비아 홀 Via hole : 부품을 삽입하지 않고 다른 층간 접속을 위한 홀

 

PCB 회로기판

 

 

실장 SMT

- Surface Mount Technology

- 직접 납땜할수도 있지만, 집적도, 인건비 등의 문제로 기계로 자동화 공정 수행

=> STM 표면 실장 기술

 

실장의 예시

 

FPCB

- Flexible Printed circuit Board

- 연성 인쇄회로 기판

- 3차원 배선, 소형화, 경량화 등이 가능

 

FPCB의 예시

 

PCB 제작 과정

1. 회로 구현 및 테스트. 브래드 보드를 이용

2. 부품 디자인 및 회로도 그리기 - Schematic

3. 부품 배치 및 아트웍 - Board

4. 거버파일 생성 및 발주. - Gerber. PCB 제작업체에 보내면 PCB가 생산. 

5. 실장 및 납땜 -SMB

-> 2, 3, 4 단계가 이글캐드로 할수 있는 일

 

 

캐드 프로그램 종류

- 카이캐드 KiCad

- PADS

- ORCAD

- 이글캐드(무료)

 

 

 

 

 

 

 

 

300x250
728x90

 오늘 3D 프린팅을 할수 없게되서 대신 코드 정리부터 해보려고한다. 어떻게 정리해나갈지 생각하고자 우선 로터리 엔코더, PID, 모터 제어 코드들을 가져 온 후 어떻게 연동시킬지 생각해본다.

 

 

1. 로터리 엔코더

https://howtomechatronics.com/tutorials/arduino/rotary-encoder-works-use-arduino/

 #define outputA 6
 #define outputB 7
 int counter = 0; 
 int aState;
 int aLastState;  
 
 void setup() { 
   pinMode (outputA,INPUT);
   pinMode (outputB,INPUT);
   
   Serial.begin (9600);
   // Reads the initial state of the outputA
   aLastState = digitalRead(outputA);   
 } 
 void loop() { 
   aState = digitalRead(outputA); // Reads the "current" state of the outputA
   // If the previous and the current state of the outputA are different, that means a Pulse has occured
   if (aState != aLastState){     
     // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
     if (digitalRead(outputB) != aState) { 
       counter ++;
     } else {
       counter --;
     }
     Serial.print("Position: ");
     Serial.println(counter);
   } 
   aLastState = aState; // Updates the previous state of the outputA with the current state

 

2. PID 예제

https://www.teachmemicro.com/arduino-pid-control-tutorial

//PID constants
double kp = 2
double ki = 5
double kd = 1
 
unsigned long currentTime, previousTime;
double elapsedTime;
double error;
double lastError;
double input, output, setPoint;
double cumError, rateError;
 
void setup(){
        setPoint = 0;                          //set point at zero degrees
}    
 
void loop(){
        input = analogRead(A0);                //read from rotary encoder connected to A0
        output = computePID(input);
        delay(100);
        analogWrite(3, output);                //control the motor based on PID value
 
}
 
double computePID(double inp){     
        currentTime = millis();                //get current time
        elapsedTime = (double)(currentTime - previousTime);        //compute time elapsed from previous computation
        
        error = Setpoint - inp;                                // determine error
        cumError += error * elapsedTime;                // compute integral
        rateError = (error - lastError)/elapsedTime;   // compute derivative
 
        double out = kp*error + ki*cumError + kd*rateError;                //PID output               
 
        lastError = error;                                //remember current error
        previousTime = currentTime;                        //remember current time
 
        return out;                                        //have function return the PID output
}

 

3. DC 모터 제어예제

https://deneb21.tistory.com/281

void setup() {
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
 
void loop() 
{
        //최대속도의 50%로 정회전
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        analogWrite(6, 127);
        delay(3000);
 
        //최대속도의 50% 역회전
        digitalWrite(7, LOW);
        digitalWrite(8, HIGH);
        analogWrite(6, 127);
        delay(3000);
 
        //최대속도로 정회전
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        analogWrite(6, 255);
        delay(3000);
 
        //최대속도로 역회전
        digitalWrite(7, LOW);
        digitalWrite(8, HIGH);
        analogWrite(6, 255);
        delay(3000);
 
        //정지 (7번핀에 HIGH를 주어도 PWM 핀에 값을 0을 주었기 때문에 정지함)
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        analogWrite(6, 0);
        delay(3000);
}

 

 

 

 준비는 거의 다되서 진행하려고 하였으나 하필이면 너무 저가의 로터리 엔코더를 사용하다가 제대로 각변화를 측정할수가 없어 더이상 본 과제는 진행할 수가 없다.

 

 상세한 테스트 내용은 오늘 자 문서에 남기고 할수 없이 스테핑 모터를 이용한. 저거 볼 밸런싱 로봇으로 변견해보아야 되겠다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

진자를 제외한 대부분 파츠들 모델링을 마쳤다. 아래의 사진들은 결과물

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

외부 CAD 모델을 활용해서

 

역 도립진자 차량 모델링 만들어 가는중

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

오늘은 사용할 부품 정리와

 

라이노를 이용해서 간단하게 모델링 했다.

 

내일은 라이노 볼트, 너트 준비 및 코드 정리하면 될거같다.

 

 

 

300x250
728x90

300x250
728x90

3d 프린터 동작 방식

1. FDM 압출형, 고체형

- 고체기반 재료에 열을가해 녹인 후 노즐로 쌓아 올림

- 장점 : 장비, 재료가격이 저렴, 가장 대중화

- 단점 : 정밀도가 낮음, 후가공 힘듬, 느림

- 재료 : PLA(후가공 힘듬, 수축 적음), ABS(후가공 편리, 수축 심함)

 

2. SLA /DLP(꽝조형, 액체형)

- SLA : 광경화성 액상수지를 레이저로 응고

- DLP : 광경화성 액상수지를 빔 프로젝터로 응고

(기념품가게 크리스탈안에 물건넣은거)

- 장점: 세밀하고 정교하게 구현

- 단점 : 색상, 원료 제하, 장비 재료가 고가

-재료 : 광경화성 액상수지

 

 

 

 

모델링 데이터 변환과정

1. 모델링 파일 STL

2. 슬라이싱(G Code)

3. 결과물

 

 

 

슬라이싱 프로그램 -> 큐라

- 무료

- 직관적

- 다양한 설정

* 여기는 ultimakor 2+

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

일단 내가 원래 생각하고 있던건 밸런싱 로봇인데

 

제어 공학적 관점에서 어떻게 접근해야 될지 몰라

 

손댈수가 없더라. 일단 이거 한 코드는 있어보이긴한데

 

 

 

대충 그린 밸런싱 로봇 그림 ㅋㅋㅋ..

 

 

 

 

그래서 제어 공학 공부에 많이 사용하고, 심플한

 

역 도립진자를 우선 해보고자 한다.

 

 

 

 

 

 

 

대강 이런식으로

 

하지만 제대로 구현하려면 각 부품들 크기를 제대로 조사해야되겟다.

 

1. 아두이노 본체

2. 아두이노 전원 배터리

3. 모터 드라이버

4. 모터 전원부

5. 로터리 인코더

6. 기어 모터

 

300x250
728x90

역 도립진자에 로터리 엔코더 모터가 필요한건 알겠다.

 

하지만 이걸 뭘 골라야될까 고민하다가 몇가지 자료를 찾았다.

 

 

 

1. 로터리 엔코더 작동 원리

- 자세히 읽지는 (못)않았지만 사람들의 평이 되게 좋길래 남긴다.

 

https://elecs.tistory.com/181?category=605348

 

 

 

2. 회전 역 도립진자

- 아두이노 메가를 가지고 역 도립진자 만든 자료

https://www.seas.upenn.edu/~jiyuehe/rotary-inverted-pendulum/Encoder.html

 

- 아깝게도 동영상이 나오는게 하나도 없다..

 

- 하지만 기본 하드웨어 설정이랑 소스코드 관련 내용을 정리해서 올려주셨더라

 

 

 

 

- 이 자료를 보니까 팬듈럼 엔코더에다가 짝대기를 달고, 짝대기가 하늘을 가리킬때 입력을

 -> 기준입력 r(t) = 0

 -> 엔코더 측정 값이 y(t)

 -> 오차 e(t) = r(t) - y(t)

 => PID 제어기로 오차를 줄여주도록 u(t) 생성

 

 

 

- 오차가 있으면 어떻게 차가 움직여야 할까..

 ->  e(t) < 0라면 전진. e(t) > 0는 후진 대강 이런식으로 해야하지 않을까..

 -> 오차와 모든 게인들을 정리한 값을 모터 입력으로 사용해주면 될듯하다.

https://throwexception.tistory.com/851

 

 

 

하지만 나는 로터리 엔코더가 없으니 하나 사야될것같다..

 

 

대충 준비물 정리

1. 로터리 엔코더 -> x

2. 작대기 -> x

3. 아두이노 우노보드 본체 -> 있음

4. 모터 2개와 모터드라이버, 차량(base) 몸체 -> 있음?

 

 

 

일단 준비물은 정리했으니

 

 

로터리 엔코더에서 어떻게 값이 들어오는지 보고

이에 맞게 DC모터 제어하는 방법을 고안해보자 ...

 

 

 

 

 

 

 

 

300x250
728x90

아두이노 부품에 대해 잘몰랐던것같다

 

매번 LCD, DC 모터, 스탭모터, 초음파 센서 같은게 있구나

 

정도만 알았지

 

정확히는 잘몰랐다.

 

 

 

 

그런데 역도립진자를 만들려면 회전각 측정이 가능한 모터를 찾아야 된다고 하더라

 

그런 모터를 로터리 엔코더가 장착된 모터라고 하더라

 

 

 

 

그러다보니 로터리 엔코더를 잠시 확인해보았다.

 

그런데 로터리 엔코더들 설명들이 하나같이 너무다 어렵더라

 

 

 

 

그러다가 로터리 엔코더 사용법에 대한 영상을 보는데

 

GA, GB 핀이 있고

 

GB 핀 신호가 라이징 에지일때 0이면 왼쪽

 

1이면 오른쪽으로 돌아가 있다고 한다.

 

 

 

실제로는 더 복잡하겠지만

 

라이징 에지시점의 A값을 확인해서 회전각을 안다니

 

그동안 본것보다는 더 이해가 잘된다.

 

 

 

 

 

 

 

 

하지만 문제는

 

여기서 설명해주는건 로터리 엔코더 하나만 보여주다보니

 

나는 모터 각을측정해야되는데!!

 

로터리 모터를 찾아봐야할거같다.

 

 

참 좋은 자료는 많은데

 

뭐가 좋은 자료인지 나한태 맞는지 참 판단하기 힘들다...

 

 

 

 

중간에 잠깐 본 오실로스코프

 

오슬로 스코프는 전기 흐름을 보르는 전기의 현미경

 

- 노이즈가 어디서 발생하는가? 전기의 튀김

- 시리얼 모니터로 보기도 하지만 이걸로는 판단하기 힘듬

 => delay를 주기도하지만 오실로스코프로 보면 센서가 어떻게 인식되는지 알수있음

 

 

 

 

아래 재품 성능

- 채널 1 -> 신호를 1개만 받을수 있다 (대부분 2채널)

 

 

 

 

 

 

 

 

 

 

 

 

300x250

+ Recent posts