얼마전 라즈베리파이를 무작정 주문했다. 그동안 아두이노만 해오고 라즈베리파이는 어려워보여서 나중에 하려고 했지만 아두이노가 질려버렸다.... 그래서 새로운 무언가를 하고싶어서 계획도 없이 충동구매ㅋㅋㅋㅋ 막상 라즈베리파이로 무엇을 해야할지 몰라서 3일동안 구글링만 했다. 라즈베리파이 활용, 프로젝트 등 많은 정보를 찾아봤지만 진입장벽이 생각보다 높았다.... (리눅스, 파이썬 안배움....) 그중 카메라를 이용해서 이미지프로세싱하는것이 눈에 띄어서 해보기로 했다. 처음 주문할때 같이 주문한 5MP짜리 카메라를 연결하려고 꺼낸 순간 책상에서 손이 미끄러졌다. 그 짧은 순간에 카메라가 책상에서 바닥으로 떨어지는 장면이 생생하다...... '털거더걱' 쎄한 느낌이 들었다. 카메라 우측상단 초록색 파편이 튀었다..
어느날 아버지께서 부르셨다. "동현아~ 컴퓨터 조립좀 해주라~" 명색이 공대생이지만 데스크탑을 맞춰본적은 한번도 없어서 첫 조립에 설레면서도 두려웠다. 그러나 졸업할때까지도 컴퓨터 조립할줄도 모르는 공대생이라고 불리기에는 쪽팔려서 직접 부품도 알아보고 조립하기로 했다. 아버지께서 게임, 영상작업 등 무거운 프로그램을 돌리는 것이 아니라 간단한 사무용PC 정도로 맞출 생각이였다. 예산은 40~50이라고 하셔서 그에 맞게 견적을 맞춰보았다. 견적 CPU : AMD 라이젠3200G 메인보드 : ASUS EX A320M-GAMING 메모리 : 삼성전자 DDR4-3200(4GB) SSD : 마이크론 MX500 파워 : 마이크로닉스 Classic II 500W 케이스 : 앱코 NCORE ---------------..
레지스터 구조 앞서 AVR의 범용레지스터는 R0 ~ R31 총 32개라고 얘기했다. 레지스터 하나당 8비트의 공간이 있으며 각각의 비트에 값을 저장 할 수 있도록 플립플롭(기억회로)으로 구성되어 있다. 따라서 하나의 레지스터에 8개의 플립플롭이 구성되어 있고 AVR 범용레지스터에만 256개가 내장되어있다. MCU구조 우리가 컴퓨터로 게임, 영상시청, 문서작업 등 다양한 작업을 할 때 CPU가 매우 대단한 연산을 하는 것 같지만 사실 0과 1로 더하기, 빼기 연산밖에 하지 않는다. (0과 1만 더하고 빼는데 이런 작업을 할 수 있다는게 대단하긴 하지...) 이런 기본적인 연산이 어떻게 이루어지는지 MCU의 내부구조를 확인해보자. 우선 "ADD Rd, Rr" 이라는 명령을 내리면 레지스터 두개가 사용되며 더..
앞에서 변수를 선언하고 연산을 했다면 내부적으로 어떻게 연산이 이루어지는지 알아보자. AVR은 분명 8비트 운영체제인데 변수를 char로 선언하면 8비트에 딱 맞게 저장 할 수 있지만 이보다 큰 자료형은 저장공간을 어떻게 할당하며 내부 연산이 이루어질까? 예를들어 short a;라는 변수를 만들었다고 가정하자. short는 16비트라 하나의 레지스터(8비트) 안에 들어가지 못한다. 이를 해결하기 위해서는 다음 레지스터 공간을 같이 할당해주면 된다. 이와같이 short자료형은 R0, R1을 동시에 할당해 주면 된다. 덧셈 연산은 각각의 MSB부와 LSB부를 맞춰서 연산을 한다. 내부적으로 위와 같은 연산이 이루어짐을 결과를 통해 확인 할 수 있다. 그러나 위의 코드만 작성을 하면 문제점이 발생한다. 예를들..
우리가 C언어에서 변수를 선언 할 때 어떤 메모리 공간에 변수를 넣을지 모른 상태로 그냥 선언을 한다. 그러나 메모리단위로 제어를 하는 MCU에서는 특정 공간을 지정 후 변수선언을 하든지 연산을 해야한다. 기본적인 어셈블리명령어와 문법을 알아보자. 1. LDI Rd, K : 상수 K를 Rd에 대입(Load Immediate, Rd
컴퓨터, 전자, 전기, 기계 가릴것 없이 공학도라면 피할 수 없는 마이크로프로세서(마이크로컨트롤러)를 배워보자. Q. 마이크로프로세서란 무엇인가? A. 마이크로프로세서란 초소형 연산처리장치이다. 우리가 흔히 사용하는 PC, 스마트폰 안에 들어있는 연산처리장치 즉 CPU가 마이크로프로세서이다. 그러나 이런 CPU는 단독적으로 사용이 불가능하다. 칩이 특정기능을 사용 수 있도록 명령을 내려야 하고 결과를 확인 할 수 있어야 한다. 마이크로프로세서에 입력과 출력 인터페이스를 결합한 칩을 마이크로컨트롤러(MCU)라고 한다. 따라서 엄밀히 말하자면 우리는 칩셋에 입출력을 전부 수행하는 마이크로컨트롤러를 배운다고 하는것이 맞는 표현이다. 처음 프로그래밍을 배울 때 보통 C, 파이썬 등을 배웠을 것이다. (필자는 C..
매트랩 비교과 마지막 수업날 교수님께서 이미지 프로세싱에 관해 짧게 말씀 해주셨다. 요즘 핫한 자율주행에서 이용되는 이미지 처리 방식도 매트랩에서 간단하게 구현할 수 있다. 예를들어 자동차 범퍼쪽에 카메라를 달고 도로사진을 찍는다고 가정해 보자. 카메라로 찍힌 화면에는 차선, 앞차, 가로등, 사람 등 수많은 요소들이 보일 것이다. 그중 차선만 골라내도록 이미지프로세싱을 할 수 있다는 얘기를 하셔서 심심하니까 한번 해보자. 문제해결방법 1. 우선 인터넷에서 도로사진을 다운받은 후 매트랩에서 호출한다. %% 이미지 불러오기 I=imread('road.jpg'); imshow(I); 이 사진은 r, g, b가 전부 혼합되어 있어서 곧바로 도로만 구분하기란 불가능 하다. 2. 따라서 해당 이미지에서 r, g, ..
2021년 7월 11일 너무너무너무 더운 여름이다. 선풍기가 없으면 잠이 들수 없는 지경이다. 에어컨만큼은 아니지만 어느정도 더위를 날려주는 선풍기의 발명은 정말 고맙다. 그러나 우리가 위치를 이동하거나 다른곳에 볼일이 있으면 선풍기를 옮겨야 하거나 공간에 제약이 있다. 이런 불편함을 해소하기 위해 자동으로 방향을 틀어주는 선풍기를 아두이노로 통해 만들어봐야겠다는 생각을 했다. 이것을 만들기 위한 정보를 찾던 도중 유튜브에서 마침 적당한 영상을 찾았다. 간단히 초음파센서와 서보모터를 이용해서 구현을 하는 것이였고 더 많은 정보를 얻기 위해 댓글을 확인 한 순간 어이가 없었다. 그 이유는 바로 소스코드를 무려 5만원주고 팔고있었으며 수많은 사람들이 그럼에도 불구하고 기꺼이 구매하려는 것이였다. 별로 어려워..
지금까지 우리는 신호를 시간축에 따른 결과값 즉 time domain관점에서 해석했다. 시간에 대한 해석은 그저 파형이 어떻게 생겼는지 관측만 가능 할 뿐 해당 신호의 물리량 및 에너지를 확인 할 수 없다. 이런 신호를 가공하고 처리하기 위해서는 다양한 방법이 있지만 이번 시간에는 여러 방법중 하나인 푸리에 변환(Fourier Transform)에 관해 이야기 하겠다. 푸리에 변환(Fourier Transform)이란? 특정 신호를 시간에 대한 해석이 아닌 주파수에 대한 해석을 하기 위한 변환과정이다. 즉 시간에 대한 그래프는 x축 : 시간(time), y축 : 크기(magnitude)로 표현하는 반면 주파수에 대한 그래프는 x축 : 주파수(frequenct), y축 : 크기 로 나타낸다. 이런 변환을 ..
지난번엔 시각적으로 이미지 처리&분석을 했다면 이번에는 청각으로 넘어가 보자. 우리가 듣는 모든 소리는 파형과 진동수를 갖고 있으며 사인, 코사인과 진동수의 조합으로 모든 소리를 재현할 수 있다. 우리가 흔히 접할 수 있는 계이름(도 레 미 파 솔 라 시)도 각각의 주파수(=진동수)를 갖고있다. 도 262 Hz 레 294 Hz 미 330 Hz 파 349 Hz 솔 392 Hz 라 440 Hz 시 494 Hz (높은)도 523 Hz (소수점 생략) 가장 기본적인 사인함수인 sin(2*pi*freq*t)형태로 소리를 출력할 수 있다. 또한 같은 사인함수지만 주파수만 다르게 한 후 합하면 화음을 연출 할 수도 있다. ex) sin(2*pi*262*t) + sin(2*pi*330*t) + sin(2*pi*392*..
우리가 화면상에서 보는 이미지색상은 전부 R, G, B의 조합으로 이루어져 있다. 조합이 0 ~ 255까지 총 256개로 모든 색을 표현할 수 있다. 이러한 색상요소 하나하나를 픽셀이라고 하는데 모든 이미지는 픽셀로 이루어진 디지털 신호이다. 이미지 픽셀은 마치 행렬처럼 이루어져 있고 이를 화면상에 숫자로 표현할 수 있다. 이번 글에서는 이미지를 갖고 픽셀이 어떻게 이루어져 있는지, 무슨색깔이 가장 많이 이루어져있는지 간단히 해석하는법을 포스팅하겠다. 이미지 분석할 대상은 바로 우리집 최강 귀염댕이 몰티즈 힝둥이다. 우선 매트랩 프로그램에서 이미지를 불러와야 하는데 이때 사용하는 함수가 imread(' ')이다 I=imread('dog.jpg'); 해당 이미지를 불러오니까 정보가 1440x1080x3이라..
그래프를 단순히 화면에 띄운다고 일이 끝난것이 아니다. 이 그래프가 어떤 모델을 그래프화 한건지, x, y축은 무엇을 나타내는지, 필요에 따라 그래프의 색상도 바꿔야 하는 경우도 있다. 이때 각각의 옵션을 변경할 수 있는 명령어를 알아보자. 1. 그래프 제목 설정 1) title(' '); ' '안에 문자를 입력하면 그래프의 제목을 설정할 수 있다. 2) xlabel(' ') x축 제목 설정 3) ylabel(' ') y축 제목 설정 2. 그래프 표현 방법 1) plot(x, y) 2D 그래프 그리기 2) mesh(x, y, z) 3D 그래프 그리기 3) surf(x, y, z) 3D 그래프 그려서 색 채우기 4) contour(x, y, z) z값을 등고선 그래프로 그리기 5) plotc(), mesh..
3D그래프 그리는 방법은 2차원 평면 그래프 그리는 방법과 별반 차이가 없다. 그저 z축 하나만 추가된 형태라 변수와 for문을 하나씩 추가해주고 3차원 그래프로 출력하기 위해 plot()함수 대신 surf()함수를 작성해 준다. 2차원 평면을 생각해보면 x는 input 이고 y는 x에 의한 output이다. 따라서 input x만 변화해주면 output y는 자동적으로 변하게 되었지만 이를 3차원 으로 확장하면 x, y 둘다 input으로 설정하고 두 input x, y에 관한 output변수를 따로 생성해 주면 된다. 이번 프로그램에서는 output변수를 Gr(=Graph)로 설정해 주었다. len_x=100; len_y=100; x=linspace(-1,1,len_x); y=linspace(-1,1..
앞서 2차원 그래프를 그릴 때 하나의 창에 하나의 그래프만 띄웠지만 여러 그래프를 띄우고 싶을 때는 어떻게 할까? plot()으로 그래프를 띄우기 전에 subplot()함수로 지정된 공간에 특정 그래프를 띄울 수 있다. 예를 들어 subplot(3, 3, 2)라고 선언을 했다고 가정하자. 이는 창에 3x3형태의 공간을 할당한 상태이며 (1, 2)의 자리에 그래프를 띄운다는 뜻이다. 또 다른 예로 subplot(3, 3, 7)라고 선언을 하면 (3, 1)의 자리에 그래프를 띄운다. 이렇게 스크립트에서 식을 여러개 만들고 for문을 통해 연산을 계속 해주면 하나의 창에 여러 그래프를 띄울 수 있다. t=linspace(-1,1,100); y1=zeros(1,100); y2=zeros(1,100); y3=ze..
지금까지 vector만들기를 한 방식은 명령창에서 값을 바로 만들었다. 그러나 실제로 이렇게 바로 값을 대입하는것은 의미가 없기 때문에 식을 이용해서 계산을 할 수 있도록 스크립트 창에서 직접 프로그래밍을 해보자. 매트랩에서 기본적으로 function이라는 내장함수를 갖고 있기 때문에 쉽게 식을 작성 할 수 있다. function[c, d, e, f]=oper_f(a,b) 라는 함수를 선언을 했다고 가정하자. 이때, oper_f는 함수명이며 (a, b)는 변수이다. function명령을 내린 순간부터 프로그램은 자동으로 함수임을 인식한다. 대괄호 안에있는 c, d, e, f는 각각 하나의 식이며 서로 다른 식으로 정의할 수 있다. 예를들어 c=a+b, d=a-b, e=a*b, f=a/b와 같이 서로 다른..
1) linspace(x1, x2, y) x1 : 초기값 x2 : 최종값 x3 : 초기값과 최종값 사이의 원소의 개수 ex) linspace(0, 10, 10) 0 ~ 10까지 11개의 공간을 만들어 10을 11개로 쪼개어 공간에 대입한다. (==) linear space : 선형적으로 공간을 만든다. 2) zeros(m, n) m x n행렬을 만들어 전부 0으로 채운다 3) ones(m, x) m x n행렬을 만들어 전부 1로 채운다
Q. MATLAB이란?? A. MATLAB은 간단하게 말하면 신호를 시각적으로 표현하기 위한 프로그래밍 툴이다. 이 프로그램은 이미지, 음성신호, 영상처리 등 다양한 분양에서 신호를 처리하기 위해 사용되며 매트랩의 강력한 장점중 하나는 바로 행렬을 기반으로 연산한다는 점이다. C/C++에서 행렬연산을 하기 위해서는 동적할당과 포인터를 이용하고 연산함수를 직접 작성해야 하지만 매트랩은 복잡한 행렬식을 컴퓨터의 디지털 신호로 쉽게 연산을 할 수 있다. 1. 기본적인 Vector 만들기 & 명령어 1) a = [1 2 3 4 5] row vector 생성 2) b = a' a vector를 transpose한 형태, 즉 column vector형태 3) c = [2 ; 3 ; 4 ; 5 ; 6] 바로 colu..
자연수 1부터 입력한 수 N까지 소수의 개수 출력하기 자연수 1부터 입력한 수 N까지의 소수의 개수를 출력하는 프로그램을 짠다면 다음과 같다.(sol.1) #include int main() { int n = 0,cnt=0,flag; scanf("%d", &n); for (int i = 2; i
두번째 프로젝트는 RTC모듈을 이용한 알람시계이다. RTC이란 Real Time Clock의 약자이며 쉽게 '시계'라고 생각하면 된다. 내부적으로 시간을 연산하는 프로그램을 갖고 있어서 초기값만 설정해 준 후 전원만 연결하면 실제시계와 똑같이 동작한다. 처음 RTC모듈을 접했다면 대부분 Serial화면으로 출력하는 법 먼저 배웠을 것이다. 그러나 아두이노는 제품을 만들 수 있는 장점이 있는데 왜 PC화면으로만 출력을 하는가? 보드에 RTC뿐만 아니라 LCD화면과 피에조 부저, LED, 블루투스 통신이 가능하도록 PC와 독립적인 알람시계를 만들어 보자! 준비물 RTC모듈, LCD패널(I2C), HC-06, 피에조부저, RLED, 9V배터리, 여러 점퍼선과 저항 설계 방법 1. RTC모듈에 초기값(현재시간)..
아두이노 우노에서 lcd화면을 띄울 때 SDA는 A5번핀, CLS은 A6번핀에 연결해야 한다. 그러나 아두이노 메가 2560에서도 똑같이 적용을 하면 화면이 뜨지 않는다. 그 이유는 메가에서 기본적으로 SDA와 CLS핀을 지원하기 때문에 따로 아날로그 핀에 연결할 필요가 없다. 사진과 같이 연결하면 LCD화면을 출력할 수 있으며 코드 작성은 우노에서 한 방법과 똑같이 하면 된다. 추가로 COMMUNICATION이라는 포트 구성을 보면 SDA, SCL뿐만 아니라 TX, RX도 볼 수 있는데 블루투스 통신포트도 이곳으로 연결시켜줘야 정상적으로 작동한다.