Wio LTE로 놀아 본다(그 5:3축 디지털 가속도 센서와 GPS)

Grove IoT 스타터 키트 for SORACOM 에서 놀아 본다.
  • 첫회:환경 구축+L치카
  • 두 번째: 온습도 센서
  • 세 번째: 버튼 + 버저
  • 네 번째: 자기 스위치와 초음파 거리 센서

  • 이번에는 3축 디지털 가속도 센서와 GPS를 사용해 본다.

    〇센서



    3축 디지털 가속도 센서
    GPS

    3축 디지털 가속도 센서와 GPS의 조합으로 무엇을 할 수 있는지 모르기 때문에 노 플랜으로 시작해 본다.

    〇3축 디지털 가속도 센서



    우선,
    Download the Digital Accelerometer(±16g) Library
    그리고 있기 때문에 전회 마찬가지로 전용 라이브러리를 DL하여 포함.
    전회와 다른 것은 Git Hub에의 링크이므로, ZIP로 해 DL.

    그리고는 그대로 인클루드 시키면 OK.
    Step1: Plug it onto the I2C port of your Grove - Base Shield.라고 쓰고 있으므로 I2C에 찔러 본다.
    #include <WioLTEforArduino.h>
    #include <ADXL345.h>          // https://github.com/Seeed-Studio/Accelerometer_ADXL345
    
    #define INTERVAL    (100)
    
    WioLTE Wio;
    ADXL345 Accel;
    
    void setup()
    {
      delay(200);
    
      SerialUSB.println("");
      SerialUSB.println("____ START ____________________________________");
    
      SerialUSB.println("### I/O Initialize.");
      Wio.Init();
    
      SerialUSB.println("### Power supply ON.");
      Wio.PowerSupplyGrove(true);
      delay(500);
      Accel.powerOn();
    
      SerialUSB.println("### Setup completed.");
    }
    
    void loop()
    {
      int x;
      int y;
      int z;
      Accel.readXYZ(&x, &y, &z);
      SerialUSB.print(x);
      SerialUSB.print(' ');
      SerialUSB.print(y);
      SerialUSB.print(' ');
      SerialUSB.println(z);
    
      delay(INTERVAL);
    }
    

    위는 샘플 스케치 그대로.
    실행해 보면 값 그 자체는 간단하게 표시된다.


    하지만 의미를 모른다. .
    아니, 스케치를 보면 X, Y, Z 축을 나타내고 있는 것은 알지만, 이 값을 보고 「어떻게 움직였는가?」를 도출하는 것은 또 한 단계 귀찮을 것 같다.
    그래서, 우선 선반 올려.
    흔들렸는지의 체크 정도에 사용할 수 있는 것이라고도 생각해 두면 좋은 것인가?
    간이 진도계에도 사용할 수 있을까 생각하는 반면, 이것으로 「얼마나 흔들렸는가?」같은 것을 수집하려고 생각하면 고민할 것 같다.

    ※진동 체크에 사용하고 싶으면 이 근처의 사이트가 참고하게 해 줄 것 같은 기색
    htps : // 아비다. 이오/사 mpぇs/ゔぃb라치온/ゔぃb라치온/
    h tps : // / g w w. jp/레ゔぃえw/286/264527

    그래서, 이 시점에서 지진등에서 흔들리면 그 지점의 GPS를 취득할 수 있잖아?
    라는 아이디어가.
    김에 그 정보도 Slack라든지 흘려보고 싶다.

    다만, 진도 체크의 부분이 조금 다소 생기기 때문에, 먼저 GPS에.

    〇GPS



    ···
    바로 어디에 찌르는지 모르겠다.
    일부 사이트를 흔들리고 있으면 아래에 [UART]라고 있으므로 찔러 본다.
    h tps // 이오 t. 후 rst 후 r의 s. 코 m/우우오테/g로ゔぇ-gps/

    우선 정보는 취득할 수 있었다. 창가가 아니면 역시 취득은 할 수 없다.


    하지만 이것만으로는 읽기 어렵다.
    그래서 위의 사이트를 그대로 참고로 TinyGPS++" 을 사용하여 읽을 수 있도록 한다.
    #include <WioLTEforArduino.h>
    #include <TinyGPS++.h>
    
    //状態に対する色設定
    #define COLOR_SETUP 0, 10, 0
    #define COLOR_MEASURE 0, 0, 10
    #define COLOR_MAGNETIC 10, 0, 0
    #define COLOR_NONE_MAGNETIC 0, 0, 10
    #define COLOR_NEAR 10, 10, 10
    #define COLOR_NONE 0, 0, 0
    
    WioLTE Wio;
    TinyGPSPlus gps;
    
    void setup()
    {
      delay(200);
    
      SerialUSB.println("");
      SerialUSB.println("____ START ____________________________________");
    
      SerialUSB.println("### I/O Initialize.");
      GpsBegin(&Serial);
      Wio.Init();
      Wio.LedSetRGB(COLOR_SETUP);
    
      SerialUSB.println("### Power supply ON.");
      Wio.PowerSupplyGrove(true);
      delay(500);
    
      SerialUSB.println("### Setup completed.");
      Wio.LedSetRGB(COLOR_NONE);
    }
    
    void loop()
    {
      Wio.LedSetRGB(COLOR_MAGNETIC);
      const char* data = GpsRead();
      if (data != NULL && strncmp(data, "$GPGGA,", 7) == 0) {
        SerialUSB.println(data);
      }
      Wio.LedSetRGB(COLOR_NONE);
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////
    //
    
    #define GPS_OVERFLOW_STRING "OVERFLOW"
    
    HardwareSerial* GpsSerial;
    char GpsData[100];
    char GpsDataLength;
    
    void GpsBegin(HardwareSerial* serial)
    {
      GpsSerial = serial;
      GpsSerial->begin(9600);
      GpsDataLength = 0;
    }
    void displayInfo()
    {
        SerialUSB.print(F("Location: ")); 
        if (gps.location.isValid()) {
            SerialUSB.println(gps.location.lat(), 6);
            SerialUSB.println(gps.location.lng(), 6);
        } else {
            SerialUSB.println(F("INVALID"));
        }
    }
    
    const char* GpsRead()
    {
      while (GpsSerial->available()) {
        char data = GpsSerial->read();
    
        if (gps.encode(data)) {
          displayInfo();
        }
    
    
        if (data == '\r') continue;
        if (data == '\n') {
          GpsData[GpsDataLength] = '\0';
          GpsDataLength = 0;
          return GpsData;
        }
    
        if (GpsDataLength > sizeof (GpsData) - 1) { // Overflow
          GpsDataLength = 0;
          return GPS_OVERFLOW_STRING;
        }
        GpsData[GpsDataLength++] = data;
      }
    
      return NULL;
    }
    
    ////////////////////////////////////////////////////////////////////////////////////////
    

    ※SETUP시에 LED를 붙이는 것이 알기 쉽고 조금 마음에 들었으므로 유용.



    이런 느낌. 이해하기 쉽다.

    간이 진도계까지는 앞으로 한숨 쉬는 느낌이지만, 우선 이번은 여기까지.
    우선 스타트업으로서 따라 온 센서류는 한번 만져 보았던 것일까.
    이들과 SORACOM의 통신도 조합해 「간이 진도계」를 목표로 해볼까 생각한다.

    좋은 웹페이지 즐겨찾기