스마트 폰을 최고급 전자 부품으로 전자 공작에 통합 (가속도편)

마지막으로 스마트 폰을 최고급 전자 부품으로 전자 공작에 통합에서 OpenCV를 사용하여 서보 모터를 움직이는 것을 썼습니다.
호평이었으므로, 이번에는 스마트 폰의 가속도를 사용해보고 싶습니다.

가속도 모듈이 아닌 스마트폰으로 가속도를 취하는 이점


  • 캘리브레이션 필요 없음
  • 무선이므로 전자 회로로부터 떨어진 장소의 가속도를 취할 수 있다
  • 정밀도가 단차
  • 샘플링 수도 단차

  • 어떻게 스마트 폰의 가속도를 사용하는지에 대해서는, 전회와 같이 obniz를 사용해, HTML 경유로 가속도를 취합니다.

    자세한 것은 이쪽의 공식 사이트를 봐 주세요
    오 b ... 이오

    만든 것



    모처럼이므로, 상기의 이점을 최대한 활용할 수 있는 것이 좋지요.
    리모트로 가속도를 사용하는 것・・・그렇다, 라디콘으로 하자! 

    그래서 iPhone의 가속도를 입력으로 한 라디콘을 만들었습니다.
    이것을 만드는데 쓴 코드가 단 1시간/60행 정도로 만들 수 있었습니다
    (OpenCV보다 훨씬 쉬웠습니다)



    소재




  • iPhone
  • obniz

  • 모터+타이어 *2
  • 골판지 조각
  • 모바일 배터리

  • 만드는 방법



    하드웨어



    회로는 회로도가 필요하지 않을 정도로 단순히 모터와 obniz를 연결하는 것입니다.



    본체는 간단하게 골판지 공작으로 만들었습니다.
    가위로 틈을 넣어 끼우는 것만의 간단한 공작입니다



    타이어를 양면 테이프로 붙이면 이렇게 됩니다.


    obniz가 어지럽혀서 싫었기 때문에 obniz를 끼는 틈도 넣어 끼고 있습니다.
    모바일 배터리는 원하는 곳에 보관하십시오.

    소프트웨어



    우선 가장 중요한, 가속도를 취하는 곳입니다만, 단 3행으로 할 수 있습니다.
    카메라 때와는 다릅니다.
    window.addEventListener("devicemotion", function (event1) {
        let x = event1.accelerationIncludingGravity.x;
    }
    

    이제 가속도가 변경되면 함수가 호출되어 가속도 값을 얻을 수 있습니다.

    그에 따라 모터를 움직이는 것이 여기
    motorL = obniz.wired("DCMotor", {forward: 0, back: 1});
    motorL.power(100)
    motorL.move(true);
    

    obniz의 어느 핀에 모터가 연결되어 있는지를 설정하고, 나머지는 power와 move 함수로 속도와 방향을 지정하면 움직입니다.

    나머지는 X축 Y축의 가속도에 따라 파워와 방향을 바꿀 뿐입니다.
    이번에는 iPhone을 앞뒤로 기울이면 전진·후퇴, 좌우로 기울면 회전을 하도록 했습니다.

    HTML 전체는 이렇게
    <html>
    <head>
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
      <script src="https://unpkg.com/[email protected]/obniz.js" crossorigin="anonymous"></script>
    </head>
    <body>
    
    <div id="obniz-debug"></div>
    <h1>obniz robot controller </h1>
    <div id="print"></div>
    
    <script>
    
      let obniz = new Obniz("2580-0064");
      let motorL, motorR;
      let threshold = 1, maxAccel = 5;
    
      obniz.onconnect = function () {
        motorL = obniz.wired("DCMotor", {forward: 0, back: 1});
        motorR = obniz.wired("DCMotor", {forward: 10, back: 11});
      };
    
      window.addEventListener("devicemotion", function (event1) {
        let x = event1.accelerationIncludingGravity.x;
        let y = event1.accelerationIncludingGravity.y;
    
        if (!motorR || !motorL) {
          return;
        }
        if (Math.abs(y) > threshold) {
          let power = Math.min(100 * (Math.abs(y) - threshold) / (maxAccel - threshold), 100);
          motorL.power(power);
          motorR.power(power);
    
          let direction = y > 0;
          motorL.move(direction);
          motorR.move(direction);
    
    
        } else if (Math.abs(x) > threshold) {
          let power = Math.min(100 * (Math.abs(x) - threshold) / (maxAccel - threshold), 100);
          if (x > 0) {
            motorR.power(power);
            motorR.move(true);
            motorL.stop();
          } else {
            motorL.power(power);
            motorL.move(true);
            motorR.stop();
          }
        } else {
          motorL.stop();
          motorR.stop();
    
        }
    
      }, true);
    
    </script>
    </body>
    </html>
    

    완성!



    OpenCV보다 훨씬 쉽게 만들 수있었습니다.



    전회의 얼굴 검출과 합치면, 사람을 쫓는 로봇 같은 것도 간단하게 만들 수 있을 것 같습니다.
    음성인식도 js로 할 수 있으므로, 「아니!」라고 말을 걸면 전진이라도 만들 수 있을 것 같네요!

    좋은 웹페이지 즐겨찾기