조이스틱
조이스틱이란 움직임에 따라 저항 값이 변하는 가변저항이 달려 있어서 그 값을 이용해 움직임이나 방향 등 표현에 활용할 수 있는 모듈 그 값을 이용해 움직임이나 방향 등 표현에 활용할 수 있는 모듈
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>
'Coding > Raspberry pi - node.js' 카테고리의 다른 글
실습 socket.io를 활용하여 1색LED, Buzzer, 3색LED Control (0) | 2019.11.17 |
---|---|
Raspberry pi를 express를 통한 웹 연결 (0) | 2019.11.17 |
SPI 방식과 ADC 칩 (0) | 2019.11.16 |
초음파 센서 제어와 웹 연동 (0) | 2019.11.15 |
실습 - PWM을 이용한 LED 밝기 제어 (0) | 2019.10.09 |
댓글