Mostrando entradas con la etiqueta ACS. Mostrar todas las entradas
Mostrando entradas con la etiqueta ACS. Mostrar todas las entradas

viernes, 5 de febrero de 2016

Lectura ADC Raspberry Pi (GPIO) con un MCP3202 o MCP3008

No todo en la electronica son unos y ceros (1-0) tambien tenemos dispositivos, sensores, medicion de voltajes, corrientes que van desde el 0 en adelante. Desafortunadamente en la Raspberry Pi no hay un una entrada donde conectemos directamente algo analogo y no lo lea pero afortunadamente tenemos algo llamado SPI, lo cual nos permite la lectura de 2 puertos dentro GPIO en la Raspberry Pi para obetener datos análogos (CE0 y CE1).

Elementos de SPI

SCLK - Serial CLocK 
CE   - Chip Enable (Chip Select) (Dos puertos CE0 y CE1) 
MOSI - Master Out Slave In 
MISO - Master In Slave Out 

Sin embarho el SPI master driver esta deshabilitado por default en la raspberry, pero es muy fácil habilitarlo, solo tenemos que teclear una línea de código en la consola para quitarlo de la lista negra o bien hacerlo desde raspi-config.

Manual:

- sudo sed -i 's/blacklist spi\-bcm2708/\#blacklist spi-bcm2708/g' /etc/modprobe.d/raspi-blacklist.conf
- sudo reboot

Automático:

- sudo raspi-config

Una vez habilitado tenemos los siguientes pines del GPIO funcionales.

 MOSI P1-19, MISO P1-21, SCLK P1-23, CE0  P1-24 y CE1  P1-26

Ya tenemos habilitado el SPI, lo que para empezar a hacer pruebas necesitamos los siguiente:
  1. MCP3202 ó MCP3008
  2. Python y Python-dev
  3. Spidev 
Para instalar python python-dev realizar:
sudo apt-get install python-dev python






Para instalar spidev:

- git clone git://github.com/doceme/py-spidev
- cd py-spidev/
- sudo python setup.py install

Recordemos que el MCP3202 es un chip de 2 canales codificado a 12 bits por lo tanto vamos a estar leyendo valores de 0 - 4095 y el MCP3008 es un chip de 8  canales codificado  a 10 bits teniendo valores desde 0 - 1023. Eso se evalua en el código para la manipulación de datos. Los chips deben conectarse de la siguiente manera.

 
Rojo: V+
Negro: GND
Naranja: CLOCK
Amarillo: MOSI
Azul: MISO
Violeta: CE

Los canales es donde va a entrar la línea de lo que queremos medir y vamos a manipular tanto el canal como el puerto CE que deseamos medir mediante el siguiente script:

Para crear el script creamos un archivo con extensión .py

Con esto podemos a jugar con los numeros de los canales o de los CE para ver y entender el funcionamiento correcto.

Espero que les haya servido, realmente es una excelente herramienta para hacer medicion de sensores ya que por lo regular estos nos arrojan numeros que van de 0 en adelante.






lunes, 3 de marzo de 2014

Push Notification en Android e iOS (Parte 2 Programación Appcelerator)

Bien, ya que tenemos toda la parte de la configuracíon del ACS (Appcelerator Cloud Services) procederemos a crear un app donde podamos recibir Push Notifications.

Empezaremos creando un nuevo Mobile App Proyect. Importante: No olviden activar  CLOUD


Ahora abrimos el tiapp.xml, y en la sección de modulos debemos de tener ti.cloud y ti.couldpush, si no los tenemos los agregamos.




Ahora en la parte inferior a un lado de Overview damos clic en tiapp.xml y editaremos el codigo manualmente. Agregaremos las siguientes tres lineas arriba del los tags <id>....</id>:


    <property name="acs-push-type-development" type="string">gcm</property>
    <property name="acs-push-type-production" type="string">gcm</property>
    <property name="acs-push-type" type="string">gcm</property>


Con esto tenemos configurado para que funcione el GCM que sirve para que trabajen los Push Notification con android.

Ahora bien procedemos a escribir el siguiente código, yo he hecho un solo codigo para que funcione en Android e iOS a la vez, practicamente solo cambia la función Ti.Platform.osname que separo mediante un if  para identificar el Sistema Operativo.

El codigo es el siguiente:


//Variable que guarda el tipo de Sistema Operativo
var osname = Ti.Platform.osname;



 

//Inicializamos el Cloud
var Cloud = require('ti.cloud');
Cloud.debug = true; 




//Esta variable contendra el Token

var deviceToken;


//Si el Sistema Operativo es android, iniciamos el cloudpush

if(osname == 'android'){
   var CloudPush = require('ti.cloudpush');
   CloudPush.debug = true;
   CloudPush.enabled = true;
   CloudPush.showTrayNotificationsWhenFocused = true;
   CloudPush.focusAppOnPush = false;
}

//Ventana de INICIO
var win = Titanium.UI.createWindow({
   title:'TestPush App',
   backgroundColor:'#fff'
});
win.open();


//Con esta función inicializamos el APP

setTimeout(buildUI,500);

function buildUI(){

   //Boton de resitro local push
   var register_local_push = Ti.UI.createButton({
     width:200,
     top:'10%',
     title:"GET TOKEN & REGISTER LOCAL PUSH"
   });
   win.add(register_local_push);

   //Acción del Boton local push
   register_local_push.addEventListener('click',getDeviceToken);

   //Boton registro
   var register_user_btn = Ti.UI.createButton({
     width:200,
     top:'25%',
     title:"REGISTER USER"
   });
   win.add(register_user_btn);


   //Acción del Boton registro
   register_user_btn.addEventListener('click',registerUser);

   //Boton login
   var login_btn = Ti.UI.createButton({
     width:200,
     top:'40%',
     title:"LOGIN"
   });
   win.add(login_btn);

   //Acción del Boton login
   login_btn.addEventListener('click',login);

   //Boton server push
   var register_server_push_btn = Ti.UI.createButton({
     width:200,
     top:'55%',
     title:"REGISTER SERVER PUSH"
   });
   win.add(register_server_push_btn);

   //Acción del Boton server push
     register_server_push_btn.addEventListener('click',subscribeToServerPush);
   }

   //REGISTRAR USUARIO EN CLOUD
   function registerUser(){
     Ti.API.info("REGISTER");
     Cloud.Users.create({
       username: "prueba",
       password: "1234",
       password_confirmation: "1234",
       first_name: "Kike",
       last_name: "Kenobi"
     }, function (e) {
         if (e.success) {
           //Usuario creado correctamente       
           alert("Usuario creado correctamente");
         } else {
           //oops, algo salio mal
           alert("El usuario no se creo, hubo un error: "+e);
         }
      });
   }

  //Logue de Usuario en CLOUD
  function login(){
    Cloud.Users.login({
      login: 'prueba',
      password: '1234'
    }, function (e) {
        if (e.success) {
          var user = e.users[0];
          alert('Success:\\n' +
          'id: ' + user.id + '\\n' +
          'first name: ' + user.first_name + '\\n' +
          'last name: ' + user.last_name);
        } else {
          alert('Error: ' +((e.error && e.message) || JSON.stringify(e)));
        }
     });  }  //Registro Local al Push Notification  function getDeviceToken(){

  //El registro funciona diferente para android que para iOS aquí elegimos que función
    if(osname == 'android'){

      CloudPush.retrieveDeviceToken({
        success: function deviceTokenSuccess(e) {     
         alert('Device Token: ' + e.deviceToken);
         deviceToken = e.deviceToken;        },
        error: function deviceTokenError(e) {
          alert('Hubo error al registrar: ' + e.error);
        }
      });

    } else {

      Titanium.Network.registerForPushNotifications({
        types: [
          Titanium.Network.NOTIFICATION_TYPE_BADGE,
          Titanium.Network.NOTIFICATION_TYPE_ALERT,
          Titanium.Network.NOTIFICATION_TYPE_SOUND
        ],
        success:function(e){
          deviceToken = e.deviceToken;
          Ti.App.Properties.setString("device_token",deviceToken);
          alert("Token recibido "+deviceToken);
        },
        error:function(e){
          alert("Error durante el registro: "+e.error);
        }
      });
    }
  }  //Registro Push Notification Server  function subscribeToServerPush(){
    //Validamos el tipo de dispositivo a registrar esto es muy importante porque cin esto checa el tipo de token
    var typeDevice = (osname == 'android')?'android':'ios';
    Cloud.PushNotifications.subscribe({
      channel: 'friend_request', //Es un valor que podemos cambiar al que queramos, sirve para clasificar.
      type: typeDevice,
      device_token: deviceToken
    }, function (e) {
      if (e.success) {
        alert('Correcto '+((e.error && e.message) || JSON.stringify(e)));
      } else {
        alert('Error: ' + ((e.error && e.message) || JSON.stringify(e)));
      }
    });  }


NOTA: No es necesario tener crear una cuenta de usuario si el app solo recibira notificaciones, se usa para poder interactuar entre dispositivos, yo lo anexo ya que más adelante usare unos ejemplos con usuarios a partir de Push Notifications desde un Servidor. (Observación de Eagle)

Todos los valores subrayados en amarillo pueden ser cambiados, esta es la pantalla de como se debe ver el app una vez compilada y corriendo. (Para iOS no se puede hacer pruebas desde el simulador, se necesita un dispositivo).


El proceso para registrar el APP a el uso de Push Notification es:
  1. Obtener Token (Obtiene el token del dispositivo)
  2. Registramos el Usuario (Se registrara un nuevo usuario en el ACS).
  3. Hacemos login una vez que el usuario haya sido creado.
  4. Y finalmente registramos el Usuario al Push Notification. (Necesita haberte creado el usuario con anterioridad si no simplemente no se podra registrar).




Una vez que hayamos registrado a Push Notification, vamos a el ACS en la sección de Push Notifications vere un nuevo dispositivo registrado para recibir Notificaciones.


Desde esta misma pantalla podemos enviar las notificaciobes y opciones dependiendo el dispositivo.


Esto es todo, espero les haya sido de mucha utilidad tambien tengo un script para mandar los Push Notifications desde la consola, es muy util si quieres trabajar desde un servidor, se los puedo pasar si es que me lo piden. Además estoy trabajando en la retroalimentación del app a traves de los Push, espero pronto subir esta parte.

Saludos.