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

로터리 엔코더(가변저항기)모듈

by hyun-am 2019. 11. 18.

로터리 엔코더란

 

원리는 360도 회전, 회전 운동을 전기적 신호를 출력하는 모듈(가변저항의 원리를 이용)

회전방향과 회전정도에 따라 저항의 값이 달라지는 원리를 이용한 센서 모듈

 

활용범위는 마우스 휠, 스피커 볼륨, 노브와 같은 곳에서 사용합니다.

 

예제 코드 

 

로터리 

 

GND = 물리적 6번

5V = 물리적 2번

DT = 물리적 40번 wpi - 29

CLK = 물리적 38번 wpi - 28

 

코드 구현

 

const gpio = require('node-wiring-pi');
const DT = 29;
const CLK = 28;

var rotate = 0;

const SenseRotate = function(){
    var checked = 0;
    //오른쪽 핀(DT)가 먼저 접점이 떨어질 경우
    while(gpio.digitalRead(DT) == 0){
        if(checked == 0){
            rotate ++;
            checked ++;
            console.log(rotate);
        }
       	// 이후 감지되는 과정을 모두 무시한다
        while(gpio.digitalRead(CLK)==0){}
    }
    while(gpio.digitalRead(CLK)==0){
        if(checked == 0){
            rotate --;
            checked ++;
            console.log(rotate);
        }
        while(gpio.digitalRead(DT)==0){ }
    }
    setTimeout(SenseRotate,20);
}
process.on('SIGINT',function(){
    console.log("Program Exit");
    process.exit();
});

gpip.wiringPiSetup();
gpio.pinMode(DT,gpio.INPUT);
gpio.pinMode(CLK,gpio.INPUT);
setImmediate(SenseRotate);

 

실습문제

 

로터리 엔코더를 REST API를 응용하여 LED제어 프로그램을 작성하시오

 

엔코더값 제어결과 엔코더값 제어결과
0 LED꺼짐 3 파랑 LED켜짐
1 빨강LED켜짐 4 흰색LED켜짐
2 초록LED켜짐 그외 반응없음

 

코드 구현

 

svr_led.js

 

const gpio = require('node-wiring-pi');
const DT = 29;
const CLK = 28;
var rotate = 0;

var data = {
    actid:'LED3',
    redcolor:'OFF',
    greencolor:'OFF',
    bluecolor:'OFF',
    whitecolor:'OFF'
};
const SenseRotate = ()=>{
    var checked = 0;
    // 오른쪽 핀(DT)가 먼저 접점이 떨어질 경우
    while(gpio.digitalRead(DT)==0){
        //rotate값을 1 추가 한 후,
        if(checked == 0){
            rotate ++;
            checked ++;
            console.log(rotate);
        }
        // 이후 감지되는 과정을 모두 무시한다.
        while(gpio.digitalRead(CLK)==0){}
    }
    
    // 왼쪽으로 돌릴 시 CLK를 기준으로 수행
    while(gpio.digitalRead(CLK)==0){
        if(checked == 0){
            rotate--;
            checked++;
            console.log(rotate);
        }
        while(gpio.digitalRead(DT)==0){}
    }
    LedControl(rotate);
    setTimeout(SenseRotate,20);
}
process.on('SIGINT',()=>{
    console.log("Program Exit...");
    process.exit();
});

const request = require('request');
LedControl = (rotate)=>{
// 여기서 다룬다
if(rotate==0){
    data = {
        actid:'OFF'
    };
}
else if(rotate==1){
    data = {
        actid:'LED3',
        redcolor:'ON',
    };
}
else if(rotate==2){
    data = {
        actid:'LED3',
        greencolor:'ON',
    };
}
else if(rotate==3){
    data = {
        actid:'LED3',
        bluecolor:'ON',
    };
}
else if(rotate==4){
    data = {
        actid:'LED3',
        whitecolor:'ON'
    };
}
else if(rotate>5||rotate<0){
    data = {
        actid:'OFF'
    };
}

request.put(
    {url:'http://IP주소:60004/led',
    form:data,
    headers:{"content-type":"application/x-www-form-urlencoded"}},
    function(error,response,body){
        if(!error&&response.statusCode == 200){
            console.log(body);
        }
    }
);

}

gpio.wiringPiSetup();
gpio.pinMode(DT,gpio.INPUT);
gpio.pinMode(CLK,gpio.INPUT);
setImmediate(SenseRotate)
    

 

svr_led.js

 

const gpio = require('node-wiring-pi');
const DT = 29;
const CLK = 28;
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const GREEN = 21;
const RED = 22;
const BLUE = 23;

var rotate = 0;

app.use(bodyParser.urlencoded({extended:false}));

var mydata = {
    acid:'LED3',
    redcolor:'OFF',
    greencolor:'OFF',
    bluecolor:'OFF',
    whitecolor:'OFF'
};

process.on('SIGINT',()=>{
    console.log("Program Exit...");
    gpio.digitalWrite(RED,0);
    gpio.digitalWrite(GREEN,0);
    gpio.digitalWrite(BLUE,0);
    process.exit();
});

const led3control = (req,res)=>{
    console.log("PUT method로 데이터수신...");
    if(req.body.actid == 'LED3'){
        if(req.body.redcolor =='ON'){
            gpio.digitalWrite(RED,1);
            gpio.digitalWrite(BLUE,0);
            gpio.digitalWrite(GREEN,0);
            console.log("빨강LED켰음");
        }
        if(req.body.greencolor =='ON'){
            gpio.digitalWrite(RED,0);
            gpio.digitalWrite(BLUE,0);
            gpio.digitalWrite(GREEN,1);
            console.log("초록LED켰음");
        }
        if(req.body.bluecolor=='ON'){
            gpio.digitalWrite(RED,0);
            gpio.digitalWrite(BLUE,1);
            gpio.digitalWrite(GREEN,0);
            console.log("파랑LED켰음");
        
        }
        if(req.body.whitecolor=='ON'){
            gpio.digitalWrite(RED,1);
            gpio.digitalWrite(BLUE,1);
            gpio.digitalWRite(GREEN,1);
            console.log("흰색LED켰음");
        }
        res.send("OK");
    }
    else if(req.body.actid=='OFF'){
        gpio.digitalWrite(RED,0);
            gpio.digitalWrite(BLUE,0);
            gpio.digitalWRite(GREEN,0);
            console.log("OFF");
    }

    else res.send("FAIL");
}

app.put('/led',led3control);
app.get('/led',(req,res)=>{
    console.log("Get method");
});

app.listen(60004,()=>{
    console.log('SVR_LED.js: 서버(60004)가동중...');
    gpio.wiringPiSetup();
    // setImmediate(SenseRotate);
    gpio.pinMode(BLUE,gpio.OUTPUT);
    gpio.pinMode(RED,gpio.OUTPUT);
    gpio.pinMode(GREEN,gpio.OUTPUT);
    gpio.pinMode(DT,gpio.INPUT);
    gpio.pinMode(CLK,gpio.INPUT);
});
    

댓글