???? - 5. 아두이노에서 지자기 센서(GY-271) 사용하기


간단히 말하면 나침반 역할을 하는 센서입니다.

칩셋이 원래는 HMC5883L이었으나 단종되어 최근에는 QMC5883L로 나오고 있는듯합니다. 하지만 보유중인 부품이 HMC5883L인 관계로 해당 칩셋 기준으로 테스트를 진행하겠습니다.



배선도



관련 라이브러리 설치

  1. 구글에서 HMC5883L arduino library를 검색합니다.
  2. 나온 결과 중에서 https://github.com/jarzebski/Arduino-HMC5883L 로 들어갑니다.
  3. 라이브러리를 ZIP 파일로 다운받습니다. (CODE 버튼 누르고, Download ZIP 선택)
  4. 아두이노 IDE를 실행
  5. 스케치 > 라이브러리 포함하기 > .ZIP 라이브러리 추가 메뉴를 실행합니다.
  6. 다운 받은 ZIP 파일을 선택합니다.


예제 실행

  1. 파일 >예제 밑에 Arduino-HMC5883L-master 항목이 생긴 것을 볼 수 있습니다.
  2. 이 밑에 있는 HMC5883L_processing 예제를 열어서 컴파일 후 업로드합니다.
  3. 툴 > 시리얼 모니터를 엽니다.


실행 결과

  • 아래와 같이 노멀 벡터 X/Y/Z 요소, 보정 안된 방위 각도, 보정(HMC5883L 각도 이슈)된 방위 각도, 평활화(smooth) 처리된 방위각 순으로 출력되는 것을 확인할 수 있습니다.
1117.80:-376.28:-92.00:345.83:337.00:339
1123.32:-380.88:-82.80:345.70:337.00:339
1116.88:-369.84:-89.24:346.11:339.00:339
1127.92:-387.32:-73.60:345.48:337.00:339
1120.56:-371.68:-84.64:346.08:339.00:339
1139.88:-386.40:-72.68:345.71:337.00:339
1121.48:-371.68:-84.64:346.10:339.00:339
1139.88:-386.40:-70.84:345.71:337.00:339
1130.68:-385.48:-73.60:345.61:337.00:339
1138.96:-387.32:-70.84:345.65:337.00:339
1129.76:-387.32:-72.68:345.51:337.00:339
1138.96:-387.32:-69.00:345.65:337.00:339
1129.76:-386.40:-69.92:345.55:337.00:339
1122.40:-373.52:-80.96:346.03:339.00:339
1132.52:-387.32:-69.92:345.55:337.00:339
1123.32:-373.52:-81.88:346.04:339.00:339
1141.72:-388.24:-66.24:345.65:337.00:339
1123.32:-372.60:-81.88:346.08:339.00:339
1141.72:-388.24:-68.08:345.65:337.00:339

,

???? - 4. 아두이노에서 기울기 센서(MPU-6050) 사용하기


MPU-6050은 아두이노에서 사용할 수 있는 기울기 센서 중 하나입니다. MPU-6050은 (중력)가속도 3축 + 자이로 3축을 합쳐서 6축 센서라고 불리는데 가속도 센서는 정적인 상태에서만 정확한 측정이 가능하므로 자이로 센서로 이를 보정하는 식으로 측정이 이루어집니다. (자이로 3축 + 가속도 2축 + 온도 이렇게 6축이라는데도 있습니다) 기능으로는 Pitch, Roll, Yaw 세 방향의 기울기를 측정할 수 있는데, 실제로 테스트를 해봤을 때 Yaw값의 경우는 다소 정확하지 않은 느낌을 받았습니다.



배선도



관련 라이브러리 설치

  1. 아두이노 IDE를 실행합니다.
  2. 툴 -> 라이브러리 관리 메뉴를 실행합니다.
  3. 라이브러리 매니저 화면에서 MPU6050를 검색합니다.
  4. MPU6050 by Electronic Cats를 설치합니다.


예제 실행

  1. 파일 >예제 밑에 MPU6050 항목이 생긴 것을 볼 수 있습니다.
  2. 이 밑에 있는 MPU6050_DMP6 예제를 열어서 컴파일 후 업로드합니다.
  3. 툴 > 시리얼 모니터를 엽니다.
  4. 속도를 115200 보드레이트로 변경합니다.
  5. 시리얼 모니터 상단 입력란에 아무 값이나 입력하고 전송을 누르면 화면 출력이 시작됩니다.


실행 결과

  • 센서를 기울임에 따라 Yaw, Pitch, Roll 값이 변경되는 것을 확인할 수 있습니다.
Initializing DMP...
Enabling DMP...
Enabling interrupt detection (Arduino external interrupt 0)...
DMP ready! Waiting for first interrupt...

ypr	30.79	18.42	-64.17
ypr	31.31	18.09	-63.87
ypr	31.79	18.02	-63.55
ypr	32.53	18.19	-62.95
ypr	33.78	19.00	-61.67
ypr	35.42	20.35	-59.94
ypr	37.08	21.77	-58.21
ypr	38.17	22.89	-57.00
ypr	38.77	23.71	-56.29
ypr	39.22	24.47	-55.71
ypr	39.75	25.41	-54.93
ypr	40.41	26.68	-53.86
ypr	41.32	28.44	-52.36
ypr	42.19	30.52	-50.78
ypr	42.77	32.47	-49.49
ypr	43.36	34.06	-48.33
ypr	43.91	35.41	-47.32
ypr	44.24	36.57	-46.51
ypr	44.41	37.62	-45.85
ypr	44.76	38.83	-45.03
ypr	45.24	40.09	-44.09
ypr	45.65	41.30	-43.15
ypr	46.17	42.65	-42.10
ypr	46.70	43.95	-41.17
ypr	46.98	44.78	-40.65
ypr	46.97	45.16	-40.28

,

???? - 3. 누를 것이 필요해! (내부풀업 사용)

 

보통은 스위치에 풀다운 저항을 붙여서 많이 사용하는데, 여기서는 귀차니즘에 굴복하라!는 일일과제 달성을 위하여 내부 풀업 저항을 이용한 방법을 확인해보겠습니다. 이 경우, 출력값이 버튼을 누르지 않았을 때 HIGH, 눌렀을 경우에 LOW로 들어오게 됩니다.

 

 

배선도

 

 

소스

void setup() {
  pinMode(4, INPUT_PULLUP);
}

void loop() {
  int buttonD4 = digitalRead(4);

  if (buttonD4 == LOW) {
    Serial.println("button pressed!");
  }
}

 

실행 결과

  • 위 소스를 테스트해보면 위에서 말한대로 입력이 들어오는 것을 확인할 수 있다.
  • 하지만 실사용의 경우에는 아래와 같이 previous 값 관리를 해야 버튼이 한번 눌릴 때 이벤트 처리가 여러번 되는 것을 방지할 수 있다.
void setup() {
  pinMode(4, INPUT_PULLUP);
}

int buttonD4Prev = HIGH;

void loop() {
  int buttonD4 = digitalRead(4);

  if (buttonD4Prev == HIGH && buttonD4 == LOW) {
    Serial.println("button pressed!");
  }
  buttonD4Prev = buttonD4;
}

 

,

???? - 2. 돌릴 것이 필요해! (포텐셔미터)

 

흔히 가변저항으로 알려진 포텐셔미터의 사용법을 확인해보겠습니다.

 

 

배선도

 

 

소스

void setup() {
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
}

 

실행 결과

  • 시리얼 모니터를 통해 결과를 확인해보면 포텐셔미터를 돌림에 따라 0 ~ 1023 사이의 값이 출력되는 것을 확인할 수 있다.

 

,

???? - 1. 아두이노를 활용한 조이스틱 제작방법 요약

 

다들 집안 냉장고에 요리하다 남은 아두이노(Arduino)가 하나씩들 있으실텐데요. 이 놀고있는 아두이노를 활용해 조이스틱(게임 컨트롤러)를 만들 수 있는 라이브러리 및 특징에 대해 조사한 내용을 요약 정리해보았습니다.

 

 

1. UnoJoy

  • 사이트1 : https://github.com/AlanChatham/UnoJoy (2019/3/27 버전)
  • 사이트2 : https://code.google.com/archive/p/unojoy/ (2013/2/21 버전)
  • 아두이노 우노, 메가, 레오나르도 지원
  • PS3-Compatible 기기 제작이 목적이므로 지원되는 컨트롤 종류 및 갯수가 PS3 패드에서 지원하는 기능에 한정된다. 스로틀, 러더 컨트롤 등은 미지원.
  • 프로그래밍을 한 후에 조이스틱 장치로 인식시키기 위해 펌웨어를 변경해주는 별도의 작업이 필요하다.(다시 되돌릴수도 있다)(Java 32비트 버전만 지원함에 유의)
  • 개발 과정에서 펌웨어를 변경하지 않고 조이스틱 기능을 테스트할 수 있는 툴이 제공된다.

 

2. Arduino Joystick Library

  • 사이트 : https://github.com/MHeironimus/ArduinoJoystickLibrary
  • 아두이노 레오나르도만 지원
  • 다음과 같은 컨트롤을 지원한다. 하나의 아두이노로 최대 세개의 조이스틱으로 인식시킬 수도 있다.
      
     - Buttons (default: 32)
     - Up to 2 Hat Switches
     - X, Y, and/or Z Axis (up to 16-bit precision)
     - X, Y, and/or Z Axis Rotation (up to 16-bit precision)
     - Rudder (up to 16-bit precision)
     - Throttle (up to 16-bit precision)
     - Accelerator (up to 16-bit precision)
     - Brake (up to 16-bit precision)
     - Steering (up to 16-bit precision)
    
  • 아두이노 레오나르도는 업로딩만으로 USB 입력장치로 인식시킬 수 있는 기능을 자체적으로 지원하므로 별도의 펌웨어 변경은 필요없다.

사양 상으로는 후자 쪽이 더 훌륭해 보이는 것이 사실이지만, 냉동실에서 고인얼음과 친구먹고 있는 아두이노라면 높은 확률로 우노일 가능성이 높겠죠.

 

그럼, 알아본 내용을 바탕으로 ‘뭔가’를 향한 여정을 계속해 보도록 하겠습니다.

 

I will be back..

To be continued..

,