반응형

어느날 저에게 다가온 인생취미.. 바로 RC 카 입니다.

WPL 에서 나온 C24, B16 같은 싸구려 RC 카를 구입하여 arduino 를 이용하여 송수신기도 만들어보고 재미있게 취미생활을 시작하였지만 항상 눈에 밟히는건 Traxxas 나 Axial 같은 나름 명품 RC 카에 대한 로망이었습니다. 물론 직접 DIY 를 하며 즐기던 저의 취미였으니 WPL 이 나쁘다는건 아니었지만 로망 같은 그런게 있었죠.

그러던 어느날 친구 녀석이 Traxxas UDR 을 선물해준게 아니겠습니까? 한방에 끝판왕이 생겨버린 셈이었습니다. 

https://diy-dev-design.tistory.com/22

 

Traxxas UDR Un Boxing! 트랙사스 UDR 이 내손에?

아재가 되며 일상이 무료해질 때 쯤 취미를 가져야 겠다고 생각해서 중국 발 싸구려 RC카 인 WPL 제품을 구입하여 한동안 재미있게 지냈다. RC 카의 송수신기도 직접 만들어 보고 모터도 바꿔보며 기어박스도 부착..

diy-dev-design.tistory.com

 

뭐 어쨌거나 UDR 은 Traxxas 의 TRX4 나 Axial 의 SCX10 같은 트라이얼 RC 또는 Rock Crawler 는 아닙니다. 그냥 막 내질러 달리는 스트레스 해소 용 차량이죠. 물론 달릴 환경만 주어진다면 정말 끝판왕 맞습니다만 학교 운동장 말고는 달릴 곳이 없는 저에게는 아쉬움이 항상 남는 그런 차량이죠...

어쨌거나 UDR 의 그 높은 완성도와 완벽할만큼 뛰어난 스케일감을 맞보고 나니 WPL RC 카는 정말 장난감 같고 손에 잡히지가 않더라구요. 다시 Traxxas 나 Axial 같은 하이엔드 급 1/10 스케일의 트라이얼 RC 에 대한 갈증이 일었습니다.

어느날 퇴근 길에 당근마켓을 살펴보던 중 눈을 의심케 하는 글을 하나 보았습니다.

 

당근마켓 판매자느님께서 올린글

 

 

띠용!!!

 

 

axial ???

 

 

이거뭐야. AXIAL ?? 와우! scx 10 이 아닙니까? 25000원 ??????? 

빈티지 소품으로 활용해도 좋다고??????????

 

 

ㅋㅋ

 

이건 고장난거라도 사야겠다 싶어서 전철에서 당장 연락을 했습니다.

 

나 : "판매자 느님 빈티지 rc카 팔렸나요?"

판매자 : "아니오 아직 안팔렸습니다"

나 : "제가 살께요. 지금 바로 가도 될까요?"

판매자 : "아 8시 이후에.."

 

전 집에와서 저녁을 먹으며 와이프에게 단호하게, 일말의 망설임 없이, 절대 거절할수 없게 가장의 위엄을 한껏 담아..

 

빌었습니다.

 

"나 RC 카 하나만... 딱 하나만 더사도 될까?"

 

ㅋㅋㅋ

 

웃더군요.

뭔가 비장해 보였나 봅니다.

 

저녁을 입으로 먹는건지 코로 먹는건지 모르게 먹어 치운 후 판매자 느님께 달려갔습니다.

 

그리고 25000 원을 드리고 받아온 물건은 바로 

두둥. 드디어 내손에 들어온 axial scx10

 

캬~~~!!

SCX10 jeep wrangler falken edition.

뭐 SCX10 2 시리즈가 아니어서 약간 아쉬운 감이 있자만 이게 어딘가요.

드디어 꿈에 그리던 1/10 스케일 Rock Crawler 가 단돈 25000 원에 생겨버렸습니다.

감사합니다. 판매자 느님.

 

그리고 판매자 분께서는 충전기가 없다고 하셨지만 전 이미 lipo 충전기가 있거든요. 판매자님, 원래 충전기는 없답니다. 게다가 장착되어 있는 배터리가 약간 배는 불렀지만 무려 13000mha 짜리 초대용량 lipo 7.4v 배터리가 들어있는게 아닙니까? 와.. 정말 계 탓네요.

살다보니 이런일도 있구나 싶더라구요.

암튼 본격적으로 RC카 데리고 등산다닐 생각하니 가슴이 두근 거립니다.

 

그리고 어찌된 영문인지 바닥 긁힘도 전혀 없는 실내 주행만 한 그런 제품이었습니다.

완전 새거나 다름없더군요.

 

어쨌든 

 

당근마켓 만세!

판매자님 만세!

 

RC카도 만세!

 

구형 모델이다 보니 배터리 위치가 무게중심에 뒤쪽으로 쏠려 있어 전방으로 이동시키는 DIY 를 진행하였습니다.

구형 SCX 차체가 궁금하다면 아래 포스트를 참고하세요

2019/12/16 - [DIY/RC] - Axial SCX10 배터리, radio box 위치 바꾸기

 

Axial SCX10 배터리, radio box 위치 바꾸기

드디어 구입한 1/10 RC 이제 본격적으로 손을 데야 할 시간입니다 ㅋ scx10 2 가 아닌게 아쉽기는 하지만 역시 WPL 제품과는 비교할 수 없는 마감 퀄리티와 제품 강도 등 아주 만족스러운 품질을 보여주고 있습니..

diy-dev-design.tistory.com

 

반응형
반응형

안녕하세요. 제가 포토샵 스크립트를 이용하여 PSD 파일내의 모든 레이어를 자동으로 하위폴더 구조를 유지하며 저장할 수 있는 스크립트를 만들어서 올렸었는데요. 바로 아래 링크에서요.

https://diy-dev-design.tistory.com/17

 

[포토샵스크립트] 모든 레이어 자동저장 / 폴더 구조 포함

예전 포스트에서 포토샵의 스크립트에대하여 설명하면서 대표적인 예로 레이어를 자동으로 저장하는 기능을 설명드린 적이 있는데요. 이번에는 좀더 간단한 ( 코딩 줄 수가 짧은 ) 스크립트로 다시 올려봅니다. A-..

diy-dev-design.tistory.com

 

블로그에 방문 주신 분께서 레이어 자동 저장 기능에 해당 레이어 크기로 이미지가 저장 되었으면 좋겠다는 의견을 주셔서 한번 만들어 보았습니다.

사실 사용하는 분마다 차이가 있을 것 같은데요. 아마 레이어의 크기로 저장되는 기능이 꼭 필요한 분도 계실 거라 생각되어 별도로 페이지를 하나 만들었습니다.

 

전체 스크립트는 큰 차이가 없으며 현재 레이어의 크기를 파악하고 그 크기로 저장하는 방법만 추가하면 될 것 같습니다.

아래의 내용을 추가할 계획입니다.

  • 현재 레이어의 크기 (가로, 세로) 를 구해본다      : Layer.bounds 라는 개체를 이용
  • 구해진 크기로 새로운 임시 도큐먼트를 생성한다 : Documents.Add( ) 이용
  • 생성된 임시 도큐먼트에 해당 레이어를 복사하여 붙여 넣는다 : Layer.copy() // document.paste()
  • 도큐먼트를 지정된 파일이름과 위치에 저장하고 임시 도큐먼트는 닫는다. : document.close()
  • 기존과 동일하게 전체 크기로 저장하기 위한 옵션을 두어 선택할 수 있게 한다.

어렵지 않죠?

아래 작성된 코드를 보시죠.

var pngOption = new PNGSaveOptions()
    pngOption.embedColorProfile = true;
    pngOption.formatOptions = FormatOptions.STANDARDBASELINE;
    pngOption.matte = MatteType.NONE;
    pngOption.quality = 100;
    pngOption.PNG8 = false; //24 bit PNG
    pngOption.transparency = true;
    pngOption.interlaced = true;

// jpg 파일 저장을 위한 설정
var jpgSaveOption = new JPEGSaveOptions()
    jpgSaveOption.quality = 10;
    
var sType = "png" // jpg 로 파일을 저장하기를 원하는경우, png 로 저장을 하고 싶다면 "png"
var cDoc = app.activeDocument
var tempLayers = cDoc.layers
var cWidth = cDoc.width
var cHeight = cDoc.height
var cRes = cDoc.resolution
var savePath = cDoc.path + "\\"
var saveAsEachLayerSize = true
// 일단 모든 레이어를 꺼줍니다.
for (var i = 0 ; i < tempLayers.length; i++)
{
	tempLayers[i].visible = false
}

// 아래의 한줄의 함수로 모든 레이어를 저장합니다.
explorerLayerSet_new(savePath, cDoc) 

function explorerLayerSet_new (cPath, lSet){
	var dLyrs = lSet.layers
    
    var documentSaveType = pngOption;
    
	if (sType == "jpg")
    {
        documentSaveType = jpgSaveOption
    }
    for (var k = 0 ; k < dLyrs.length; k++){
		if (dLyrs[k].typename == "LayerSet") 
		{
			dLyrs[k].visible = true
			ePathName = cPath + dLyrs[k].name + "\\"
			ee = new Folder(ePathName)
			ee.create();
			explorerLayerSet_new (ePathName, dLyrs[k])
			dLyrs[k].visible = false
		}else{
			dLyrs[k].visible = true
			dFile = File(cPath + dLyrs[k].name + "." + sType)
            
              if (saveAsEachLayerSize == false)
              {
                  cDoc.saveAs(dFile, documentSaveType,true, Extension.LOWERCASE)  
              }else{  // 레이어의 크기에 맞추어 파일을 저장하는 기능                  
                  // layer.bounds 를 이용하여 레이어의 크기를 얻어올 수 있다.
                  var cBounds = dLyrs[k].bounds
                  var newWidth = cBounds[2] - cBounds[0];
                  var newHeight = cBounds[3] - cBounds[1];
                  
                  dLyrs[k].copy();
                  
                  // 레이어의 크기와 동일한 도큐먼트를 하나 생성한다.
                  var tmpDoc = app.documents.add(newWidth, newHeight, cDoc.resolution, dLyrs[k].name, NewDocumentMode.RGB, DocumentFill.TRANSPARENT);
                  tmpDoc.paste();
                  tmpDoc.saveAs(dFile, documentSaveType,true, Extension.LOWERCASE);
                  tmpDoc.close(SaveOptions.DONOTSAVECHANGES);
              }
			
			if (dLyrs[k].name.indexOf("All") == -1)
			{
				dLyrs[k].visible = false
			}
		}
	}
	lSet.visible = false
}

 

기존 saveAs 부분이 변경이 되었습니다.

png, jpg 를 판단하는 부분을 위쪽으로 빼서 documentSaveType 이라는 변수에 저장 옵션을 담아 버렸습니다.

그리고 위쪽에 saveAsEachLayerSize 라는 변수를 두어 True 일 경우 레이어 크기로, False 일 경우 전체 도큐먼트 크기로 저장이 되게 하여 기존의 방식이 필요한 분들도 하나의 스크립트로 사용할 수 있도록 하였습니다.

이렇게 해서 버전 3 가 되었네요. 좋은 의견 주신 '포도' 님께 감사드립니다.

 

layerexporter_v3.jsx
0.00MB

 

이전의 레이어 자동 저장 스크립트 포스트와 레이어 관련하여 공부할 만한 포스트를 링크 합니다.

 

2019/11/14 - [DEV/Adobe Script] - [포토샵스크립트] 스크립트로 레이어 생성, 이동, 복사 하기

 

[포토샵스크립트] 스크립트로 레이어 생성, 이동, 복사 하기

포토샵의 가장 중요한 핵심 기능중의 하나가 레이어라는 구조일 것입니다. 이미지를 계층적으로 쌓아 올리고 각각의 이미지간 효과를 적용하거나 투명도등을 조절하여 완성된 하나의 이미지를 만들어 내는 것이죠...

diy-dev-design.tistory.com

2019/12/04 - [DEV/Adobe Script] - [포토샵스크립트] Instagram 용 파노라마 사진 자르기

 

[포토샵스크립트] Instagram 용 파노라마 사진 자르기

Instagram, 요즘 가장 핫한 SNS 가 아닐까 싶습니다. 지하철에서 무심코 주변을 보니 눈에 보이는 핸드폰 화면 마다 Instagram 화면이 보이는 것을 보고 깜짝 놀랐습니다. 난 안하는데... 어쨌든 Instagram 계정을..

diy-dev-design.tistory.com

 

공감은 작성자에게 큰 힘이 된답니다. 아시죠? ^^

반응형
반응형

3DS MAX 스트립트를 이용하여 스크립팅을 하기 시작하면 MAX 로 할 수 있는 일이 너무나 많고 빠르게 진행된다는 것을 알 수 있게 됩니다. 이 놀라운 기능들을 스크립트를 매번 실행시키는 것이 번거롭고 여러가지 기능을 한번에 수행하거나 관리할 수 있게끔 만들고 싶은 욕심이 생길 때가 있습니다. 그럴때 그런 기능들을 한곳에 모아 실행하기 위하여는 마치 어떤 툴이나 프로그램 처럼 UI 가 있는 것이 실행하기도 편하고 보기에도 좋을 것입니다.

그래서 오늘은 3DS MAX Script 를 이용하여 다이얼로드 창을 만드는 방법, 그리고 간단한 UI 를 적용하는 방법을 알아 보겠습니다.

  • 다이얼로그 창 만들기 / 버튼 만들어 기능 연결하기
  • 롤아웃 플로터 만들기

먼저 3DS MAX 에서 다이얼로그 창을 만들어 보겠습니다.

다이얼로그 는 윈도우에서 예/아니오 경고창과 같이 간단한 타이틀바와 닫기 버튼, 내부에 간단한 UI 들을 담을 수 있는데요. 기본적으로는 rollout 을 만들어 rollout 내부에 UI 를 담고 만들어진 rollout 을 다이얼로그창의 형식으로 보여주는 형태로 되어 있습니다.

 

다이얼로그 창 만들기 / 버튼 만들어 기능 연결하기

가장 기본형은 아래와 같습니다.

rollout myFirstRollout "my menu 01"
(
	button bt_myButton "press me!"
	
	on bt_myButton pressed do
	(
		messageBox "You got it!"
	)
	
)

createDialog myFirstRollout

먼저 롤아웃을 선언해 준 뒤 그안에 버튼을 하나 만들고 버튼을 눌렀을때 특정한 메시지를 팝업으로 보여주는 다이얼로그입니다.

바로 요렇게 만들어 지게 됩니다.

심플한 다이얼로그

가운데 있는 버튼을 눌러주면 아래와 같이 팝업으로 메시지가 출력이 됩니다.

messagebox 가 뜬 모습

 

자 이게 기본은 했고요. 다이얼로그의 크기, 위치, 버튼의 크기나 위치등을 지정하지 않았기 때문에 위와 같이 작게 표시가 되었는데요. 여기서 그 크기위 위치를 지정하는 방법을 알아보도록 하겠습니다.

제일 마지막 줄에 createDialog 라는 명령으로 만들어준 롤아웃을 다이얼로그라는 형태로 보여주었는데요. 이부분에서 다이얼로그릐 크기, 위치를 지정할 수 있습니다. 마지막 줄의 내용을 아래와 같이 수정해 보겠습니다.

createDialog myFirstRollout 300 200 100 100

요런 식으로 정의 할 수 있는데요. 4개의 숫자를 뒤에 연속해서 써주게 되는데

[가로길이] [세로길이] [윈도우상의 가로위치] [윈도우상의 세로위치]

의 순서로 적어주면 되며 뒤의 두가지 숫자를 생략하게 되면 화면의 중앙에 다이얼로그가 생성이 됩니다.

위의 코드로 수정한 뒤 실행하게 되면 아래와 같이 윈도우 좌측 상단에 가로 300 세로 200 픽셀의 다이얼로그 창이 만들어 지게 됩니다.

화면의 좌상단에서 열린 다이얼로그 창

버튼을 하나 추가해 볼까요?

rollout myFirstRollout "my menu 01"
(
	button bt_myButton1 "press me!"
	button bt_myButton2 "don't press me!"
	
	on bt_myButton1 pressed do
	(
		messageBox "You got it!"
	)
	
	on bt_myButton2 pressed do
	(
		destroyDialog myFirstRollout
	)
	
)

createDialog myFirstRollout 300 200 100 100

자 이제 버튼이 두개가 되었습니다. 두번째 버튼을 누르게 되면 다이얼 로그 창이 닫히는 그런 코드가 실행이 됩니다.

스크립트를 실행해 보면 아래와 같이 버튼이 두개가 표시됩니다.

다이얼로그에 버튼이 두개가 되었다.

그런데 저는 저 두개의 버튼을 가로로 배치하고 싶어서 코드를 약간 더 손을 보았습니다. 레이아웃을 조정하는 것이죠.

rollout myFirstRollout "my menu 01"
(
	button bt_myButton1 "press me!" pos:[10,10] width:130 height:30
	button bt_myButton2 "don't press me!" pos:[150,10] width:130 height:30
	
	on bt_myButton1 pressed do
	(
		messageBox "You got it!"
	)
	
	on bt_myButton2 pressed do
	(
		destroyDialog myFirstRollout
	)
	
)

createDialog myFirstRollout 300 200 100 100

맨위에 버튼을 만들어주는 부분에 pos 와 width, height 를 설정해 줌으로써 사용자가 원하는 위치와 크기로 버튼을 배치할 수 있습니다.

실행해보면 아래와 같이 변경이 됩니다.

두개의 버튼이 가로로 배치되었다

 

네.. 그럴싸 해 졌습니다.

롤아웃 플로터 (rollout floater) 만들기

이번에는 좀더 고급 UI 를 이용해 보겠습니다. 3DS MAX 의 우측에 보면 여러가지 옵션이나 설정을 입력하고 기능을 선택하는 메뉴바가 나오는데요. command pannel 이라고 합니다. 해당 패널에 보면 기능이 많은 경우 기능을 접었다 폈다 할 수 있는 형태로 메뉴가 만들어져 있습니다. 

유사한 기능끼리 그룹을 만들어 묶어주고 사용하지 않는 기능 그룹은 묶어 둘 수 있어 상당히 편리한 UI 라고 할 수 있겠습니다. 스크립트  UI 로도 거의 동일한 기능을 아주 쉽게 구현할 수 있습니다.

그런 기능들의 묶음이 위에서 보여주었던 하나의 롤아웃이 되며 롤아웃들을 하나의 창에 보여줄 수 있는 개체가 롤아웃 플로터 입니다.

간단한 예를 보여드리겠습니다.

rollout myRollout_ani "my Animation"
(
	button bt_myButton1 "run" pos:[10,10] width:130 height:30
	button bt_myButton2 "stop" pos:[150,10] width:130 height:30
	
	on bt_myButton1 pressed do
	(
		messageBox "No function now"
	)
	
	on bt_myButton2 pressed do
	(
		messageBox "No function now"
	)	
)

rollout myRollout_geom "my Geometry"
(
	button bt_myButton1 "convertTo mesh" pos:[10,10] width:130 height:30
	button bt_myButton2 "remove Iso Vertex" pos:[150,10] width:130 height:30
	
	on bt_myButton1 pressed do
	(
		messageBox "No function now"
	)
	
	on bt_myButton2 pressed do
	(
		messageBox "No function now"
	)	
)

myTool = newrolloutFloater "my custon tool" 300 300 100 100

addRollout myRollout_ani myTool 
addRollout myRollout_geom myTool 

myTool.open

두개의 롤아웃을 먼저 만들고 myTool 이라는 변수를 새로운 롤아웃 플로터로 설정한뒤 myTool 에 두개의 롤아웃을 추가합니다. 끝으로 만들어진 롤아웃 플로터를 보여주는 것이죠.

간단하지 않습니까?

실행하면 아래와 같이 됩니다.

두개의 롤아웃이 있는 메뉴가 만들어 졌다.

 

이렇게 만들어진 롤아웃 플로터내의 롤아웃 들은 아래와 같이 접는것도 가능합니다.

롤아웃은 말그대로 접어 올릴수 있는 메뉴다.

이제 제법 툴같이 만들어 졌습니다.

 

자 3DS MAX 에서 롤아웃을 만드는 것을 알아보았습니다.

이제 다음 강좌에서는 롤아웃 내의 버튼에 기능을 할당해 보도록 하겠습니다. 인터넷에서 긁어 모은 각종 스크립트 들을 저렇게 만든 롤아웃 플로터 하나에 모아두면 필요할때 빠르게 기능 동작이 가능할 것 입니다.

 

그럼 이만~

 

2020/04/29 - [분류 전체보기] - 3DS MAX 스크립트로 개체 선택하기

 

3DS MAX 스크립트로 개체 선택하기

Max Script 를 이용하여 무엇인가를 하려면 필수 요소라고 할 수 있는 것 중의 하나가 개체를 선택하거나 지정하는 방법입니다. 여기서 개체는 3D Scene 안의 오브젝트, 스플라인, 헬퍼 등과 같은 사��

diy-dev-design.tistory.com

 

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

 

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

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

diy-dev-design.tistory.com

 

반응형
반응형

일을 하다 보면 가끔 업무를 진행하던 경로 하위에 있는 데이들의 리스트를 만들어야 하는 경우가 있습니다. 하나의 폴더라면 어떻게 해보겠는데 그 폴더가 하위 뎁스가 연속해서 있고 저장되어 있는 파일이 불특정으로 다수 있는 경우 이를 리스트로 만드는 일은 정말 끔찍한 일이 아닐 수 없습니다.

이런 경우 손쉽게 리스트로 작성하는 스크립트를 만들어 보았습니다.

폴더 및 하위 폴더의 파일 명칭은 물론 저장된 경로, 파일의 만든날짜, 수정한 날짜 등의 속성을 표시할 수 있도록 하고 파일의 용량과 타입까지 자동으로 리스트로 만들어 보려 합니다.

이러한 코드를 작성하기 위하여 개발을 할 내용을 준비해봅니다.

  1. 엑셀 vba 에서 사용 가능한 File 및 Directory 관련 개체를 알아보자.
  2. 지정한 폴더내에 파일이 있는 경우 파일의 이름과 속성등을 가져와 기록해주자
  3. 파일이 바뀔때마다 줄을 바꾸어 주자
  4. 폴더를 만나게 되면 해당 폴더 하위의 파일을 찾아주자.
  5. 2 ~ 4 번은 하위 폴더를 만날때 마다 계속해서 반복해주어야 하므로 재귀 함수로 동작하도록 구성하자.
    * 재귀함수란 자신이 자신을 호출하는 함수를 말합니다.
  6. 연속해서 위치를 이동시켜야 하므로 range.offset(y,x) 를 이용하되 x, y 는 전역 변수 (public)로 설정해주자

요 정도면 원하던 기능의 구현이 가능할 것 같습니다.

제가 작성한 코드를 아래에 올려보겠습니다.

보시면서 위에 설명드린 동작이 어떤 과정으로 일어나는지 확인해 보세요.

Public fso As Object
Public offsetY As Integer
Public offsetX As Integer
Public stRng As Range

Sub getSubFileList()

    Dim fsoFolder As Object
    Dim aSht As Worksheet
    Dim rootpath As String
    
    rootpath = "C:\Users\mariine\Pictures\excel_test\"
    
    offsetX = 0
    offsetY = 0
    
    Set aSht = ActiveSheet
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set fsoFolder = fso.GetFolder(rootpath)

    Set stRng = aSht.Range("B2")

    getDataRecursive fsoFolder
    
End Sub

Sub getDataRecursive(ByVal baseFolder As Object)

    Dim tmpSubFolders As Object
    Dim tmpFiles As Object
    Dim tmpRng As Range
    
    offsetX = offsetX + 1
    
    Set tmpSubFolders = baseFolder.subFolders
    
    Set tmpFiles = baseFolder.Files
    
    For Each c In tmpFiles
        
        stRng.Offset(offsetY, offsetX).Value = c.Name                       ''파일명
        stRng.Offset(offsetY, offsetX - 2).Value = offsetY + 1              ''인덱스
        stRng.Offset(offsetY, offsetX - 1).Value = c.ParentFolder.Path      ''경로명
        stRng.Offset(offsetY, offsetX + 1).Value = c.Size / 1000# & "kb"    ''파일용량
        stRng.Offset(offsetY, offsetX + 2).Value = c.DateCreated            ''만든날짜
        stRng.Offset(offsetY, offsetX + 3).Value = c.DateLastModified       ''수정한날짜
        stRng.Offset(offsetY, offsetX + 4).Value = c.Type                   ''파일타입
        
        offsetY = offsetY + 1
    Next c
    
    offsetX = offsetX - 1
    
    For Each d In tmpSubFolders
        
        Dim tmpSub As Object
        Set tmpSubs = fso.GetFolder(d)

        getDataRecursive tmpSubs
        
    Next d     
    
End Sub

 

제일 상단의 4줄은 이번 코드에서 사용할 전역 변수를 설정해주는 모습입니다.

전역변수를 설정해주면 하위의 어떤 함수에서건 해당 값을 읽고 쓸 수 있게 됩니다. A 함수에서 변경한 전역 변수의 값을 B 함수에서도 그대로 사용이 가능하게 됩니다.

그 다음 만나는 Sub getSubFileList() 함수가 동작을 설정하는 함수가 되겠고요. FileSystemObject 라는 파일 및 디렉토리 작업이 가능한 COM 오브젝트를 선언하여 서브폴더나 폴더, 파일 등에 접근이 가능하도록 하고 있습니다.

그리고 그뒤로 이어지는 재귀 함수인 Sub getDataRecursive(ByVal baseFolder As Object) 를 호출하는 것으로 동작이 시작됩니다. 

그렇게 시작된 재귀함수는 입력받은 폴더내에 파일이 있으면 파일의 이름 및 기타 속성들을 줄을 바꾸어 가며 기록을 진행하고 모든 파일에 대하여 기록이 끝나면 그아래 해당 폴더에 하위 폴더가 있는지 검사한뒤 하위 폴더가 있는 경우 또다시 자신 (폴더내의 파일을 찾아 기록하는 함수) 을 호출하여 주게 되는 겁니다.

이렇게 해주면 하나의 재귀함수로 아무리 깊고 많은 뎁스의 폴더안의 파일들도 모두 탐색이 가능해 지게 되겠습니다.

이렇게 만들어진 리스트는 아래와 같습니다.

 

만약 특정 확장자만 검색하고 싶으시면 실제 파일 속성을 기록하는 For 구문의 바로 첫 행에 IF 문을 이용하여 파일 이름내에 필요한 확장자가 있는지 검사를 진행하면 되겠습니다.

예를 들어 xlsx 파일만 리스트로 만들고 싶다면 해당 For 구문을 아래와 같이 변경하면 되겠습니다.

    For Each c In tmpFiles
        
        If InStr(c.Name, ".xlsx") Then
            stRng.Offset(offsetY, offsetX).Value = c.Name                       '파일명
            stRng.Offset(offsetY, offsetX - 2).Value = offsetY + 1              '인덱스
            stRng.Offset(offsetY, offsetX - 1).Value = c.ParentFolder.Path      '경로명
            stRng.Offset(offsetY, offsetX + 1).Value = c.Size / 1000# & "kb"    '파일용량
            stRng.Offset(offsetY, offsetX + 2).Value = c.DateCreated            '만든날짜
            stRng.Offset(offsetY, offsetX + 3).Value = c.DateLastModified       '수정한날짜
            stRng.Offset(offsetY, offsetX + 4).Value = c.Type                   '파일타입
            offsetY = offsetY + 1
        End If
        
    Next c

어렵지 않죠?

만약 있어서는 안되는 확장자가 들어있다면 눈에 띄게 표시를 하는것도 어렵지 않습니다.

예를 들어 폴더내에 hwp 파일만 있어야 한다고 했을때 해당 폴더에 .doc 파일처럼 또 다른 있는 경우 빨간색으로 셀을 표시할 수 있습니다.

For Each c In tmpFiles
        
        stRng.Offset(offsetY, offsetX).Value = c.Name                       '파일명
        stRng.Offset(offsetY, offsetX - 2).Value = offsetY + 1              '인덱스
        stRng.Offset(offsetY, offsetX - 1).Value = c.ParentFolder.Path      '경로명
        stRng.Offset(offsetY, offsetX + 1).Value = c.Size / 1000# & "kb"    '파일용량
        stRng.Offset(offsetY, offsetX + 2).Value = c.DateCreated            '만든날짜
        stRng.Offset(offsetY, offsetX + 3).Value = c.DateLastModified       '수정한날짜
        stRng.Offset(offsetY, offsetX + 4).Value = c.Type                   '파일타입
        
        If Not InStr(c.Name, ".hwp") Then
            stRng.Offset(offsetY, offsetX).Interior.Color = RGB(255, 0, 0)
        End If
        
        offsetY = offsetY + 1
        
    Next c

참 쉽죠?

 

이렇게 해서 폴더내의 모든 파일을 하위폴더를 포함하여 가져오는 스크립트를 알아보았습니다. 이런식의 작업은 엑셀의 워크시트 함수만을 이용하여 작업하기는 어렵기 때문에 vba를 좀 할줄 알면 아주 많은 시간을 절약하는 것이 가능합니다. 

 

오늘은 여기까지 하도록 하겠습니다.

관련하여 사전 지식이 부족하신 분은 아래 관련 포스트를 링크해 드리니 참고하시면 되겠습니다.

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

 

엑셀 VBA 시작하기

마이크로 소프트 엑셀은 수많은 기능과 자동화된 연산 처리, 편리한 템플릿 가공, 다양한 그래프 드을 이용한 데이터의 시각화 외에도 아주 많은 유용한 기능을 제공하여 사무 업무의 표준 프로그램이 되었다. 나..

diy-dev-design.tistory.com

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

 

[VBA]RGB 색상 값이 들어있는 셀에 셀 색상 지정하기

이번 강좌에서는 셀에 입력되어 있는 컬러 값을 이용하여 셀의 색상을 지정하는 방법을 알아보도록 하겠습니다. 디자이너 분들이라면 언제가 한번쯤은 엑셀 시트에 자신이 정의한 컬러 값을 정리해서 보내야 하는..

diy-dev-design.tistory.com

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

 

[vba] For 구문 이용하기와 offset 사용 해 보기

엑셀에서 자동화를 한다는건 사실 이유가 뻔 합니다. 처리해야 할 셀이 엄청나게 많거나 일반적인 함수로 연산이 불가한 경우 입니다. 그 중 오늘은 엄청나게 많은 데이터에 대한 자동화 처리를 위하여 반복문을..

diy-dev-design.tistory.com

2019/07/12 - [DEV/VBA] - [vba] 자동화를 위하여 엑셀의 영역 설정하는 방법

 

[vba] 자동화를 위하여 엑셀의 영역 설정하는 방법

엑셀을 사용하는 목적 자체가 근본적으로 문서를 만들기 위함은 아니다 보니 세로 또는 가로로 굉장히 길게 데이터가 나열되어 있는 경우가 많습니다. 우리는 vba 를 이용하여 자동화를 할 것이기 때문에 어디부..

diy-dev-design.tistory.com

 

감사합니다.

 

공감은 블로그 포스팅을 진행하는 블로거에게 큰 힘이 됩니다~

반응형
반응형

영화 조커를 봤습니다.

정말 올해 기생충이 아니었다면 정말 최고의 영화가 아니었을까 생각되네요.

호아킨 피닉스의 연기도 최고라 말할수 있겠고 영화의 구성이나 연출도 너무 훌륭했습니다.

고담 시티가 왜 범죄의 도시가 되었는지, 조커가 왜 고담 시티에서 범죄의 상징적인 존재가 되었는지를 너무나 매끄럽게 이야기해주는 영화.

정말 감명깊게 봤기에 폰 배경화면을 하나 만들어 보았습니다.

조커 공식 포스터를 이용하여 제작해 보았습니다.

카메라 숨김 옵션은 덤

[wallpaper] galaxy note 10

 

다운 받으셔서 사용하세요.

G_NOTE10_joker.jpg
1.75MB

감사합니다.

다른 카메라 숨김 버전은 아래 링크를 참조하세요.

2019/09/07 - [DESIGN] - [wallpaper] 갤럭시 노트 10 카메라 숨김 배경화면

 

[wallpaper] 갤럭시 노트 10 카메라 숨김 배경화면

정동남 버전 으로 유명한 갤럭시 노트 10을 샀다. 아니 유명한 줄 모르고 샀는데 유명한걸 알게된건 사용한 날짜가 지날수록 자꾸 눈에 걸리는 정중앙 카메라가 신경이 쓰이면서 부터랄까... 와 .. .. 엄청거슬려..

diy-dev-design.tistory.com

2019/09/10 - [DESIGN] - [wallpaper] 갤럭시 노트10 카메라 숨김 배경 vol 2

 

[wallpaper] 갤럭시 노트10 카메라 숨김 배경 vol 2

갤럭시 노트 10의 정동남 스타일을 말끔히 치워버릴 수 있는 배경을 지난 포스트에 올렸었는데 만드는 것도 재미있어 몇장 더 만들어보았습니다. 지난 포스트의 이미지 보기 https://diy-dev-design.tistory.com/4..

diy-dev-design.tistory.com

2019/09/18 - [DESIGN] - [wallpaper] Galaxy S10e wallpaper 카메라 숨김

 

[wallpaper] Galaxy S10e wallpaper 카메라 숨김

갤럭시 S10e 카메라 숨김용 배경화면을 만들어 보았습니다. NOTE10 보다는 덜하지만 S10e 도 스크린 안으로 카메라가 들어오게 되면서 어느순간 눈에 거슬리는 것은 어쩔수 없네요. 또 배경화면들이 왜 다 유료인..

diy-dev-design.tistory.com

2019/10/09 - [DESIGN] - [wallpaper] Galaxy s10 5G 카메라 숨김 배경화면

 

[wallpaper] Galaxy s10 5G 카메라 숨김 배경화면

이번 포스트는 갤럭시 s10 5G 카메라 숨김 배경화면 입니다. 재미있는 배경화면을 좀 많이 만들까 했는데 저작권 문제도 있을 듯 해서 특정 회사의 캐릭터들은 사용하지 않기로 하였습니다. 예쁜 배경화면들과 많..

diy-dev-design.tistory.com

2019/10/14 - [DESIGN] - [wallpaper] Galaxy s10 series 배경화면 - MATRIX RELOADED

 

[wallpaper] Galaxy s10 series 배경화면 - MATRIX RELOADED

타이포 그래픽으로 제작한 갤럭시 S10 시리즈 배경화면 입니다. 문자의 이미지를 문자로 형상화 한 그래픽을 이용하여 배경화면을 만들어 보았는데요. 매트릭스의 경우 영화의 메인 컨셉 이미지와도 매칭되는 느낌..

diy-dev-design.tistory.com

 

감사합니다.

반응형
반응형

Instagram, 요즘 가장 핫한 SNS 가 아닐까 싶습니다. 지하철에서 무심코 주변을 보니 눈에 보이는 핸드폰 화면 마다 Instagram 화면이 보이는 것을 보고 깜짝 놀랐습니다.

난 안하는데...

어쨌든 Instagram 계정을 하나 만들어 보았습니다.

전 SNS 에 취미같은 건 없고 다만 뭔가 하나 만들어 보고 싶었는데 테스트 할 공간이 바로 Instagram 이었다고나 할까.

인스타 그램에 파노라마 사진을 올리면 사진이 다 보이지도 않거니와 얇고 길에 나와 보기에 썩 좋지 않더라고 합니다. 그래서 파노라마로 길게 찍힌 사진을 Instagram에 올리기 적당하게 네모 반듯하게 자동으로 잘라주는 스크립트를 만들어 보았습니다.

폰 app 중에는 Instagram 용 파노라마를 자연스럽게 올릴 수 있도록 잘라주는 APP 들이 있는데 PC 에 있는 사진을 올리고 싶다면 그걸 폰에 올려서 잘라서 업로드 하는게 역시 귀찮더군요. 바로 PC 에서 잘라서 올리면 좋겠다는 생각이 들어 만들어 보기로 하였습니다.

 

이렇게 만들려고 합니다.

  • 인스타용 최적 이미지 사이즈는 1080 x 1080 이라고 한다
  • 가로길이를 1080 으로 나누어 등분할 개수를 구한다. --> N.xx
  • 1080으로 정확히 나누어 떨어질 리 없기 때문에 소숫점 첫자리 기준으로 반올림/내림 한다.
  • 가로길이 : 1080 px x N , 세로길이 : 1080 px 로 리사이즈를 한다.
  • 가로세로 1080 px 씩 좌측부터 selection 을 만들어 이미지를 복사한다.
  • 새로운 1080 x 1080 짜리 document 를 만들어서 복사한 이미지를 붙인다.
  • 이미지와 동일한 명칭의 폴더를 만든 후 복사한 이미지를 저장한다.

요렇게 하면 만들어 질 것 같았습니다.

먼저 테스트용 이미지는 아래와 같습니다.

무려 4664 x 1200 짜리 커다란 이미지. 우도 하고수동 해수욕장에서

대한민국의 보물 '우도' 에 자리잡고 있는 하고수동 해수욕장 되시겠습니다.

가로로 긴 이미지 인데요, 

 

올리면 이렇게 보이게 됩니다.

Instagram 에 파노라마를 직접 올린 사진

 

이렇게 좌우를 자를 수 밖에 없는 상황이 됩니다.

 

그래서 Instagram 이미지 크기에 맞게 가로로 긴 이미지를 스크립트로 자동으로 자르면 어떻게 될까요?

스크립트를 이용하여 이미지를 자동으로 아래와 같이 잘라주게 됩니다. 신기하죠?

자동으로 이미지를 자른 모습 

 

그럼 제가 만든 스크립트로 자른 이미지를 올리면 어떻게 올라가게 될까요..

파노라마가 자연스럽게 연결된 모습

네! 바로 이렇게 됩니다 ㅋㅋ

 

스크립트 다운 로드는 여기서 받으세요.

autoCropForInstagram.jsx
0.00MB

 

자.. 제 블로그가 저런 자랑글 올리는 블로그는 아니니 이제 스크립트를 소개해 드리겠습니다.

// auto crop for instagram (panorama) 
var defUnit = preferences.rulerUnits
preferences.rulerUnits = Units.PIXELS

//JPG 파일저장용 옵션
var jpgOption = new JPEGSaveOptions();
jpgOption.qulity = 8;


var cDoc = app.activeDocument;
var cName = cDoc.name;
cName = cName.replace(".", "_"); // 현재 열린 파일명에서 . 을 _ 로 변경

var cFile = File(cDoc.fullName);
var cPath = cFile.parent; // 현재 열린 이미지의 경로를 구한다.

var cWidth = cDoc.width;
var cHeight = cDoc.height;
var divideStep = 1;

var newWidth = cWidth * (1080 / cHeight); //세로를 1080 으로 변경했을때의 가로 크기
divideStep = newWidth / 1080 ; 

if ((divideStep % 1.0) >= 0.5)
{
    divideStep = Math.ceil(divideStep); // 0.5 보다 크면 올림
    newWidth = 1080 * (divideStep);            
}
else
{
    divideStep = Math.floor(divideStep); // 0.5 보다 작으면 내림
    newWidth = 1080 * (divideStep);  
}

cDoc.resizeImage(newWidth, 1080);


var dDoc = app.documents.add(1080,1080); // 저장용 문서 만들기

for (var k = 0; k < divideStep; k++) // 가로 개수만큼
{
    app.activeDocument = cDoc;
    
    var x1 = 1080 * k;
    var x2 = 1080 * (k+1);
    var y1 = 0;
    var y2 = 1080;
    
    // 1080 x 1080 씩 선택하여 저장용 문서에 붙여 넣는다.
    cDoc.selection.select([[x1,y1], [x2,y1], [x2,y2], [x1,y2]])
    cDoc.selection.copy();
    app.activeDocument = dDoc;
    dDoc.paste();
    
    var sPath = cPath + "\\" + cName + "\\"
    var sFolder = new Folder(sPath)
    try
    {
        sFolder.create(); //파일 이름으로 폴더를 만들어 준뒤
    }catch(e){}
    
    var sFile = new File(sPath + cName + "_" + k + ".jpg");
    //파일 저장
    dDoc.saveAs(sFile, jpgOption, true, Extension.LOWERCASE);
    
}

dDoc.close(SaveOptions.DONOTSAVECHANGES);//저장용 문서 닫기
//cDoc.close(SaveOptions.DONOTSAVECHANGES); // 원래 이미지도 닫으려면 주석 풀기

// 유닛 단위를 원래대로 돌린다.
preferences.rulerUnits = defUnit

 

스크립트 내에 주석을 달아 놓았으니 찬찬히 보시면 이해가 되실거에요.

포토샵에 먼저 파노라마 이미지를 열어 놓은 뒤 실행하셔야 합니다.

실행은 Extend script toolkit 으로 해당 스크립트를 붙여넣기 하신 뒤 실행하셔도 되고요, 해당 스크립트를 다운 받으신 뒤 포토샵에서 스크립트 불러오기 하셔서 실행하셔도 됩니다.

스크립트 실행 방법은 아래의 포스트를 참고하세요~

 

https://diy-dev-design.tistory.com/47

 

[포토샵스크립트] 스크립트 단축키로 실행하기

안녕하세요. 오늘은 자신이 작성하였거나 웹에서 다운로드 받은 스크립트를 간단하고 빠르게 실행하는 방법을 알려드리겠습니다. 우선 스크립트를 실행하는 방법은 몇가지가 있는데 다음과 같습니다. Extend Scrip..

diy-dev-design.tistory.com

 

개발 공부도 함께 하실 분은 아무래도 직접 Extend script toolkit 에 코딩을 해보시는게 좋겠죠?

아래 포스트에 코드를 이용하여 편집해보며 실행할 수 있는 방법이 소개되어 있습니다.

https://diy-dev-design.tistory.com/7

 

[포토샵 스크립트] 강좌, 무작정 따라해보기

어도비 포토샵은 자체 스크립트를 이용하여 다양한 기능을 수행할 수 있는 툴을 지원합니다. 언어는 자바 스크립트 이며 작성된 자바스크립트를 포토샵에서 실행하는 방법과 Extend Script Tool Kit 을 이용하여..

diy-dev-design.tistory.com

 

그럼 이만~

 

참 제 인스타는 제 블로그 이름과 같습니다.

인스타에 올린 파노라마를 직접 보시려면 아래 주소에 가셔서 확인하셔요 ㅋ. 게시글은 달랑 2개.

https://www.instagram.com/p/B5nbnenH3vD/?igshid=1pps3vkv5c1mi

그럼 진짜로 20000

반응형
반응형

포토샵의 가장 중요한 핵심 기능중의 하나가 레이어라는 구조일 것입니다. 이미지를 계층적으로 쌓아 올리고 각각의 이미지간 효과를 적용하거나 투명도등을 조절하여 완성된 하나의 이미지를 만들어 내는 것이죠. 

오늘 강좌에서는 포토샵에 레이어를 생성하고, 이름을 붙이거나, 위치를 이동하는 등의 레이어를 관리하는 기능을 소개해 드릴까 합니다.

오늘 강좌에서 다룰 내용은 아래와 같습니다.

  • 이미 있는 레이어를 복제하기, 위치 조정하기, 투명도 조정하기
  • 이미 있는 레이어의 순서 변경하기(이동하기)

 

먼저 포토샵 스크립트 작성을 위하여 extend script toolkit 을 실행합니다.

그리고 당연히 포토샵 어플리케이션을 열어야 겠죠. 

오늘은 제가 좋아하는 traxxas 로고를 이용하여 코드 연습을 해보겠습니다.

이 로고 이미지를 이용하여 wallpaper 를 한번 만들어 보겠습니다. 손으로 하자면 아주 귀찮을 그림을 만들어 보겠습니다.

//로고파일의 위치를 설정한다
traxxasLogo_250_File = "D:/01_works/용/DIY_HARD_RC/traxxas_LOGO_125x25.png"
var logoFile = new File(traxxasLogo_250_File);

// 포토샵에 새로운 도큐먼트를 생성한다. 크기는 1920 1080
var wallPaperPsd = app.documents.add(1920,1080,72)

// 검정색 컬러를 정의한다
var newColor = new SolidColor();
newColor.rgb.red = 0;
newColor.rgb.green = 0;
newColor.rgb.blue = 10;

// 배경색상을 검정색으로 fill 한다
wallPaperPsd.selection.selectAll();
wallPaperPsd.selection.fill(newColor);
wallPaperPsd.selection.deselect();

// 로고 이미지를 열어서 포토샵으로 복사한다. 
var logoImg = app.open(logoFile);
var newLogoLyr = logoImg.layers[0].duplicate(wallPaperPsd.layers[0], ElementPlacement.PLACEBEFORE);


app.activeDocument = logoImg;
// 로고 파일은 닫는다.
logoImg.close();

app.activeDocument = wallPaperPsd;
//복사한 레이어의 이름을 변경한다.
newLogoLyr.name = "logo_1_1";

오늘 강좌의 핵심이되는 부분은 요 부분입니다.

var newLogoLyr = logoImg.layers[0].duplicate(wallPaperPsd.layers[0], ElementPlacement.PLACEBEFORE);

logoImg 파일의 0번째 레이어를 복사하는 명령어죠. duplicate 뒤에 오는 값들은 어디에 복사할 것인지를 지정합니다. 첫번째 인자는 복제될 대상을 지정합니다. 이번 예제에서는 다른 PSD 파일 (배경화면용 이미지)의 0번째 레이어가 대상이 되었습니다. 그뒤에 오는 인자는 지정한 대상과의 관계인데요. 이번 예제에서 사용한 것은 "대상 예제의 바로 전에 위치시켜라" 라는 명령입니다.

ElementPlacement 라는 개체의 하위 옵션으로 몇가지 옵션을 지정할 수 있는데요. PS 버전이 올라가면서 옵션이 많이 다양해 졌습니다. 필요한 위치에 맞추어 넣으시면 되겠습니다.

ElementPlacement.PLACEAFTER         //cs6 - 대상개체 아래에
ElementPlacement.PLACEATEND         //cs6 - 대상개체의 제일 마지막에
ElementPlacement.PLACEBEFORE        //cs6 - 대상개체의 바로 위에
ElementPlacement.INSIDE             //cc - 대상이 폴더인 경우 폴더 안에
ElementPlacement.PLACEATBEGINNING   //cc - 대상 개체의 제일 처음에

 

어쨌든 요기까지 스크립트를 실행해보면 아래와 같은 그림이 만들어 집니다.

스크립트를 이용해 포토샵 psd 파일에 다른 파일의 이미지를 레이어로 복사한 상태

화면에 로고 이미지가 붙었죠?

요 이미지를 화면에 쫙 깔아 보겠습니다. 손으로 하려면 매우 귀찮은 작업이죠.

위에 작성한 코드를 포함하여 추가한 코드는 아래와 같습니다.

//로고파일의 위치를 설정한다
traxxasLogo_250_File = "D:/01_works/용/DIY_HARD_RC/traxxas_LOGO_125x25.png"
var logoFile = new File(traxxasLogo_250_File);

// 포토샵에 새로운 도큐먼트를 생성한다. 크기는 1920 1080
var wallPaperPsd = app.documents.add(1920,1080,72)

// 검정색 컬러를 정의한다
var newColor = new SolidColor();
newColor.rgb.red = 0;
newColor.rgb.green = 0;
newColor.rgb.blue = 10;

// 배경색상을 검정색으로 fill 한다
wallPaperPsd.selection.selectAll();
wallPaperPsd.selection.fill(newColor);
wallPaperPsd.selection.deselect();

// 로고 이미지를 열어서 포토샵으로 복사한다. 
var logoImg = app.open(logoFile);
var newLogoLyr = logoImg.layers[0].duplicate(wallPaperPsd.layers[0], ElementPlacement.PLACEBEFORE);

app.activeDocument = logoImg;
// 로고 파일은 닫는다.
logoImg.close();

app.activeDocument = wallPaperPsd;
//복사한 레이어의 이름을 변경한다.
newLogoLyr.name = "logo_def";

// 이제 화면에 로고 이미지를 가득 채워 넣자

//각 로고 간의 간격을 설정해주자
var gapWidth = 100;
var gapHeight = 100;

// 로고 이미지의 영역을 구한다. bounds 는 레이어내의 이미지 영역 정보를 가져온다
var logoBounds = newLogoLyr.bounds; //영역 정보는 [left, top, right, bottom] 순으로 들어온다.
var logoWidth = logoBounds[2] - logoBounds[0]; // 레이어의 가로 크기
var logoHeight = logoBounds[3] - logoBounds[1]; // 레이어의 세로크기

// 화면 영역내에 몇개의 로고가 들어갈 수 있는지 계산한다.
var numWidth = wallPaperPsd.width / (logoWidth + gapWidth)
var numHeight = wallPaperPsd.height / (logoHeight + gapHeight)

// 가로, 세로로 로고를 복사하여 붙여 넣는다.
for (var yy = 0; yy < numHeight ; yy++) // 세로 개수만큼 반복
{
    for (var xx = 0; xx < numWidth; xx++) // 가로 개수만큼 반복
    {
        var tmpLyr = newLogoLyr.duplicate(newLogoLyr, ElementPlacement.PLACEBEFORE);
        tmpLyr.translate(xx * (logoWidth + gapWidth), yy * (logoHeight + gapHeight))
        tmpLyr.name = "logo_" + xx + "_" + yy ;
    }    
}

 

로고 이미지를 가로세로로 100px 씩 간격을 띄고 화면에 꽉 채우는 스크립트가 되었습니다.

이렇게하면 아래와 같은 그림이 만들어 집니다.

traxxas 로고로 꽉 채워진 이미지가 만들어 졌다.

네 그런데 약간 아쉬운건 로고가 약간 치우쳐져서 배치가 되었네요.

그리고 약간 단조로워 보이는 듯 합니다. 그리고 바탕화면에 사용할 그림인데 너무 강렬한 감이 있습니다.

자 코드를 좀 수정해 보겠습니다. 이제 코드가 제법 길어지므로 집중해서 보셔야 합니다.

var currentUnitValue = app.preferences.rulerUnits

// 포토샵 유닛을 픽셀로 변경
app.preferences.rulerUnits = Units.PIXELS;



//로고파일의 위치를 설정한다
traxxasLogo_250_File = "D:/01_works/용/DIY_HARD_RC/traxxas_LOGO_125x25.png"
var logoFile = new File(traxxasLogo_250_File);

// 포토샵에 새로운 도큐먼트를 생성한다. 크기는 1920 1080
var wallPaperPsd = app.documents.add(1920,1080,72)

// 검정색 컬러를 정의한다
var newColor = new SolidColor();
newColor.rgb.red = 0;
newColor.rgb.green = 0;
newColor.rgb.blue = 10;

// 배경색상을 검정색으로 fill 한다
wallPaperPsd.selection.selectAll();
wallPaperPsd.selection.fill(newColor);
wallPaperPsd.selection.deselect();

// 로고 이미지를 열어서 배경화면용 포토샵으로 복사한다. 
var logoImg = app.open(logoFile);
var newLogoLyr = logoImg.layers[0].duplicate(wallPaperPsd.layers[0], ElementPlacement.PLACEBEFORE);

app.activeDocument = logoImg;
// 로고 파일은 닫는다.
logoImg.close();

app.activeDocument = wallPaperPsd;
//복사한 레이어의 이름을 변경한다.
newLogoLyr.name = "logo_def";

// 이제 화면에 로고 이미지를 가득 채워 넣자

//각 로고 간의 간격을 설정해주자. 숫자가 작을 수록 촘촘해지고 클수록 듬성듬성 붙는다.
// 포토샵 스크립트 실행 속도가 느리므로 너무 작은 숫자는 넣지 말자.
var gapWidth = 100;
var gapHeight = 100;

// 로고 이미지의 영역을 구한다. bounds 는 레이어내의 이미지 영역 정보를 가져온다
var logoBounds = newLogoLyr.bounds; //영역 정보는 [left, top, right, bottom] 순으로 들어온다.
var logoWidth = logoBounds[2] - logoBounds[0]; // 레이어의 가로 크기
var logoHeight = logoBounds[3] - logoBounds[1]; // 레이어의 세로크기

// 화면 영역내에 몇개의 로고가 들어갈 수 있는지 계산한다.
var numWidth = Math.floor(wallPaperPsd.width / (logoWidth + gapWidth));
var numHeight = Math.floor(wallPaperPsd.height / (logoHeight + gapHeight));

// 가로, 세로로 가득 찼을때 남는 공간을 계산하여 offset 을 만들어 주자
var offsetX = Math.floor(wallPaperPsd.width - (numWidth * (logoWidth + gapWidth) - gapWidth));
offsetX = offsetX * 0.5;

var offsetY = Math.floor(wallPaperPsd.height - (numHeight * (logoHeight + gapHeight) - gapHeight));
offsetY = offsetY * 0.5;

// 투명도를 조절하기 위한 값. 여기서 설정한 값에 의해 투명도가 자동으로 조절되어 아래로 내려갈 수록 투명해 진다. 
var maxOpacity = 50;
var minOpacity = 15;

// 각 단계별 투명도 변이 값을 계산하자.
var opacityStep = (maxOpacity - minOpacity) / numHeight

// 가로, 세로로 로고를 복사하여 붙여 넣는다.
for (var yy = 0; yy < numHeight ; yy++) // 세로 개수만큼 반복
{
    for (var xx = 0; xx < numWidth; xx++) // 가로 개수만큼 반복
    {
        var tmpLyr = newLogoLyr.duplicate(newLogoLyr, ElementPlacement.PLACEBEFORE);
        wallPaperPsd.activeLayer = tmpLyr; // 처음 레이어가 계속 활성화 되는 것을 막기 위하여 활성화된 레이어를 현재 복사된 레이어로 지정
        tmpLyr.translate(-logoBounds[0], -logoBounds[1]); // 복사된 레이어를 0,0 으로 이동시킴
        tmpLyr.translate((xx * (logoWidth + gapWidth)) + offsetX, (yy * (logoHeight + gapHeight)) + offsetY) // 지정된 위치로 이동
        tmpLyr.name = "logo_" + xx + "_" + yy ;
        
        tmpLyr.opacity = maxOpacity - (yy * opacityStep); // 아래로 갈 수록 투명하게
        // tmpLyr.opacity = minOpacity + (yy * opacityStep); // 위로 갈수록 투명하게 하려면 주석을 풀어 줍니다.
    }    
}
//처음에 복사한 레이어는 필요 없으니 숨겨줍니다.
newLogoLyr.visible = false;

//유닛을 스크립트 실행 이전상태로 복구함
app.preferences.rulerUnits = currentUnitValue;




 

이제 스크립트는 아래로 복제해 나가면서 점차 투명도를 주어 서서히 보이지 않도록 하고 있습니다. 이 투명도로 사용자가 설정한 최대값과 최소값을 이용하여 점차 변화하도록 하고 있습니다. 

간격을 조정하여 촘촘하게 배치하거나 듬성듬성 배치하더라도 의도한데로 서서히 변화가 적용될 것 입니다.

적용된 화면을 다시 볼까요?

화면에 격자형으로 배치되지만 아래로 갈수록 투명도가 높은 상태가 되었다.

 

이렇게 하면 스크립트의 일부만 수정하여 다양한 화면을 만드는 것이 가능합니다.

반복하여 붙여넣을 파일의 경로, 반복 간격, 투명화 정도를 설정하는 것으로 다른 이미지에도 동일하게 적용이 가능합니다. 본 예제에서는 1920 1080 사이즈의 이미지로 제작하였지만 다른 사이즈를 입력하여도 아마 정확하게 동작할 것입니다. 

여기에 마지막으로 화면 가운데에 좀 더 커다란 로고를 넣는다면 어떻게 해야 할까요?

직접 한번 도전해 보시면 어떨까요?

[wallpaper] traxxas logo 1920 x 1080
[wallpaper] traxxas UDR 1920 x 1080

 

감사합니다. 그럼 이만~

 

레이어 위치 이동하는 스크립트는 여기에도 있었죠? ^^

https://diy-dev-design.tistory.com/46

 

[포토샵스크립트] 현재 레이어 이미지를 중앙으로 이동시키기

안녕하세요. 오늘은 선택된 레이어를 화면의 중앙으로 이동시키는 포토샵 스크립트를 작성해 보겠습니다. 와이프가 한동안 쇼핑몰 상세페이지 디자인 작업을 재택근무 형식으로 했었는데요. 옆에서 작업하는 것을..

diy-dev-design.tistory.com

 

반응형
반응형

먼저 포스트에서 아두이노를이용하여 다양한 리모콘의 신호를 해킹하는 방법을 알아 보았습니다.

https://diy-dev-design.tistory.com/65

 

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

도대체 영화 한편 보려면 몇개의 리모콘을 사용하는지... TV 전원을 켜기위해 TV 리모컨을 찾아야 하고 안드로이드 TV 셋톱을 켜기위해 안드로이드 TV 리모콘을 역시 찾아야 하며 막상 틀었더니 소리가 어마무시하..

diy-dev-design.tistory.com

 

그럼 이제 신호를 TV, 안드로이드 TV BOX, 블루투스 사운드바 에 각각 보내는 테스트를 해볼 차례 입니다.

앞선 포스트에서 확인이 가능하겠지만 제가 테스트를 통해 모은 신호는 아래와 같습니다.

 * tv (NEC)
 * power :      0x2DF10EF, 32
 * input :      0x2DFD02F, 32
 * chnnel up :  0x2DF00FF, 32
 * chnnel dn :  0x2DF807F, 32
 * volumn up :  0x2DF40BF, 32
 * volumn dn :  0x2DFC03F, 32
 * OK :         0x2DF22DD, 32
 * sw up :      0x2DF02FD, 32
 * sw dn :      0x2DF827D, 32
 * sw left :    0x2DFE01F, 32
 * sw right :   0x2DF609F, 32
 * 
 * android tv (NEC)
 * power :      0x807F02FD, 32
 * sw up :      0x807F6897, 32
 * sw dn :      0x807F58A7, 32
 * sw left :    0x807F8A75, 32
 * sw right :   0x807F0AF5, 32
 * sw OK :      0x807FC837, 32
 * back :       0x807F9867, 32
 * volumn up :  0x807F18E7, 32
 * volumn dn :  0x807F08F7, 32
 * 
 * 
 * lonpoo speaker
 * power :      0x40BF807F, 32
 * volumn up :  0x40BF50AF, 32
 * volumn dn :  0x40BFD02F, 32
 * bt :         0x40BFA05F, 32
 * bt esc :     0x40BF906F, 32
 * opt :        0x40BF20DF, 32
 * 
 */

 

먼저 몇가지 확인이 쉬운 기능들을 테스트 할 예정입니다.

전원 ON/OFF 로 해보죠.

준비물은 아래와 같습니다.

  • 아두이노 나노
  • IR LED (송신용, 투명한 재질임)
  • 10 k 정도 되는 저항, 저는 4.7k * 3 개
  • push button 3개
  •  

간단하죠?

IR LED 는 전에 사 두었던 거리감지 쉴드에서 적출 하였습니다. 일정 거리 미만이 되면 신호를 보내는 쉴드 인데요. 마땅히 사용할 일이 없어 놀고 있던 보드에서 추출하였습니다.

거리 감지 센서, 아래쪽의 투명한 LED 가 IR 송신부 LED 이다.

버튼 역시 앞서 포스트에 등장했던 비디오 테이브 플레이어의 보드에서 적출 하였습니다. 다리 4개 짜리 버튼이 브래드보드에서 테스트 하기가 좋지 않기 때문에 뜯는 김에 버튼들도 추출을 진행하였습니다.

혹시 몰라 TR 도 하나 뜯어 보았는데 동작이 잘 안되면 연결해볼까 합니다.

버려진 가전제품에서 적출해낸 부품들

 

일단 테스트 코드를 만들어 보겠습니다.

미리 준비하였던 신호들을 본인의 제품에 맞는 명령으로 보내면 되는데요. 일단 예제 중에 IRremote --> IRsendDemo 예제를 기본으로 시작을 하도록 하겠습니다.

 

해당 예제에 라이브러리를 추가(스케치--> 라이브러리 포함하기--> IRremote) 하고 아래와 같이 코딩을 합니다.

#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

/*
 * IRremote: IRsendDemo - demonstrates sending IR codes with IRsend
 * An IR LED must be connected to Arduino PWM pin 3.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */
/*
 * tv (NEC)
 * power :      0x2DF10EF, 32
 * input :      0x2DFD02F, 32
 * chnnel up :  0x2DF00FF, 32
 * chnnel dn :  0x2DF807F, 32
 * volumn up :  0x2DF40BF, 32
 * volumn dn :  0x2DFC03F, 32
 * OK :         0x2DF22DD, 32
 * sw up :      0x2DF02FD, 32
 * sw dn :      0x2DF827D, 32
 * sw left :    0x2DFE01F, 32
 * sw right :   0x2DF609F, 32
 * 
 * android tv (NEC)
 * power :      0x807F02FD, 32
 * sw up :      0x807F6897, 32
 * sw dn :      0x807F58A7, 32
 * sw left :    0x807F8A75, 32
 * sw right :   0x807F0AF5, 32
 * sw OK :      0x807FC837, 32
 * back :       0x807F9867, 32
 * volumn up :  0x807F18E7, 32
 * volumn dn :  0x807F08F7, 32
 * 
 * 
 * lonpoo speaker
 * power :      0x40BF807F, 32
 * volumn up :  0x40BF50AF, 32
 * volumn dn :  0x40BFD02F, 32
 * bt :         0x40BFA05F, 32
 * bt esc :     0x40BF906F, 32
 * opt :        0x40BF20DF, 32
 * 
 */

#include <IRremote.h>

const int pw_tv = 4;
const int pw_and = 5;
const int pw_spk = 6;

IRsend irsend;

void setup()
{
  pinMode(pw_tv, INPUT_PULLUP);
  pinMode(pw_and, INPUT_PULLUP);
  pinMode(pw_spk, INPUT_PULLUP);
  pinMode(13, OUTPUT);
}

void loop() {

  int s_pw_tv = digitalRead(pw_tv);
  int s_pw_and = digitalRead(pw_and);
  int s_pw_spk = digitalRead(pw_spk);

  // tv 전원 역할 스위치 (평상시는 HIGH 입니다)
  if (s_pw_tv == HIGH) {
    digitalWrite(13, LOW);
  }else{
    digitalWrite(13, HIGH);
    for (int i = 0; i < 3; i++) {
     irsend.sendNEC(0x2DF10EF,32);     
      delay(40);
    }
  }
  
  // 안드로이드 tv box 전원 역할 스위치 (평상시는 HIGH 입니다)
  if (s_pw_and == HIGH) {
    digitalWrite(13, LOW);
  }else{
    digitalWrite(13, HIGH);
    for (int i = 0; i < 3; i++) {
     irsend.sendNEC(0x807F02FD,32);     
      delay(40);
    }
  }
  
  // 사운드 바 전원 역할 스위치 (평상시는 HIGH 입니다)
  if (s_pw_spk == HIGH) {
    digitalWrite(13, LOW);
  }else{
    digitalWrite(13, HIGH);
    for (int i = 0; i < 3; i++) {
     irsend.sendNEC(0x40BF807F,32);     
      delay(40);
    }
  }
	
	delay(50); //5 second delay between each signal burst
}

3개의 버튼을 사용할 것이므로 3개의 입력핀을 설정한뒤 버튼이 눌렸을 때 LED (13번 핀, 아두이노 기본 LED) 를 켜주면서 3차례에 걸쳐 신호를 보내도록 코딩하였습니다.

저는 모든 신호의 제품이 NEC 로 확인 되었기 때문에 라이브러리의 sendNEC 라는 명령을 통해 신호를 보내 주었습니다.

보드는 아래와 같이 구성하였습니다.

3개의 버튼은 각각 4,5,6 번에 연결, IR LED 는 3번에 연결 하였다.

코드를 보면 알겠지만 버튼은 모두 GND 에 연결하고 PULLUP 상태를 만들어 준 뒤 LOW 일때 동작하도록 하였습니다. 이렇게 하면 아두이노 내부 저항에 의해 별도의 외부 저항 없이 버튼 연결이 가능하게 됩니다.

IR LED 의 경우 방향이 정해져 있는데 어짜피 다이오드 이므로 신호가 나오는지 체크해서 신호가 안나오면 방향을 반대로 뒤집어 주면 됩니다. 

신호가 나오는지는 핸드폰 카메라로 확인이 가능한데요, 신호가 나올때는 보라색으로 깜박깜박 합니다. 아래 영상을 참고하시면 됩니다.

 

IR 신호가 정상적으로 나온다면 불이 깜빡이는 것을 확인할 수 있다. 

 

해당 보드로 TV 와 안드로이드 TV box, 사운드바가 정상적으로 동작하는 것을 확인할 수 있습니다.

실제 LED 는 TR 없이 쇼파에서 문제 없이 동작하였으니 이제 실제 결과물을 만들어야 할 시간입니다.

동작할 기능은 많은데 모든 기능에 대하여 버튼을 만들어 넣을 수 는 없을 것 같으니 머리를 좀 써야 할 시간입니다. 이제부터 본격적인 개발이 시작된다고 할까요?

 

이거 뭐 껌이네요. 여러분도 한번 도전해 보시기 바랍니다.

 

자 대망의 만능 리모콘 만들기 3편은 다음 포스트에서 소개해 드리겠습니다.

 

그럼 이만~

 

2020/06/17 - [DIY/Arduino] - [DIY] 아두이노로 통합(만능) 리모콘 만들기 3/3

 

[DIY] 아두이노로 통합(만능) 리모콘 만들기 3/3

아두이노로 통합(만능) 리모콘 만들기 3/3 이라 쓰고 왠지 이번 포스트에서 끝나지 않을 것 같은 느낌이 강하게 듭니다. 지난 포스트에서 아두이노 IR 센서를 이용하여 신호를 해킹하고 또 필요한

diy-dev-design.tistory.com

2020/05/26 - [DIY/Arduino] - 0.96 inch OLED 디스플레이 구동하기

 

0.96 inch OLED 디스플레이 구동하기

가끔 아두이노로 무엇인가를 만들어 보려고 하다보면 디스플레이가 있으면 하는 생각이 들때가 있습니다. 아두이노는 작은 컴퓨터이기는 하지만 모름지기 컴퓨터라 한다면 입력장치 - 중앙처��

diy-dev-design.tistory.com

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

 

아두이노를 이용한 간단한 화분 자동 물주기 시스템

얼마뒤면 베트남으로 가족 여행을 떠날 예정입니다. 7박이나 하고 올 예정이므로 집을 비우기 전 준비해야 할 것들이 많습니다. 이것저것 여행준비를 하던 찰나 베란다에 내어 둔 화분이 걱정이

diy-dev-design.tistory.com

2022.03.26 - [DIY] - [DIY]무민양품 USB 데스크팬 수리하기

 

[DIY]무민양품 USB 데스크팬 수리하기

사무실을 이사하다보면 각 종 쓰레기가 쏟아져 나오는데 간혹 쓸만한 것들이 나오는 경우가 있습니다. 오호~ 이건 무민 양품의 USB 선풍기! 뭐 고장 났으니 버렸겠지 싶어 지나쳐 가다가 ... 고치

diy-dev-design.tistory.com

 

만능 리모컨 만들기 최종 완성본은 아래에서 확인하세요~

2022.08.16 - [DIY/Arduino] - [DIY] 아두이노로 통합(만능) 리모콘 만들기 (최종)

 

[DIY] 아두이노로 통합(만능) 리모콘 만들기 (최종)

만능 리모컨을 만들기로 해놓고 정말 많은 시간이 흘렀습니다. 2019.11.10 - [DIY/Arduino] - [DIY] 아두이노로 만능 (통합) 리모콘 만들기 1/3 2019.11.10 - [DIY/Arduino] - [DIY] 아두이노로 통합(만능) 리모콘..

diy-dev-design.tistory.com

 

반응형
반응형

도대체 영화 한편 보려면 몇개의 리모콘을 사용하는지... 

TV 전원을 켜기위해 TV 리모컨을 찾아야 하고 안드로이드 TV 셋톱을 켜기위해 안드로이드 TV 리모콘을 역시 찾아야 하며 막상 틀었더니 소리가 어마무시하게 커서 블루투스 사운드 바 소리를 줄이기 위해 사운드바 리모콘을 찾아서 겨우 소리를 줄였더니 TV 기본 사운드가 너무 큰 탓인지 사운드바의 볼륨 1에서도 소리가 커서 하나를 줄이면 소리가 아얘 나지 않는 상황이어서 다시 TV 리모콘을 집어 들고 TV 볼륨을 줄였으나 알고보니 영상의 기본 사운드가 너무 크게 인코딩 되어 있어 안드로이드 TV 에서 볼륨 레벨을 낮추기 위하여 다시 안드로이드 TV 리모콘을 집어들어야 하는 상황이 거짓말처럼 하루건너 발생하는 우리집이다.

아놔..

끌때도 TV 끄고, 안드로이드 TV 끄고 사운드바 끄고... 

이걸 한번에 통합하는 건 불가능 한 것일까..

 

그래서 한번 만들어 보기로 하였습니다.

아두이노를 이용하여 IR 리모콘 신호를 해킹하는 예제를 언젠가 본적이 있어 구글링을 하여 보았습니다.

제가 참고한 블로그는 아래 블로그 입니다.

https://blog.naver.com/opusk/220984753138

 

[Application] 아두이노로 리모컨 IR신호 확인하기 - IRremote Library를 활용한

적외선 통신 (Infrared Ray Communication)먼저, IR통신에 대해 알아보면 말그대로 적외선 통신입니다...

blog.naver.com

좀 어려운 말들이 있기는 하지만 복잡할 것 없이 그냥 따라 해보시면 됩니다.

 

일단 신호를 따서 필요한 신호를 모두 모은 뒤에 버튼을 달고 버튼을 누를 때 마다 필요한 신호를 보내면 끝.

 

일단 신호를 따야 겠죠?

필요한 준비물은 아래와 같습니다.

  • 아두이노 나노
  • IR 리모콘 수신부 LED (저는 고장난 비디오 데크 에서 뜯어냈습니다. 재활용품 버리는날 주워왔었죠)
  • 10 k 정도의 저항 (얼마인지는 모르겠네요)
  • IR 라이브러리 (링크)

 

요렇게 하고 시작해 보겠습니다.

먼저 위에 링크 라고 되어있는 페이지로 가봅시다.

https://github.com/z3t0/Arduino-IRremote

가서보면 아래와 같은 페이지가 보이는데요. 우측에 'clone or download' 를 누르시게 되면 압축 파일로 다운로드가 됩니다.

 

 

이렇게 다운로드 받은 zip 파일을 압축을 해제한 뒤 아두이노 library 폴더에 넣으시면 되는데요. library 폴더는 아두이노가 설치된 폴더에도 있고 내문서에 Arduino 폴더에도 있습니다. 

저는 설치폴더 찾아 들어가기가 귀찮아서 그냥 내문서에 있는 라이브러리 폴더에 넣었습니다.

 

이제 아두이노 IDE 를 실행해 봅니다. (아두이노 IDE가 켜진 상태에서 라이브러리를 추가 하였다면 모두 종료하고 재실행하면 라이브러리 및 예제가 추가되어 있는 것을 알 수 있습니다)

그런다음 예제에서 IRremote 로 들어가고 그 하위에 있는 IRrecvDumpV2 를 선택해 줍니다.

 

그러면 아두이노 IDE 에 예제 파일이 보이게 되는데요.

여기에서 추가로 설정해주어야 하는 것이 입력 핀 번호 수정입니다.

아래 그림과 같이 int recvPin 을 2번으로 변경해 줍니다. 2번은 나노의 D2 에 해당됩니다.

 

끝으로 IR 라이브러리를 추가해주어야 하는데요.

요렇게 해주면 준비가 완료 됩니다.

이제 브래드 보드에 리모콘 수신부를 연결하도록 하겠습니다.

아래 사진과 같이 연결해 줍니다.

 

적외선 수신부의 가장 좌측 다리를 D2 에 연결하고 10k 저항을 통해 5v 를 인가합니다.

가운데 다리는 GND 에 우측 다리는 5v 에 직접 연결합니다.

준비 완료.

 

아두이노 IDE 에 작성해놓은 코드를 업로드 합니다. 

혹시 처음 하시는 분은 아래와 같이 설정을 하면 됩니다.

COM 포트는 사용자마다 다를거에요. 어떤 USB 포트에 연결했느냐에 따라 다른 번호가 나타납니다. 

USB 를 연결한뒤에 새로 나타나는 포트가 아두이노가 연결된 포트입니다.

 

이제 신호를 테스트 해보겠습니다.

USB 를 연결하고 시리얼 모니터를 켠 후 리모콘의 버튼을 눌러 필요한 신호를 보내봅니다.

무려 세개의 리모콘이 이번 통합 대상이다.
리모콘을 수신부를 향해 눌러준다.

그럼 시리얼 모니터에 아래와 같이 출력이 됩니다.

시리얼 모니터를 통하여 입력된 정보

중요한 것은 여기 빨간색 네모 박스의 내용입니다.

입력된 신호는 NEC 라는 회사의 프로토콜이며 0x807FAA55 라는 HEX 코드가 바로 입력된 신호인 것이죠. 위에 rawData 라는 정보가 보이는데 이는 NEC, LG 등과 같이 프로토콜의 제조사를 알 수 없는 리모콘신호인 경우 rawData 를 직접 보내기 위하여 사용되는 정보 입니다. 

저의 경우에는 NEC 라는 제조사의 신호임이 확인되었기 때문에 해당 제조사에서 약속한 0x807FAA55 라는 값을 보내면 됩니다. 

가끔 시리얼 모니터에 제조사 정보에 UNKNOWN 이라고 나오는 경우가 있습니다. 실제로 제품 사용중에 리모콘을 눌러도 신호가 전달이 되지 않는 경우가 있죠? 이렇게 신호가 불분명하게 입력되는 경우입니다. 다시 눌러보면 정확히 들어오게 되는데 이때 들어온 정보를 사용하면 됩니다.

이렇게 3개의 리모콘을 이용하여 제가 모아본 신호는 아래와 같습니다.

 * tv (NEC)
 * power :      0x2DF10EF, 32
 * input :      0x2DFD02F, 32
 * chnnel up :  0x2DF00FF, 32
 * chnnel dn :  0x2DF807F, 32
 * volumn up :  0x2DF40BF, 32
 * volumn dn :  0x2DFC03F, 32
 * OK :         0x2DF22DD, 32
 * sw up :      0x2DF02FD, 32
 * sw dn :      0x2DF827D, 32
 * sw left :    0x2DFE01F, 32
 * sw right :   0x2DF609F, 32
 * 
 * android tv (NEC)
 * power :      0x807F02FD, 32
 * sw up :      0x807F6897, 32
 * sw dn :      0x807F58A7, 32
 * sw left :    0x807F8A75, 32
 * sw right :   0x807F0AF5, 32
 * sw OK :      0x807FC837, 32
 * back :       0x807F9867, 32
 * volumn up :  0x807F18E7, 32
 * volumn dn :  0x807F08F7, 32
 * 
 * 
 * lonpoo speaker
 * power :      0x40BF807F, 32
 * volumn up :  0x40BF50AF, 32
 * volumn dn :  0x40BFD02F, 32
 * bt :         0x40BFA05F, 32
 * bt esc :     0x40BF906F, 32
 * opt :        0x40BF20DF, 32
 * 
 */

저는 위의 신호들을 하나의 리모콘을 통하여 보낼 수 있도록 만들어볼 생각입니다.

그럼 다음 포스트에서 실제 신호를 보내는 예제를 만들어 보겠습니다.

 

그럼 이만~

 

그 다음 이야기는 아래 포스트에서 확인해 주세요

https://diy-dev-design.tistory.com/66

 

[DIY] 아두이노로 통합(만능) 리모콘 만들기 2/3

먼저 포스트에서 아두이노를이용하여 다양한 리모콘의 신호를 해킹하는 방법을 알아 보았습니다. https://diy-dev-design.tistory.com/65 [DIY] 아두이노로 만능 (통합) 리모콘 만들기 1/3 도대체 영화 한편 보려..

diy-dev-design.tistory.com

 

2020/06/17 - [DIY/Arduino] - [DIY] 아두이노로 통합(만능) 리모콘 만들기 3/3

 

[DIY] 아두이노로 통합(만능) 리모콘 만들기 3/3

아두이노로 통합(만능) 리모콘 만들기 3/3 이라 쓰고 왠지 이번 포스트에서 끝나지 않을 것 같은 느낌이 강하게 듭니다. 지난 포스트에서 아두이노 IR 센서를 이용하여 신호를 해킹하고 또 필요한

diy-dev-design.tistory.com

2020/05/26 - [DIY/Arduino] - 0.96 inch OLED 디스플레이 구동하기

 

0.96 inch OLED 디스플레이 구동하기

가끔 아두이노로 무엇인가를 만들어 보려고 하다보면 디스플레이가 있으면 하는 생각이 들때가 있습니다. 아두이노는 작은 컴퓨터이기는 하지만 모름지기 컴퓨터라 한다면 입력장치 - 중앙처��

diy-dev-design.tistory.com

2020/07/01 - [DIY] - 미니 테슬라코일 만들기 - 알리 DIY KIT

 

미니 테슬라코일 만들기 - 알리 DIY KIT

어렸을적 위대한 발명가, 과학자 하면 단연 손꼽는 일인자가 있었는데 누군가 물어본다면 100 이면 100 다 토마스 에디슨을 떠올릴 것입니다.. 그런데 커보니 에디슨은 발명가나 과학자라기보다��

diy-dev-design.tistory.com

 

만능 리모컨 만들기 최종 완성본은 아래쪽을 참고해 주세요

2022.08.16 - [DIY/Arduino] - [DIY] 아두이노로 통합(만능) 리모콘 만들기 (최종)

 

[DIY] 아두이노로 통합(만능) 리모콘 만들기 (최종)

만능 리모컨을 만들기로 해놓고 정말 많은 시간이 흘렀습니다. 2019.11.10 - [DIY/Arduino] - [DIY] 아두이노로 만능 (통합) 리모콘 만들기 1/3 2019.11.10 - [DIY/Arduino] - [DIY] 아두이노로 통합(만능) 리모콘..

diy-dev-design.tistory.com

 

반응형

+ Recent posts