본문 바로가기
소프트웨어/자바스크립트

[자바스크립트] Droidscript - 카메라를 장착한 RC카 만들기

by 만들오 2021. 1. 23.

안녕하세요? 만들오 입니다.

 

오늘은 지난번 만든 안드로이드폰으로 CCTV만들기에 이어

RC카에 카메라를 달아 FPV를 구현하는게 목표입니다.

 

사실 마이크로비트 제어 + CCTV 만들기 내용을 잘 조합하기만 하면 됩니다 ㅋㅋ;

이제는 설치부분은 생략하고 각 코드부분만 올릴게요.

 

1. Droidscript HTML 앱 코드

  New Html App 만들기로 파일을 만들어 줍니다. 저는 MB_FPV로 했습니다.

만든 MB_FPV.html의 코드를 다음과 같이 바꿔주세요

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Droidscript CCTV</title>
</head>
<body>
    <video id="webcam" style="display:none;"></video>
    <canvas id="canvas" width="395" height="395"></canvas>
    <p id="ip" style="color:white">...</p>
    <p id="info" style="color:white">Waiting for Client...</p>
</body>
<script src=file:///android_asset/app.js></script>
<script type="text/javascript">
    let port = 9000;
    let serv = app.CreateWebServer( port, "Upload,ListDir" );
    serv.SetFolder( "/sdcard/DroidScript/"+app.GetAppName());
    serv.SetOnReceive( serv_OnReceive );
    serv.Start();
    
    app.LoadPlugin("MicroBit");
    microbit = app.CreateMicroBit();
    microbit.SetOnConnect(MBconnected);
    microbit.SetOnReceive(MBreceive);
    microbit.Scan();
    
    document.getElementById("ip").innerHTML = app.GetIPAddress()+":"+port;
    
    let w=395, h=395;
    let video=document.getElementById("webcam");
    var constraints = {video: {facingMode: { exact: "environment" },width: {exact:w}, height:{exact:h}}, audio: false };
    
    function successCallback(stream){
        video.srcObject = stream;
        video.play();
    }
  
    function errorCallback(error){
        console.log(error);
        app.ShowPopup(error );
    }
    navigator.getUserMedia(constraints, successCallback, errorCallback);

    let canvas=document.getElementById('canvas');
    let ctx=canvas.getContext("2d");

    function processVideo(){
        ctx.drawImage(video, 0, 0, w, h);
        let imageData = ctx.getImageData(0, 0, w, h);
        setTimeout(processVideo, 0);
    }
    processVideo();

    function sendStream(){
        let rawData = canvas.toDataURL("image/jpeg", 0.5);
        serv.SendText(rawData);
    }
    setInterval(sendStream, 30);

    function serv_OnReceive(msg, ip){
        document.getElementById("info").innerHTML = "Connected. Start streaming my camera...";
        app.ShowPopup(msg);
        microbit.Send(msg+"\n");
    }
    
    function MBreceive(data){
        app.ShowPopup('microbit: ' + data);
    }
    
    function MBconnected(){
        app.ShowPopup("MicroBit is connected!");
    }
</script>
</html>

2. index.html 추가하기

위 그림과 같이 프로젝트 내에서 New File을 선택하여 index.html파일을 생성 후 다음과 같이 수정해 주세요.

<!DOCTYPE html>
<html>
    <head>
        <title>OCOACH</title>
        <meta name="viewport" content="width=device-width">
    </head>
    <style>
        body{
            background-color:rgb(150,150,150);
            text-align:center;
            -webkit-user-select:none;
        }
        button{
            width:90px;
            height:90px;
            margin:6px 1px 6px 1px;
            font-size:30px;
            color: white;
            background-color:rgb(51,51,51);
            border:none;
            border-radius:20px;
            box-shadow: 0 9px rgba(104,104,104, 0.5);
        }
        button:active{
            box-shadow: 0 5px rgba(104,104,104, 0.5);
            transform: translateY(4px);
        }
    </style>
    <body>
        <image id="window" src="">
        <div align='center'>
            <div style='position:relative; width:90%; height:90%; border:2px dashed #BDBDBD'>
                <button id='w' ontouchstart=touch(this.id) onmousedown=touch(this.id) onmouseup=touch('s')>w</button>
                <div>
                <button id='a' ontouchstart=touch(this.id) onmousedown=touch(this.id) onmouseup=touch('s')>a</button>
                <button id='s' ontouchstart=touch(this.id) onmousedown=touch(this.id) onmouseup=touch('s')>s</button>
                <button id='d' ontouchstart=touch(this.id) onmousedown=touch(this.id) onmouseup=touch('s')>d</button>
                </div>
                <button id='x' ontouchstart=touch(this.id) onmousedown=touch(this.id) onmouseup=touch('s')>x</button>
            </div>
        </div>
    </body>
    <script>
        var img = document.getElementById("window");
        var addr = location.href;
        var ip = addr.replace("http", "ws");
        var ws = new WebSocket(ip);
        ws.onmessage = function(msg){
            img.src = msg.data;
        }
                     
        function touch(id){
            ws.send(id);
        }
    </script>
</html>

 

위의 index.html파일은 사실 마이크로비트 블루투스 앱 만들기와 유사합니다. 이미지 태그와 웹소켓을 추가하여 통신한 부분이 추가되었군요.

 

3. 실행 및 코드 작동설명

  다음은 작동 영상입니다. 서버로 구현한 안드로이드폰 화면을 캡쳐했습니다.

최근 만든 영상으로 대체합니다. 컨셉은 해당 글과 동일하며, Droidscript 대신 ESP CAM을 이용했습니다.

 

 

 

작동 순서는 다음과 같습니다.

  1) 앱 실행 직후 마이크로비트 검색

  2) 마이크로비트 연결되면 팝업창에 MicroBit is connected! 문구 출력

  3) 표시된 웹서버 주소로 접속. ex)192.168.0.2:9000)

  4) 영상 스트리밍 시작

  5) 버튼을 누르면 스마트폰으로(Droidscript가 만든 웹서버) Websocket을 이용해 문자 전송

  6) Websocket 문자를 받으면 마이크로비트로 문자 전송(블루투스)

 

* 이 글은 티스토리 카카오계정 연동정책으로 인해 이전 블로그(오코취) 글을 옮겨왔습니다.

[].

728x90

댓글