본문 바로가기
Coding/Raspberry pi - node.js

웹기반 조이스틱 제어

by hyun-am 2019. 11. 17.

조이스틱

 

조이스틱이란 움직임에 따라 저항 값이 변하는 가변저항이 달려 있어서 그 값을 이용해 움직임이나 방향 등 표현에 활용할 수 있는 모듈 그 값을 이용해 움직임이나 방향 등 표현에 활용할 수 있는 모듈

 

90도 각도로 가변저항이 달려있고, Z축에 텍트 스위치가 달려있어 2축+1온/오프 제어가 가능한 모듈입니다.

 

 

위에서부터 SW(z축 스위치핀), VRY(Y축), VRX(x축), 5V, GND(-)로 구성되어있습니다. 

 

연결은 VRY와 VRX는 MCP3208에서 CH0번과 CH1번과 연결합니다.

그리고 MCP3208칩은 앞에 나와있던 것 처럼 연결합니다.

참고
https://hyun-am-coding.tistory.com/entry/SPI-%EB%B0%A9%EC%8B%9D%EA%B3%BC-ADC-%EC%B9%A9

 

코드 구성

 

JS 코드

const fs = require('fs');
const http = require('http');
const gpio = require('node-wiring-pi');
const socketio = require('socket.io');
const mcpadc = require('mcp-spi-adc');

const CS_MCP3208 = 10	// chip Enable(CE0) is set
const VRX = 0	// ADC 0번째 채널선택 = 아날로그센서
const VRY = 1	// ADC 1번째 채널선택 = 아날로그센서
const SPI_SPEED = 100000	// Clock Speed = 1Mhz

var timerid, timeout = 800; 	// 타이머 제어용
var xvalue = yvalue = -1;	// JoyStick X,Y 측정데이터 저장용

const joyx = mcpadc.openMCP3208(VRX,	// 채널 0 지정 (X좌표)
		{speedHz : SPI_SPEED},	// Clock속도 지정
        (err) =>{
            console.log("SPI 채널 0 초기화완료!");
            if(err) console.log('채널 0 초기화실패!(HW점검!)');
        });
const joyy = mcpadc.openMCP3208(VRY,	// 채널 1 지정 (Y좌표)
        {speedHz : SPI_SPEED},	// Clock 지정
        (err) =>{
            console.log("SPI 채널1 초기화 완료!");
            if (err) console.log("채널 1 초기화 완료 실패!(HW점검!)");
        });

const JoyStick = () =>{
    joyx.read((error,reading)=>{
        console.log("▲▼ (%d)",reading.rawValue);
        xvalue = raw.Value;
    });
    joyy.read((error,reading)=>{
        console.log("◀▶ (%d)",reading.rawValue);
        yvalue = raw.Value;
    });
    if(xvalue != -1 && yvalue != -1){
        io.sockets.emit('watch',xvalue,yvalue);
        xvalue = yvale = -1;
    }
    timerid = setTimeout(JoyStick,timeout);
}
process.on('SIGINT',()=>{
    joyx.close(()=>{
        joyy.close(()=>{
            console.log('MCP-ADC가 해제되어, 웹서버를 종료합니다.');
            process.exit();
        });
    });
});

const serverbody = (request,response) =>{
    fs.readFile('views/plotly_joy.html','utf-8',(err,data)=>{
        response.writeHead(200,{'Content-Type':'text/html'});
        response.end(data);
    });
};

const server = http.createServer(serverbod);
const io = socketio.listen(server);
io.sockets.on('connection',function(socket){
    socket.on('startmsg',function(data){
        console.log("가동메시지 수신(측정주기:%d)!",data);
        timeout = data;
        JoyStick();
    });
    
    socket.on('stopmsg',function(data){
        console.log("중지메시지 수신!");
        clearTmeout(timerid);
    });
});

server.listen(60001,()=>{
    gpio.wiringPiSetup();
    gpio.pinMode(CS_MCP3208,gpio.OUTPUT);
    console.log('----------------------');
    console.log('조이스틱 제어용 웹서버');
    console.log('웹브라우져 접속 주소: http://ip주소:60001/');
    console.log("----------------------");

 

웹 부분 코드

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="content-type" content="text/html">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>웹기반 조이스틱 제어 샘플코드</title>
    <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        window.onload = function(){
            var socket = io.connect();
            var widthcount = 1;

            socket.on('watch',function(xdata,ydata){
                Plotly.extendTraces('chart',{y:[[xdata],[ydata]]},[0,1]);
                widthcount++;
                if(widthcount>100){
                    Plotly.relayout('chart',{
                        xaxis:{
                            range:[widthcount-99,widthcount]    //x축 동적이동
                        }
                    });
                }
            });
        document.getElementById('start').onclick = function(){
            var text = document.getElementById('text').value;
            socket.emit('startmsg',text);
        };
        document.getElementById('stop').onclick = function(){
            var text = document.getElementById('text').value;
            socket.emit('stopmsg',text);
        };
        };
        
    </script>

</head>
<body>
    <h2> 조이스틱 측정 </h2>
    <hr>
    <input type="text" id="text" value = "800"/>ms(예,500 ~ 1000ms)
    <input type="button" id="start" value = "조이스틱센서 측정가동"/>
    <input type="button" id="stop" value="조이스틱센서 측정중지"/>
    <hr>
    <div id ="chart">
        <script>
            var joyx = { y:[0], name:'JoyX', type: 'line',
            marker:{color:"rgb(255,0,0)"}, line: {shape:'spline'}};
            var joyy = { y:[0], name:'JoyY', type: 'line',
            marker:{color:"rgb(0,0,255)"}, line: {shape:'spline'}};
            var data = [joyx, joyy];
            Plotly.plot('chart', data);
        </script>

    </div>
</body>
</html>

 

댓글