2020년 11월 7일 토요일

간단한 카티아(Catia) 사용 방법

 이 글은 간단한 카티아(Catia) 사용 방법을 정리한 것이다.



2020년 11월 5일 목요일

아두이노 기반 FS-IA10B RF 수신기 채널 신호 처리 및 PWM 출력 방법

이 글은 아두이노 기반 FS-IA10B RF 수신기 채널 신호 PWM(Pulse Width Modulation) 출력 방법을 간단히 정리한 것이다.

수신기에서 들어오는 PWM신호를 오실로스코프로 확인하면 다음과 같다. 

이 PWM 진폭변조 신호는 진폭에 따라 수신기와 연결된 서보모터나 ESC(Electronic Speed Controller)와 연결된 모터를 제어하는 진폭 데이터를 포함하고 있다. 수신기의 각 채널은 진폭 데이터를 송신기에서 전달받아 모터에 전달함으로서 모터의 속도나 회전각도를 제어할 수 있다. 

문제는 각종 센서나 ROS(ROBOT OPERATING SYSTEM)에서 처리한 정보에 근거해 PWM을 강제로 수정, 로봇 등을 제어해야할 때이다. 이 경우, 수신기와 아두이노 같은 임베디드 보드 GPIO를 연결해 PWM데이터를 얻어, 이를 수정한 후 PWM데이터로 출력해야 한다. 

수신기 제작 업체에서 제공하는 IBUS 등 라이브러리가 있으나, 여기서는 가장 코딩하기 쉬운 방법을 이용해 처리한다. 

다음과 같이 코딩하고, 각 채널을 수신과 아두이노의 해당 핀에 연결하여 테스트해본다. 
// title: MSR_RF2
// developed by: KTW
// date: 2020.11.5
#include <Servo.h>

#define CH1 2
#define CH2 3
#define CH3 4
#define CH4 5
#define CH5 6

Servo ESC1;     // create servo object to control the ESC
Servo ESC2;
Servo ESC3;
Servo ESC4;

// Read the number of a given channel and convert to the range provided.
// If the channel is off, return the default value
int readChannel(int channelInput, int minLimit, int maxLimit, int defaultValue){
  int ch = pulseIn(channelInput, HIGH, 30000);
  if (ch < 100) return defaultValue;
  return map(ch, 1000, 2000, minLimit, maxLimit);
}

// Red the channel and return a boolean value
bool redSwitch(byte channelInput, bool defaultValue){
  int intDefaultValue = (defaultValue)? 100: 0;
  int ch = readChannel(channelInput, 0, 100, intDefaultValue);
  return (ch > 50);
}

void setup(){
  Serial.begin(115200);
  pinMode(CH1, INPUT);
  pinMode(CH2, INPUT);
  pinMode(CH3, INPUT);
  pinMode(CH4, INPUT);
  pinMode(CH5, INPUT);

  ESC1.attach(8,1000,2000); // (pin, min pulse width, max pulse width in microseconds)   
  ESC2.attach(9,1000,2000);    
  ESC3.attach(10,1000,2000);    
  ESC4.attach(11,1000,2000);    
}

int ch1Value, ch2Value, ch3Value, ch4Value;
bool ch5Value;

void loop() {
  ch1Value = readChannel(CH1, 0, 180, 0);
  ch2Value = readChannel(CH2, 0, 180, 0);
  ch3Value = readChannel(CH3, 0, 180, 0);
  ch4Value = readChannel(CH4, 0, 180, 0);
  ch5Value = redSwitch(CH5, false);
  
  Serial.print("Ch1: ");
  Serial.print(ch1Value);
  Serial.print(" Ch2: ");
  Serial.print(ch2Value);
  Serial.print(" Ch3: ");
  Serial.print(ch3Value);
  Serial.print(" Ch4: ");
  Serial.print(ch4Value);
  Serial.print(" Ch5: ");
  Serial.println(ch5Value);

  ESC1.write(ch1Value);
  ESC2.write(ch2Value);
  ESC3.write(ch3Value);
  ESC4.write(ch4Value);
  
  delay(500);
}

이제, 오실로스코프 두개 프로브에 각각 수신기 채널, 아두이노 출력 핀을 연결한다. 아두이노 수직 채널 입력 전압을 2V로 조정하고, 수평은 1.0 ms로 설정한다. 그리고, TRIGGER AUTO 버튼으로 시그널 수평을 고정한다. 그럼, 다음과 같이 입력후 처리된 PWM 진폭이 각각 일치하는 것을 확인할 수 있다.

2020년 11월 4일 수요일

LiPO 배터리 연결잭 정리

이 글은 LiPO 배터리 연결잭을 간단히 정리한 글이다. 

배터리를 사용하다 충전을 할 때 매우 다양한 배터리 연결잭 종류로 인해 피곤한 경우가 종종 있다. 이 경우 연결잭 종류를 확인하고, 직접 납땜 제작해야 한다. 

  • XT60
  • XT90: 30mm
  • T-Plug: 
  • 바나나 잭

구입은 디바이스 마트하비킹에서 하면 된다.

2020년 10월 19일 월요일

엔비디아 나노 이미지 백업 및 복구

이 글은 엔비디아(nvidia jetson) 나노(nano) 이미지 백업 및 복구 방법을 간략히 설명한 것이다. 크게 2가지 방법이 있다. 하나는 Win32 Disk Imager, 다른 하나는 DD 명령을 사용하는 방법이다. 

Win32 Disk Imager

다음 링크에서 프로그램 다운받아 설치한 후 실행한다.

실행 후 저장할 이미지 이름과 클론(복제)할 SD memory, USB memory를 USB 포트에 연결하고, Read 버튼을 클릭한다. 그럼 복제가 시작된다. 

복구는 반대로 비어 있는 메모리를 USB 포트에 연결하고, Write 버튼을 클릭하면 된다. 

DD명령


다음 명령어로 대용량 USB 메모리 기능을 추가한다.
sudo apt-get install exfat-fuse exfat-utils

다음 명령어로 이미지를 복제할 마운트 이름을 확인한다.
sudo parted -l

다음 명령어로 특정 마운트 이미지를 저장한다. 참고로 if는 입력 파일 옵션이다.
sudo dd if=/dev/mmcblk0 conv=sync,noerror bs=64k | gzip -c > ~/backup_image.img.gz

이미지 저장에 몇 시간 걸릴 것이다. 
이미지 복구는 다음 명령을 이용한다.
gunzip -c ~/backup_image.img.gz | dd of=/dev/sda1 bs=64k

레퍼런스

2020년 10월 18일 일요일

R 스튜디오 기반 데이터 통계 신뢰도 크론바흐 알파 계산하기

이 글은 오픈소스 R 스튜디오를 사용해 데이터 신뢰도를 간단히 검증할 수 있는 방법인 크론바흐 알파(Cronbach Alpha) 계산 방법을 나눔한다. R은 통계 분석언어이다. RStudio는 무료이며 GUI방식으로 편리하게 R 언어를 사용할 수 있도록 한다. 

RStudio
머리말
크론바흐 알파는 신뢰도 계수 중 하나이다. 알파값은 다양한 항목들 간에 내적 일관성(internal consistency)가 높은지를 측정한다. 이를 위해 조사 항목의 데이터들 간 상관계수를 계산한다.  

예를 들어, 어떤 질문 항목에 비해, 응답자들이 특정 방향으로 일관된 경향의 답을 하는 지를 알아볼 수 있다. 홍길동이 여러 관계된 질문들 Q1...n에 대해 일관성있게 점수들을 준다면 알파값이 높게 나오지만, 임의적으로 답을 주면 알파값이 낮게 나온다. 특정 질문 Qi가 일관성이 없어보이면, 해당 데이터를 삭제함으로써 일관성을 높일 수 있다. 
   
보통, 알파값이 0.8이 높으면 일관성과 신뢰성이 좋다고 판단한다. 알파값이 0.9이상이면 신뢰성이 높은 데이터이다. 0.7이상이면 항목들간에 어느정도는 일관성이 있다고 판단한다.

크론바흐 알파값은 피어슨(Pearson) 상관 계수와 함께 데이터 신뢰성 계산에 많이 사용된다.

프로그램 설치
통계 패키지 R과  RStdudio를 다음 링크에서 설치한다.

프로젝트 시작 및 데이터 준비
RStduio를 실행한다. 그리고 파일에서 새 프로젝트 메뉴를 선택한다. 
폴더 기반으로 프로젝트를 생성한다. 그리고, 생성된 폴더 안에 분석할 데이터를 엑셀로 저장한다. 테스트를 위해 아래 엑셀 데이터를 다운로드한다.
엑셀에 저장된 데이터는 리커트 5점 척도로 조사된 항목들로 구성되어 있다. 

크론바흐 알파 계산하기
새 프로젝트 후 콘솔창에 다음 명령을 입력해 패키지를 설치한다. 
install.packages("psy")
library("psy")
install.packages("psych")
library("psych")

엑셀파일이 준비되어 있다면, 다음 명령으로 엑셀파일을 읽을 수 있다. 
library(readxl)
B <- read_excel("benefit.xlsx")
View(B)

결과는 다음과 같다. 

만약, 준비된 데이터가 없다면, 다음 명령을 입력한다.
B <- data.frame(
B1=c(3,4,3,4,5,2,3,5,3,1), 
B2=c(4,4,1,2,4,1,2,4,2,2), 
B3=c(3,4,1,3,3,2,2,4,3,3))

데이터를 확인한다. 
View(B)

추세선 그래프를 확인한다.
pairs(B, panel=panel.smooth)

크론바흐 알파를 계산한다.
cronbach(B)

결과는 다음과 같다. 알파값이 0.812이므로 0.8보다 크다. 보통, 알파값이 0.8이 높으면 일관성과 신뢰성이 좋다고 판단한다. 
$sample.size
[1] 15
$number.of.items
[1] 7
$alpha
[1] 0.8127667

좀 더 상세한 알파 값을 얻는다. 
alpha(B)

소숫점까지 포함된 알파 값을 확인해 본다.
q <- alpha(B)
q$total

결과는 다음과 같다.
 raw_alpha std.alpha   G6(smc) average_r      S/N
 0.8127667 0.8066837 0.8761885 0.3734824 4.172871
        ase     mean        sd  median_r
 0.07143076 3.847619 0.7392902 0.4240922

마무리
이 글에서는 R 스튜디오 기반 데이터 통계 신뢰도 크론바흐 알파를 계산하는 방법을 간략히 설명하였다. 크론바흐 알파는 통계학자 크론바흐가 제안한 데이터 신뢰성 평가 방법이다. 주로 설문지 답변 데이터 신뢰성 등을 평가할 때 많이 사용된다. 크론바흐 알파 값 등급은 정해지지 않았지만, 일반적으로 0.6 이상이면 신뢰성이 있다고 한다. 만약, 0.6 미만으로 나오면 해당 데이터는 수정 및 삭제하는 것이 좋다. 



2020년 10월 9일 금요일

sudo 암호 없이 우분투 사용 방법

어떤 경우, 우분투 암호가 너무 길어 사용하기 어려울 때가 있다. 이 글은 sudo 암호 없이 우분투 사용 방법을 간략히 설명한다.

우분투 account에서 로그인 시 암호 입력을 해제한다. 그리고, 다음 명령을 실행한다.
sudo visudo

맨 아래 행에 다음을 입력한다.
user ALL=(ALL:ALL) NOPASSWD:ALL

만약, 오류가 생긴다면, 다음과 같이 추가된 행을 수정한다.
pkexec visudo

이제 암호 없이 패키지를 설치할 수 있다.