원격 차임의 아날로그 연동

shiftall 님의 블로그 기사 를 보고, 원격 차임의 연동 좋다고 느끼고, obniz라면 보다 간단한 시스템으로 만들 수 있는 것은 아닌가? ? 라고 생각했기 때문에 만들어 보았습니다.

만든 것



한쪽의 차임을 울리면 다른 한쪽의 차임이 물리적으로 밀리는 장치


작동 흐름





전 자료의 동작 흐름보다 항목이 적습니다.
쓰는 것이 귀찮아서 생략했다 라든지가 아니고, obniz가 마음대로 해주는 부분이 많기 때문에, 간단하게 되어 있습니다.

특히 원격지 연동하고 있는 느낌이 들지 않습니다만, obnizA와 obnizB는 전혀 다른 장소에 있어 괜찮습니다. 지구의 뒷면이라도 괜찮습니다.

그런데 하나의 프로그램 안에서 그 2개가 동시에 취급할 수 있다고 조금 이상하다.

소재





  • obniz *2
  • 주걱 (100 엔 균일 한 것을 사용했습니다)
  • 마이크 모듈
  • 와이어 (마이크 모듈과 obniz 연결에 사용)
  • 서보 모터
  • 핀 헤더 (서보 모터와 obniz 연결에 사용)

  • 그리고 위의 사진에는 없지만 obniz의 전원용으로 모바일 배터리와 USB 케이블이 2개씩 필요합니다.

    연결 방법



    우선 헤라와 서보 모터를 물리적으로 접착합니다.
    처음에는 셀로판 테이프로 빙글빙글 감았는데 곧 벗어 버렸기 때문에 이런 때에 만능한 아교 총으로 접착했습니다.


    서보 모터에서 나오는 3 개의 선을 obniz의 0 ~ 2 번 제품에 연결하면 차임을 울리는 사람은 완성됩니다
  • obnizB io0 : servo GND (브라운 라인)
  • obnizB io1 : servo VCC (적색 선)
  • obnizB io2 : servo SIGNAL (노란색 선)



  • 차임 소리를 감지하는 것이 더 쉽고 마이크 모듈과 obniz를 와이어로 연결하기 만하면됩니다.
  • obnizA io0 : 마이크 VCC
  • obnizA io1 : 마이크 GND
  • obnizA io2 : 마이크 SIGNAL



  • 소스 코드



    작성하는 프로그램도 간단합니다.
    먼저 두 개의 obniz에 연결하기를 기다립니다.
    OBNIZ_A_IDOBNIZ_B_ID 는 각각 obniz id를 작성해야합니다

    별개의 두 곳에있는 obniz를 병렬로 나란히 쓸 수있는 것이 역시 이상합니다.
    var obnizSensor = new Obniz("OBNIZ_A_ID");
    var obnizMotor = new Obniz("OBNIZ_B_ID");
    
    (async function(){
      await obnizSensor.connectWait();
      await obnizMotor.connectWait();
    
      // 2つのobnizとながったらここで処理を書く
    
    })();
    

    연결이 완료되면 마이크와 서보 모터를 연결하여 초기 설정 (서보 모터 각도 설정)을 수행합니다.
      var microphone = obnizSensor.wired("AE_MICAMP", {vcc:0, gnd:1, out:2});
      var servo = obnizMotor.wired("ServoMotor", {gnd: 0, vcc:1 , signal:2 });
      servo.angle(90.0); 
    

    그리고는 이미 마이크가 반응하면 서보를 움직여 누를 뿐입니다.
    몇 번 시도하면 차임이 울리면 4.5V 이상이 올 것 같기 때문에 임계 값을 4.5V, 서보 모터가 차임을 울리는 시간을 2000ms (= 2 초)로하고 있습니다

    약간의 궁리로는 state 변수를 사용하여 2 연속으로 마이크가 반응하는 것을 피하기 위해 노력하고 있습니다.
    
    var threshold = 4.5;
    var duration = 2000;
    var state =  "none";
    
    microphone.onchange = function(voltage){
        if(voltage > threshold ){
          if(state === "none"){
            state = "chime";
            console.log("chime");
            servo.angle(20.0); 
    
            setTimeout(()=>{
              state =  "none";
              servo.angle(90.0);
            }, duration);
          }
        }
    }
    

    소스 코드 전체



    obniz는 node.js 또는 html에서 javascript를 작성하지만 이번에는 html로했습니다.
    전체 코드는 이런 것입니다.
    <html>
    <head>
      <meta charset="utf-8">
      <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 instant html</h1>
    
    <script>
    var obnizSensor = new Obniz("OBNIZ_A_ID");
    var obnizMotor = new Obniz("OBNIZ_B_ID");
    var threshold = 4.5;
    var duration = 2000;
    var state =  "none";
    
    (async function(){
      await obnizSensor.connectWait();
      await obnizMotor.connectWait();
    
      var microphone = obnizSensor.wired("AE_MICAMP", {vcc:0, gnd:1, out:2});
      var servo = obnizMotor.wired("ServoMotor", {gnd: 0, vcc:1 , signal:2 });
      servo.angle(90.0); 
      microphone.onchange = function(voltage){
        if(voltage > threshold ){
          if(state === "none"){
            state = "chime";
            console.log("chime");
            servo.angle(20.0); 
    
            setTimeout(()=>{
              state =  "none";
              servo.angle(90.0);
            }, duration);
          }
        }
      }
    })();
    
    </script>
    </body>
    </html>
    
    

    HTML을 포함해도 50 줄을 쓰지 않고 만들 수있었습니다.
    이러한 무선 물건을 바삭하게 만들고 싶을 때 obniz는 쉽습니다.


    ↑ 제대로 보면 무선인 것을 알 수 있다고 생각합니다

    좋은 웹페이지 즐겨찾기