반응형

프로그래밍을 이용하여 파일을 생성하거나 이동시킬때 md5 와 같은 무결성 검증을 위한 해시체크 파일을 생성해야 할때가 있습니다. 물론 간단한 유틸리티를 내려받아 윈도우 쉘 명령어로 만드는 방법도 있겠지만 굳이 프로그래밍에 의한 결과를 다시 사용자가 손으로 작업하는 것은 효율 적인 방법이라고 하기는 어렵겠죠.

그래서 이번에는 C# 프로그램에서 바로 md5 파일을 생성하는 방법을 소개해 드릴까 합니다.

 

일단 기본은 아래와 같습니다.

// 코드 최 상단에 아래와 같은 using 지시문을 넣어 줍니다.
using System.Security.Cryptography;


// 코드내에 아래의 함수를 추가하여 해시문자열을 받아올 수 있습니다.
// 해시 문자열을 스트링으로 받아오는 함수, 아래 str 은 파일의 경로를 지정한다.
private static string getMD5Hash(string str)
{
  using (var md5 = MD5.Create())
  {
    using (var stream = File.OpenRead(str))
    {
      var hash = md5.ComputeHash(stream);
      return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
    }
  }
}

 

이렇게 하면 getMD5Hash(파일경로) 라는 함수를 이용하여 해시체크용 문자열을 가져올 수 있습니다. 굳이 다른 유틸리티 없이도 본인이 개발중인 프로그램 내에서 md5 체크썸 파일을 만들 수 있는 것이죠.

md5 파일을 만드는것 까지 해보면 아래와 같습니다.

저의 경우에는 디렉토리 하위에 모든 파일에 대한 체크썸 파일이 필요했기 때문에 하위 디렉토리를 돌며 파일 및 폴더를 탐색하는 재귀함수 형태로 제작을 했습니다.

using System.Security.Cryptography;

.
.
.

private static void createmd5(string _path, string md5name)
{
	string dirName = Directory.GetParent(md5name).ToString() + "\\";
	string tmp = "";
	chkDir_md5(ref tmp, _path, dirName);
	
	File.WriteAllText(md5name, tmp);

}

// 지정된 폴더를 탐색하며 하위의 모든 폴더, 파일을 검사 후 문자열 기록
private static void chkDir_md5 (ref string _str, string _path, string _defPath)
{

	FileAttributes att = File.GetAttributes(_path);
	if ((att & FileAttributes.Directory) == FileAttributes.Directory)
	{
		// is a Directories
		string[] tmpPath = Directory.GetDirectories(_path, "*");

		foreach (string s in tmpPath)
		{
			chkDir_md5(ref _str, s, _defPath);
		}

		string[] tmpFiles = Directory.GetFiles(_path, "*.*");

		foreach (string s in tmpFiles)
		{
			chkDir_md5(ref _str, s, _defPath);
		}
	}
	else
	{
		// is a file
		_str += getMD5Hash(_path);
		_str += " *" + _path.Replace(_defPath, "");
		_str += "\n";

	}	
}

private static string getMD5Hash(string str)
{
	using (var md5 = MD5.Create())
	{
		using (var stream = File.OpenRead(str))
		{
			var hash = md5.ComputeHash(stream);
			return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
		}
	}
}

 

찬찬히 보시면 전혀 어려울 것이 없으니 훓어 보시기 바랍니다.

 

md5 파일을 제작하여 원본파일과 함께 배포를 하게 되면 파일을 전달받는 위치에서 해당 파일이 원본과 동일하지를 판단할 수 있으며 압축/압축해제시 또는 웹서버에 올라간 데이터가 네트웍망을 타고 내려오는 동인 손실이 있었는지를 파악하는데 도움이 됩니다.

 

이상으로 c# 에서 MD5 체크썸 파일을 만드는 방법을 소개해 드렸습니다.

 

2020/07/21 - [DEV/c#] - C# 문자열 읽어서 문자열에 해당하는 변수에 값 세팅하기

 

C# 문자열 읽어서 문자열에 해당하는 변수에 값 세팅하기

오늘 소개해드릴 꿀팁은요. 문자열을 읽어 들여서 문자열 내에 들어있는 특정 단어를 이용하여 개발 중인 코드의 변수로 인식하여 해당 변수에 값을 세팅하는 방법을 소개해 드릴까 합니다. 예�

diy-dev-design.tistory.com

 

2020/05/28 - [DEV/c#] - [c#] 주어진 경로가 디렉토리인지 파일인지 확인하는 방법

 

[c#] 주어진 경로가 디렉토리인지 파일인지 확인하는 방법

오늘은 간단하게 주어진 경로가 폴더인지 파일인지 구분하는 방법을 소개해 드리겠습니다. 길게 설명할 것 없이 간단하게 코드나갑니다. FileAttributes chkAtt = File.GetAttributes(_path); if ((chkAtt & FileA..

diy-dev-design.tistory.com

2020/04/03 - [DEV/c#] - ImageMagick 을 이용하여 이미지 컨트롤 해보기

 

ImageMagick 을 이용하여 이미지 컨트롤 해보기

포토샵 없이 이미지를 편집하는 방법이 없을까 고민하다가 알게된 라이브러리, 바로 ImageMagick 입니다. 먼저 포스트에서 ImageMagick 을 프로젝트에 가져오는 방법을 아래와 같이 소개해 드린적이 ��

diy-dev-design.tistory.com

2020/01/03 - [DEV/c#] - [C#] C# APP 에서 엑셀 연동해보기

 

[C#] C# APP 에서 엑셀 연동해보기

엑셀에서 VBA 로 코드를 짜다 보면 막상 특정 엑셀 파일에만 VBA 가 적용이 가능하기 때문에 막상 다른 엑셀 파일에서 동일한 동작을 하려면 또 코드를 복사해 넣고 실행을 해야 하는 경우가 있습�

diy-dev-design.tistory.com

2019/06/21 - [DEV/c#] - [C#] 마우스 매크로를 위한 마우스 자동 클릭 기능 만들기

 

[C#] 마우스 매크로를 위한 마우스 자동 클릭 기능 만들기

사용자의 마우스 컨트롤 없이 자동으로 지정된 위치에서 마우스를 클릭하게 만들어 주는 기능 입니다. 먼저 아래와 같이 DLL 을 불러들여 주어야 하겠습니다. class 정의 바로 아래부분에 넣어 주�

diy-dev-design.tistory.com

 

반응형
반응형

 

오늘은 간단하게 주어진 경로가 폴더인지 파일인지 구분하는 방법을 소개해 드리겠습니다.

길게 설명할 것 없이 간단하게 코드나갑니다.

 

FileAttributes chkAtt = File.GetAttributes(_path);
if ((chkAtt & FileAttributes.Directory) == FileAttributes.Directory)
{
 // 디렉토리일 경우
}
else
{
 // 파일 일 경우
}

 

간단하죠 ?

이렇게 하면  _path 로 주어진 경로가 디렉토리인지 파일인지 구분할 수 있는데요. 폴더를 계속해서 탐색하는 기능을 만들때 유용하게 사용할 수 있답니다.

 

 

예를 들면 아래와 같은 방법으로 하위폴더의 모든 파일에 대한 액션을 할 수 있는 재귀 함수를 만들수 있는 것입니다.

private static void chkDir_recursive (string _path)
{

  FileAttributes chkatt = File.GetAttributes(_path);
  if ((chkatt & FileAttributes.Directory) == FileAttributes.Directory)
  {
    // is a Directories
    string[] tmpPath = Directory.GetDirectories(_path, "*");

    foreach (string s in tmpPath)
    {
    	chkDir_recursive(_path); // 폴더를 만나면 하위로 계속 탐색을 진행
    }

    string[] tmpFiles = Directory.GetFiles(_path, "*.*");

    foreach (string s in tmpFiles)
    {
    	chkDir_recursive(_path); // 파일을 만나도 동일한 함수로 실행 가능함
    }
  }
  else
  {    
    // 파일을 만나게 되면 실제 해야할 액션을 코딩한다

  }

}

 

간단하죠?

 

이상으로 주어진 경로가 폴더인지 파일인지 구분하는 방법을 소개해 드렸습니다~

2020/05/29 - [DEV/c#] - [C#] .net 프로그램에서 MD5 해시 체크파일 만들기

 

[C#] .net 프로그램에서 MD5 해시 체크파일 만들기

프로그래밍을 이용하여 파일을 생성하거나 이동시킬때 md5 와 같은 무결성 검증을 위한 해시체크 파일을 생성해야 할때가 있습니다. 물론 간단한 유틸리티를 내려받아 윈도우 쉘 명령어로 만드�

diy-dev-design.tistory.com

2020/01/03 - [DEV/c#] - [C#] C# APP 에서 엑셀 연동해보기

 

[C#] C# APP 에서 엑셀 연동해보기

엑셀에서 VBA 로 코드를 짜다 보면 막상 특정 엑셀 파일에만 VBA 가 적용이 가능하기 때문에 막상 다른 엑셀 파일에서 동일한 동작을 하려면 또 코드를 복사해 넣고 실행을 해야 하는 경우가 있습�

diy-dev-design.tistory.com

2019/06/21 - [DEV/c#] - [C#] C# .NET 프로젝트에서 ImageMagick 이용하기

 

[C#] C# .NET 프로젝트에서 ImageMagick 이용하기

이미지 관련된 툴을 개발함에 있어 다양한 이미지 포멧을 만들고 변경하기 위한 코어를 개발하는 것은 말도 안되게 힘든 작업입니다. 저는 디자이너라는 타이틀을 가지고 있기 때문에 포토샵이

diy-dev-design.tistory.com

2019/06/21 - [DEV/c#] - [C#] 마우스 매크로를 위한 마우스 자동 클릭 기능 만들기

 

[C#] 마우스 매크로를 위한 마우스 자동 클릭 기능 만들기

사용자의 마우스 컨트롤 없이 자동으로 지정된 위치에서 마우스를 클릭하게 만들어 주는 기능 입니다. 먼저 아래와 같이 DLL 을 불러들여 주어야 하겠습니다. class 정의 바로 아래부분에 넣어 주�

diy-dev-design.tistory.com

2019/06/21 - [DEV/c#] - [C#] Delay 기능

 

[C#] Delay 기능

c# .net 환경 개발시 아래의 함수를 이용하여 Delay 를 구현할 수 있습니다. private static DateTime Delay(int MS) { DateTime ThisMoment = DateTime.Now; TimeSpan duration = new TimeSpan(0, 0, 0, 0, MS);..

diy-dev-design.tistory.com

 

반응형
반응형

가끔 아두이노로 무엇인가를 만들어 보려고 하다보면 디스플레이가 있으면 하는 생각이 들때가 있습니다. 아두이노는 작은 컴퓨터이기는 하지만 모름지기 컴퓨터라 한다면 입력장치 - 중앙처리장치 - 출력장치가 모두 있어야 비로소 컴퓨터라 할수 있겠지요. 센서나 버튼 등은 간단한 입력장치라 볼수 있겠으나 아두이노 기판에 붙어있는 LED 는 출력장치라고 하기에는 조금 부족한 면이 있습니다.

 

그래서 오늘은 아두이노 나노 에 OLED 디스플레이를 붙여 볼 생각입니다.

오늘도 역시 알리익스프레스에서 구입한 부품으로 시작합니다.

 

 

오늘 필요한 부품은

  • 아두이노 나노  Arduino Nano (우노가 있으신 분은 그냥 우노로 하시면 됩니다)
  • 0.96 inch OLED display (128x64)

이게 전부 입니다.

간단하죠?

 

참고로 제가 구입한 OLED 보드는 아래의 제품입니다.

Arduino OLED 테스트를 위하여 구입한 제품

I2C 통신이 가능한 모델로 코딩을 간단하게 할수 있고 연결해야 하는 선이 적어 손쉽게 구현이 가능하다는 장점이 있습니다. (4pin)

 

 

먼저 OLED 에 무엇인가를 손쉽게 표시하기 위하여는 라이브러리를 받아야 합니다. 

아래의 첨부파일을 받아주세요.

Adafruit_SSD1306-master.zip
0.03MB
Adafruit-GFX-Library-master.zip
0.32MB

받은신 라이브러리는 압축을 해제하여 내문서> Arduino> Library 폴더안에 아래와 같이 복사해서 넣어주세요.

 

그럼 기본적인 준비는 끝났습니다. 

아두이노 나노와 OLED 를 아래와 같이 연결해 주세요.

  • A4 --> SDA
  • A5 --> SCK
  • 5V --> VDD
  • GND --> GND

요렇게 연결하면 연결도 끝 입니다.

매우 간단하죠?

 

 

자 코딩을 해볼까요? 간단하게 텍스트를 출력하는 예제를 짜 보았습니다.

#include <Wire.h> 
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <gfxfont.h>

#define OLED_ADDR   0x3C

// reset pin not used on 4-pin OLED module
Adafruit_SSD1306 display(-1);


void setup() {
  // put your setup code here, to run once:

  display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);

  display.setFont();
  display.clearDisplay();
  display.display();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(2, 25);
  display.print("DIY DEV DESIGN");
  display.display();
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

setup 에서 한번만 호출해주는 코드 입니다. 나중에 loop 에서 다른 화면을 보여주는 걸로 한다면 인트로 정도가 될 수 있겠습니다.

출력되는 화면을 한번 볼까요?

DIY DEV DESIGN 을 출력해 보았다.

캬~ 아주 깔끔하고 예쁩니다. 디스플레이 크기가 작은 만큼 글자 크기도 좀 작게 설정을 하였는데요. 선명하고 예쁩니다. 

우리는 이 디스플레이에 무엇인가를 그리거나 표시하기 위하여 위와 같은 방식으로 계속 직접 코딩을 하는 것은 비 효율 적이기 때문에 뭔가 좀저 효율적으로 그릴 수 있도록 코딩을 해볼 계획입니다.

 

 

만들어 볼 기능은 아래와 같습니다. (사실 RC 카 조종기에 넣을 기능임)

  • 텍스트 표시하기
  • 프로그래스 바 표시하기
  • 좌우 밸런스 바 표시하기

 

 

텍스트 표시하기

// 위쪽은 동일하므로 생략합니다.

void loop() {
  display.clearDisplay();
  draw_text(1, 2, "[ DIY DEV DESIGN ]", false);
  draw_text(2, 2, "This is selected menu", true);
  draw_text(3, 2, "This is 2nd menu", false);
  draw_text(4, 6, "Sub menu 1 line", false);
  draw_text(5, 6, "Sub menu 2 line", false);
  draw_text(6, 2, "This is 3rd menu", false);
  display.display();
  delay(1000);
}

void draw_text (int line, int xPos, String txt, bool isSelected)
{
  
   int cHeight = (line-1) * 8 + ((line-1) * 2);
   if(isSelected)
   {
      display.fillRect(xPos - 2, cHeight, 127, 8, WHITE);
      display.setTextColor(BLACK);
   }else{
      display.fillRect(xPos - 2, cHeight, 127, 8, BLACK);
      display.setTextColor(WHITE);
   }
   display.setCursor(xPos, cHeight);
   display.print(txt);
}

아래쪽에 draw_text 라는 함수를 하나 만들어 주었습니다. 원하는 줄에 원하는 텍스트를 쉽게 표시할 수 있도록 했는데요, 특징으로는 메뉴 등의 기능으로 사용할 수 있도록 해당 라인이 선택 상태인지를 입력할 수 있도록 했습니다.

구현된 화면을 보면 아래와 같죠. 로터리 스위치나 푸쉬스위치의 입력을 받아 선택상태를 바꾸어 주는 방식으로 메뉴를 개발할 수 있을 것 같습니다.

아두이노 OLED 텍스트 메뉴 표시 테스트

 

 

 

 

프로그래스 바 만들어 보기

void loop() {
  
  for(int i = 2; i < 127; i++)
  {
    display.clearDisplay();
    draw_text(1, 2, "[ DIY DEV DESIGN ]", false);
    draw_text(2, 2, "progress 1", false);
    draw_progressBox(3, i, false);
    draw_text(4, 2, "progress 2", false);
    draw_progressBox(5, 126-i, true);
    display.display();
    delay(20);
  }
  
}

void draw_progressBox(int line, int val, bool isSelected)
{
  
  int cHeight = (line-1) * 8 + ((line-1) * 2);
  if(isSelected)
    {
      display.fillRect(0, cHeight, 127, 8, WHITE);
      display.drawRect(1,cHeight+1, 126, 6, BLACK );
      display.fillRect(1,cHeight+1, val, 6, BLACK );
    }else{
      display.drawRect(1,cHeight+1, 126, 6, WHITE );
      display.fillRect(1,cHeight+1, val, 6, WHITE );
    }
}

void draw_text (int line, int xPos, String txt, bool isSelected)
{
  
   //생략
}

이번에는 draw_progressBox 라는 함수로 프로그래스 바를 표현해 봤습니다. 역시 라인의 위치를 간단히 설정할 수 있도록 하였으며 val 값을 입력 받도록 하였습니다.

그리고 텍스트와 마찬가지로 선택상태를 주게 되면 색상이 반전되어 보이도록 기능을 주었습니다. 총 2~126 까지의 값이 표현 가능합니다. 깔끔하게 100개만 입력 받도록 넓이를 조정해보는 것도 좋을 것 같네요.

구현하면 아래와 같이 표시 됩니다.

아두이노, OLED 프로그래스바 코드 테스트

 

 

 

 

 

아날로그 발란서 만들어보기

다음은 아날로그 발란서 입니다. 센터를 정해 놓고 좌우로 얼마나 기울었는지 등을 설정하거나 보여주는 기능에 적합한 메뉴 입니다.

void loop() {
  
  for(int i = 2; i < 127; i++)
  {
    display.clearDisplay();
    draw_text(1, 2, "[ DIY DEV DESIGN ]", false);
    draw_text(2, 2, "progress 1", false);
    draw_analogBalancer (3, i, false);
    display.display();
    delay(20);
  }
  
}
void draw_analogBalancer(int line, int val, bool isSelected)
{
  int cHeight = (line-1) * 8 + ((line - 1) * 2);  

  if (isSelected)
  {
    display.fillRect(0, cHeight, 127, 8, WHITE);
    display.drawLine(0, cHeight+3, 127, cHeight+3, BLACK);
    display.drawLine(val, cHeight+1, val, cHeight+5, BLACK);
    display.fillTriangle(64, cHeight+5, 62, cHeight+7, 66, cHeight+7, BLACK);
    display.drawPixel(val-1, cHeight+3, WHITE);
    display.drawPixel(val+1, cHeight+3, WHITE);
  }else{
    display.drawLine(0, cHeight+3, 127, cHeight+3, WHITE);
    display.drawLine(val, cHeight+1, val, cHeight+5, WHITE);
    display.fillTriangle(64, cHeight+5, 62, cHeight+7, 66, cHeight+7, WHITE);
    display.drawPixel(val-1, cHeight+3, BLACK);
    display.drawPixel(val+1, cHeight+3, BLACK);
  }
}

코드가 좀 길죠? 아무래도 표현해야 할 요소가 많기 때문인데요, 역시 선택상태를 표시하기 위하여 두벌로 코딩이 되었습니다. 선택 상태를 만드실 필요가 없다면 else 아래쪽만 코딩을 해주셔도 표현이 가능합니다.

 

구현된 화면을 한번 보실까요?

아두이노 OLED 밸런스 바 코드 테스트

가운데 세모가 중심의 위치를 나타내고 세로로 얇은 막대가 현재 입력 받는 val 에 해당되는 위치가 됩니다. 물론 반대로 표시하는 것도 조금만 코드를 수정하면 가능하겠죠?

 

 

이렇게 하여 간단하게 아두이노를 이용하여 초소형 OLED 를 구동하는 것을 보여드렸습니다. 전혀 어렵지 않으니 바로 도전해 보시기 바랍니다. 

OLED 가 각종 정보를 표시하는데 생각보다 속도가 많이 느리므로 아두이노 자체 기능이 지연될 수 있습니다. realtime clock 과 같은 실제 시계 등을 만들기 위하여는 위에 표시한 방식과는 다르게 구현을 해야 될 것 같습니다.

 

궁금하신 것은 뎃글로 문의 해 주시기 바랍니다.

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면  클릭!!  부탁드려요~


 

 

2020/03/23 - [DIY/Arduino] - Arduino(아두이노) 무작정 시작하기

2019/12/23 - [DIY/RC] - 아두이노를 이용한 RC 카 만들기 2

2019/11/10 - [DIY/Arduino] - [DIY] 아두이노로 만능 (통합) 리모콘 만들기 1/3

2019/06/27 - [DIY/Arduino] - 아두이노를 이용한 간단한 화분 자동 물주기 시스템

2019/10/29 - [DIY/Arduino] - [DIY] 아두이노를 이용한 수경재배 시스템

반응형
반응형

가끔 모니터 가로세로 크기가 궁금할 때가 있습니다. 휴대폰 구입 전 화면 크기를 정확히 알고 싶은 경우도 있지요.

그런데 이상하게 화면의 가로세로 크기에 대하여 mm 로 설명이 나오지 않는 경우가 많죠. 책상과 모니터를 새로 사기 위하여 크기가 궁금하다면 그런데 어디에도 정보가 없다면 모니터를 구입하여 자로 재는 수밖에 없습니다. -_-;;

 

픽셀 피치라던가 DPI, 몇인치 인지, 가로세로 최대 해상도 뭐 이런 정보들은 많은데요 막상 실제 모니터 LCD 의 가로, 세로의 길이를 mm 나 cm 로 알려주는 곳은 많지 않죠.

이런 분들을 위해 엑셀로 간단하게 계산 하는 수식을 하나 올려드리겠습니다. 

아래와 같이 셀의 정보를 설정합니다.

B4 : 인치 수 입력 (ex. 21)
E4 : 가로 해상도 입력 (1920)
F4 : 세로 해상도 입력 (1080)

가로크기 mm (아래 수식을 원하는 가로 길이 셀에 넣으세요)
= 25.4*(B4*E4)/SQRT((E4*E4)+(F4*F4))

세로크기 mm (아래 수식을 원하는 세로 길이 셀에 넣으세요)
= 25.4*(B4*F4)/SQRT((E4*E4)+(F4*F4))

저는 C4, D4 셀에 구하고자 하는 위치를 정한뒤 위의 수식을 넣었습니다.

1920 1080 해상도의 24 인치 모니터의 LCD 크기는 아래와 같습니다. 

회색칸으로 표시된 곳에 크기가 잘 나왔죠? 

흰색 칸에 위에 말씀드린 정보만 입력하면 가로 세로 크기를 정확하게 보여줍니다.

VBA 가 아닌 엑셀 함수이므로 값을 입력하는 즉시 크기를 알 수 있습니다.

휴대폰의 액정크기를 확인하는데 사용하셔도 됩니다.

해상도와 인치수만 안다면 어떤 LCD에도 다 적용되니 커스텀 LCD 모니터 제작이나 뭐 다른 궁금한 곳에 사용해도 다 됩니다.

 

유용하게 사용하시기 바랍니다~ ^^

 

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

2020/04/03 - [DIY] - LEGO 블럭을 이용한 전자담배 기기 직접 제작하기

 

LEGO 블럭을 이용한 전자담배 기기 직접 제작하기

전자담배를 피는 입장에서 늘 불안한건 사용중인 전자담배를 어딘가에 놓고 오거나 고장나는 등의 이유로 대체할 기계가 없는 순간이 왔을 때 인것 같습니다. 전자담배는 연초 담배를 대신할 ��

diy-dev-design.tistory.com

2020/05/17 - [DIY] - [재활용] 고장난 LED 바 수리하기 > 화장대 조명 만들기

 

[재활용] 고장난 LED 바 수리하기 > 화장대 조명 만들기

저의 보물창고 바로 폐 배터리, 형광등 수거함 입니다. 지나는 길에 기웃거려 보니 LED 바가 버려진게 있더군요. LED 바 금액 자체가 비싼건 아니지만 사실 일부러 돈주고 살만큼 효과적인 조명기�

diy-dev-design.tistory.com

2020/01/08 - [DEV/c#] - Excel Automate, 엑셀 자동화 프로그램

 

Excel Automate, 엑셀 자동화 프로그램

필자의 블로그 명칭을 보고 이미 알고 계신분이 있을지 모르겠지만 사실 저는 디자이너 입니다. 하지만 블로그에 맨 개발 관련 된 이야기만 적고 있지요. 음... 그런데 실제로 회사에서도 저는 ��

diy-dev-design.tistory.com

 

반응형
반응형

이번에 소개해드릴 부분은 시트간 데이터를 비교하는 방법입니다.

VBA 로 뭔가를 하게되면서 가장 유용하게 많이 사용하는 것 중 하나죠.

예를 들면 Sheet1 에 어떤 데이터 리스트가 있고 Sheet2 에 똑같은 유형의 업데이트 된 다른 리스트가 있다고 했을 때 두 데이터를 비교해서 차이가 있는 것을 마킹한다던가 특정 값이 더 높은 데이터를 찾는다든가 아니면 B 의 시트에서 A에 공통으로 있는 항목만 찾는 등의 작업을 할때 아주 유용한 개발 내용입니다. 이런 류의 작업을 눈으로 사람이 한다는건 데이터의 양에 따라 다르기는 하지만 데이터가 1000개 또는 10000개가 넘는다면 정말 말도 안되는 작업이죠.

 

일단 기본 개념은 아래와 같습니다.

  • 변수 선언
    • 두개의 시트를 지정할 변수를 선언한다. (worksheet)
      • 만약 두개의 시트가 각각 다른 엑셀문서에 존재한다면 엑셀 문서지정을 위한 변수를 선언한다. (workbook)
    • 두 시트에 비교해야할 영역을 설정하기 위한 변수를 각각 선언한다. (range)
  • 실제 코드 부분
    • 엑셀문서와 시트를 설정한다
    • 각각의 영역을 설정한다
    • A 영역을 반복하여 도는 For 구분을 만든다
      • A 영역을 한번 반복하는 동안 B 영역을 반복하는 For 구분을 삽입한다.
      • 필요한 조건문을 작성하여 조건에 해당되는 경우 특정 액션을 수행한다.

이런 식이 됩니다.

처음 보시는 분은 어리둥절 할 수도 있지만 막상 몇번 코딩을 해보면 아주 간단한 구문 입니다.

아래 간단한 예제를 한번 볼까요?

 

하나의 엑셀파일에 있는 두개의 시트를 비교하는 방법입니다.

Sub check()

    Dim shtA As Worksheet
    Dim shtB As Worksheet
    
    Dim rngA As Range
    Dim rngB As Range

    Set shtA = Worksheets("Sheet1") '워크시트의 이름을 넣으세요'
    Set shtB = Worksheets("Sheet2") '워크시트의 이름을 넣으세요'
    
    Set rngA = shtA.Range("A2") '첫번째 시트의 비교할 시작행의 번호를 넣으세요'
    Set rngA = shtA.Range(rngA, rngA.End(xlDown)) '세로로 데이터가 있는 끝까지 자동으로 설정합니다'
        
    Set rngB = shtB.Range("A2") '두번째 시트의 비교할 시작행의 번호를 넣으세요'
    Set rngB = shtB.Range(rngB, rngB.End(xlDown)) '세로로 데이터가 있는 끝까지 자동으로 설정합니다'
    
    For Each c In rngA
        c.Interior.Color = xlNone '초기 색상을 없애 줍니다'        
        For Each d In rngB
        	if c.value = d.value then '해당되는 칸의 값이 같을 경우'
            	
                ' 오른쪽 바로 옆칸의 값이 다를경우'
                if c.offset(0,1).value <> d.offset(0,1).value then
                	c.Interior.Color = RGB(255,0,0) '빨간색으로 셀을 색칠한다'
                end if
                
                '동일한 값이 한번이 있고 넘기려면 반복을 끝낸다'
                Exit For                
            end if        
        next d        
    Next c
    
End Sub

간단하지요?

반복문안에서 다시 반복을 하면서 값을 찾아내는 방법입니다. 간단하지만 아주 유용한 방법입니다.

 

 

 

다른 엑셀파일에 있는 정보를 비교하려면?

만약 두개의 다른 엑셀 시트에 있는 시트를 비교해야 한다면 위에서 소개한 코드에 워크북을 설정해주는 부분만 추가하면 됩니다.

워크북은 아래와 같이 설정하게 되죠.

Sub check()
	
    Dim bookA as Workbook '워크북 변수'
    Dim bookB as Workbook '워크북 변수'
    
    Dim shtA As Worksheet
    Dim shtB As Worksheet
    
    Dim rngA As Range
    Dim rngB As Range
    
    set bookA = Workbooks("firstExcelFile.xlsx")'첫번째 엑셀 파일명을 입력, 확장자 포함'
    set bookB = Workbooks("secondExcelFile.xlsx")'두번째 엑셀 파일명을 입력, 확장자 포함'
    
    set shtA = bookA.Worksheets("Sheet1")
    set shtB = bookB.Worksheets("Sheet2")
    
    ' 이하 동일 '
    

 

역시 간단하죠?

저런 방식으로 두개의 엑셀 파일 또는 그 이상의 엑셀 파일을 지정하여 값을 비교할 수 있습니다.

 

 

다른 시트의 값을 찾아 원본 시트에 동일한 명칭에 가져오는 방법

만약 반복 구문을 도는 동안 두번째 데이터의 값에서 동일한 명칭을 찾아 그에 해당되는 값을 첫번째 시트에 넣는다면 아래와 같이 하면 됩니다. 실제로 찾아서 값을 넣은 개수도 확인할 수 있도록 해보겠습니다. 

 

Sub check()

    Dim shtA As Worksheet
    Dim shtB As Worksheet
    
    Dim rngA As Range
    Dim rngB As Range
	
    Dim matchingNumber as integer '매칭된 대상 개수 파악용'
    
    Set shtA = Worksheets("Sheet1") '워크시트의 이름을 넣으세요'
    Set shtB = Worksheets("Sheet2") '워크시트의 이름을 넣으세요'
    
    Set rngA = shtA.Range("A2") '첫번째 시트의 비교할 시작행의 번호를 넣으세요'
    If Len(rngA.Offset(1, 0)) Then ' 만약 시트에 데이터가 딱 한줄일 경우 아래쪽까지 range 를 설정하지 않는다.'
    	Set rngA = shtA.Range(rngA, rngA.End(xlDown)) '세로로 데이터가 있는 끝까지 자동으로 설정합니다'
    end if
    
    Set rngB = shtB.Range("A2") '두번째 시트의 비교할 시작행의 번호를 넣으세요'
    if  Len(rngB.Offset(1, 0)) Then ' 만약 시트에 데이터가 딱 한줄일 경우 아래쪽까지 range 를 설정하지 않는다.'
    	Set rngB = shtB.Range(rngB, rngB.End(xlDown)) '세로로 데이터가 있는 끝까지 자동으로 설정합니다'
    end if
    
    For Each c In rngA
        c.Interior.Color = xlNone '초기 색상을 없애 줍니다'        
        For Each d In rngB
        	if c.value = d.value then '해당되는 칸의 값이 같을 경우'
            	'명칭이 같은 정보의 바로 옆 같의 값을 복제하여 가져온다'
                c.offset(0,1).value = d.offset(0,1).value
                
                matchingNumber = matchingNumber + 1
                
                '동일한 값이 한번이라도 있는 경우 바로 종료 하려면 아래 주석을 풀어주세요'
                'Exit For    '            
            end if        
        next d        
    Next c
    
    MsgBox("매칭된 개수는 " & matchingNumber & " 입니다.")
    
End Sub

이렇게 하면 다른시트에서 비교한뒤 동인한 명칭을 갖는 행의 값을 가져오면서 가져온 개수를 알 수 있습니다.

 

참 쉽죠?

 

궁금하거나 다른 문의사항이 있으면 뎃글로 남겨주시면 감사하겠습니다.

감사합니다.

본 포스트를 보신 후 
도움이 되었다 생각되시면 공감 클릭!!  부탁드려요~

 

 

2019/06/01 - [DEV/VBA] - 엑셀 VBA 시작하기

2019/08/01 - [DEV/VBA] - [vba] 현재 엑셀 시트의 선택한 영역을 vba 스크립트에서 가져오기

2019/07/12 - [DEV/VBA] - [vba] For 구문 이용하기와 offset 사용 해 보기

2019/08/30 - [DEV/VBA] - [VBA]RGB 색상 값이 들어있는 셀에 셀 색상 지정하기

2019/09/02 - [DEV/VBA] - [vba] 엑셀 시트의 모든 색상의 셀 색상 제거하기

2019/10/24 - [DEV/VBA] - [vba] 버튼(단추)를 이용하여 스크립트 실행하기

 

 

반응형
반응형

오늘은 간단하게 직접 DIY에 사용할 드레멜을 만들어 볼 계획입니다.

드레멜 같은 고속 전동공구가 있는 것과 없는것은 DIY 과정에 있어 하늘과 땅 차이라 할 수 있을 만큼 있으면 매우 편리한 공구 입니다.

직접 구입해서 사용하는 것도 좋겠지만 오늘은 버려진 청소기를 분해하여 얻은 모터를 이용하여 드레멜을 제작해 볼 계획입니다.

 

필요한 재료

  • 버려진 핸디형 진공 청소기
  • 미니 드릴 척 (알리익스프레스, 본인의 모터 샤프트의 직경에 맞는 제품을 구입해야 합니다.)
  • 재활용 18650 배터리 2개
  • DC-DC 컨버터, 전압 강하용
  • 104k 가변 저항 (속도 조절용)
  • 전원 스위치
  • 18650 배터리 케이스

 

재료가 많이 필요치도 않습니다. 모터와 18650 배터리를 제외하면 나머지 부품은 다 합쳐야 5000원이 되지 않죠. 오천원도 안되는 금액에 무선 드레멜을 하나 장만 한다면 괜찮지 않습니까?

 

어쨌든 부품도 몇개 없고 하니 제작도 간단 합니다. 배터리 케이스의 + - 선을 스위치와 모터, 보드등의 각 부분에 납땜해주는게 전부입니다.

 

나머지는 본드로 고정하고 전선을 연결하면 되는 것이지요.

드레멜로 사용하기 위하여 반드시 필요한 부품이 있습니다. 바로 비트를 고정해주는 척(chuck) 이 있어야 합니다.

앞쪽에 드릴비트나 원형톱, 각종 연마용 비트를 연결하기 위하여 사용되는 부품인데요, 모터 샤프트의 직경을 측정한 뒤 알리에서 적당한 제품을 구입하였습니다.

알리에서 구입한 미니 드릴 척

참으로 저렴합니다..

 

모터 샤프트에 끼우로 육각렌치로 번데기 볼트를 조여주면 됩니다.

 

 

 

DC 브러시 모터의 속도 조절은 여러가지 방법이 있겠지만 간단하게 주어지는 전압을 조정하는 것으로 조정이 가능합니다. 전용 드라이버가 있다면 좀더 유연하게 사용이 가능하겠지만 드레멜처럼 간단한 공구에는 사실 그런것 필요 없습니다. 

저는 그냥 단순하게 전압 강하용 보드를 하나 붙여 주었습니다.

속도 조절을 위한 전압 조절 보드와 보드에 있는 가변 저항을 떼어내고 볼륨 타입 가변저항을 달아 좀더 전압 조작을 쉽게 해주는 정도가 전부 입니다.

DC-DC 컨버터는 아래의 제품을 이용했습니다.

알리에서 구입한 DC-DC 컨버터 3A 까지 사용 가능

 

저렴하죠? 입력단에 DC전압을 걸어주고 위에 보이는 파란색 가변저항을 돌려 주게되면 출력단에 낮아진 전압이 출력됩니다. 저의 경우 7.4V 전압을 걸어주게 되면 출력은 0 ~ 6V 정도의 출력이  나오더군요. 약간 부족한 감은 있긴 하지만 너무 강해도 위험할 수 있어 적당히 타협하고 사용중입니다. 입력 전압을 높이면 좀더 훌륭할 것 같긴 하지만 배터리 3개가 들어가는 케이스도 없고 테스트 해보니 사용에 큰 문제는 없을 듯 하여 그냥 제작하기로 합니다.

참고로 완성 사진에는 저 파란색 가변저항을 대신하여 104K 볼륨용 가변저항을 이용하여 속도 조절을 하였습니다. 핀은 순서대로 세개를 차례로 연결하면 되는데 방향이 바뀌어도 큰 상관은 없습니다. 시계 방향으로 돌리면 속도가 올라가는 것이 바뀌는 것 뿐 다른 차이는 없습니다.

 

 

완성된 사진을 볼까요?

 

전체 사진 - 각 핀이 노출되는 부분은 절연을 해주었다

 

옆모습 - 좀 이상한거 같지만 그립감은 좋음
배터리는 저번에 주워온 외장 배터리를 분해하여 얻은 것을 사용하였다.
손으로 잡은 모습, 배터리와 모터의 발열체크가 자동으로 된다.

 

배터리 부분을 위의 사진과 같이 잡고 사용하면 되는데요, 배터리와 모터의 발열 체크를 자동으로 할 수 있습니다.

좀 사용하다 보면 손이 따끈따끈해지거든요 ㅋ

아래쪽의 가변 저항을 돌려주면 모터의 속도가 변합니다. 전압이 조금 부족하여 완전 초고속은 아니지만 그만큼 안전하게 오랜 시간을 사용할 수 있을 것이라 생각해 봅니다.

 

 

제 블로그에 보면 자주 등장하는 소재가 바로 재활용, 재사용, 페품활용 등에 대한 주제 입니다. 여러분 환경을 위하여 우리가 사용했던 물건 들을 버리기 전에 한번 더 아이디어를 발휘하여 새로운 생명을 부여하는 것은 어떨까요?

 

이렇게 초간단 DIY 드레멜 제작기를 마칩니다.

 

2020/03/03 - [DIY] - [재활용] 버려진 외장배터리에서 18650 적출하기, 부활시키기

 

[재활용] 버려진 외장배터리에서 18650 적출하기, 부활시키기

재활용 쓰래기장은 저와 같은 부류의 사람에게는 보물 창고 입니다. 오늘도 음식 쓰레기 버리러 가는 길에 폐 배터리 수거함을 슬쩍 보니 외장 배터리 2개가 버려져 있더군요. 게다가 하나는 샤�

diy-dev-design.tistory.com

 

2020/03/21 - [DIY] - RC카 베터리로 아답터 없이 노트북 켜기

 

RC카 베터리로 아답터 없이 노트북 켜기

노트북을 오래 사용하다 보니 배터리도 맛이 갔고 사실상 데스크톱 처럼 사용하고 있습니다. 아답터 없이는 1분도 사용이 불가능한 수준이어서 아얘 빼버린지 오래입니다. 사실상 데스크톱이죠

diy-dev-design.tistory.com

 

2019/12/27 - [DIY/RC] - Storm Thunder 용 2S1P 7.4v 18650 배터리 DIY

 

Storm Thunder 용 2S1P 7.4v 18650 배터리 DIY

RC 카를 가지고 놀다가 중간에 배터리가 떨어지면 정말 김이 팍 샙니다. 항상 잊지 말고 챙겨야 할게 바로 배터리인데요. 이 배터리가 항상 계륵 같은 존재 입니다. 내차에 맞는 배터리를 구입하�

diy-dev-design.tistory.com

 

2019/08/20 - [DIY] - [DIY] DC 전압/전류량계 튜닝 하기

 

[DIY] DC 전압/전류량계 튜닝 하기

알리에서 DC 전류량계를 하나 구입하였습니다. 전자 제품 쪽 DIY 를 하다보면 현재 만들어진 제품이 어느정도의 전류를 소모하는지 궁금할때가 있는데요. 불행히도 제가 가지고 있는 테스터기에�

diy-dev-design.tistory.com

 

 

반응형
반응형

저의 보물창고

바로 폐 배터리, 형광등 수거함 입니다.

폐형광등, 배터리 수거함

지나는 길에 기웃거려 보니 LED 바가 버려진게 있더군요.

LED 바 금액 자체가 비싼건 아니지만 사실 일부러 돈주고 살만큼 효과적인 조명기구는 아니죠. LED는 마치 평생 쓸 수 있는 조명기구 인 것 처럼 홍보하지만 생각보다 고장도 잦은 편입니다. 특히 대량의 LED 가 직렬로 연결된 경우는 LED 하나 또는 몇개만 고장나도 전체 조명이 안들어 오는 경우도 흔합니다.

오늘 주워온 LED 바 역시 몇개의 LED 가 고장 났는지 불이 들어오지 않는 상태 였습니다. 

케이스가 있는 LED 바
3구 소켓이 꼽히는 자리, 참고로 난 저 소켓은 없었다.

 

 

 

 

고장난 LED 바 수리하기

먼저 커버를 탈거하고 상태를 확인해 봅니다.

아래쪽 걸림부를 눌러서 빼내면 쉽게 탈거 가능
LED 바의 제품번호가 보이네요. 2835 LED 를 사용한 것 같습니다. 전체 10 W 인가 보네요.
아래쪽에 보이는건 안정기 입니다. 필요 없으므로 버립니다.

 

파워서플라이 전압을 3V 정도로 낮춘다음 LED 가 살아있는지 테스트를 진행합니다.

 

3V 전원을 한군데에 연결했는데 LED 4개가 켜졌다?

오.. 쏴라있네~

 

음... 

LED 하나만 연결해도 4개가 한꺼번에 불이 켜지는 군요. 아마 4개씩 병렬로 연결되어 있고 4개 한세트로 구성된 LED 들이 직렬로 연결되어 있는 것으로 보여집니다.

제가 컨트롤 하기 편한 전압은 12V 이므로 12개씩 끊어서 사용하기로 합니다.

 

4개씩 테스트를 하며 표시를 해두었습니다. 

중간중간 고장난 LED가 없는 구간으로 4개씩 끊어가며 정상 동작하는 LED 에 표시를 해보았습니다.

 

 

 

 

 

12V 용 LED bar 로 개조하기

LED 바를 잘라서 12V 용으로 구성해 보았습니다.

4개가 1조로 구성되며 4세트가 묶이면 12V 로 동작이 가능하다

 

고장난 LED 는 12개 한세트가 만들어 지지 않는 부분에서 떼어내어 고장난 부분에 교체를 진행합니다. 동일한 스펙의 SMD LED 칩이 있었다면 본래의 크기로 수리가 가능하겠지만 가지고 있는 부품이 없으므로 12개가 한세트가 되지 못하는 부분에서 떼어내어 세트를 맞추어 보도록 하였습니다.

 

SMD 타입 LED 는 매우 약한 부품이므로 가능한 조심스럽게 다루어주어야 합니다. 가장 안전한 방법은 열풍기를 이용하여 온도를 올려 납이 녹으면 핀셋 같은 도구로 살살 밀어내서 떼어내는 방법이 있습니다. 약간 시간이 걸리고 귀찮은 방법이지만 가장 안전하고 깨끗하게 LED 를 떼어낼 수 있는 방법이죠.

알리에서 구입한 열풍기가 열일 중... 잘 안녹는다. (사실 이건 붙이는 사진임)
결국 LED 바에서 LED를 떼어내는데 성공
정상LED로 교체 완료한 사진, 좀 삐뚤빼뚤 하지만 동작은 잘 된다.

 

 

만약 열풍기가 없다면 LED 양쪽에 납을 충분히 녹여서 붙여준뒤 인두로 양쪽을 번갈아 가며 녹여주면서 핀셋으로 살짝 밀어주면 LED가 쉽게 이탈이 됩니다. 다만 이렇게 하면 LED 단자 부분에 납이 많이 뭍게되어 반듯하게 붙이기가 좀 어렵다는 단점이 있습니다만 손쉽게 SMD 부품을 떼어낼 수 있는 방법이니 참고하세요. 납 흡수용 제품이 있다면 납을 빨아들인 후 사용을 하시는 것을 추천 드립니다.

12V 용으로 구성된 재생 LED 바

어쨌든 12V 용 LED 바 7개가 만들어 졌습니다.

 

이 7개의 LED 바 중 6개를 이용하여 이제 아내를 위하여 화장대 조명을 만들 계획입니다.

 

 

 

 

화장대 조명으로 되살아날 지어다~

케이스를 길이에 맞게 잘라 줍니다. 케이스는 알루미늄이므로 어렵지 않게 절단이 가능하지만 소음 및 절단으로 인한 가루가 많이 날리게 되므로 아내의 눈치를 보며 최대한 보이지 않는 곳에서 작업을 합니다.

직접 만든 드레멜로 잘라 주었다.

드레멜이나 전동 톱이 있다면 좀더 쉽게 자를수 있겠지요. 저는 버려진 핸디 청소기에서 적출한 모터를 이용하여 간단한 드레멜을 만들어 사용중에 있습니다. 알리에서 약간의 부품을 구입한다면 아주 쉽게 속도 조절이 되는 드레멜을 만드는 것이 가능합니다.

 

만들어 놓은 LED 바는 3개씩 병렬로 연결을 해 줍니다.

 

주워온 2개의 LED 바가 약간 PCB 레이아웃이 달라 배선도 약간 차이가 있습니다. 하나는 - 극은 시작부분과 끝부분이 연결이 되어 있었지만 다른 하나는 전체가 직렬로 연결된 형태더군요. 배선은 아래 이미지를 참고하세요.

각각의 LED 바를 병렬로 연결해줍니다. 직렬, 병렬 아시죠?

 

요렇게 3개씩 LED 바를 넣어 준 뒤 12V 아답터를 이용하여 작동 테스트를 합니다.

오호 영롱한 불빛

 

끝으로 원래 있던 끝부분 마개에 소켓을 달아 주고 마무리를 합니다. 

 

원래 3pin 소켓이지만 양쪽의 두개만 실제로는 사용하였다.
LED 바와도 연결, 그라운드쪽은 케이스 몸통을 통과해 선을 끌어내어 주었다.
뚜껑까지 닫고 수리완료한 LED 바 동작 테스트. 굳!

 

12V 아답터 끝에는 스위치를 달고 두개로 선을 나누어 숫놈 잭을 달아 LED 바 양쪽에 연결을 해주었습니다.

 

쨔짠~

12V 아답터와 LED바 2개가 생겼다. ㅋㅋ 새것 같네
불도 잘 들어오는지 최종 테스트.

 

 

 

 

화장대에 조명 설치하기

화장대로 가봅시다.

 

우리 곰돌 군이 특별 출연해 주셨습니다.

턱밑에 그림자 작렬, 사진은 뽀샤시 한 편이다. 실제로는 어두컴컴

화장대에 앉아서 거울을 보면 얼굴이 침침해 보이고 그림자 때문에 그늘이 드리워져 보기가 좋지 않습니다. 이놈에 화장대 조명이 E14 타입의 조명인데요, LED로 교체하려고 보니 출력이 높은 조명이 당췌 보이지가 않아 어두 컴컴 합니다.

 

자 그럼 제작한 LED 바를 설지해 볼까요?

 

워낙 가볍기 때문에 3M 양면 테잎을 조금씩 잘라 3군데에 붙여 모서리에 고정 해 주었습니다.

 

자 설지후 사진을 한번 볼까요?

 

샤방샤방~ 그림자 없이 환한 얼굴

ㅋㅋㅋ 대성공입니다.

 

완전 뽀샤시 하네요.

사진은 조명 밝기 때문에 약간 어둡게 나왔지만 실제로는 아주 환하고 예쁘게 보입니다.

 

 

자 오늘도 보람찬 하루였습니다. 물론 짬짬히 작업하느라 며칠 걸리기는 했습니다만 어렵지 않은 작업이고 버려진 물건을 재사용하여 쓸모 있는 물건을 만들어 사용하는 데에 따른 보람도 컸던 작업이었습니다.

요즘 사람들은 너무 쉽게 물건을 버리는 것 같습니다. 매주 버려지는 어마어마한 쓰레기와 전자제품으로 인해 지구가 걱정될 수준이지요.. 버리기 전에 조금만 살펴보고 고쳐서 사용한다면 얼마든지 가치가 있는 것들이 있다는 것을 잊지 말아주세요~

 

버려진 LED 바를 수리하여 화장대 조명으로 재탄생시키다

 

고장난 LED 바 고치기.. 이만 마치겠습니다.

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 

 

2020/04/03 - [DIY] - LEGO 블럭을 이용한 전자담배 기기 직접 제작하기

 

LEGO 블럭을 이용한 전자담배 기기 직접 제작하기

전자담배를 피는 입장에서 늘 불안한건 사용중인 전자담배를 어딘가에 놓고 오거나 고장나는 등의 이유로 대체할 기계가 없는 순간이 왔을 때 인것 같습니다. 전자담배는 연초 담배를 대신할 ��

diy-dev-design.tistory.com

2020/03/03 - [DIY] - [재활용] 버려진 외장배터리에서 18650 적출하기, 부활시키기

 

[재활용] 버려진 외장배터리에서 18650 적출하기, 부활시키기

재활용 쓰래기장은 저와 같은 부류의 사람에게는 보물 창고 입니다. 오늘도 음식 쓰레기 버리러 가는 길에 폐 배터리 수거함을 슬쩍 보니 외장 배터리 2개가 버려져 있더군요. 게다가 하나는 샤�

diy-dev-design.tistory.com

2020/03/10 - [DIY] - [수리기] 닌텐도 Wii 리모컨 고장 수리. #간단 #초보 가능

 

[수리기] 닌텐도 Wii 리모컨 고장 수리. #간단 #초보 가능

저희 집에 단연 없어서는 안될 1순위 가전 제품중의 하나가 바로 닌텐도 Wii 입니다. 아이들이 게임을 하는 동안도 몸을 사용하며 게임 자체보다는 가족들이나 친구들과 많은 이야기를 나누고 웃

diy-dev-design.tistory.com

2019/11/05 - [DIY] - [repair] 고장난 블루투스 스피커 고치기 - 피스넷 하이엔드

 

[repair] 고장난 블루투스 스피커 고치기 - 피스넷 하이엔드

맑은 하늘과 푸르른 잔디밭, 공원에 누워 따사로운 햇살을 받으며 누워 있을때 필요한 건 모다? 바로 블루투스 스피커 되시겠습니다. 2017년도 쯤이었나요.. 보스 사운드링크 미니와 피스넷 하이�

diy-dev-design.tistory.com

 

반응형
반응형

Max Script 를 이용하여 무엇인가를 하려면 필수 요소라고 할 수 있는 것 중의 하나가 개체를 선택하거나 지정하는 방법입니다. 여기서 개체는 3D Scene 안의 오브젝트, 스플라인, 헬퍼 등과 같은 사용자가 직접 선택할 수 있는 개체를 말합니다. 물론 오늘 강좌에서의 선택은 마우스를 클릭하여 선택하는 select의 개념만을 말하는 것은 아닙니다. 

예를 들어 A 라는 모델링 개체의 스케일을 2배로 변경한다고 했을 때 일반적인 사용자의 입장에서는 마우스로 해당 모델링을 클릭하거나 레이어 리스트에서 선택하거나 개체 리스트에서 해당 모델링을 선택 (select) 한 뒤 속성 등을 변경하게 되는데요. 스크립트에서는 굳이 select 의 상태를 만들 필요는 없습니다. 물론 동일하게 select 상태를 만들 수 있긴 하지만 성능 관점에서는 굳이 select 상태여야 할 필요가 없다면 바로 진행을 하면 됩니다.

참고로 본 강좌 진행을 위해 알아야 할 것은 이제부터는 개체를 노드(Node)라고 부를 것 입니다. 3DS MAX Script 에서 공식적으로 개체를 Node 라고 지정하였기 때문이고요. 레퍼런스 등을 보실때도 그렇게 이해하고 계신 것이 혼선이 없을 것 입니다.

우선 기본적인 방식을 살펴 보겠습니다.

  • selection 상태를 만드는 방법
  • 현재 선택된 개체를 가져오는 방법
  • selection 상태가 아닌 상태에서 개체를 지정하는 방법
    • 지정된 이름을 기준으로 지정하는 방법 (단수 개체)
    • 이름의 일부를 기준으로 지정하는 방법 (복수 개체)
    • 레이어 단위로 지정하는 방법
    • 모델링 클래스 단위로 지정하는 방법 (geometry, spline, ...)

 

이런 것들을 소개해 드릴 까 합니다.

이번 강좌의 내용만 잘 이해하셔도 3D Scene 내의 대부분의 개체를 선택하거나 지정하는 것이 가능합니다.

 

 

Selection 상태를 만드는 방법

먼저 기본형은 Select <Node> 의 형태로 되어 있습니다.

Node 는 $ 표시를 붙인 뒤에 개체의 이름을 적어주면 해당 노드를 지정하게 됩니다.

만약 $Box01 이라 하면 "Box01" 이라는 이름을 갖는 노드(개체)를 지칭하게 됩니다. 이녀석을 선택 (Select) 상태로 만드시려면 아래와 같은 방법을 사용하면됩니다.

Select $Box01

요 코드를 스크립트 에디터 또는 리스너(F11) 창 아래 하얀색 창에 적어주고 실행하면 "Box01" 이라는 이름을 갖는 모델링이 선택된 상태가 됩니다. 물론 Box01 이라는 개체가 존재해야 하지요.

A 라는 오브젝트를 선택한 뒤 B 라는 오브젝트를 추가로 선택하고 싶으신 경우 아래와 같이 코드를 작성하시면 됩니다.

select $Box01
selectmore $Box02

selectmore 라는 명령어를 이용하여 셀렉션을 추가할 수 있습니다.

 

 

 

현재 선택된 개체를 가져오는 방법

코드 작성을 하다보면 모든 기능이 시작부터 끝까지 자동화가 어려운 경우가 있습니다. 그런 경우 사용자에 의해 특정 개체를 선택한 뒤 부터 코드가 실행이 된다거나 하는 경우가 종종 있을 수 있습니다. 이럴때 현재 선택된 개체를 가져오는 스크립트가 필요한데요. 바로 아래와 같이 사용하시면 됩니다.

myObject = getCurrentSelection()

이렇게 하면 현재 선택된 개체들을 myObject 라는 변수로 가져올 수 있는데요. 아래와 같이 실재로 사용할 수 있습니다.

myObject = getCurrentSelection()

for obj in myObject do
(
	-- 선택된 개체에 대하여 수행해야 하는 코드를 작성한다.
    print (obj.name)
)

-- 또는

for i = 1 to myObject.count do
(
	obj = myObject[i]
    print (obj.name)
)

 


selection 상태가 아닌 상태에서 개체를 지정하는 방법

스크립트를 이용하여 자동화 업무를 하다보면 항상 선택이라는 액션이 발생되는 것은 아닙니다. 선택이라는 액션이 이루어 지는동안 속도가 많이 저하되기 때문에 자동화의 대상이 많을 수록 선택 과 같은 액션은 생략하는 것이 좋습니다. 개체가 선택될 때 마다 맥스에서는 UI 를 업데이트 해주어야 하는데요, 이때 성능이 많이 느려지게 됩니다. 아래의 내용에서는 선택 과정 없이 특정 개체에 직접 접근하는 간단한 사례를 설명하겠습니다.

 

지정된 이름을 기준으로 지정하는 방법 (단수 개체)

오브젝트의 이름을 알고 있는 경우 가장 손쉽게 개체를 지정할 수 있습니다. 보통은 코드 작성의 편의를 위하여 변수에 담아서 사용하는것이 일반적인 방법입니다. 위에 select 예제와 유사한 방식으로 지정하게 됩니다.

obj = $Box01
print (obj.name)

Box01 이라는 모델링 개체의 이름을 프린트 창에 출력하는 코드죠. 위와 같이 첫줄을 적어주면 obj 라는 개체가 갖는 다양한 속성들이나 명령들을 적용할 수 있게 됩니다. 예를 들어 해당 개체가 Box 라는 class 인 경우 아래와 같이 속성을 변경할 수 있게 됩니다.

obj = $Box01
print (obj.name)

-- 박스의 크기를 현재의 두배로 만들자
obj.width = obj.width * 2
obj.height = obj.height * 2
obj.length = obj.length * 2

-- 높이를 50 만큼 올려보자
obj.pos.z += 50 

 

요런식으로 사용하는 것이지요.

 

 

 

이름의 일부를 기준으로 지정하는 방법 (복수 개체)

이번에는 이름의 일부분만을 이용하여 개체를 지정하는 방법을 소개해보겠습니다.

예를 들어 "box01" , "box02",... "box99" 이런식으로 동일한 이름 구조를 갖는 복수개의 개체가 있는 경우에 해당됩니다. 

objs = execute ("$box*")

print objs.count

위에 보시면 execute 라는 명령어가 있는데요. 뒤쪽에 나오는 문자열을 실행 가능한 문장처럼 해석하는 것입니다. 문자열에는 "$box*" 이라는 형태로 씌어져 있는데 여기서 * 은 와일드 카드라고 불리는 글자 입니다. 다시말하면 box + 어떤 것이든 해당되는 문자열 이라고 보시면 됩니다. scene 내에 box 로 시작하는 모든 개체가 objs 라는 변수에 담기는 것이죠. objs 는 배열형 변수가 되어 실제 사용하실 때는 아래와 같이 하나씩 꺼내 쓸 수 있게 됩니다.

objs = execute ("$box*")

print objs.count -- 전체 담겨져 있는 개체의 수를 출력한다

for o in objs do
(
	print o.name -- 개체의 이름을 출력한다.
    -- 여기서 개체별로 하고 싶은 액션을 작성하면 됩니다.
)

-- 다른 방법으로는
for i = 1 to objs.count do
(
	print objs[i].name

)

 

위와 같은 형식으로 각각의 개체에 대하여 어떤 작업을 하는 것이 가능합니다.

 

 

레이어 단위로 지정하는 방법

그럼 이번에는 레이어 단위로 개체를 지정하는 방법을 알아보겠습니다. 

3DS MAX 작업을 하다보면 레이어를 기준으로 개체를 생성하고 관리하는 경우가 종종 있습니다. 물론 레이어 창을 열어서 해당 레이어 안의 개체를 선택해 줄 수 있겠지만 레이어가 많은 경우, 또는 특정 레이어에 항상 같은 작업이 반복되는 경우 레이어의 개체를 지정하여 액션을 만들어 주는 것이 유용할 때가 있습니다.

레이어 이름을 아는 경우 아주 간단하게 적용이 가능합니다.

myLayer = LayerManager.getLayerFromName "myObjects"

myLayer.nodes &objs

for  o in objs do
(
	print o.name
)

myObjects 라는 이름을 갖는 레이어의 모든 개체를 objs 라는 변수에 담는 코드 입니다. 

레이어.nodes 라는 명령어가 뒤에 따라오는 참조형 변수에 해당 레이어의 모든 노드를 담아주는 기능을 수행합니다. 

참조형 변수는 반드시 & 기호를 붙여 주어야 하며 미리 정의를 해줄 필요는 없습니다.

 

 

모델링 클래스 단위로 지정하는 방법 (geometry, spline, ...)

scene 내에 위에서 정의한 방식 외에도 여러 레이어에 포함되어 있고 다양한 이름으로 존재하는 개체를 지정해야 하는 경우도 많이 있습니다. 예를 들면 scene 내의 모든 geometry 나 spline, helper 등을 선택해야 할 때도 있기 마련입니다.

이럴 때 사용할 수 있는 간단한 방법이 있습니다.

for  o in objects do
(
	print o.name
)

scene 내의 모든 오브젝트에 대한 처리가 가능하게 하는 간단한 방법입니다.

여기서 사용된  objects 와 같은 개체를 오브젝트 셋이라 부를수 있는데요 다음과 같은 종류가 있습니다.

objects  --all the objects
geometry  --the standard 3ds Max categories... 
lights
cameras
helpers
shapes
systems
spacewarps
selection  --the current selection

어떤 변수에 위에 해당되는 셋을 선언해주면 scene 내의 모든 해당 클래스의 개체가 대상이 됩니다.

아주 간단하지만 강력한 기능이죠.

 

이렇게 다양한 방법으로 화면 내의 개체를 지정하고 지정된 개체에 대하여 필요한 어떤 작업을 수행하는 것이 가능합니다. 어렵지 않죠?

다음번에는 어떤 조건을 붙여서 개체를 지정하거나 피하는 방법을 소개해 드리겠습니다.

 

그럼 이만~

2022.05.31 - [DEV/MAX SCRIPT] - [3ds max script] ray 에 대하여 알아보기

 

[3ds max script] ray 에 대하여 알아보기

가끔 아니 어쩌면 자주 3D 공간안에서 물체의 위치를 지정할때 이 물체가 저쪽에 닿는 면에 딱 위치하고 싶은데... 할때가 있죠? 예를 들면 나무나 돌덩이 이런걸 랜덤하게 막 생성한 다음 굴곡진

diy-dev-design.tistory.com

2019/12/11 - [DEV/MAX SCRIPT] - 3DS MAX 스크립트로 초간단 다이얼로그 창 , UI 버튼 만들기

 

3DS MAX 스크립트로 초간단 다이얼로그 창 , UI 버튼 만들기

3DS MAX 스트립트를 이용하여 스크립팅을 하기 시작하면 MAX 로 할 수 있는 일이 너무나 많고 빠르게 진행된다는 것을 알 수 있게 됩니다. 이 놀라운 기능들을 스크립트를 매번 실행시키는 것이 번�

diy-dev-design.tistory.com

 

2019/12/16 - [DEV/MAX SCRIPT] - 3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

 

3DS MAX SCRIPT 강좌?? 무작정 시작하기 - 디자이너 추천

개발이라 하면 두드러기가 나는 디자이너 들이 있습니다. 아니 대부분 그렇죠. 이글을 읽고 계신 본인도 그러하다면, 그런데 스크립트로 무언가를 하고 싶다면 어쩌겠습니까.. 배워야지요. 그래

diy-dev-design.tistory.com

 

반응형
반응형

집에 자전거가 무려 5대가 되어 버렸다. 친구녀석이 안타는 로드를 뜬금없이 가져와 타라고 주는 바람에 뭐 사양하고 자시고 할 틈도 없이 받게 되었습니다.

문제는 기존에 자전거가 4대였는데도 이미 둘데가 없었다는 것이었습니다.

복도는 무슨 자전거 포 마냥 자전거로 꽉 차있는데 이제는 사람이 지나다니기도 불편할 지경이 되었습니다.

 

그래서 이 자전거들을 조금이나마 공간을 덜 차지하게 보관할 수 있을까 고민을 하던 중 기막힌 아이디어가 떠올랐습니다.

 

준비물은 이제는 둘째 마저도 가지고 놀지 않는 큰 사이즈의 레고 (듀플로 라고도 하던가??) 암튼.. 다들 알만한 바로 그 큰 사이즈의 레고 블럭들을 이용하여 거치를 해보기로 했습니다.

완성된 사진

레고를 이용하여 만들어진 자전거 거치대

 

자 그럼 시작해 볼까요??

준비물

- 레고 블럭 넓은판, 길다란 블럭, 세모 꼴 블럭

- 간단히 접착을 할 수 있는 본드 (우드락 본드, 수지본드 등)

 

위와같이 레고 블럭을 준비해 보자

 

 

먼저 레고를 준비합니다.

아래와 같이 조립을 할거에요. 양쪽의 세모꼴 블럭이 자전거 바퀴가 넘어가지 않도록 고정을 해주는 역할을 하게 될 겁니다.

바퀴 고정용 블럭 조립 완료, 테스트 후 문제가 없다면 본드로 고정을 해주자

 

그런 다음 바닥을 깨끗하게 닦아주고 본드칠을 한 레고판을 바닥에 붙여주면 끝!

 

바닥부분에 실리콘이나 우드락 본드등으로 고정을 한다

 

왠걸... 이게 서네요 ㅋㅋ

양쪽의 경사로 만들어진 턱 으로 인하여 바퀴가 고정된다.

 

손잡이를 벽에 기대고 앞 바퀴역시 벽에 기댄상태.

이게 이렇게 서서 고정이 되더라고요.

 

로드 자전거는 입구 벽부에 앞바퀴가 무게를 지탱해주고 있고 뒷바퀴는 레고 부품때문에 움직이지 않기 때문에 고정이 되는 것입니다. 게다가 무게 중심도 약간만 앞쪽으로 쏠려 있기 때문에 일부러 건드리지만 않으면 절대 넘어질 일이 없어 보입니다.

 

 

 

 

그럼 앞바퀴를 벽에 고정을 할 수 없는 경우는 어떻게 해야할까요?

 

아래 사진을 보시죠. 저희 집에 자전거가 다섯대라고 했었죠? 적어도 두대는 공간확보를 해주어야 하는 상황인데요.

한 세트를 더 만들어 바닥에 레고를 이용하여 바퀴를 고정해줄 부분을 접찹합니다.

24인치 바퀴를 사용하는 자전거에는 700C 보다 한칸 더 작게 조립해주었다.

 

 

그 다음 몇번의 테스트를 통해 핸들을 고정해줄 위치를 잡아주었고요

 

핸들 고정을 위한 레고 블럭을 붙일 위치를 표시했다.

 

아래 사진처럼 역시 레고 블럭을 이용하여 손잡이가 걸릴 위치에 블록 판을 본드로 부착해 주었습니다.

몇개의 레고블럭을 이용해 손잡이 고정용 부품을 달아 주었다.

쨔잔~

 

블럭 사이에 손잡이가 쏙 들어가고
앞 바퀴는 벽에 기대어져 있다.

 

뒷바퀴는 만들어 두었던 레고 블럭에 잘 안착된 상태

 

간단하게 자전거가 거치되었습니다.

 

ㅋㅋ

 

좁은 공간에 자전거 두대를 거치할 수 있게 되었다.

 

너무나 간단하게 좁은 공간에 두대를 세워 놓을 수 있게 되었습니다.

테스트 하였던 로드 자전거가 아닌 하이브리드 자전거도 잘 세워집니다.

 

기존에는 적당히 겹쳐서 세워 두었는데 안쪽의 자전거를 빼려면 바깥쪽의 자전거를 일부러 빼내야 하는 수고로움도 있을 뿐더러 복도가 좁아지는 바람에 지나다니기도 매우 불편하였었는데요, 이제는 다니기도 편해지고 각각의 자전거를 독립적으로 세우고 꺼낼수 있게되었습니다.

 

이래서 레고 레고 하는구나 싶지만 사실 사용된 블럭 중의 대부분은 레고 제품이 아닌 가품입니다. ㅋ

제작 영상이 궁금하시면 아래 영상을 참고해 주세요. ^^

 

 

어쨌든 아주 간단하게 자전거 거치 문제를 해결하게 되어 대 만족인 상황입니다.

 

 

집에 사용하지 않는 아이들의 장난감을 이용하여 이렇게 업사이클링에 도전해 보는 것을 어떨까요?

 

이상으로 장난감 업싸이클링 (자전거 거치대로 변신) 후기를 마칩니다.

 

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 

 

2020/04/09 - [DIY] - 간단하게 자전거 거치대 설치하기, 벽에 구멍 뚫지 않음

 

간단하게 자전거 거치대 설치하기, 벽에 구멍 뚫지 않음

집에 자전거가 5대가 되었다. 와이프도 자기 자전거를 사달라고 하는 바람에 미니벨로를 하나 더 영입하였기 때문인데 중요한건 우리 가족은 4명이라는 점입니다. -_-;; 어쨌든 현관 앞에 쟁여두�

diy-dev-design.tistory.com

 

2019/09/03 - [DIY] - [DIY] 어린이를 위한 자전거 피팅, 핸들바 조정 및 브레이크 레버 간격 조절하기

 

[DIY] 어린이를 위한 자전거 피팅, 핸들바 조정 및 브레이크 레버 간격 조절하기

안녕하세요. 이번에도 자전거 관련된 DIY 글을 올려 보려 합니다. 저희집에 자전거가 총 4대가 있는데요. 저와 아내, 아들내미, 딸내미 이렇게 넷이 각각 자전거를 가지고 있습니다. 아내는 그다지 자전거를 타는..

diy-dev-design.tistory.com

 

2020/04/03 - [DIY] - LEGO 블럭을 이용한 전자담배 기기 직접 제작하기

 

LEGO 블럭을 이용한 전자담배 기기 직접 제작하기

전자담배를 피는 입장에서 늘 불안한건 사용중인 전자담배를 어딘가에 놓고 오거나 고장나는 등의 이유로 대체할 기계가 없는 순간이 왔을 때 인것 같습니다. 전자담배는 연초 담배를 대신할 수 있는 훌륭한 기계..

diy-dev-design.tistory.com

 

2019/09/02 - [DIY] - [DIY] 자전거 체인링크 분해 수리하기

 

[DIY] 자전거 체인링크 분해 수리하기

자전거 페달이 멈추었습니다. 갑자기.. 출근길에.... ... 지인에게 얻어서 출퇴근용으로 잘 사용하던 자전거(알톤 로드마스터 하이브리드 자전거)가 갑자기 출근길에 문제가 생겼습니다. 페달이 갑자기 턱 걸리면..

diy-dev-design.tistory.com

 

반응형

+ Recent posts