Translate

jueves, abril 27, 2017

Usar datos gratis para proyectos IoT FreedomPop y Orange Pi 2G IoT (también Simyo).


Configuración PPP, freedompop y tarjera Orange Pi 2G IoT:

He preparado este pequeño tutorial para poder usar los datos de conexión gratuita de freedompop con esta pequeña tarjeta de Orange Pi, comprada en aliexpress por unos 12€.
La versión usada de Linux es Ubuntu Server, Link de descarga (http://www.orangepi.org/downloadresources/) también funcionará en Armbian, aunque no lo he probado.

Es necesario registar el modem de la Orange Pi 2G IoT en la red GSM de movistar (de momento es la predeterminada por freedompop). Sin este paso no se puede registrar en su red.

1.Instalar el software necesario:

#sudo apt-get install ppp wvdial

2. Configurar ficheros:

        2.1  fichero:  /etc/wvdial.conf para Freedompop:
[Dialer defaults]
ISDN = 0
Modem Type = Analog Modem
Phone = *99***1#
Stupid Mode = 1
Dial Command = ATDT
Modem = /dev/modem0
Baud = 460800
Init1 = AT+COPS=0
Init2 = AT+CFUN=1
Init3 = AT+CGATT=1
Init4 = AT+CGDCONT=1,"IP","freedompop.foggmobile.com","",0,0
Init5 = AT+CGACT=1,1
Username = " "
Password = " "


          2.2 fichero  /etc/ppp/peers/wvdial
                   noauth
                   name wvdial
                   # Descomenta esta linea si quieres utilizar los DNS de Freedompop (son las DNS de google)
                  #usepeerdns
                 defaultroute
                  replacedefaultroute
           2.3 fichero /etc/ppp/options
                 comentar la linea lcp-echo-failure 4, si no la comentamos se desconectará cada 2 minutos.



3.Ejecutar wvdial, este es el log:

+CREG: 5
OK
--> Sending: AT+CGATT=1
AT+CGATT=1
+CGREG: 5
--> Sending: ATQ0
ATQ0
+CGATT:1
OK
--> Re-Sending: AT+CGATT=1
AT+CGATT=1
+CGATT:1
OK
--> Sending: AT+CGDCONT=1,"IP","freedompop.foggmobile.com","",0,0
AT+CGDCONT=1,"IP","freedompop.foggmobile.com","",0,0
OK
--> Sending: AT+CGACT=1,1
AT+CGACT=1,1
OK
--> Modem initialized.
--> Sending: ATDT*99***1#
--> Waiting for carrier.
ATDT*99***1#
CONNECT
--> Carrier detected.  Starting PPP immediately.
--> Starting pppd at Thu Apr 27 08:45:06 2017
--> Pid of pppd: 4484
--> pppd: ú¶P{
--> Using interface ppp0
--> pppd: ú¶P{
--> local  IP address 10.xxx.xxxx.xxxx
--> pppd: ú¶P{
--> remote IP address 192.xxx.xxxx.xxxx
--> pppd: ú¶P{
--> primary   DNS address 8.8.8.8
--> pppd: ú¶P{
--> pppd: ú¶P{
--> Script /etc/ppp/ip-up run successful
--> Default route Ok.
--> Nameserver (DNS) Ok.
--> Connected... Press Ctrl-C to disconnect
--> pppd: ú¶P{


4. Podemos probar la comunicacion con una ping al puerto ppp0 y DNS de google:
Deveremos iniciar antes una nueva sesión ssh a la Orange Pi, o bien hacerlo como lo ago yo, usando 
el gestor de ssiones "tmux", creo que tengo el tutorial en este blog:

ping -I ppp0 8.8.8.8

Y el resultado es este:


root@OrangePi:~# ping -I ppp0 8.8.8.8

PING 8.8.8.8 (8.8.8.8) from 10.186.19.228 ppp0: 56(84) bytes of data.

64 bytes from 8.8.8.8: icmp_seq=1 ttl=58 time=836 ms

64 bytes from 8.8.8.8: icmp_seq=2 ttl=58 time=1071 ms

64 bytes from 8.8.8.8: icmp_seq=3 ttl=58 time=944 ms

64 bytes from 8.8.8.8: icmp_seq=4 ttl=58 time=1025 ms

64 bytes from 8.8.8.8: icmp_seq=5 ttl=58 time=548 ms

64 bytes from 8.8.8.8: icmp_seq=6 ttl=58 time=302 ms

64 bytes from 8.8.8.8: icmp_seq=7 ttl=58 time=2372 ms

....

Nota: si usamos Simyo la configuración de /etc/wvdial.conf es:

[Dialer Simyo]
ISDN = 0
Modem Type = Analog Modem
Phone = *99***1#
Stupid Mode = 1
Dial Command = ATDT
Modem = /dev/modem0
Baud = 460800
Init1 = AT+COPS=0
Init2 = AT+CFUN=1
Init3 = AT+CGATT=1
Init4 = AT+CGDCONT=1,"IP","orangeworld"
Init5 = AT+CGACT=1,1
Username = " "
Password = " "

Podemos elegir entre conectar con Freedomopop o Simyo, podemos etiquetar [Dialer freedompop] y [Dialer Simyo] luego, dependiendo de la Sim que tengamos insertada usar: wvdial freedompop para conectar con freedompop o wvdial Simyo para conectar con Simyo.



lunes, abril 24, 2017

Configurar modem GSM en la Orange Pi 2G IoT (Orange España)

Configurar modem GSM en la Orange Pi 2G IoT
Comentaros que necesitáis unos conocimientos más o menos básicos para poder seguir esto, pero vamos, está todo cortado y pelado.
Empezamos. Abrimos terminal.
sudo apt-get install  ppp wvdial

Hacemos
sudo vim /etc/wvdial.conf
Y metemos:
[Dialer defaults]
Modem = /dev/modem0
Baud = 30720000
Dial Command = ATDT
Init1 = ATE1
Init2 = AT+CGDCONT=1,"IP","internet","",0,0
FlowControl = CRTSCTS
Init3 = ATM0
Phone = *99#
Username = orange
Password = orange
Stupid Mode = 1
"internet" es donde va el nombre del APN, que en el caso de Orange es, precisamente ese, internet. El username y password de Orange son orange para ambos, si teneis otra compañía estos datos serán diferentes. De hecho, quizá estas configuraciones no funcionen para ellos. NOTA: Lo he probado exitosamente también con Vodafone con el APN "airtelnet.es" y como usuario y contraseña vodafone.
Hacemos
sudo vim /etc/ppp/peers/wvdial
y metemos:
hide-password
noauth
name wvdial
debug
usepeerdns
defaultroute
noipdefault
mtu 472
Ahora hacemos
sudo vim /etc/ppp/peers/wvdial-pipe
y metemos:
noauth
name wvdial
plugin passwordfd.so
defaultroute
replacedefaultroute
Hacemos, finalmente,
sudo wvdial
Y a volar!!!!!!!!!! Para ahora deberíais estar conectados. Si no obtenéis conexión, puede deberse a varias cosas. Podríais tener una conexión abierta de otra red (LAN, Wireless) mientras conectábais al móvil, luego la habéis cerrado para probar la conexión móvil, y ésta no funciona. Desactivad otras redes antes de conectar con el móvil.
También podrían ser las DNS, vamos a descubrirlo.
ping -w 3 www.google.es
Si os responde correctamente, es que estáis conectados. Si no, probad:
ping -w 3 8.8.8.8
Si os responde este, pero no el anterior, es que os fallan las DNS. La solución es sencilla:
sudo echo "nameserver 208.67.222.222" >/etc/resolv.conf
sudo echo "nameserver 208.67.220.220" >>/etc/resolv.conf
Con estos dos comandos hemos añadido las DNS de OpenDNS. Ahora todo debería funcionar correctamente.
Hay unas últimas consideraciones a hacer.
Ya lo hemos configurado todo, pero ¿cómo desconectamos? y ¿cómo volvemos a conectar?
Los procesos "sudo rfcomm connect 0" y "sudo wvdial" se cierran haciendo Ctrl+C en la consola donde se ejecutan. Otra forma para cerrar ambos es matarlos mediante
sudo killall wvdial pppd rfcomm
Para volver a conectar, podemos hacer un script. El primero que os propongo es "silencioso", "ciego":
sudo rfcomm connect 0 & sleep 5 && sudo wvdial
El segundo que os propongo abre dos pantallas de xterm mostrando los procesos (debéis tener instalado xterm; sudo apt-get install xterm):
echo -e 'sudo xterm -e rfcomm connect 0 & sleep 5 && sudo xterm -e wvdial' >> ~/.conectbt.sh
chmod +x  ~/.conectbt.sh
Ahora teneis el script hecho, sólo teneis que crear un acceso directo a
gksudo sh ~/.conectbt.sh
Para desconectar, vamos a las pantallas donde se ejecutan los procesos, y hacemos Ctrl+C
Espero que os haya sido de utilidad!!

miércoles, abril 19, 2017

Control led con Arduino uno R3 y pantalla touch de 2.0" Driver: S6D1121



Este es el anuncio del dispositivo:
https://es.aliexpress.com/item/2-0-3-3V-TFT-LCD-Touch-Screen-Breakout-Board-With-Touch-Pen-For-Arduino/32780151979.html?spm=2114.13010608.0.0.k2mfBQ




  • se puede utilizar directamente para mostrar los caracteres, gráficos e imágenes en formato BMP.
  • compatibilidad: Porque el nivel lógico 3.3 V, es compatible con 3.3 V placa Arduino, por lo general, es necesario agregar un circuito de conversión de nivel si se utiliza un 5 V
  • Placa Arduino (Arduino uno R3/Mega2560 Arduino/Arduino Leonardo).
  • biblioteca de Arduino: UTFT
  • conductor IC: S6D1121
  • tipo de pantalla táctil: pantalla táctil resistiva
  • resolución: 240X320, $ number bits (262,000) color
  • tamaño de la pantalla: 2.0 pulgadas;
  • voltaje de funcionamiento: 3.3 V

Driver TFT:                        Http://www.rinkydinkelectronics.com/library.php?id=52
Driver touch 4 pines:                 Https://github.com/adafruit/Touch-Screen-Library
Todas las librerías necesarias: Https://drive.google.com/drive/folders/0B6uNNXJ2z4CxZmFlUGFNXzBnUDA?

Con el siguiente programa arduino controlamos la pantalla de tft touch de 2.0", comprada en aliexpress por 3€.
Controlaremos por medio de un botón en pantalla un led usando el pin 5 de la placa arduino y un sensor DHT22 temperatura/humedad. Para las pruebas use el arduino uno R3:




CODIGO ARDUINO :




/*
* Arduino 2″ TFT Touch Display and dht22 humidity and trmparature sensor.
*
* Created by surfero
* surfero.blogspot.com
*
*/

#include                         //http://www.rinkydinkelectronics.com/resource/UTFT/UTFT.pdf
#include                     //Touchscreen library
#include                          //Humidity and temperature sensor library

#define DCS  6                            // Chip select pin of touch screen
#define DCLK A1                            // Clock pin of touch screen
#define DIN  A2                            // Data in pin of touch screen
#define DOUT 7                            // Data out pin of touch screen

#define YAXIS 0                           //Axis of the TFT sceen
#define XAXIS 1

#define DHTPIN 3                        // Temp and humidity sensor
#define DHTTYPE DHT22                    //Sensor type

#define PRESSDELAY 200                   //Delay between touch screen readings

Touch_AS Touch(DCS, DCLK, DIN, DOUT);    // Initialize touchscreen
UTFT myGLCD(ITDB24E_8,A2,A1,A3,A0);  // Initialize display
DHT dht(DHTPIN, DHTTYPE);                // Initialize temp and humidity sensor

extern uint8_t BigFont[];                //Setting fonts for the LCD http://www.rinkydinkelectronics.com/r_fonts.php
extern uint8_t SmallFont[];
extern uint8_t SevenSegNumFont[];

unsigned long temparatureMillis = 0;     //Store the last temp reading time
int x, y;                                //Store touch cordinates
String tempUnit = "C";                  //Temperature measurement unit
unsigned long millisNow =0;             //Store touch time to ignore repeated touch signals

void setup()

{
// Initial setup
 Serial.begin(9600);
 myGLCD.InitLCD();
 myGLCD.clrScr();

 myGLCD.setFont(BigFont);
 myGLCD.setBackColor(0, 0, 255);

 drawScreen(0);                         //Call draw screen function
 dht.begin();                           //Sratr the temp and humidity sensor
}

void loop()
{
   if (Touch.Pressed()){               //Check to see if the touch screen is pressed
     x=Touch.GetCoord(XAXIS);          //Get X cord
     y=Touch.GetCoord(YAXIS);          //Get Y cord
     
     if(x>105 && x<225 amp="" y="">95 && y<130 span="">
       //Skip touchscreen readings for the next 500ms(set in PRESSDELAY).
       //This is used because whenever the sceen in touched it sends the cordinates continously.
       //We only need to toggle the unit once per touch.
       if(millis()-millisNow >= PRESSDELAY){
         millisNow = millis();      

        if(tempUnit == "C"){          //Toggle temparature unit
           tempUnit = "F";
        }
        else if(tempUnit == "F"){
          tempUnit = "C";
        }
        readTemparature();
       }
     }
   }
   //Check temparature every 2000ms (2 seconds)
   if(millis() - temparatureMillis >= 2000){
     temparatureMillis = millis();
     readTemparature();
     Serial.println(temparatureMillis);
   }
}
//Function to read temparature and humidity
void readTemparature(){
 float h = dht.readHumidity();              // Read humidity
 float t = 0;
 if(tempUnit == "C"){
   t = dht.readTemperature();               // Read temperature in C
 }
 else{
   t = dht.readTemperature(true);            // Read temperature in F
 }

 // Check if any reads failed and exit early (to try again).
 if (isnan(h) || isnan(t)) {
   Serial.println("Failed to read from DHT sensor!");
   return;
 }
 //Serial.print("Temp: ");
 //Serial.print(t);
 updateTemp(t, tempUnit);
 updateHumidity(h);
}

//Function to draw screens. Parameter will set which sreen to draw (When more than one screen)
//Documentation for the screen library- http://www.rinkydinkelectronics.com/resource/UTFT/UTFT.pdf
void drawScreen(int screen){
 //0= home screen (More screens will be added later)
 if(screen == 0){
   myGLCD.setBackColor(0,0,0);
   myGLCD.setColor(255,255,255);
   myGLCD.setFont(BigFont);
   myGLCD.print("Data from sensor", CENTER, 30);
   myGLCD.setColor(255, 0, 0);
   myGLCD.drawLine(0,60,319,60);
   myGLCD.setBackColor(0, 0, 0);
   myGLCD.setColor(255, 255, 255);
   
   myGLCD.setFont(BigFont);
   myGLCD.print("Temparature", CENTER, 70);
   
   myGLCD.setColor(255, 255, 255);
   
   myGLCD.setFont(BigFont);
   myGLCD.print("Humidity", CENTER, 150);
 }
}

//Function to update temparature
void updateTemp(float val, String unit){
   myGLCD.setColor(255,255,255);
   myGLCD.drawRoundRect (105, 95, 225, 130);
   myGLCD.setColor(0,255,0);
   myGLCD.setFont(BigFont);
   myGLCD.printNumF(val, 2, CENTER, 100);
   myGLCD.print(unit, 205, 100);
}

//Function to update humidity
void updateHumidity(float val){
   myGLCD.setColor(255,255,255);
   myGLCD.drawRoundRect (105, 175, 225, 210);
   myGLCD.setColor(0,255,0);
   myGLCD.setFont(BigFont);
   myGLCD.printNumF(val, 2, CENTER, 178);
   myGLCD.print("%", 205, 178);
}

sábado, abril 01, 2017

Raspberry Pi Trasplante de Regulador de Voltaje (Hard Mod)


Si bien es cierto que para una gran cantidad de aplicaciones alimentamos nuestra placa Raspberry Pi con un adaptador de pared, otros usos podrían requerir de una fuente de alimentación portátil a baterías, como por ejemplo: Construyendo Nuestro Propio Pi(rate)Box Desde Cero.
Lamentablemente el circuito de la fuente de alimentación de la placa Raspberry Pi utiliza un regulador de tensión lineal para la línea de alimentación principal de 3.3V. El regulador de tensión en cuestión es un SE8117T33 fabricado por Seaward Electronics Inc., el cual, si bien es de alto rendimiento, por sus características lineales desperdicia aproximadamente un 30% de energía la cual disipa en forma de calor. Este porcentaje puede parecer despreciable si la placa Raspberry Pi es alimentada utilizando un adaptador de pared, pero cuando se trata de baterías, este porcentaje no es para nada insignificante. Para incrementar la autonomía utilizando baterías, sustituiremos el regulador de tensión lineal por un regulador de tensión switching.
Sin más preámbulos procederemos a analizar las características eléctricas del regulador de tensión original de la placa Raspberry Pi encontradas en la hoja de datos provista por el fabricante.
Características principales del regulador de voltaje SE8117T33:
  • Voltaje de Entrada: 9V (Máx.)
  • Voltaje de Salida: 3.3V
  • Corriente Máxima: 1A
Conociendo estos datos, buscaremos un módulo regulador switching de características iguales o superiores para alimentar correctamente nuestra placa. En el mercado existe una gran cantidad de módulos switching de diversos fabricantes que pueden satisfacer nuestros requerimientos, como por ejemplo, el módulo D24V6ALV de la Casa Pololu, que si bien provee una corriente de salida máxima de 600mA, es suficiente para nuestro propósito. En particular, no me fué posible encontrar dicho módulo dada la actual escasez de componentes electrónicos importados en mi país. Sin desistir de la búsqueda, conseguí mediante un importador local un módulo genérico de procedencia China, rotulado “DSN-MINI-360”, cuyas características eléctricas se detallan a continuación:
Características principales del módulo regulador switching DSN-MINI-360:
  • Voltaje de Entrada: 4.75V – 23V
  • Voltaje de Salida: 1.0V – 17V (Ajustable)
  • Corriente Máxima: 1.8A
  • Eficiencia: 96%
Como podemos observar, las características satisfacen perfectamente nuestros requerimientos, y con una eficiencia del 96% sólo tenemos una pérdida del 4% en contraste con el 30% del regulador de tensión lineal original, obteniendo así una mejora del 26%.
El módulo regulador switching DSN-MINI-360 se observa en las siguientes imágenes:
A continuación debemos soldar al módulo switching los 3 cables de conexión en los lugares correspondientes:
  • IN+ –> Entrada (+) [5V]
  • IN- –> GND (-) [Común a Entrada/Salida]
  • OUT+ –> Salida (+) [3.3V]
En la siguiente imagen se observa el resultado de este proceso:
Habiendo realizado exitosamente el paso anterior, ahora debemos ajustar la tensión de salida del módulo a un voltaje de 3.3V, la misma tensión de salida del regulador de voltaje original de la placa. Conectaremos el módulo switching a una fuente de alimentación cuyo voltaje de salida sea 5V, respetando el esquema de conexiones detallado anteriormente. Con el multímetro ajustado en la escala apropiada, comenzaremos a ajustar el trimpot ayudándonos con un destornillador de precisión hasta obtener el voltaje deseado en la salida. NO DEBE EXCEDER 3.3V!!!
IMPORTANTE: el ajuste de la tensión de salida del módulo switching debe realizarse ANTES de ser conectado a la placa Raspberry Pi. Una tensión de alimentación mayor a 3.3V causará daños irreparables en la placa.
Llegados a este punto, ya tenemos el módulo switching listo para ser instalado como reemplazo del regulador de voltaje original. La etapa siguiente probablemente sea las más crítica (y emocionante) de todo el proceso, que consiste en remover el regulador de voltaje original e instalar el módulo switching como reemplazo del mismo.
Antes de remover el regulador de voltaje SE8117T33, debemos verificar el pinout del mismo para identificar los puntos de conexión de nuestro módulo switching. El pinout se observa en la siguiente imagen:
Luego, buscamos el regulador de voltaje original en la placa Raspberry Pi y en su correspondiente diagrama esquemático para identificar correctamente los puntos de conexión:
Para remover el regulador de tensión original, emplearemos una estación de soldado SMD con aire caliente, en particular he utilizado la estación HONY 908 con excelentes resultados.
Con extremo cuidado calentaremos el componente hasta que sea posible extraerlo de la placa con la ayuda de una brusela antiestática. Debemos asegurarnos de calentar lo suficiente el componente ya que de lo contrario existe el riesgo de dañar los pads del PCB. La placa con el regulador de voltaje removido se observa a continuación:
Si logramos remover el regulador de tensión sin inconvenientes, podemos volver a respirar y la modificación estará casi completa. En caso de tener algún contratiempo, a no perder la calma y revisar el diagrama esquemático en busca de alguna solución.
Con el componente original removido, solamente nos queda soldar los 3 cables de conexión de nuestro módulo switching a los pads correspondientes en nuestra placa Raspberry Pi. También es conveniente fijar el módulo al PCB, para esta tarea utilizaremos un pegamento no abrasivo a base de silicona, por ejemplo “Fastix®”. El único inconveniente será que la frambuesa (logo) quedará oculta. Triste
En particular, he sometido a todo el proceso descripto anteriormente a dos placas Raspberry Pi con excelentes resultados. En las siguientes imágenes se observan ambas placas: