[Arduino] - 시리얼 통신을 이용한 디스플레이 오토피벗 (피버시노 v.1.1)


지난번에 모니터 상태에 따라 디스플레이 출력 방향을 자동으로 바꿔주는 오토피벗 장치를 만들어보았다.
테스트 용이라 크기도 크기지만 케이블이 자꾸 결려서 파손위험이 있었다.
이번에 만든 피버시노v.1.1은 BlunoBeetle을 이용해서 케이블 과 크기를 해결했다.



BlunoBeetle은 작은 크기의 아두이노 이다.
예전에 키패드를 만들때 사용한 Beetle 과 비슷하지만 BlunoBeetle에는 블루투스가 추가로 탑재 되어있고 Beetle은 레오나르도로 인식하여 HID 장비로 사용할수 있지만 BlunoBeetle은 아두이노 우노로 작동한다.

물론 AT커맨드를 이용해 HID 무선 장비로 사용 할 수 있다.
그러나 내 개발 환경의 문제인지 데스크탑 PC에서는 BlunoBeetle 을 찾지 못하는 문제가 발생했다.

블루투스 스피커중에 모바일이나 테블릿과는 문제가 없지만 내 컴퓨터랑 연결이 안되던 제품이 있었는데 그거랑 같은 문제같다. 아마도 블루투스 드라이버나 서비스 지원 문제로 보인다.

그러나 BlunoBeetle은 두대가 있으면 마스터 슬레이브를 부여해 무선환경에서 데이터 링크기능을 이용할 수 있다. BlunoLink가 이렇게 빛을 보게 되었다.


  • 무선 모드 사용법
1. 시리얼 모니터를 열고 "+++" 입력

2. "Both NL & CR" 로 변경

3. AT커맨드 "AT+FSM=FSM_TRANS_USB_COM_BLE" 를 이용해 transparent mode로 바꿔주고 한 쪽은 "AT+SETTING=DEFPERIPHERAL" 을 다른 한 쪽은 "AT+SETTING=DEFCENTRAL" 로 상태를 바꿔준다.

4. "AT+EXIT" 종료


연결 확인은 BlunoBeetle의 "LINK" Led 가 초록색으로 점등되면 성공이다.
이후로는 아두이노 프로그램이 BlunoLink를 통해 BlunoBeetle로 업로드된다.
참고로 수신(BlunoLink)과 송신(BlunoBeetle) 디바이스가 완벽히 LINK되는데 까지 5초 정도 걸린다.

  • 하드웨어

이번에 사용한 가속도 센서는 MPU6050이다.
여러 번 사용했던 부품들이라 조금 지저분하다.
핀배열은 SCL to SCL(A5), SDA to SDA(A4), INT to D2



2개의 구멍은 숨구멍이 아니라 리셋과 부트 버튼이다.

  • 아두이노 소스코드
소스코드는 센서 라이브러리와 변수명 정도가 조금 바뀌었다.
추가로 센서값을 알기쉬운 값으로 맵핑하여 사용했다.
파이썬은 바뀐점이 없기때문에 저번에 만든 프로그램을 그대로 사용하면된다.

"피벗이노"라고 이름을 붙여봤다.
어감이 사투리 같지만 그래서 더 마음에든다 "피버시노"
/* 
|| @ file Pivot_Ino_V1.1.ino
|| @ author Heejoong 
|| # 2019-01-16 ~
*/
#include <MPU6050.h>
#define commandLine_OPEN "Rotate <"
#define commandLine_CLOSE ">"
//default I2C address 0x68
MPU6050 accelgyro;
int value = 0;
int16_t ax, ay, az;
int16_t gx, gy, gz;
const char * P_array[2];
const char * RotateMonitor(int x);
void setup() {
    Wire.begin();
    Serial.begin(38400);
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();
}
void loop() {
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    int mapped_ax = map(ax, -32768+32767-180+180);
    //int mapped_ay = map(ay, -32768, +32767, -180, +180);
    //int mapped_az = map(az, -32768, +32767, -180, +180);
    P_array[0= RotateMonitor(mapped_ax);
    if(P_array[value] != P_array[0]) {
      Serial.print(commandLine_OPEN);
      Serial.print(RotateMonitor(mapped_ax));
      Serial.println(commandLine_CLOSE);
      value = 0;
    }
    else { 
      P_array[1= RotateMonitor(mapped_ax);
      value = 1;
    }
    delay(100);
}
const char * RotateMonitor(int x){
  if( x > -120 && x < -60) { return "Left"; }            //270 degrees
  else if(x > 60 && x < 120) { return "Right"; }       //90  degrees
  else { return "Idle"; }                             //0  degrees
}
cs


집에있는 프라이머랑 검정 스프레이로 색을 입혀봤는데 어두운 회색이 나왔다.
분명히 뚜껑색과 같은 검정색이라고 적혀있지만 같은색이 아니였다.
사기당한 기분이다.
그래도 반짝 반짝 코팅 된 느낌은 만족스럽다.



크기가 확실히 작아져서 모니터 하단 빈공간에 장착했다.
모니터켜면 같이 켜지고 끄면 같이 꺼지고 USB가 있는 모니터라면 전원을 쉽게 공급 받겠지만 이 모니터는 USB가 없다. USB가 없어도 MHL 지원 모니터는 HDMI로 부터 전원을 받을 수 있다.

  • 마무리
아직은 외부 프로그램(display.exe)을 함께 사용중이다.
다음에는 외부 프로그램 없이 파이선 하나로 해결을 보려고 한다.


  • 업데이트 버전
=====================================================
피버시노 v1.0
피버시노 v1.1
피버시노 v1.1.1
피버시노 v1.1.2
피버시노 v1.1.3

Comments

Popular posts from this blog

[Python] - 블루투스 모듈 HC-06의 MAC 주소를 이용하여 통신 포트 찾기

[POE] - 패스 오브 엑자일 획득키 F 의 사용법 (Path of Exile)

[Arduino] - HC-06를 이용해 PC 와 Arduino 블루투스 연결

[Raspberry Pi] - 라즈베리 파이에서 멀티미디어 감상에 적절한 비디오 세팅