sexta-feira, 28 de abril de 2017

Agente SNMP com Raspberry Node.js e MCP3008 para teste

Neste post faremos um pequeno Agente SNMP para teste de um gernete SNMP.

Foi utilizado o CI MCP3008 como conversor A/D de 08 canais, portanto a tensão de entrada em cada canal de 0 á 3,3 Volts será convertida para 0 a 1023 e a conexão com o raspberry se dará através do protocolo SPI.

Portanto no raspberrry o protocolo SPI deverá estar habilitado.

Vejamos o set usado na figura abaixo:






















O CI MCP3008 foi montado em placa de circuito impresso com os 08 pots  para variar a entrada em cada canal e o circuito pode ser visto na figura abaixo:


Este circuito deve ser conectado com o raspberry através de jumpers seguindo a pinagem abaixo:





































Pino 17 é a conexão com os 3,3 Volts para alimentar o MCP3008
Pino 19 é a conexão com o MOSI do MCP3008.
Pino 21 é a conexão com o MISO do MCP3008.
Pino 23 é a conexão com o Clock do MCP3008.
Pino 24 é a conexão com o CS do MCP3008.
Pino 25 é a conexão com  o GND do MCP3008.

Terminado o Hardware podemos programar!!!

Primeiro deve ser criada uma pasta no raspberry para colocar os scripts
Dentro desta pasta além do script que vamos escrever tem que se baixar 02 módulos com os comandos abaixo após o prompt:

npm install    mcp3008.js   --save
npm install    snmpjs          --save

Estes comandos criará a pasta node_modules e será inserido os arquivos dentro.

Agora vamos ao script:


//==============Modulos=======================

var Mcp3008 = require('mcp3008.js');//Obs: Habilitar o SPI no raspberry
var snmp = require('snmpjs');

//==========================variaveis globais===================

var adc = new Mcp3008();
var adc1=adc2=adc3=adc4=adc5=adc6=adc7=adc8="0";//valores lidos no AD

//===========Intervalo de leituras do ADC==============================

setInterval(function(){ leCanais(); }, 1000);//chama a funcao leCanais() a cada  01 segundos

//===================LeCanais=======================================

function leCanais()
{
 leCanal1();
 leCanal2();
 leCanal3();
 leCanal4();
 leCanal5();
 leCanal6();
 leCanal7();
 leCanal8();

 console.log(adc1 + "  " + adc2 + "  " + adc3 + "  " + adc4 + "  " + 
 adc5 + "  " + adc6 + "  " + adc7 + "  " + adc8);

}

//=========Leitura do canal 1 do MCP3008======================
function leCanal1()
{
  adc.read(0, function (value)
   { 
   adc1=value.toString();
   });
}
//=========Leitura do canal 2 do MCP3008======================
function leCanal2()
{
  adc.read(1, function (value)
   { 
   adc2=value.toString();
   });
}
//=========Leitura do canal 3 do MCP3008======================
function leCanal3()
{
  adc.read(2, function (value)
   { 
   adc3=value.toString();
   });
}
//=========Leitura do canal 4 do MCP3008======================
function leCanal4()
{
  adc.read(3, function (value)
   { 
   adc4=value.toString();
   });
}
//=========Leitura do canal 5 do MCP3008======================
function leCanal5()
{
  adc.read(4, function (value)
   { 
   adc5=value.toString();
   });
}
//=========Leitura do canal 6 do MCP3008======================
function leCanal6()
{
  adc.read(5, function (value)
   { 
   adc6=value.toString();
   });
}
//=========Leitura do canal 7 do MCP3008======================
function leCanal7()
{
  adc.read(6, function (value)
   { 
   adc7=value.toString();
   });
}
//=========Leitura do canal 8 do MCP3008======================
function leCanal8()
{
  adc.read(7, function (value)
   { 
   adc8=value.toString();
   });
}

//====================Agent SNMP==========================

var agent = snmp.createAgent();

agent.request({ oid: '.1.1.1.1.1.1.1.1.1', handler: function (prq) {

  var val = snmp.data.createData({ type: 'OctetString',
      value: adc1 });

  snmp.provider.readOnlyScalar(prq, val);
} });


agent.request({ oid: '.1.1.1.1.1.1.1.1.2', handler: function (prq) {

  var val = snmp.data.createData({ type: 'OctetString',
      value: adc2 });

  snmp.provider.readOnlyScalar(prq, val);
} });


agent.request({ oid: '.1.1.1.1.1.1.1.1.3', handler: function (prq) {

  var val = snmp.data.createData({ type: 'OctetString',
      value: adc3 });

  snmp.provider.readOnlyScalar(prq, val);
} });


agent.request({ oid: '.1.1.1.1.1.1.1.1.4', handler: function (prq) {

  var val = snmp.data.createData({ type: 'OctetString',
      value: adc4 });

  snmp.provider.readOnlyScalar(prq, val);
} });


agent.request({ oid: '.1.1.1.1.1.1.1.1.5', handler: function (prq) {

  var val = snmp.data.createData({ type: 'OctetString',
      value: adc5 });

  snmp.provider.readOnlyScalar(prq, val);
} });


agent.request({ oid: '.1.1.1.1.1.1.1.1.6', handler: function (prq) {

  var val = snmp.data.createData({ type: 'OctetString',
      value: adc6 });

  snmp.provider.readOnlyScalar(prq, val);
} });


agent.request({ oid: '.1.1.1.1.1.1.1.1.7', handler: function (prq) {

  var val = snmp.data.createData({ type: 'OctetString',
      value: adc7 });

  snmp.provider.readOnlyScalar(prq, val);
} });


agent.request({ oid: '.1.1.1.1.1.1.1.1.8', handler: function (prq) {

  var val = snmp.data.createData({ type: 'OctetString',
      value: adc8 });

  snmp.provider.readOnlyScalar(prq, val);
} });


agent.bind({ family: 'udp4', port: 161 });


No início foi adicionado os 02 módulos através do requere.
A função setInterval chama as leituras dos A/D a cada segundo e atualiza as variáveis

Foi utilizado os OIDs '.1.1.1.1.1.1.1.1.1' até .1.1.1.1.1.1.1.1.8 para identificar um lugar na MIB para armazenar os valores das leituras dos ADs.

Usamos um programa de varredura de MIB e obtivemos o resultado abaixo:























Fizemos um GET em cada um do OIDs e os valores são de acordo com a posição dos pots.



É isto ai, o código está bem comentado e espero que sirva para alguém que precise fazer algum teste.

Até a próxima....







Nenhum comentário:

Postar um comentário