반응형

안녕하세요. 2020년 2월입니다. 

1월에 기사준비도 하고, 공부도 이것저것 한 것 같은데 나는 이것을 이루었다!

라고 자신있게 말할 만한게 없는 것 같습니다.

 

요즘 머신러닝이 너무 핫합니다.

구글, 페이스북에서 텐서플로우, 파이토치 등 무섭게 업데이트되고 있습니다.

좀 더 쉽게, 직관적으로 변하고 있습니다. 쉽게? 직관적? 코드 길이?

귀찮음을 매우 싫어하는 저에게 이건 기회가 아닐까? 생각했습니다.

 

평소에 관심이 있었던 인공지능이지만, 너무 막연한 벽 때문에 엄두조차 못내고 있었습니다.

4학년이고 맘편히 공부할 수 있는 시간도 없다는 불안함이 저를 부추겼습니다.

그래서 2월에는 인공지능에 한 번 힘을 쏟아볼 생각입니다.

 

그렇다면 머신러닝을 할 준비를 해야겠죠?

 

https://www.anaconda.com/distribution/

 

Anaconda | The World's Most Popular Data Science Platform

Anaconda is the standard platform for Python data science, leading in open source innovation for machine learning. Develop, manage, collaborate, and govern at scale with our enterprise platform.

www.anaconda.com

올려둔 사이트에 들어가서 3.7을 다운로드 해줍니다.

next 버튼을 누르다보면 아래의 문장이 나옵니다.

 

Add Anaconda to the system PATH environment variable 

체크해줍니다. 안해줘도 상관없습니다만, 그냥 해줍시다.

 

저는 아나콘다를 설치, 주피터 노트북에서 파이토치를 돌릴 생각입니다. 

페이스북의 파이토치와 구글의 텐서플로우에 대한 비교 글을 다음 글에서 보기로 하고, 어서 아나콘다를 준비합시다.

 

원래부터 파이썬을 썼을 때, 주피터 노트북을 애용했습니다. 

그 이유는 너무 귀찮기 때문입니다. visual code, 파이참은 설정하는게 어후... 귀찮습니다. 그냥 맘편히 아나콘다를 

사용하는게 좋습니다. 

만약 저처럼 귀찮음을 가지신 분이라면 아나콘다를 굉장히 추천 추천합니다. 

 

아나콘다는 웹서버에 올린다는 특징이 있어, 인터넷이 안되면 아마 안될겁니다. ㅜ 

(저희 랩실은 가끔 인터넷이 느려져서ㅠ)

 

아나콘다의 좋은점!

1. 아나콘다를 깔면 파이썬 등 라이브러리(numpy, matplotlib) 등이 자동 적으로 깔립니다. 와우!

2. 그리고 부분실행이 가능해서 중간 점검이 가능하다고 해야하나?

제가 친구랑 파이썬 공부한다고 만든 롤전적 프로그램 기회가 되면 보여드리겠습니다.

pandas로 데이터를 처리하고, matplotlib로 그래프를 그릴 때, 그 줄에 해당한 부분만 실행이 가능하니 

바로바로 확인이 가능했어서 굉장히 편했습니다.

 

 

 

anaconda powershell, anaconda prompt, jupyter notebook 깔린게 보이죠?

 

바탕화면에 새 파일 하나 만들어줍시다.

 

어디에 만들든 상관없습니다. 

 

요렇게 들어가 줍시다. 

 

 

복사 ctrl+c 아시죠?? 해줍니다.

 

이제 anaconda prompt에 들어가줍니다. 

 

cmd 창처럼 검은색 창이 떳죠?? 

 

cd + 자신이 복사한 경로 이렇게 써줍시다.

 

무슨 뜻이냐면, change directory 라는 뜻으로 경로를 바꿔준다는 뜻입니다. 어디로? 자기가 복사한 경로에.

 

그래서 아까 Add Anaconda to the system PATH environment variable 해도 되고 안해도 된다는게 이것 때문이였습니다.

 

엔터 눌러줍시다.

 

이제 주피터 노트북을 실행합시다.

 

jupyter notebook 이렇게 적어줍시다.

 

실행!

 

짜잔! 

 

그럼 한번 되는지 확인해볼까요?

 

New 버튼 보이시죠? 

python 3를 누르고 생성해줍니다. 

 

실행은 RUN!!!

잘되네용??

 

저희가 설정해둔 경로에 파일은 방금 저희가 만든 untitled.ipynb 파일이 있네요!

 

다음시간에는 파이토치를 깔고 어떻게 공부를 할건지 방향을 말하도록 하겠습니다. 

저 또한 딥러닝, 인공지능 정말 아예 처음입니다. 

그렇다고 영어를 잘하느냐. 그것도 아닙니다. 그냥 깡으로 레퍼런스를 찾아보고 구글링해서 공부를 할 생각입니다. 

파이팅@!

728x90
반응형
반응형

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>


#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS

typedef uint8_t  BYTE;
typedef uint32_t DWORD;
typedef int32_t  LONG;
typedef uint16_t WORD;


/*********************************************************STRUCTS***********************************************************/
#pragma pack(push, 1)
typedef struct tagBITMAPFILEHEADER
{
WORD bfType;  //specifies the file type
DWORD bfSize;  //specifies the size in bytes of the bitmap file
WORD bfReserved1;  //reserved; must be 0
WORD bfReserved2;  //reserved; must be 0
DWORD bfOffBits;  //species the offset in bytes from the bitmapfileheader to the bitmap bits
}BITMAPFILEHEADER;


typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;  //specifies the number of bytes required by the struct
LONG biWidth;  //specifies width in pixels
LONG biHeight;  //species height in pixels
WORD biPlanes; //specifies the number of color planes, must be 1
WORD biBitCount; //specifies the number of bit per pixel
DWORD biCompression;//specifies the type of compression
DWORD biSizeImage;  //size of image in bytes
LONG biXPelsPerMeter;  //number of pixels per meter in x axis
LONG biYPelsPerMeter;  //number of pixels per meter in y axis
DWORD biClrUsed;  //number of colors used by the bitmap
DWORD biClrImportant;  //number of colors that are important
}BITMAPINFOHEADER;

typedef struct
{
BYTE  rgbtBlue;
BYTE  rgbtGreen;
BYTE  rgbtRed;
}RGBTRIPLE;

typedef struct
{
BYTE hslHue;
BYTE hslSaturation;
BYTE hslLightness;
}HSL;
#pragma pack(pop)
/*********************************************************STRUCTS***********************************************************/

#define filterWidth 3
#define filterHeight 3

void Filters(int biHeight, int biWidth, RGBTRIPLE** triple);
int CopyBitmapFile(char* filename, BITMAPINFOHEADER* bitmapInfoHeader, char* copy_filename);

int main()
{
char image[80], image_copy[80];
printf("원본 이미지 파일 : ");
scanf("%s", image);

printf("편집 이미지 파일 : ");
scanf("%s", image_copy);


BITMAPINFOHEADER bitmapInfoHeader;
memset(&bitmapInfoHeader, 0, sizeof(BITMAPINFOHEADER));
CopyBitmapFile(image, &bitmapInfoHeader, image_copy);

}


int CopyBitmapFile(char* filename, BITMAPINFOHEADER* bitmapInfoHeader, char* copy_filename)
{
int i, j, k;
FILE* filePtr; 
BITMAPFILEHEADER bitmapFileHeader; 
memset(&bitmapFileHeader, 0, sizeof(BITMAPFILEHEADER));

filePtr = fopen(filename, "rb");
if (filePtr == NULL)
return 1;

FILE* outptr = fopen(copy_filename, "wb");
if (outptr == NULL)
{
fclose(filePtr);
fprintf(stderr, "Could not create %s.\n", copy_filename);
return 2;
}


fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);

if (bitmapFileHeader.bfType != 0x4D42)
{
printf("이미지 파일 찾을 수 없엉");
fclose(filePtr);
fclose(outptr);
return 3;
}


fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);


fwrite(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, outptr);

fwrite(bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, outptr);

int padding = (4 - (bitmapInfoHeader->biWidth * sizeof(RGBTRIPLE)) % 4) % 4;

int biHeight = abs(bitmapInfoHeader->biHeight);
int biWidth = bitmapInfoHeader->biWidth;

RGBTRIPLE** triple;
triple = (RGBTRIPLE**)malloc(sizeof(RGBTRIPLE*) * biHeight);
int ii;
for (ii = 0; ii < biHeight; ii++)
{
triple[ii] = (RGBTRIPLE*)malloc(sizeof(RGBTRIPLE) * biWidth);
}


for (i = 0; i < biHeight; i++)
{
for (j = 0; j < biWidth; j++)
{
fread(&triple[i][j], sizeof(RGBTRIPLE), 1, filePtr);
}
}



for (i = 0; i < biHeight; i++)
{
for (j = 0; j < biWidth; j++)
{
// brighter image
int x, y, z;
x = triple[i][j].rgbtBlue  + 75;
y = triple[i][j].rgbtGreen + 75;
z = triple[i][j].rgbtRed + 75;
triple[i][j].rgbtBlue = ((x > 255) ? 255 : x);
triple[i][j].rgbtGreen = ((y > 255) ? 255 : y);
triple[i][j].rgbtRed = ((z > 255) ? 255 : z);
}
}

for (i = 0; i < biHeight; i++)
{
for (j = 0; j < biWidth; j++)
{

fwrite(&triple[i][j], sizeof(RGBTRIPLE), 1, outptr);
}

fseek(filePtr, padding, SEEK_CUR);

for (k = 0; k < padding; k++)
{
fputc(0x00, outptr);
}
}

fclose(filePtr);
fclose(outptr);

for(int p = 0; p < biHeight; p++ )
{
free(triple[p]);
}
free(triple);

return 0;
}

728x90
반응형
반응형

안녕하세요. 오늘은 PWM에 대해 알아보도록 하겠습니다.

 

아두이노의 핀에는 I/O(input/output)핀의 종류 3가지가 있습니다.

 

1. Analog Input 

 

2. Digital Input 

 

3. Digital Output

 

하나 부족해보이지 않나요?

 

바로 Analog Output입니다.  

 

아두이노에는 Analog Output이 없습니다. 

 

아날로그 와 디지털의 차이부터 먼저 볼까요?

 

 

아날로그, 디지털

 

 

(a)아날로그

 

아날로그는 연속적으로 변화하는 숫자, 물리량을 의미합니다. 소리, 진동 등의 자연현상

 

(b) 디지털

 

0, 1로 이루어진 규칙적인 숫자, 컴퓨터와 소통하기 위해 

 

(어떻게 0, 1로 컴퓨터가 만들어졌는지는 나중에 글을 쓰도록 하겠습니다!)

 

 

자. 그럼 이제 생각해봅시다. 

 

아날로그 출력 : 연속적으로 변화하는 숫자를 출력한다.

 

그렇다면 우리는 연속적으로 변화하는 숫자를 출력할 수 없는 것일까요?

 

예를 들어 연속적인 가변저항의 값을 변화시켜 LED의 밝기를 제어할 수는 없을까요?

 

당연히 있습니다. 아날로그 출력을 설명하기 전에 아날로그 입력의 원리부터 알아보도록 합시다.

 

 

ADC(Analog-Digital-Converter) : 아날로그 신호를 디지털 신호로 변환

 

아두이노에 아날로그 입력은

 

아두이노 안에는  ADC가 아날로그 신호(0 ~ 5V)를 10bit로 데이터 신호를 샘플링(양자화)하여 부호화!!

 

 

쉽게 말해 아두이노는 보통 0 ~ 5V의 전압을 입력받을 수 있습니다.

 

아두이노의 10bit로 0 ~ 5V를 나눕니다.

 

10bit로 나눈다는 말은 10bit는 2^10(2의 10제곱)으로 0 ~ 1023의 값이 존재하며 

 

0 ~ 5V를 1024개로 나눈다는 뜻입니다. 

 

예를 들면 0V일 때는 02.5V512!,    5V1024의 값을 가집니다.

 

이렇게 디지털로 샘플링 된 아날로그 신호를 PWM을 통해 아날로그 신호를 제어할 수 있습니다.

 

 

PWM!  :  펄스의 폭을 변조 !

 

그림으로 설명하겠습니다. 아주 간단합니다.

 

 

약 25%의 duty cycle

Pulse는 파란 색으로 튀어나온 부분이고

Width는 빨간 색 선입니다. 

 

PWMDuty Cycle(신호가 시스템이 살아있는 특정 기간의 백분율)의 원리를 사용합니다. 

 

쉽게 예를 들면

 

1Cycle에 Pulse Width(펄스의 가로 길이)가 약 25%라고 한다면

아두이노의 5V25%1.25V만큼 전압을 출력합니다. 만약 비트로 연산한다면 255가 됩니다.

 

1Cycle에 Pulse Width(펄스의 가로 길이)가 약 50%라고 한다면

아두이노의 5V50%2.5V만큼 전압을 출력합니다. 만약 비트로 연산한다면 511가 됩니다.

 

1Cycle에 Pulse Width(펄스의 가로 길이)가 약 100%라고 한다면

아두이노의 5V100%5V만큼 전압을 출력합니다. 만약 비트로 연산한다면 1023가 됩니다.

 

PWM의 출력(디지털)은 마치 아날로그처럼 사용할수 있어 하나의 DAC로 볼 수 있습니다.

(엄연히 말하면 DAC는 아닙니다. 결국 디지털 신호로 제어하기 때문입니다.)

 

DAC(Digta-Analog-Converter) : 디지털 신호를 아날로그 신호로 변환

 

그림으로 표현하면 이렇게 ADC와 DAC는 짝꿍입니다.

 

다음 시간에는 어떻게 PWM을 이용해서 아날로그 신호, 연속적인 숫자를 제어할 수 있는지 아두이노 코딩을 이용해서 글을 쓰겠습니다.

728x90
반응형
반응형

3_1.cpp
0.00MB

 

안녕하세요 2차원 배열 동적할당하기 3편입니다. 

 

2편에서는 1차 배열을 2차 배열처럼 표현하였는데 단점으로 배열 사용할 때 인덱스가 복잡하여 사용하기 어려웠습니다.

 

이제는 1편의 2차 배열을 조금 정리하여 이쁘게 표현해보도록 하겠습니다. 

 

 

int** mat;
mat = (int**)malloc(sizeof(int*) * column);

mat[0] = (int*)malloc(sizeof(int) * row *column);


for (int i = 1; i < column; i++) {
     mat[i] = mat[i - 1] + row;
      }

 

이제 포인터 한 번 찍어보도록 하겠습니다.

이렇게 표현하면 그냥 배열처럼 사용할 수 있습니다. 

 

for (int i = 0; i < column; i++)
{
     for (int j = 0; j < row; j++) {
          printf("%d ", &mat[i][j]);
          }
printf("\n");
}

 

 

3 x 3 행렬

5 x 5 행렬도 찍어보겠습니다. 

 

5 x 5 행렬

메모리를 찍어보니 끊어지지 않고 4바이트(sizeof(int))만큼 증가하는걸 볼 수 있습니다. 

 

메모리를 사용했으니 이제 제자리에 돌려놔야겠죠?? 메모리 할당은 조금 복잡하나 해제는 아주 간단합니다.

 

free(mat[0]);

free(mat);

 

 

속도도 1편보다 빠릅니다. (사람 눈에는 차이가 없습니다. 워낙 빨라서...)

 

저는 전공이 하드웨어나 영상처리 쪽이 아니기 때문에 C를 많이 사용하지 않습니다. 당연히 요즘은 파이썬...

 

1학년 때 처음 배운게 C언어였고, 이제 4학년부터는 AVR을 공부하고 캡스톤을 준비해야 하니, 

 

예전에 제가 배웠던 혹은 중요하게 생각하는 부분, 글쓰기를 계속해 나가도록 하겠습니다.

 

728x90
반응형
반응형

안녕하세요. 오늘은 풀업, 풀다운 저항에 대해 알아 보도록 하겠습니다.

 

우선 플로팅 현상을 방지하는데 풀업, 풀다운 저항을 사용합니다.

 

플로팅 현상은 3.3V에서 동작한다고 했을 때, 3.0V와 3.5V 사이에서 전압이 애매하게 걸릴 경우 

 

디지털 회로상으로 0 인지 1인지 구별하지 못하게 되어 오작동을 일으킵니다.

 

 

 

1. 아두이노 기본 풀업 저항(소프트웨어)

아두이노는 기본적으로 풀업 저항을 소프트웨어적으로 제공합니다.

아두이노 풀업 

 

 

 

 

2. 풀업 저항(하드웨어)

 

풀업 저항

저항은 대게 10k ~ 100k옴을 사용합니다.

 

3. 풀다운 저항(하드웨어)

풀다운 저항

 

728x90
반응형

+ Recent posts