Blog

1. 아두이노에 연결하기

 아두이노에서 IR 송수신 센서를 이용하여 리모컨 제어를 할 수 있습니다. IR 수신 센서는 TSOP38238(Datasheet 보기)를 이용 하였고, IR 송신 센서는 IR333C(Datasheet 보기)를 사용 하였습니다. 연결은 각 센서 데이터시트를 참고하여 연결을 하면 됩니다. 아래 그림에서 왼쪽 검은색의 센서가 IR 수신 센서이고, 오른쪽 투명한 센서가 IR 송신 센서입니다.




2. IR 라이브러리 설치하기

 먼저 IR 관련 처리를 하기 위해 IR 관련 라이브러리를 설치를 해야 합니다. 물론 기본적으로 존재는 하지만 송신이 되지 않고, 수신만 되는 상태라 아래 주소에서 받아서 라이브러리 폴더에 넣어 주시면 됩니다.

 

IR Library Download : https://github.com/z3t0/Arduino-IRremote


받으신 후에 기존에 있던 IRremote폴더 내에 있는 파일들은 모두 지우고 넣어 주셔야 합니다. 그냥 새로 추가할 경우 충돌이 일어나 제대로 동작하지 않을 수 있습니다. 



3. 리모컨 송수신 테스트

#include <IRremote.h> // Include the IRremote library


/* Connect the output of the IR receiver diode to pin 11. */

int RECV_PIN = 11;

/* Initialize the irrecv part of the IRremote  library */

IRrecv irrecv(RECV_PIN);

decode_results results; // This will store our IR received codes


IRsend irsend; // Enables IR transmit on pin 3


/* Storage variables for the received IR code: */

unsigned int irLen = 0; // The length of the code

unsigned int irBuffer[RAWBUF]; // Storage for raw (UNKNOWN) codes

int codeType; // The type of code (NEC, SONY, UNKNOWN, etc.)

unsigned int codeValue; // The value of a known code

boolean codeReceived = false; // A boolean to keep track of if a code was received


const int buttonPin = 12; // Button pin. Pulled up. Triggered when connected to ground.


// setup() initializes serial and the Infrared receiver.

void setup() {

  Serial.begin(9600);

  irrecv.enableIRIn(); // Start the receiver

  pinMode(buttonPin, INPUT_PULLUP);

}


// loop() checks for either a button press or a received IR code.

void loop() {

  if (irrecv.decode(&results)) {

    updateIRReceive(); // Sort out the received code

    codeReceived = true; // Enables code transmit on button press

    irrecv.resume(); // re-enable receive

  }


  if ((digitalRead(buttonPin) == LOW) && (codeReceived == true)) {

    sendCode(); // Sends out our code. (See bottom of sketch).

    irrecv.enableIRIn(); // Re-enable receiver

    codeReceived = false;

  }

}


void updateIRReceive() {

  codeType = results.decode_type;

  irLen = results.rawlen;

  codeValue = results.value;


  Serial.println(irLen);

  Serial.print("receive code type : 0x");

  Serial.println(results.decode_type, HEX);

  Serial.print("receive code value : 0x");

  Serial.println(results.value, HEX);

  

  if (codeType == UNKNOWN) {

    // We need to convert from ticks to microseconds

    for (int i = 1; i <= irLen; i++) {

      if (i % 2) {

        // Mark

        irBuffer[i-1] = results.rawbuf[i]*USECPERTICK - MARK_EXCESS;

        Serial.print(" m");

      } else {

        // Space

        irBuffer[i-1] = results.rawbuf[i]*USECPERTICK + MARK_EXCESS;

        Serial.print(" s");

      }

      Serial.print(irBuffer[i-1], DEC);

    }

    Serial.println();

  } else {

    if (codeType == NEC) {

      Serial.print("Received NEC: ");

      if (results.value == REPEAT) {

        // Don't record a NEC repeat value as that's useless.

        Serial.println("repeat; ignoring.");

        return;  

      }

    } else if (codeType == SAMSUNG) {

      Serial.print("Received SAMSUNG: ");

    } else if (codeType == RC5) {

      Serial.print("Received RC5: ");

    } else if (codeType == RC6) {

      Serial.print("Received RC6: ");

    } else {

      Serial.print("Unexpected codeType ");

      Serial.print(codeType, DEC);

      Serial.println("");

    }

    Serial.println(results.value, HEX);

    codeValue = results.value;

    irLen = results.bits;

    

    Serial.print("code type : ");

    Serial.println(codeType);

    Serial.print("code value : ");

    Serial.println(codeValue);

    Serial.print("code value hex : 0x");

    Serial.println(codeValue, HEX);

    Serial.print("ir length : ");

    Serial.println(irLen);

    Serial.println();

  }

}


void sendCode() {

  if (codeType == NEC) {

      //irsend.sendNEC(codeValue, irLen);

      irsend.sendNEC(0x20DF22DD, irLen);

    

    Serial.print("Sent NEC 0x");

    Serial.println(codeValue, HEX);

    Serial.println();

  }  else if (codeType == SAMSUNG)  {

      irsend.sendSAMSUNG(codeValue, irLen);

    

    Serial.print("Sent NEC 0x");

    Serial.println(0xEACEFB13, HEX);

    Serial.println();

  } else if (codeType == UNKNOWN /* i.e. raw */) {

    // Assume 38 KHz

    irsend.sendRaw(irBuffer, irLen, 38);

    Serial.println("Sent raw");

    for (int i = 0; i < irLen; i++) {

      Serial.print(irBuffer[i]);

      Serial.print(" ");

    }

    Serial.println();

    Serial.println(codeValue, HEX);

  }

}

 위 코드는 리모컨으로부터 IR 수신을 받은 값을 사용자가 아두이노에 연결된 버튼을 누를 경우 수신된 값을 전송해 주도록 작성된 코드입니다. 위 회로도에서 버튼은 포함되지 않았기에 추가를 해 주셔야 합니다. 

 정상적으로 수신이 동작이 됩니다. 다만, 송신시 수신된 codeValue값을 그대로 보냈음에도 불구하고 제대로 전송이 되지 않는 문제가 있어서 Hex값을 보내도록 수정을 하였습니다. 리모컨 Hex값은 위와 같은 회로로 눌러가며 입력을 받아도 되지만, 아래 사이트에 있을 경우 그 값을 그대로 이용을 하여도 무방할 것 같습니다. 찾으실 때 제품명이 아닌 리모컨에 기재된 리모컨 제품번호를 검색 하셔야 합니다. 물론 모든 리모컨 값이 있는게 아니라 없을 경우 일일이 입력하여야 합니다.


http://lirc.sourceforge.net/remotes/



4. 테스트 영상 보기

 먼저 리모컨 버튼을 누른 후 입력값 확인 후 아두이노에서 버튼을 눌러 리모컨 값을 전달하는 영상입니다.


'Programing > Arduino' 카테고리의 다른 글

리모컨 제어하기  (2) 2015.07.30

Comment +2

SCP 아이디@주소:원격지경로 다운로드경로


scp pi@192.168.0.68:/home/pi/hs_err.log ~/error.log

Comment +0

안드로이드에서 소프트키를 보여주지 않아야 할 경우가 있을 때 아래 코드로 파일을 하나 생성 해 줍니다.


using UnityEngine;

public class DisableSystemUI {
	#if UNITY_ANDROID
	static AndroidJavaObject activityInstance;
	static AndroidJavaObject windowInstance;
	static AndroidJavaObject viewInstance;
	
	const int SYSTEM_UI_FLAG_HIDE_NAVIGATION = 2;
	const int SYSTEM_UI_FLAG_LAYOUT_STABLE = 256;
	const int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512;
	const int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 1024;
	const int SYSTEM_UI_FLAG_IMMERSIVE = 2048;
	const int SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 4096;
	const int SYSTEM_UI_FLAG_FULLSCREEN = 4;
	
	public delegate void RunPtr();
	
	public static void Run() {
		if (viewInstance != null) {
			viewInstance.Call("setSystemUiVisibility", 
			                  SYSTEM_UI_FLAG_LAYOUT_STABLE
			                  | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
			                  | SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
			                  | SYSTEM_UI_FLAG_HIDE_NAVIGATION
			                  | SYSTEM_UI_FLAG_FULLSCREEN
			                  | SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
		}
		
	}
	#endif  

	public static void DisableNavUI() {
		if (Application.platform != RuntimePlatform.Android)
			return;
		#if UNITY_ANDROID
		using (AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
			activityInstance = unityPlayerClass.GetStatic("currentActivity");
			windowInstance = activityInstance.Call("getWindow");
			viewInstance = windowInstance.Call("getDecorView");
			
			AndroidJavaRunnable RunThis;
			RunThis = new AndroidJavaRunnable(new RunPtr(Run));
			activityInstance.Call("runOnUiThread", RunThis);
		}
		#endif
	}
}


그리고 처음 호출하는 부분에서 

DisableSystemUI.DisableNavUI();

를 불러주면 소프트키를 숨겨줍니다.

해당 폰에서 소프트키를 다시 볼려면 화면 상단을 아래로 스와이프를 해 주면 됩니다.

Comment +2

.gitignore를 설정한 뒤에 commit를 하는데 설정한 파일이 계속해서 있다면 cache를 제거를 해 줘야 합니다.


git rm -r --cached .

git add .

git commit -m "message"


.gitignore에서 설정한 파일이 보이지 않은 것을 확인하면 됩니다.

Comment +0

ProjectFolder.xcodeproj/project.xcworkspace/xcuserdata/myUserName.xcuserdatad/UserInterfaceState.xcuserstate

github에서 자주 커밋을 하게 되는데 빌드 할 때마다 저 파일을 계속해서 커밋을 해 줘야 하는데, 이를 방지할 방법은......

터미널을 실행 한 다음에 아래 코드를 입력 해주고서 커밋을 해 주면 이제 앞으로 나타나지 않습니다.

git rm --cached ProjectFolder.xcodeproj/project.xcworkspace/xcuserdata/myUserName.xcuserdatad/UserInterfaceState.xcuserstate
git commit
-m "Removed file that shouldn't be tracked"
 

Comment +0


xcode4를 기준으로 작성된 글입니다. 다른 버전일 경우 관련 메뉴가 없거나 다른 곳에 있을 수 있습니다.

1. 먼저 Xcode를 실행하도록 합니다. 상단 메뉴에서 File - Source Control - Repositories를 선택합니다.

2. 다음과 같은 창이 뜨게 됩니다. 여기서 아래쪽에 있는 + 버튼을 누르면 "Add Repository"를 눌러주세요.

3. 추가를 할 수 있는 창이 뜨게 됩니다. Name에는 알아볼 수 있는 이름을 입력을 해 주시고, Location에는 서버 주소를 입력을 해 주시면 됩니다.


4. 각 폴더를 설정할 수 있는 부분이 있는데 다음으로 넘어가시면 됩니다.


5. 저 같은 경우에는 네이버 개발자센터에서 제공하는 것을 이용을 하였습니다. 아이디와 비밀번호를 입력하여 접속을 하면 됩니다.
네이버 개발자센터는 비밀번호가 네이버 비밀번호가 아닌 다시 등록을 해야 하더군요.
네이버 비밀번호를 입력을 하는데 계속해서 실패가 떠요 ㅠㅠ 
개발자센터 마이페이지에 가셔서 코드저장소 비밀번호를 설정을 해 주세요~


6. 인증이 완료가 되면 다 되었습니다. 
아래에 있는 Checkout을 누르셔서 자신의 컴퓨터로 받아주시면 됩니다.
 
참고로 xcode4를 기반으로 작성된 글이라 다른 버전에서는 다르게 나타날 수 있습니다. 

'Programing > iOS' 카테고리의 다른 글

Xcode4와 SVN 연동하기  (4) 2011.05.31

Comment +4

  • lol 2011.06.12 15:40 신고

    감사해용~

  • ㅠㅠ 2011.07.17 02:38 신고

    예전에 개발하신 시간표 작성 프로그램 혹시 소스 공개나
    제작 의뢰 가능할까요 ?
    son0481@gmail.com 로 답장 메일 부탁드릴게요 ^^;

  • orangeun 2012.03.07 16:12 신고

    오.. 감사합니다.
    아이폰 공부하려 했더니 책과 다른 버전인 xcode4 .........
    생전 처음 맥을 만지려니 후덜덜하네요.
    책보고서도 해매다가 도움얻고 갑니다. ^^

계산기

Programing/C#2009.01.03 15:30

 윈도에 탑재되어 있는 계산기와 거의 비슷하게 동작하는 계산기입니다. 기본적인 사칙 연산을 비롯하여, 나머지 연산, 제곱근을 할 수 있게 되어 있습니다. 다만 몇몇 버그들이 있어서 그것들을 고치면 제대로 돌아가는 계산기가 만들어질 것입니다.

 발견한 버그는 0으로 나눌 때 생기는 문제가 있습니다. 프로그램을 종료할지 묻기는 하는데, 무시하고 실행하면 별 문제 없이 실행이 가능합니다.

 현재 시간은 시험칠때 작년 문제에 계산기에 시간을 표시하는 기능이 있었다는 것을 확인하고 시험칠 때 그 문제가 나오면 바로 낼려고 만들어 두었던 건데, 정작 시험에는 안 나왔다죠; 

 위에 보이는 텍스트박스에 바로 숫자를 입력을 하여 계산을 할 수도 있습니다. 


 실행파일은 아래에서 받으실 수 있습니다.

 소스코드는 아래 해피캠퍼스에서 받으실 수 있습니다.

'Programing > C#' 카테고리의 다른 글

계산기  (6) 2009.01.03
DDR  (0) 2009.01.02
윈도 탐색기  (4) 2008.12.28
아날로그 시계  (4) 2008.11.08
직소퍼즐  (4) 2008.11.02

Comment +6

DDR

Programing/C#2009.01.02 15:00

DDR게임입니다.
실제 DDR과는 조금 다르게 진행이 됩니다.
실제 DDR은 오락실에서 한번쯤 보셔서 아실껍니다.

 이건 다르게 버튼에 있는 화살표가 검은색으로 칠해지면 그 방향키를 누르거나 마우스로 클릭을 하면 되게 됩니다. 일정한 시간 간격으로 버튼이 바뀌도록 되어 있습니다. 시간이 지나면 빨라지거나 그런건 아직 없습니다. 설정을 통해서 사용자가 시작 속도를 빠르게 할 수도 있습니다. 
 
 점수가 0점이 되게 되면 게임은 그냥 끝이 나게 되어 버리게 되어 있습니다. 혹은 20회 틀리게 된다면은 역시나 게임이 끝나게 됩니다. 만약 계속해서 맞추게 된다면은 게임은 안 끝나고 계속 진행이 되게 됩니다.

 C#으로 작성을 하였구요. C#을 배우고 두번째로 나온 과제였습니다. 타이머를 적절하게 활용을 하여 누르게될 화살표가 표시될 시간과 대기 시간을 정해주게 하면 됩니다. 타이머를 2개를 써도 되지만, 저는 하나만 써서 처리를 하였습니다. 사실 하나만 사용해도 처리를 하는데는 별 문제가 없습니다.

 간단한 프로그램이라 C#을 조금 배우셨다면 쉽게 하실 수 있으실 것입니다. 다만 버튼으로 처리를 할때 키보드 이벤트 처리가 잘 안 되는 문제가 있습니다. 저는 살짝 꼼수를 부려서 처리를 하긴 했습니다.

 게임 실행 파일은 아래 링크에서 받으실 수 있습니다.
 소스 코드는 아래 해피캠퍼스 링크에서 받으실 수 있습니다.

'Programing > C#' 카테고리의 다른 글

계산기  (6) 2009.01.03
DDR  (0) 2009.01.02
윈도 탐색기  (4) 2008.12.28
아날로그 시계  (4) 2008.11.08
직소퍼즐  (4) 2008.11.02

Comment +0

 포스팅꺼리는 없어서 학기 중에 레포트로 제작했던 것들이나 공개를 해 볼려고 합니다. 사실 그전에 했던것들은 전부 콘솔환경(도스창이라고 생각하시면 되요)이라 전혀 비주얼적으로 이쁘지 않았다는 문제가 있었다죠. 그래서 이번에 배운 과목에서는 이걸 이쁘게 만는걸 했었다죠. 전에 직소 퍼즐을 만들어서 공개를 했었다죠.

이번에 소개할 것은 윈도 탐색기입니다. 실제 탐색기와 거의 동일하게 한다고 했습니다만 나름 다 잘됩니다.
더블클릭을 하면 실행도 되고, 그럭저럭 되긴 됩니다만 안되는거 찾으면 많죠.
실제 윈도 탐색기에는 많은 것들을 해야 하더군요;


실행 파일 아래 있습니다. 다운로드 받아서 확인 해 보시면 됩니다.,
소스코드는 해피캠퍼스에서 다운로드를 받으실 수 있습니다.

'Programing > C#' 카테고리의 다른 글

계산기  (6) 2009.01.03
DDR  (0) 2009.01.02
윈도 탐색기  (4) 2008.12.28
아날로그 시계  (4) 2008.11.08
직소퍼즐  (4) 2008.11.02

Comment +4

 학교 레포트는 아니지만 한번 연습삼아 만들어 본 것이랍니다. 단순히 시계를 아날로그 형태로만 출력을 하도록 한 것입니다. 그 시간은 절대 표준 시간이거나 정확한 시간은 아닐 수도 있습니다. 현재 컴퓨터의 시간을 출력을 하는 것이랍니다. 

 오른쪽에 보이는 것처럼 출력을 합니다. 처음에는 쉬울줄 알고 그냥 쓰윽 하다가 바로 시간에 맞게 선을 그을려니 갑자기 삼각함수가 헷갈리게 시작하더군요; 요즘들어 수학의 안타까움을 느끼면서 지내고 있긴합니다; 

 시간이 지나면 초침, 분침, 시침이 알아서 움직이게끔 했습니다. 시침도 분에 맞게 이동을 하게 했구요. 이건 게임이 아니라 이웃분들께서 받아서 열심히 하는 일은 안 생길듯 합니다; 레포트로 나온게 하나 있는데, 그거 제출하고 공개하도록 할께요. DDR 게임이라고, 예전에 오락실에 있는거랑 비슷한겁니다. 하지만 아직까지 실력이 없는지라 정말 오락실에 있는것처럼 하지는 못합니다. 그냥 보이는거 누르는 건데, 아래 그림하고 같은 거랍니다.

그림 보기



 다시 원래대로 들어가서 이번 시계에는 폼에는 아무것도 안 그려 넣었습니다. 라벨 하나 넣었더군요. 현재 시간을 디지털로 출력을 해 주기 위한거랍니다. 원이나 테두리 숫자나 시침, 분침, 초침은 그래픽으로 그려넣은 것이랍니다. 저 각 침들을 그려줄때 삼각함수를 이용해서 위치를 잡아주도록 했습니다. 주석을 달아야 하는데 귀찮아서 그냥 버려두었습니다.

아날로그 시계의 소스 코드는 해피캠퍼스에서 다운로드를 할 수 있습니다.
Clock

'Programing > C#' 카테고리의 다른 글

계산기  (6) 2009.01.03
DDR  (0) 2009.01.02
윈도 탐색기  (4) 2008.12.28
아날로그 시계  (4) 2008.11.08
직소퍼즐  (4) 2008.11.02

Comment +4