아두이노 프로 마이크로가 USB장치 만느는데 아주 좋다는 이야길 듣고, 아주 예전에 있었던 아날로그 조이패드를 개조했다. 그냥 연결하는데는 방향 컨트롤이 문제가 있어서 방향키 부분을 잘라내고, 그곳에 KY-023 2축 조이스틱 모듈을 붙이고 스위치 1개를 더 얻었다. 사실 다른 옵션이 없어서 그냥 선택한 부품.

 

 아두이노의 조이스틱 라이브러리를 사용해서 코드를 구성했다.

 

 노이즈 같은 중간값에 흔들림이 조금 있어서 흔들림을 무시하도록 조정하기도 했다(NOISE_X, NOISE_Y).

 XCV와 YCV는 중심값으로 127근처로 나온다. USB포트의 약간의 전압드랍으로 125가 나온 듯.

 3.3V로 나중엔 변경해야겠다.

 A0와 A1이 각각 X,Y축이고 버튼들은 0V에 눌러진 상태가 된다.

 

 버튼에 대한 핀번호를 따로 할당할 수 있게 코드를 수정했다.

#include <Joystick.h>
#include <wiring_private.h>


#define MAX_BUTTON 7
//#define DEBUG_XY
#define FASTADC

#define XCV 125
#define YCV 125
#define NOISE_X 4
#define NOISE_Y 4

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK /* JOYSTICK_TYPE_GAMEPAD */,
                   MAX_BUTTON, 0,
                   true, true, false,  // x, y, z axis
                   false, false, false,
                   false, false,
                   false, false, false);

int jbutton[MAX_BUTTON]={5,6,7,8,9,14,16};
int xbv, ybv;
unsigned long sp,ep;

void setup() {
  for (int index = 0; index < MAX_BUTTON; index++) {
    pinMode(jbutton[index], INPUT_PULLUP);    
  }

#ifdef FASTADC
 // set prescale to 16
 sbi(ADCSRA,ADPS2);
 cbi(ADCSRA,ADPS1);
 cbi(ADCSRA,ADPS0);
#endif

  xbv=analogRead(A0) >> 2;  // 127
  ybv=analogRead(A1) >> 2;  // 127
  
  Joystick.begin(); 
  Joystick.setXAxisRange(-127,127);
  Joystick.setYAxisRange(-127,127);
  #ifdef DEBUG_XY
  sp=millis();
  #endif
}

int lastButtonState[MAX_BUTTON] = {0,0,0,0,0,0,0};
int xv, yv;

void loop() {
  xv=(analogRead(A0)>>2);
  xv+=(analogRead(A0)>>2);
  xv>>=1;
  xv-=XCV;
  if(xv<-127) xv=-127;
    else if(xv>127) xv=127;
  if(xv<NOISE_X && xv > -NOISE_X) xv=0;
  
  yv=(analogRead(A1)>>2);
  yv+=(analogRead(A1)>>2);
  yv>>=1;
  yv-=YCV;
  if(yv<-127) yv=-127;
    else if(yv>127) yv=127;
  if(yv<NOISE_Y && yv > -NOISE_Y) yv=0;

  #ifdef DEBUG_XY
  ep=millis();
  if(ep-sp>100) {
    Serial.println(xv);
    Serial.println(yv);
    Serial.println(xbv);
    Serial.println(ybv);
    Serial.println("===");
    sp=ep;
  }
  #endif
    
  Joystick.setXAxis(xv);
  Joystick.setYAxis(yv);

  // Read pin values
  for (int index = 0; index < MAX_BUTTON; index++)
  {
    int currentButtonState = !digitalRead(jbutton[index]);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
  }
}

 

Posted by 파르셀수스

댓글을 달아 주세요

 새로운 라이젠 메모리 계산기가 나오면서 메모리 기판의 패턴에 대한 내용이 있길래 살짝 가져왔다.

 

 A0는 등거리(같은 거리) 패턴으로 아주 일반적인 메모리 기판이고, A1은 ECC 메모리를 위한 패턴. A3는 메모리 모듈 4개를 묶는 패턴이다. 이 패턴에 따라 메모리 오버클럭의 파라미터가 달라질 수 있나보다.

 

  대부분의 경우엔 A0 등거리 패턴이 기준이 된다고 한다.

 

 

Posted by 파르셀수스

댓글을 달아 주세요

 많은 안정성과 관련된 버그들을 잡은 kdenlive의 20.04가 나왔다.

 좋은 기능성에 비해 렌더링 부분은 하드웨어 가속이 빠진 ffmpeg(3월 버전)를 사용하는 것 같다.

 그래서 CPU만 렌더링이 되는데, 낮은 스펙의 하드웨어로는 조금 더 느린 렌더링 속도를 가진다.

 이 문제를 해결하기 위해서 ffmpeg를 교체해버리는 작업을 시도했다.

 

 먼저 ffmpeg 윈도우즈 빌드를 다운로드한다. 리눅스라면 다시 빌드하는 어려움도 있을 수 있겠다.

 윈도우즈 빌드는 최대한 모든 옵션을 다 사용해서 컴파일 한 것 같은데 하드웨어 가속도 제대로 지원하는 것 같다.

 

 일단 Nightly 빌드인 날짜가 찍혀있는 것을 선택하고, 윈도우즈64비트를 선택한다. 그리고 마지막으로 shared linking 버전을 선택하고 Download build 버튼을 누른다.

 

 다운로드 받은 파일을 kdenlive를 설치한 bin 폴더에 덮어씌우기를 한다.

 

 이런 작업이 끝나면 렌더링 메뉴에서 몇몇 설정은 사용할 수 없다고 나오는데 이건 버그인 것 같다.

 설정 리스트에서 북마크 기능이나 새로운 설정을 생성하거나 하면 사용할 수 없다던 설정들이 풀린다.

 

 조금 더 작업이 필요한데 새로운 설정을 만들어야 한다. 'MP4-H265 (HEVC)'를 자주사용하는 메뉴 설정(별표)등으로 활성화 시킨 다음에 추가하기 버튼을 누른다. 그러면 대부분 내용들이 그대로 복사되는데, 그 중에 프로필 이름은 비어 있다.

 원하는 명칭으로 프로필 이름을 바꾸고, 매개 변수에서 vcodec의 항목을 바꾼다.

 AMD의 하드웨어 인코더는 hevc_amf라고 하면 되고, NVidia의 하드웨어 인코더는 hevc_nvenc라고 해주면 된다.

 

 그러면 다음부터 계속 같은 프로필을 사용해서 렌더링을 할 수 있다.

 소프트웨어 렌더링보다는 더 빠른 렌더링 속도를 확인할 수 있을 것이다.

 

 만약 사용을 확인하고 싶다면, 작업관리자의 성능 탭에서 비디오를 선택하면 인코더의 사용율을 확인할 수 있다.

 

 누군가 kdenlive로 하드웨어 렌더링을 하는 사용자를 위해서.

Posted by 파르셀수스

댓글을 달아 주세요