#Arduino #3D printer #아두이노 #3D프린터 # 3D프린터개발산업기사

 

로터리인코더(로타리엔코더) 쉽게 이해하기

 

0. 서론

로터리 인코더는 CLK와 DT라는 두개의 포인트를 가지고 회전을 검출하는 장치입니다.

사실상 원리는 간단하고 이를 아두이노에 활용하기에도 쉽지만 의외로 이 인코더의 작동원리를 이해하기 힘들어 아두이노 코드에 접목하기가 쉽지 않은 것이 현실입니다.

이에 오늘은 로터리인코더(로타리엔코더)의 회전방향 검출에 대해 알아보도록 하겠습니다.

 

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

로터리 인코더는 CLK와 DT라는 두개의 포인트로 회전을 검출합니다.

발광부-수광부로 이해해도 좋고, 금속 원판에 포인트가 붙었다 떨어졌다로 이해해도 좋습니다.

어찌되었든 이 두 지점이 거리를 두고 위치하고 있기 때문에 원판이 돌아갈 때 시간차이가 나게 되고, 이 시간차이를 가지고 이 원판이 시계방향으로 회전하는지, 반시계방향으로 회전하는지를 알아낼 수 있습니다.

출처: www.ElectroPeak.com



그림의 이해를 쉽게 하기 위해 원형철판에 두 지점이 닿아있다고 보겠습니다. 이 상황에선 두 포인트 전부 전기가 통하는 상태입니다.(수치로는 1 혹은 HIGH라고 볼 수 있습니다.)
또한 CLK(그림의 Output A)는 DT(Output B)보다 왼쪽에 위치하며, 이미지상으로는 위쪽에 위치합니다.

일단 시계방향으로 돌아갈때를 보죠.
이 상황에서 시계방향으로 돌면 CLK가 먼저 원판에서 떨어집니다. 그리고 그 다음 DT가 떨어지고, 그 다음 다시 CLK가 원판에 붙고, 다시 DT가 붙습니다.
1주기를 살펴보면

CLK DT
1 1
0 1
0 0
1 0
1 1

이렇게 되는 것을 볼 수 있습니다.
또한 최소 분해능은 1/4주기로 볼 수 있습니다. 1/4주기마다 회전을 검출할 수 있기 때문이죠.


그럼 반시계방향으로 돌아가는 상황을 보도록 합시다.
원판이 반시계방향으로 돌면 DT가 먼저 원판에서 떨어집니다. 다음 CLK가 떨어지고, 다음 DT가 다시 붙고, 다음 CLK가 붙겠죠.
1주기를 살펴보면

CLK DT
1 1
1 0
0 0
0 1
1 1

이렇게 되는 것을 볼 수 있습니다.

이를 펄스그림으로 보게되면 아래와 같습니다.

출처: https://protosupplies.com/

 

2. 소자의 이해(HW-040)

저희가 쓸 소자는 HW040이라는 소자입니다. 이 소자의 특징은 로터리 인코더가 한번 딸깍하고 돌아갈때 위에서 말한 1주기 중 1/2주기씩 움직인다는 것입니다. 이를 이미지로 설명하면 원판에 둘다 붙어있다가 한번 딸깍에 둘다 떨어지고, 다음 딸깍에 둘다 붙는다는 말이 되죠. 참고로 첫 시작값은 보통 CLK, DT 모두 1값으로 시작하는게 보통이나 상황에 따라 달라질 수 있기에 소스코드에서 한번 처음 읽어주도록 합시다.

 

3. 코드에의 적용

이렇게 1주기에 CLK와 DT값이 4가지로 변화하기 때문에 이 모든 값에 대응해서 코딩을 해야할 것 같지만(물론 이런 경우가 제일 완벽하겠죠), 자세히 들여다보면 어떤 규칙이 있습니다. 바로 CLK값이 변화할때 시계방향이면 DT와 읽는 값이 정 반대이고(CLK가 왼쪽이므로 원판에서 먼저떨어집니다), 반시계방향이면 CLK값이 변화할때 DT값이랑 같다는 것이죠.(CLK가 왼쪽인데, CLK에서 변화가 감지될 때는 이미 DT값이 변한 이후입니다.)

특히 저희가 쓸 소자는 1번 딸깍에 1/2주기씩 진행하기 때문에 모든 상황에 대해서 코딩하는 것이 낭비라고 볼 수도 있기도 하고, 한번 딸깍에 코딩으로 반응이 와야하기 때문에 모든 주기에 대해서 코딩하기 보단 변화를 가지고 코딩하는게 좋습니다.(1주기 코딩을 하게되면 두번 딸깍해야 반응이 오겠죠)

여기서의 포인트는 딱 두가지입니다.

1) CLK값이 변화할때
2) 그 순간 DT와 CLK값의 차이(정방향 변화: 두 값이 차이, 역방향 변화: 두값이 동일)

 

 그럼 코드를 작성해보겠습니다. 이전과 같이 LED는 각 2, 3, 4번 핀에 대응시키고 로터리 인코더의 CLK, DT는 각 8, 9번 핀에 대응시키겠습니다.(SW는 그냥 스위치처럼 사용하기에 편리하므로 이번 포스팅에서는 제외하겠습니다.) 목표는 로터리 인코더가 오른쪽으로 돌면 빨간불, 왼쪽으로 돌면 파란불이 들어오게 하는 것입니다.

#define LED_R 2 
#define LED_G 3 
#define LED_B 4 
#define CLK 8 
#define DT 9 

bool pre_clk = 0; 

void setup() { 
  pinMode(LED_R, OUTPUT); 
  pinMode(LED_G, OUTPUT); 
  pinMode(LED_B, OUTPUT); 
  pinMode(CLK, INPUT); 
  pinMode(DT, INPUT); 
  pre_clk = digitalRead(CLK); 
} 

void loop() { 
  bool cur_clk = digitalRead(CLK); 
  if(pre_clk != cur_clk){ 
    if(digitalRead(DT) != cur_clk){ 
      digitalWrite(LED_R, HIGH); 
      digitalWrite(LED_G, LOW); 
      digitalWrite(LED_B, LOW); 
    } 
    else{ 
      digitalWrite(LED_R, LOW); 
      digitalWrite(LED_G, LOW); 
      digitalWrite(LED_B, HIGH); 
    } 
  } 
  pre_clk = cur_clk; 
}

#Arduino #3D printer #아두이노 #3D프린터 # 3D프린터개발산업기사

 

millis() 함수와 delay() 함수의 차이

 

0. 서론(매우 빠른 작동속도를 가진 아두이노)

아두이노는 사실 1ms(1/1000초, 밀리세컨드, millisecond)보다 더 빨리 작동하고 있습니다. 물론 내부의 코드 길이나 상황에 따라 또한 어떤 구문을 실행하냐에 따라 걸리는 속도가 달라지기는하겠습니다만 이론적으로 대략 1/16000초의 속도로 한 명령어를 처리(16MHz)합니다.(이쪽으로 더 나가면 플립플롭(Flip-Flop), 래치(Latch), 클록스피드(Clock speed)와 같은 디지털 논리 회로의 영역으로 들어갑니다)

그래서 루프문 안에 시간을 지연시켜주지 않고 켰다 껐다하는 신호만 준다면 아주 단순한 LED를 깜빡이는 프로그램도 LED가 꺼졌다 켜졌다 하는게 눈으로 안보이고 LED가 계속 켜져있는 것처럼 보일겁니다. 약 0.001초마다 스위치를 계속 켰다껐다 하는거니까요.

 

1. 가장 쉽게 쓸 수 있는 delay함수

그래서 가장 쉽게 사용할 수 있는 명령 지연 함수가 delay함수입니다. 이 함수 안에 ms(밀리세컨드)단위의 시간을 입력하면 그 시간만큼 쉽게말해 프로세서는 "정지"하죠.

프로세서가 "정지"하기에 다음 명령 실행까지 시간적으로 지연이 되기는 합니다만, 그 "정지"해 있는 동안엔 프로세서가 아무 일도 못한다는 단점이 있습니다. 말그대로 일시정지하는거죠. 그 시간엔 그 어떤 다른 일도 하지 못합니다.

이런건 단순히 LED를 껐다 키거나 하는 단일 소자로 단일 명령을 시키는데는 전혀 걸림돌이 되지 않지만, 만약 "동시에" 일을 시켜야 하면 난감한 상황이 올겁니다.

 

가령 (delay가 적용된 깜빡이가 있는) 차를 타고가면서 왼쪽 깜빡이를 켰는데,

1) 라이트가 켜진 순간 차가 멈춰버립니다.(불 켜고 딜레이 0.5초=모든 걸 정지 0.5초)
2) 당황하여 깜빡이를 꺼보지만 라이트가 꺼지기 전까진 깜빡이가 꺼지지 않습니다.(깜빡이 스위치를 껐지만 불 꺼지고 딜레이 0.5초 가 지나기 전까지 프로세서는 어떤 입력도 못받아들임)
3) 그리고 깜빡이가 꺼지면서 차가 다시 움직이기 시작합니다.

난감하죠? 100% 교통사고 각입니다.

 

2. delay의 대안 millis함수

그래서 이를 해결하기위해 여러 방법들을 강구하게되고, 그 중에 하나가 millis함수를 이용하는 겁니다.
(여담으로 이를 "병렬처리"라 하고(순차처리=직렬처리, 동시처리=병렬처리), 이를 구현하기 위해서 CPU시스템적인 부분 뿐만 아니라(여기는 진짜로 각 클록 주파수 사이사이에 명령어들을 배치해서 "병렬처리인 척"하는 부분이긴 합니다만..) 각 언어마다 많은 방법들을 만들어냅니다. 싱크로, 메서드 등이 그것들인데 그건 여기서는 제쳐두죠)

아두이노 프로세서는 프로그램이 작동된 후 자동으로 ms단위로 프로그램이 실행되는 시간을 저장하고 있습니다.
따라서 어떤 A라는 순간의 millis값과 B라는 순간의 millis값을 비교하면 시간이 얼마나 흘렀는지 알 수 있게 되죠.(B ms - A ms = 걸린 시간 ms)
[이 부분은 매우 중요한게, millis뿐만 아니라 어떤 프로그램 언어를 사용하든 시간 차이(time delta)는 매우 중요한 개념이 됩니다.]

거기에 millis함수는 delay함수와 다르게 프로세서를 일정기간 멈추는 명령이 아닙니다. 말그대로 시간만 체크하는 명령어죠.(시계 한번 흘깃 보는 명령어입니다.) 이는 엄청난 강점이 됩니다.

 

가령 "10분 있다 엄마가 와서 책상에 앉아있나 확인할거야"라는 명령이 있었다고 보면,

delay: 10분동안 아무것도 안하고 내내 책상에 앉아서 멍때리기
millis: 10분동안 틈틈이 시간보면서, 그 안에서 책도보고 컴퓨터도하다가 10분째 착석

결과는 같지만 10분 활용이 다르죠. millis는 엄마의 명령시간 안에서 이런저런 일들을 "같이(병렬)" 처리했으니까요

 

따라서 millis를 사용하게 되면 경과시간을 알아내어서 시간에 따른 지연 조작을 할 수 있으면서도 내부 명령은 아두이노 속도대로 처리가 되는 병렬처리가 가능해집니다.(프로세서 자체가 멈춰서 시간을 지연하는거나, 사용자가 시계로 체크해서 일정 시간 후를 체크하는 것의 차이?)

 

3. delay함수와 millis함수의 활용

아두이노 자체 적인 개발 외에도 "3D프린터개발산업기사"의 실기부분에도 이 내용이 활용됩니다.

시험 항목을 보죠.

5) HEATING BED 설정
라) 설정온도인 30'C에 도달하면 LED는 R->G->B 순으로 500ms 간격으로 점등 되도록하며, 모터는 시계방향으로 계속적으로 동작 되도록 합니다.

이 부분인데요, 문제를 잘 보시면 LED가 500ms라는 시간을 가지고 점등이 되는 "와중에" 모터는 계속 돌아가야합니다. 병렬로 작동이 되어야 한다는 것이죠. 그럼 여기서는 millis함수를 써야겠죠.

 

반대로 굳이 millis함수를 쓸 필요가 없는 항목도 있습니다.

6) EMERGENCY 설정
나) ~ 근접센서에 물체 또는 손을 이용하여 접촉할 경우 ~ 회전 중인 모터가 정지되고, 부저를 1초 간격으로 5회 울린 후 ~

[회전 중인 모터 정지 -> 부저"" 1초 간격으로 5회 작동 -> ~~]의 순차적인 처리이기때문에 여기서는 굳이 millis안쓰고 delay로 써도 상관이 없습니다.

 

4. 실제 코드 작성

그러면 실제로 응용은 어떻게 해야할까요?

다른 부분은 다 제쳐두고, HEATING BED 설정의 라)항목만 실행하는 프로그램을 작성해보죠(온도가 30도에 도달하여 조건들을 실행하는 부분만 작성했습니다.)

#define LED_R 2  
#define LED_G 3  
#define LED_B 4

unsigned long start_time = 0;

void setup() {  
  pinMode(LED_R, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_B, OUTPUT);
}

void loop() {  
  start_time = millis(); // 이벤트 시작시간을 저장  
  unsigned long time_delta = millis() - start_time; // 시간차이(time_delta) 설정(현재시간-이벤트시작시간)  
  while(time_delta < 1500*3){ // 시작시간 기준(time_delta가 0부터 증가할 것이므로) (1500ms * 3번)의 시간동안 작동  
    if(time_delta%1500 < 500){ // 시간차이(이벤트 시작부터 진행된 시간)를 1500으로 나눠서 나머지가 500보다 작으면 
      digitalWrite(LED_R, HIGH); // 빨간불 켜기  
      digitalWrite(LED_G, LOW);  
      digitalWrite(LED_B, LOW);  
    }  
    else if(time_delta%1500 < 1000){ // 근데 나머지가 500 이상이고(위의 if가 거짓이기 때문에 else if로 왔으므로) 1000보다 작으면  
      digitalWrite(LED_R, LOW); // 빨간불 끄기  
      digitalWrite(LED_G, HIGH); // 초록불 켜기  
      digitalWrite(LED_B, LOW);  
    }  
    else{ // 그 외의 경우(위에 조건들이 모두 거짓일 때 else로 오므로 나머지가 1000이상인 경우)  
      digitalWrite(LED_R, LOW);  
      digitalWrite(LED_G, LOW); // 초록불 끄기  
      digitalWrite(LED_B, HIGH); // 파란불 켜기  
    }  
    // 모터 작동 코드 작성: delay가 없으므로 매 순간마다 모터가 작동  
    time_delta = millis() - start_time; // 코드 단위를 실행한 후 time_delta 재설정(이벤트 시작부터 진행된 시간 갱신)
  }  
  // 모든 불 끄기  
  digitalWrite(LED_R, LOW);  
  digitalWrite(LED_G, LOW);  
  digitalWrite(LED_B, LOW);  
  delay(2000); // 마무리 확인용 delay(세 번이 제대로 작동됐는지)  
}

이와 같은 코드가 작성될 것입니다.

 

5. 여담

참고로 millis함수는 프로그램 시작 후 50여일 이후의 시간도 ms단위로 기록할정도로(물론 50일경 오버플로나서 다시 0으로 돌아간다지만..) 큰 메모리 용량을 필요로 하기 때문에 unsigned long(4바이트)형태의 자료형을 가집니다.

사실 컴퓨터로 코딩할때는 큰 고려사항이 아닙니다만, 아주 제한된 메모리양과 처리속도를 가진 마이크로프로세서에 코딩할때는 전체적인 메모리와 처리속도를 모두 고려해야하는, 어떻게보면 컴퓨터로 프로그래밍하는 것보다 더 복잡한 과정을 거치게 됩니다.(자료형을 무엇을 쓸지, 프로그램 최적화는 어떻게 해야할지, 변수를 전역으로 두고 쓸지 지역으로 두고 쓸지 등..) 아두이노 기본 프로젝트 같은경우에야 문제가 안되겠지만 프로젝트가 커지면 문제죠. 따라서 프로젝트가 크지 않으면 그냥 unsigned long그대로 써주시되, 어차피 실행시간이 길지 않을 거고 다른 작업들로 메모리가 부족한 상황이다 싶으시면 int(2바이트) 자료형으로 써주시면 됩니다.

몇 년전에 여드름으로 병원에 간적이 있다.

원래는 비보험 약이고 그걸 알고 병원에 갔는데, 의사선생님이 엄청 꼬치꼬치 캐물으시고, 진료 후에도 다시 부르셔서 '이걸 이렇게 하면 보험이 안되니 그냥 한가지 종류만 드세요, 그리고 보험되야하니 다른 약 한가지도 같이 처방했으니 그냥 필요할 때 드세요'하면서 처방해주셨다.

당시에는 그게 굉장히 귀찮았었는데, 어찌저찌 병원비는 보험이 되어서 평상시 다니는 병원비대로만 냈고 약값만 자비부담(다른 수가는 보험처리되고 약값자체만 내가 내는 것)으로 냈다.

 

그리고 몇년 뒤 오늘, 이번에는 다른 병원에 갔는데 '몇정당 처방전 값 얼마'하면서 처방전 팔이를 하고 있더라.

보험구분을 '기타'로 처방전을 내버리니 처방전 값이야 의사 맘대로고, 약국에서 약 조제할때도 전액 비보험(약값을 포함한 모든 수가를 내가 다 내는 것)으로 몇 년 전에 처방받고 약 샀을 때에 비해 병원비+약가 해서 3배 이상 비싸게 주고 샀다.

 

지난뒤에야 봄인 줄 알았다고.. 몇 년 전에는 그걸 모르고 '아 귀찮은데 그냥 비보험으로 내주시지'했는데, 이번에 한번 크게 덤태기 써보니까 그 선생님이 환자의 입장에서 생각해주시는 정말 갓갓 트루 참 의사선생님이시라는 걸 알았다.(물론 역순으로 갔으면 깨닫지 못했을 수도 있다. 정말 의사선생님의 마음가짐 하나로 같은 약 처방 받고 약 사는데 총액이 3배이상 널뛰기를 한다.)

 

그리고 반면에 처방전가지고 '장사'하시는 사짜 선생님들도 계시다는 걸 알게되었다.

 

지금까지 정말 좋은 의사선생님들만 만나서 그랬는지는 몰라도 한번도 이런 일이 없다가, 정말 병원비 내는데 갑자기 몇만원 단위 나와서 "이거 약가 아니에요? 병원비가요?"하면서 정말 식겁했다.(진료중에서 말하긴 했는데 난 당연히 약가 얘기 하는 줄 알았다. 세상에 처방전이 '한통에 얼마구요, 두통하면 두배입니다.' 이런게 어딨나!?)

그리고 왜 그렇게 해외 밀반입 의약품들이 판치는 지도 알았다. 오늘 당한식으로 덤태기쓰면 해외 밀반입 의약품 몇푼 더 주고 사는거랑 크게 다를 바가 없는 것 같더라.(질이야 둘째치고서라도)

 

정말 없어지지만 않았어도 예전 병원에 찾아가서 처방받으며 감사하다고 골백번은 더 인사할텐데, 아침부터 참 씁쓸하다. 그 병원 다시는 안간다.(물론 나한테 쪽쪽 빨아서 오늘 좀 기분은 좋으시겠지)

 

* 처방전 후려치기 하는 병원 있으면 그병원 계속 가지 마시고 다른 병원으로 가보세요. 어차피 우리나라에 병원은 많고, 사짜 의사가 많은 만큼 트루킹갓제너럴굿닥터 의사선생님도 많으시니까요.

'Diary > etc' 카테고리의 다른 글

금속공예  (0) 2020.02.11
목공  (0) 2020.02.11

Frances Ha[프란시스 하]

 

스포주의!

 

영화의 요지는 간략하다

"이상은 큰데 현실은 시궁창
그러나 그 현실을 받아들여가는 과정"

사실 99% 우리 모두의 인생이 이와같지 않을까 생각한다.

금수저는 다를 것 같다는 것또한 영화에서 '금수저도 마찬가지'라고 보여준다.
레브와 벤지에대한 소피의 대사에서


대략적인 작품의 플롯은 다음과 같다.
큰 이상을 품은 프란시스
꿈에서 뿐만 아니라 인관관계에서도 '이상적'을 꿈꾼다.

그리고 소피와 함께 하는 생활에서 이상적으로 흘러간다고 싶었는데..
나는 소피와 같다고 생각하고 내 생각과 소피의 생각이 같을 거라고 이상적으로 생각하고 남친과 헤어지기까지 했건만..
소피는 다른 생각이었고, 소피의 독립으로 둘의 생활이 끝나게 된다.
그리고 이때부터 프란시스의 '이상'은 흔들리게 된다.

일단 인간관계에서의 이상이 깨지고[소피의 독립]
직장에서의 이상이 깨지고[견습생이며 무대를 원하지만 뽑히지 않는]
다른 사람들과의 교류를 꿈꾸지만 겉돈다.
파티장면에서는 보는 내가 오그라들정도로 프란시스가 말할때마다 분위기가 항상 싸해진다.
프란시스가 겉돈다는 걸 표현하기 위한 연출이 훌륭하다.
이와 관련해서 파티 뒤에 프란시스가 나디아에게 독백하는 부분이 결국 영화 최후반부에 연출된다.
더불어 이 사람들의 관계에 끼고 싶어 프란시스는 무리해서 파리로 가지만, 결국 혼자만의 기대에 좌절당하고 미국으로 다시 돌아오며, 자신의 이상에 한번 더 깨진다.
그와중에 다른 친구들은 굉장히 잘 지내는 것 같다. 특히 내 일상을 흔들어제낀 소피가 최고로 잘 지내는 것 같다. 속이 쓰리다.

현실적인 대안들이 찾아오지만, 자꾸 '이상'을 앞세워 눈을 돌린다.

결국 바닥 끝까지 몰린 프란시스.

이런저런 일을 겪으며, 특히 잘지내는 친구들이 사실 그렇게 잘 지내지 않는다는, 다른 사람들도 '이상'에 배신당한다는 사실을 깨닫다가 결국 소피마저도 본심은 '이상'을 꿈꾸며 '현실'을 도피하고 싶어하지만 결국 제정신으로 돌아와서는 '현실'을 살아간다는 것을 보고 내면의 무언가가 변화한다.

그 이후로는 주어진 현실을 받아들이며 살아간다.

그러다 결국, 주어진 현실을 살아가다 보니 돈도, 연인도, 주위의 인정도 얻은 프란시스
거기에 마침내 성공적인 무대를 치르고 난 뒤의 무대위에서, 과거 나디아에게 말했던 내용을 소피와의 눈맞춤으로 이루어내고 이로써 프란시스는 자신이 원하는 인간관계까지 얻고, 결국 자신에게 주어진 현실을 모두 받아들이는 단계로 성장한다.

그리고 마지막 장면에서 자신의 풀 네임인 FRANCES HALLADAY를 우체통에 넣을 때 길이가 맞지 않자 자르거나, 다시 쓰지 않고, 내가 나 자신으로 보이지 않을 수도 있지만 융통성 있게 그냥 접어서 우체통에 끼워넣는 모습에 결국 프란시스는 '이상적이지 않더라도 현실을 받아들이며 살더라도 나의 본질은 나다'라는 것을 보여주며 영화는 끝이난다.
그리고 이렇게 접어서 길이가 맞는 이름이 FRANCES HA이고, 결국 이것이 영화의 큰 주제이며 제목이 된다.

결국 영화 감독이 말하고 싶었던 바는 내 이름이 일부 접힌다고, 다른 사람이 이상하게 본다고 해도 자신은 자신이고, 그 본질이 틀어져도 상관없다는 것이다. 영화에서도 인생이란 말이 자주 나오지만, 결국 뜻대로 안되는게 인생이고 내 맘대로 살아지지도 않지만 오히려 그렇게 현실에 맞춰서 살아나가는 것. 이름이 다르게 보이면 보이는대로, 현실이 이렇게 부딪치건 저렇게 부딪치건 환경에 무너지지 않고 살아나가는 것. 항상 어떠한 상황에서도 꿋꿋한 프란시스를 보며 많은 생각이 들게 하는 영화였다.

[Windows] Windows10 OS 설치 USB 만들기!

 

윈도우를 PC에 설치하기로 마음먹으셨다면 우선 윈도우10 OS 설치 USB를 만들어 주셔야합니다.

 

이는 거의 모든 OS설치시에 필요한 것입니다.(가끔 Mac에서 부트캠프로 윈도우를 설치하는 경우 따로 USB를 만들지 않고도 바로 설치가 가능한 경우같은 예외가 있기는 합니다.)

 

여기서 '설치 USB'라는 것은 '부팅가능한(Bootable)' USB를 만든다는 뜻으로, 단순히 파일을 옮기거나 복사붙여넣기 하는 것이 아닙니다.

 

블로그의 정체성에 따라 순서대로 나열해 보도록 하겠습니다.

 

1) ISO파일을 다운로드 받는다!

요새는 윈도우10 ISO파일을 다운로드 받기가 힘들어졌습니다. 링크를 꼭꼭 숨겨놨거든요.

거기에 편승해서 이상한 링크에서 받게하는 이상한 사람들도 많으니, 꼭 마이크로소프트 공식 홈페이지에서 받도록 합시다.

마이크로소프트에서 공식으로 받을 수 있는 방법은 이전 포스팅에 정리해 놓았으니 참고하시면 됩니다.

 

2) 설치가능한 USB를 만들어주기!

2-1) USB 선택!

설치가능한 USB를 만들어주게되면, 해당 USB내에 저장된 모든 것이 싹 포맷되며, OS의 ISO만 설치가능한 형태로 써지게 된다. 그러기에 해당 ISO파일 크기보다 크지만, 내용은 없는(혹은 백업한 뒤의) USB를 고르는 것이 중요합니다.

 

2-2) Rufus설치!

설치가능한 USB(Bootable USB)를 만들 수 있는 프로그램은 많지만, 공식적으로 ubuntu에서 제시하는 프로그램은 rufus이다.

https://rufus.ie/에 접속하면 한글로 친절하게 모든 설명이 나와있다.

여기서는 rufus 설치파일을 다운로드 받아서 설치해도 상관없고, Portable(한글 번역 '이동식') 버전을 받아도 상관없다.

둘의 차이라면 설치파일은 컴퓨터에 설치 후에 실행하는 것이고 Portable은 그냥 바로 실행이 된다는 점?

기본 설정법도 홈페이지에 나온 그대로 놓고 작업하면된다.

처음에 장치를 선택해주고 부트 선택에서 우리가 다운로드 받은 Win10_21H1_Korean_x64.iso파일만 잘 선택해주고 아래 시작만 눌러주면 끝.

<출처: https://rufus.ie/>에서 퍼온 사진이라 ubuntu지만, 부트선택 파일만 윈도우 iso로 잘 선택하면 장땡!

이렇게 해서 상태에 완료가 뜨면 부팅 USB 만들기는 성공했습니다. 이제 직접 OS를 깔 차례!

0] 포스팅의 변

윈도우10 발매 초창기에는 홈페이지에서 쉽게 iso파일을 받을 수 있게 해놨는데, 요새는 어느정도 윈도우 10이 확산되었다 싶었는지 '구매'에 초점을 맞춰서 그런지 쉽게 iso파일을 받을 수 없게 해놓았다.(아직까지도 복잡하게 어떻게 어떻게 하면 받을 수 있기는 하다. 정말 극악이라 그렇지..)(구매 안해도 윈10은 잘 돌아가는데, 대신 화면 오른쪽 아래에 반투명하게 'Windows 정품 인증'이 뜬다.)

근데 이걸 개발할때나 패킷딸때만 썼던 크롬 개발자도구로 다운 받을 수 있는 방법이 있어 공유하고자 한다.

 

1] 크롬으로 마이크로소프트 사이트에서 공식 ISO파일 받기

0) 크롬브라우저 기준!

1) 먼저 과거에 바로 iso를 받을 수 있었던 마이크로소프트 윈도우10 다운로드 링크에 접속

2) 그러나 아무리 화면을 살펴봐도 iso를 바로 받을 수 있는 버튼은 없고, '업데이트'와 '도구다운로드' 버튼만 보일 것이다.

3) 여기서 크롬의 개발자도구를 켠다. 개발자도구를 켜는 단축키는 F12이다.

개발자 도구가 켜진 화면

4) 여기서 아래 이미지에 표시된 대로, 1번 2번 3번을 각각 클릭한 뒤 F5(새로고침)를 누른다.

꼭 페이지를 '새로고침' 해야 한다.

5) 그러면 이렇게 iso파일을 받을 수 있는 페이지가 나오게 되고, 여기서 [버전 선택]을 눌러 [윈도우10]을 선택한 뒤 확인을 누르고, '유효성 검사'가 지나간 다음, [언어 선택]에서 [한국어]를 선택하면 다시 '유효성 검사'가 나온 뒤 32bit와 64bit 선택창이 나오게 된다.

 

 

6) 여기서 32bit나 64bit 다운로드 버튼을 클릭하면 바로 다운로드 창이 열리며 다운로드 할 수 있게 된다.

7) 이 파일을 가지고 rufus와 같은 프로그램을 이용하여 usb에 구워주면 부팅디스크 혹은 os 설치 usb(Bootable USB)가 완성된다.(이전 Ubuntu Bootable USB만드는 포스팅 참조)(윈도우 버전으로 새로 포스팅함 포스트는 여기)

원넓이의 부정적분 구하기 - 2) 부정적분으로 구해보기

intetral root(1-x^2) dx

 

굉장히 오랜만에 다시 써보는 포스팅이네요.

저번 시간에 원 내부의 사다리꼴과 같은 도형의 넓이를 구하는 방법을 가장 기본적인 공식(부채꼴 공식+삼각형 공식)을 가지고 구해보았습니다.

원 내부의 하얀부분은 "활꼴의 절반"이라고 쉽게 설명이 가능한데, 그 반대편에 대한 용어는 따로 존재하지 않네요..

이번 시간에는 이것을 부정적분으로 x값을 가지고 바로 구하는 방법을 알아볼까 합니다.

저번에 각도 $\theta$를 부채꼴 부분으로 잡았는데, 이번에도 한번 이렇게 잡아서 수식을 전개해보려고 합니다.

부채꼴 부분이 $\theta$입니다.

일단 이렇게 특수한 상황에 가기 전에, 일반적으로 원의 넓이를 적분으로 어떻게 구하는지 다시 한번 살펴보도록하겠습니다.

 

자, 일단 원의 방정식은 $x^{2}+y^{2}=r^{2}$입니다. 저희는 $r$이 1인 단위원을 사용하기 때문에 식은 더욱 간단하게 $x^{2}+y^{2}=1$이 되겠네요.

이를 좀 더 보기 편하게 y에 대한 값으로 나타내면(x의 값에 따라 y값을 결정하는 방식) $y=\pm \sqrt{1-x^{2}}$으로 정리할 수 있습니다.

이 때 부호에 따라 양의 부호는 y축을 기준으로 0보다 위에 그려지는 반원을, 음의 부호는 아래쪽에 그려지는 반원을 의미합니다.

현재 저희는 위에 그려지는 반원 중에서도 1사분면 위의 사반원에 대해 구하려고 하고 있으므로, 이에 대한 적분 수식은 $\int \sqrt{1-x^2} \, dx$라고 볼 수 있습니다.

 

여기서 루트가 들어간 적분은 그냥 풀기에 너무 힘들기 때문에 x를 치환시켜 줄 것입니다.

예전에 고등학교 때 적분을 공부하면서 도대체 왜 치환하는지 의문을 가졌었는데, 실상은 치환해서 더 쉬운 형태로 만들어서 적분을 쉽게 만들기 위해서 하는 작업입니다 치환적분은!

 

루트를 없애줄 수 있으면서 적분 형태를 간단하게 해줄 수 있는 것이 무엇이 있나 한번 살펴보다보니, 언뜻 지나가는 공식이 있습니다.

$ sin^{2} \theta + cos^{2} \theta = 1 $이라는 공식이지요.(이 공식은 그냥 암기할 게 아니라, 너무 당연한 것을 표현한 것입니다. 아까 단위원의 방정식은 $x^{2}+y^{2}=1$이라고 했습니다. 이것은 원 위에서 무조건 성립하는 값입니다. 여기서 매개변수 표현법을 사용하면 $y=sin \theta, x=cos \theta$라고 했습니다. 즉, 단위원의 방정식에 매개변수 표현법을 사용하여 표현 방법만 x, y 변수가 아닌 $\theta$변수 로 바꿔준 것이 됩니다.)

이항해보면

$cos^{2} \theta =1-sin^{2} \theta$

제곱을 제거하면

$cos \theta = \sqrt{1-sin^{2} \theta}$

어디선가 많이 본 보양이지요?

즉, $x$를 $sin \theta$로 치환하면 자연스럽게 루트가 들어간 식이 정리되면서 적분이 가능한 형태로 바뀔 것 같습니다!

일단, $x$를 치환하면 $dx$도 같이 치환해 줘야 하므로 미분을 때려 봅시다.

$x=sin \theta$

$dx=cos \theta d\theta$

그럼 이렇게 준비된 x를 가지고 치환적분을 해보겠습니다.

$ \int \sqrt{1-x^{2}} dx $

$ \int \sqrt{1-sin^{2} \theta} cos \theta d\theta]_{x=sin \theta, dx=cos \theta d\theta} $

$ \int cos \theta \cdot cos \theta d\theta $

$ \int cos^{2} \theta \, d\theta $

여기서 다시 난관에 봉착합니다. $ cos^{2} \theta $를 적분하려면 많은 애로사항이 꽃핍니다.

일단 제곱을 떨어내야하는데, 어떻게 떨어내야할지 생각해봤더니... 배각공식을 역이용해서 떨어보겠습니다.

$ cos 2\theta \, = \, cos^{2} \theta - sin^{2} \theta $

참고로 배각공식은 삼각함수의 덧셈공식에서 온겁니다

$ cos (\alpha+\beta) = cos \alpha \cdot cos \beta - sin \alpha \cdot sin \beta $

자, 일단 $ cos^{2} \theta $를 $ cos 2\theta $로 바꿀 수 있는 실마리를 잡았는데, 뒤에 $ sin^{2} \theta $는 어떻게 없앨 수 있을까요?

여기서 삼각함수 무적의 공식 $ sin^{2} \theta + cos^{2} \theta = 1 $이 등장합니다.

$ sin^{2} \theta = 1 - cos^{2} \theta $로 만들고, 원 식에 대입하면

$ cos 2\theta = cos^{2} \theta - (1 - cos^{2} \theta) $

$ cos 2\theta = 2cos^{2} \theta - 1 $

우리는 $ cos^{2} \theta $를 바꿔야 하니 $ cos^{2} \theta $로 정리해보죠

$ cos^{2} \theta = \frac{cos 2\theta +1}{2} $

그럼 바로 대입하면

$ \int cos^{2} \theta \, d\theta $

$ \int \frac{cos 2\theta +1}{2} \, d\theta $

$ \frac{1}{2} (\int (cos 2\theta + 1) \, d\theta) $

$ \frac{1}{2} (\frac{1}{2}sin 2\theta + \theta) $ +C 생략

자, 드디어 적분을 완료해서 적분기호가 사라졌습니다.

그러나 $ sin 2\theta $는 뭔가 보기에 깔끔하지 않죠.. 똑같이 삼각함수 배각공식을 이용하여 단일 $ \theta $항으로 만들어줍시다.

$ sin 2\theta = 2 \cdot sin \theta \cdot cos\theta $

물론 이 배각공식도 덧셈공식에서 왔습니다.

$ sin (\alpha+\beta) = sin \alpha \cdot cos \beta + cos \alpha \cdot sin \beta $

따라서 원 식에 배각공식을 이용하여 풀어주면

$ \frac{1}{2} (\frac{1}{2}(2 \cdot sin \theta \cdot cos\theta) + \theta) $

$ \frac{1}{2} (sin \theta \cdot cos\theta + \theta) $

$ \frac{1}{2}sin \theta \cdot cos\theta + \frac{1}{2}\theta $

여기서

$ x = sin \theta $

$ \theta = arcsin x $

$ y = \sqrt{1-x^{2}} = cos \theta $

이므로, $ \theta $에 대한 식이 아닌, 원 x에 대한 식으로 바꿔주면

$ \frac{1}{2} \cdot x \cdot \sqrt{1-x^{2}} + \frac{1}{2} \cdot arcsin \, x $

이 나오고, 이는 이 전 포스팅의 결과 식과 완전히 같은 모양이 됩니다.

 

원넓이의 부정적분 구하기원넓이의 부정적분 구하기 - 1) 일반공식으로 구해보기

 

원넓이를 처음 배우는 것은 초등학교 때, $\pi$를 3.14 근사값으로 배우면서 공식 암기와 함께 시작한다.

이후 중학교 과정에서 수의 확장과 함께 무리수로 $\pi$를 배워 무리수가 들어간 공식으로 배우고, 고등학교에 이르러서는 적분을 통해 원의 넓이를 새삼스레 다시 구해본다.

결국 우리의 수학 교과과정은 원에 대해서 배우는 것이다 라고 말해도 과언이 아닐 정도이다.

 

여기서 고등학교에서 정적분으로 원의 넓이를 구할 때 기계적으로 치환, 공식대입, 정적분을 통해서 '아 그냥 그렇게 되는구나'라고 알고 넘어가는 사람들이 대다수 일 터.

이번에 뭔가 궁금증이 생겨서 다시 풀어보니, 예전엔 그냥 단순히 치환하고 공식을 대입해서 풀었던 여기에는 참 많은 이유들이 있다는 것을 알게되었다.

 

그리하여 부정적분을 통해서 왜 이렇게 치환하고 그것으로 어떻게 넓이를 구하는지 알아보고자 한다.

요런식으로 x가 0부터 0.5일때 원의 넓이를 구하는 방법을 알아보려고 한다.

 

물론 원은 사분원 넓이의 네배이니까 적분으로 원넓이 공식을 유도할 때 처럼, 반지름이 1인 단위원을 기준으로 하여 사분원의 넓이를 구하는 식으로 진행한다.

 

1] 일반식으로 원 넓이 구하기

부정적분으로 넘어가기 전에, 우리가 아는 일반 공식으로 $x$축에 대한 원의 넓이를 구할 수 있다.

딱 위의 그림에서와 같이 한번에 구하려면 왠지 적분을 써야 할 것 같지만,

호와 삼각형으로 나눠서 구한다면?

위 그림과 같이 부채꼴과 삼각형으로 나눠서 구한다면 쉽게 원의 부분 넓이를 구할 수 있다.

부채꼴의 넓이는 호도법으로 전체 각도($2\pi$(360도))에 대한 원 넓이 $\pi r^2$을 전체 각도에 대한 부분각도의 비 만큼 곱해주면( $\frac{\theta}{2\pi}$ ) 부채꼴의 넓이($\frac{\theta}{2\pi}*\pi r^2 = \frac{1}{2} r^2\theta$)가 나온다.

물론 여기서는 r(반지름)을 1로 놨으니 r 변수는 사라질 것이다.

부채꼴의 각도를 기준으로 놨으니, 이제 삼각형도 계산할 수 있다. 삼각형의 넓이는 가로*세로/2이다.

xy좌표축의 x와 y의 값을 $\theta$로 표현하면 단위원의 매개변수 표현법에 의거 $y=sin\theta, x=cos\theta$로 표현할 수 있다. 다만 여기서는 부채꼴의 각도를 기준으로 표현을 했으니 우리가 쓰는 좌표축의 $y$값이 $cos\theta$가 될것이며 $x$값은 $sin\theta$가 될 것이다. 뭔가 두 길이가 달라진 것 같지만, 사실상 직사각형에서의 삼각형이니 두개는 대칭이다.(엄밀히 매개변수 표현법으로 $y=sin\theta, x=cos\theta$이니, 위의 예에서 $y=sin(90-\theta), x=cos(90-\theta)$가 되고 각각, $y=sin(90-\theta)=cos\theta$, $x=cos(90-\theta)=sin\theta$의 관계가 성립한다.)

$ \theta $를 부채꼴의 각도로 놓았다.

수식으로 표현하면 $\frac{1}{2}sin\theta cos\theta$가 삼각형의 넓이가 될 것이다.

 

그리하여 두 식을 더한 $\frac{1}{2} \theta + \frac{1}{2}sin\theta cos\theta$ 값이 저 사다리꼴과 같은 도형의 부분 넓이가 된다는 것을 알았다.

 

여기까지 우리는 각도를 알면 그 각도에 해당하는 원의 사다리꼴과 같은 도형의 부분넓이를 구할 수 있게 되었으나, 반드시 각도를 알아야 한다는 단점이 있다.

 

여기서 x축 값 만으로 이 넓이를 구하려면, arcsin값만 알면 된다. 위의 그래프에서 x값과 같은 값을 나타내는 것은 $\theta$ 각도를 가지고 구한 $sin$값과 같다는 것을 알 수 있다. 그렇다면, 반대로 x값을 sin함수의 역함수인 arcsin에 넣어주면, 그 값에 해당하는 각도가 구해질 것이고, 그 각도값으로 부채꼴의 넓이 공식에 적용하면 부채꼴의 넓이를 알 수 있으므로 arcsin만 써주면 해결이다.

그렇다면 삼각형 부분은 어떻게 해결할 것인가?

사실 이 삼각형 부분은 x축 값이 밑변, 원의 방정식에서 x값을 대입한 값이 y값이다. 즉, y값은 $y = \sqrt{1-x^2}$이다.

이렇게 되면, 우리는 일반식으로 원에서의 사다리꼴과 같은 형태의 넓이를 x값에 따라 얻을 수 있는 일반식을 만들 수 있다.

 

$\frac{1}{2} arcsin\, x + \frac{1}{2}\cdot x \cdot \sqrt{1-x^2}$

 

다음 포스팅에서는 이를 부정적분으로 구해보는 시간을 가져볼 예정이다.

 

 

캄파리(Campari)

 

이마트에서 이 작은병(200ml) 하나에 만 천원이나하는 비싼 술

1860년 이탈리아 사람인 가스빠레 깜빠리 라는 사람이 약용 리큐르인 비터스를 개량하여 만든 술

용담 뿌리가 들어가서 쓴맛이 난다.

 

활용가능 칵테일은 캄파리 소다, 캄파리 오렌지, 캄파리 비어

'Beverages > Cocktail&Liquor' 카테고리의 다른 글

[리큐르] 힙노틱(HPNOTIQ)  (0) 2022.01.24

안녕하세요.

 

회사에서 업무 PC를 우분투로 사용하면서 화면 캡쳐할 일이 종종 있습니다.

 

제가 사용하는 우분투 16.04에는 기본적으로 총 6가지 방법의 캡쳐 기능을 제공합니다.

 

'전체 화면 캡쳐', '활성화 창 캡쳐', '선택 영역 (부분) 캡쳐' 가 가능하고,

 

각각의 캡쳐에 대해 '그림 파일로 저장'과 '클립 보드로 복사' 기능을 각각 제공합니다.

 

'전체 화면'은 현재 모니터에 보이는 모든 화면을 (여러대의 모니터 사용시 모든 모니터 화면),

 

'활성화 창'은 현재 선택되있는 창을,

 

'선택 영역 캡쳐' 시에는 화면을 선택할 수 있도록 마우스 포인트가 십자 형태로 바뀝니다.

 

 

그리고 '그림 파일로 저장'은 말 그대로 그림 파일로 저장할 수 있는 창이 떠서 그림파일로 저장할 수 있게 해주고,

 

'클립 보드로 복사'는 추가로 창이 뜨지는 않고, 그림이 클립보드로 복사되서 (그림을 Ctrl+c 한 효과), 붙여녛기로 그림판이나 문서 편집 프로그램에 그림을 삽입할 수 있게 해줍니다.

 

 

각각의 경우 기본 단축키는 다음과 같습니다.

 

* 'Print' 키는 'Print Screen' 키를 말합니다.

 

 

 전체 화면 캡쳐

 활성화 창 캡쳐

 선택 영역 캡쳐

 그림 파일로 저장

Print 

Alt + Print 

 Shift + Print

 클립 보드로 복사

 Ctrl + Print

Ctrl + Alt + Print 

Ctrl + Shift + Print 

 

 

위의 단축키들은 변경이 가능합니다.

 

'환경설정 (전체설정) -> 키보드 -> 바로가기 -> 스크린샷' 메뉴에 보면 위의 6 종류의 단축키를 설정이 가능합니다.

 

저는 윈도우에서 원노트를 통한 부분 캡쳐를 '윈도우 + S' 를 사용하기 때문에 우분투도 이와 유사하게 'Alt + S' 로 맞춰주었습니다.



출처: https://harryp.tistory.com/595 [Park's Life]

+ Recent posts