martes, 13 de agosto de 2013

Forzar resolución de monitor en KDE

Quizás te ha pasado que quieres asignar a tu monitor una resolución especifica y esta no está en la lista de resoluciones admitidas.

Por ejemplo: yo quiero colocar mi monitor de derecho en la resolución 1152x864

Primero: debo saber cual es el nombre asignado a mi monitor, para ello (note que la resolución buscada no está en la lista de ese monitor):

xrandr -q

En mi caso se llama DVI-1 (Es el monitor derecho)

Ahora agregamos la resolución con:

xrandr --addmode DVI-1 "1152x864"

Nota: si muestra un error en el comando anterior entonces la resolución no es admitida por el controlador para este tipo de monitor y no hay nada que hacer. 

Para finalizar asignamos la resolución al monitor deseado:

xrandr --auto --output DVI-1 --mode 1152x864

Listo, ya deberías tener tu resolución asignada.

lunes, 24 de junio de 2013

Programar Arduino pro mini con un PL2303HX (Linux)

Aquí se indica como cargar sketches a un pro mini usando un adaptador USB to TTL PL2303HX.

Conexiones:

Pro mini    |      PL2303HX
Vcc          |      5V
GND        |      GND
RX           |      TX
TX           |      RX

Para cargar los sketch:
1- Conecte el PL2303HX al PC y este al pro mini. En el sistema el adaptador aparece con el nombre de ttyUSBn:
2- Presione el botón de reset del pro mini y mantengalo presionado

3- Presione el boton upload del arduino ide


4- Cuando aparezca el texto "Tamaño binario del Sketch" inmediatamente sueltas el botón de reset


5- Deberia indicar: Carga terminada. Vuelva a presionar y soltar el botón de reset

Bluetooth + Linux + Qt + C/C++

En este tuto veremos como comunicar un programa escrito en C/C++ - Qt con un arduino usando un módulo bluetooth.

Este post es idéntico al anterior, con la variación que en vez de mandar o recibir datos desde moserial lo haremos con un programa nuestro. Nuestro programa apagará y encenderá un led conectado al arduino y mostrará la respuesta enviada.

Paso 1: Instala las bibliotecas de desarrollo de python para c/c++

#yum install python-*

#yum install bluez*

Paso 2: Realiza todos los pasos de este post y verifica que funcione.

Paso 3: Cuando todo funcione entonces procedemos a abrir Qt Creator y creamos nuestro Qt Gui Application. En mi caso lo llame BluetoothRapido

Paso 4: Editamos el fichero .pro para que reconozca las bibliotecas python. para ello agregamos el siguiente string al final del fichero:

INCLUDEPATH += /usr/include/python2.7/
LIBS += -lpython2.7 -lbluetooth -lpthread




Nota que este ejemplo es para python 2.7. Debes verificar que versión de python tienes instalado en tu máquina. Si es distinto al 2.7 por ejemplo 2.5 entonces debes sustituir la versión en el string. Quedaría así:


INCLUDEPATH += /usr/include/python2.5/
LIBS += -lpython2.5 -lbluetooth -lpthread


Ya estás listo pasa usar la clase BluetoothManager que simplifica mucho el trabajo. Consta de dos métodos principales para enviar datos, sincrona y asincronamente, (Probado con Qt5 - c++x11):


class BluetoothManager{
 public:
 void init(){
 isOpen=true;
 Py_Initialize(); 
 main_module = PyImport_ImportModule("__main__");
 main_dict = PyModule_GetDict(main_module);
 PyRun_SimpleString(pycode_Init);
 } 
 // Envia un string sin esperar respuesta
 void sendAsync(QString data){
 if (!isOpen){
 perror("Error: puerto cerrado");
 return;
 }
 if (!data.size()){
 return;
 }
 // Concatena el string a enviar con el comando
 PyRun_SimpleString(QString(QString("sock.send(\"")+data+"\\n\");\n").toLatin1().constData()); 
 } 
 // Envia un string y espera la respuesta
 QString sendSync(QString data){
 if (!isOpen){
 perror("Error: puerto cerrado");
 return QString("");
 }
 if (!data.size()){
 return QString("");
 }
 
 // Concatena el string a enviar con el comando
 PyObject *data_py = NULL;
 PyRun_SimpleString(QString(QString("sock.send(\"")+data+"\\n\");\n").toLatin1().constData());
 usleep(150000);
 PyRun_SimpleString("print(\"Recibe Data: \");\n");
 PyRun_SimpleString("data = sock.recv(1024);\n");
 PyRun_SimpleString("print \"received: \", data;\n");
 data_py = PyMapping_GetItemString(main_dict, (char*)"data");
 return QString(PyString_AsString(data_py));
 }
 
 void close(){
 if (isOpen){
 PyRun_SimpleString("sock.close();");
 Py_Finalize();
 isOpen=false;
 }
 }
 
 ~BluetoothManager(){
 close();
 }
 private:
 bool isOpen;
 // Código para inicializar
 const char * pycode_Init=
 "from bluetooth import *;\n"
 "server_address = \"00:13:01:05:06:73\";\n" // Mac de mi modulo
 "port = 1;\n"
 "sock = BluetoothSocket( RFCOMM );\n"
 "sock.connect((server_address, port));\n"
 "sock.settimeout(100.0);\n";
 int t=0;
 PyObject *main_module, *main_dict;
 };


-----------------------------------

00:13:01:05:06:73 es la MAC de mi módulo bluetooth (hc-05). Debe sustituirla por su MAC.

Por ejemplo Ejemplo, para mandar un string asincronamente al bluetooth:

BluetoothManager bt;
bt.sendAsync("UN_STRING");

martes, 11 de junio de 2013

Instalar Android Studio en Fedora (Solución a No JDK found)


Primero nos descargamos el .zip de aqui y lo descomprimimos.

Si intenta ejecutar el fichero bin/studio.sh encontrara el siguiente error:

ERROR: Cannot start Android Studio\nNo JDK found. Please validate either STUDIO_JDK, JDK_HOME or JAVA_HOME environment variable points to valid JDK installation.

Para evitar esto hacemos:

Vemos que versión de JDK tenemos instalada. En mi caso es la jdk1.7.0_11



Luego editamos el fichero ubicado en android-studio/bin/ llamado studio.sh con algún editor de textos y agregamos la siguiente linea debajo de las lineas de comentario:

JAVA_HOME=/usr/java/jdkVERSION_DE_JDK

En mi caso quedaría así:

JAVA_HOME=/usr/java/jdk1.7.0_11



Luego guardas y ejecutas el fichero studio.sh

listo

lunes, 27 de mayo de 2013

Entrar en AT Mode de un HC-05 / HC-06 con Arduino duemilalove

En este tuto se usa una baseboard para el hc-05:

En caso de no tener la baseboard entonces debes conectar el pin34 a 3.3v y rx a rx y tx a tx


Primero las conexiones:

HC-05 Baseboard    |  Arduino Duemilanove
               KEY -----------> 3.3V
               RX    -----------> TX
               TX    -----------> RX            
               5V    ----------> 5V
               GND -----------> GND
























Importante: Debes despegar el micro atmega del arduino. Si usas un arduino que no se le pueda despegar el micro entonces puedes usar Serial.print() para enviar los comandos al modulo bluetooth (ejemplo: Serial.print("AT")) o puedes usar la biblioteca "HC05". 

Luego de conectar por USB el arduino, el led del módulo debería parpadear a 1 Hz (indicando que está en modo AT):



Cuando esto ocurra abre Arduino ide y luego el monitor serial (en caso de que tengas un duemilanove sin micro)
coloca 38400 Baudios
y NL & CR



Luego escribe los comandos AT que desees:

Por ejemplo:
// Asigna Lenin como_NOMBRE del dispositivo
AT+NAME=Lenin

// Pregunta por el nombre del dispositivo
AT+NAME?

// Asigna el numero 9876 como contraseña al modulo HC-05
AT+PSWD=9876


Cuando termines de configurar, desconectas pin KEY y debería volver a modo datos.

Note que el duemilanove NO TIENE EL MICRO:


Links

http://www.instructables.com/id/Modify-The-HC-05-Bluetooth-Module-Defaults-Using-A/all/?lang=es


http://tallerarduino.wordpress.com/2011/12/06/modulo-bluetooth-hc-06-o-gp-gc021-y-arduino/
http://taktak.co.uk/2013/bluetooth-module-hc-05-bt_board-1-5-configuration/
https://github.com/jdunmire/HC05/blob/master/README.md
http://techwatch.keeward.com/geeks-and-nerds/how-to-configure-and-use-an-iteaduino-bt/

jueves, 2 de mayo de 2013

Comunicación bluetooth Arduino <=> PC Linux con un dongle usb

En este tuto se busca establecer una comunicación bidireccional entre un arduino y una pc usando bluetooth.



Se requiere:
* Dongle usb:

* Arduino + modulo bluetooth (Aqui uso el HC-05)



* Debe tener instalado bluez y moserial. Si usa fedora puede instalarlo con:
     yum install -y blue* moserial*

Vamos a hacer que el Arduino prenda y apague un led según se le indique.

La conexión debe queda así:

Led                ----> Pin 13 Arduino
Bluetootx Tx ----> Arduino Tx
Bluetootx Rx ----> Arduino Rx
Bluetootx Vcc----> Arduino 5v               


Paso 1. Cargar el sketch al arduino: 
Nota: Desconecta el Rx del bluetooth antes de cargar el sketch o te dará problemas en la carga


/** Por Hector Oliveros **/
char inByte;
int  LED = 13; // LED on pin 13

void setup() {
  // El baud rate debe ser el mismo que en el monitor serial y 
  // que el mobulo bluetooth. 
  // para cambiar el baud rate debe entrar en modo AT
  Serial.begin(9600);
}

void loop() {}

// Se activa cuando se detecta escritura en el puerto serial
void serialEvent() {  
  while (Serial.available()) {
    inByte = Serial.read();        
    // Si detecta el caracter '0' entonces apaga el led
    if( inByte == '0' ){
      digitalWrite(LED, LOW);  
      Serial.println("LOW");
    }
    
    // Si detecta el caracter '1' entonces enciende el led
    if( inByte == '1' ){
      digitalWrite(LED, HIGH); 
      Serial.println("HIGH");
    }  
  }
}


Puedes descargar el sketch desde aqui:
Luego de realizada la carga debes volver a conectar el Rx del bluetooth al arduino.

Paso 2: Configurar la PC.
Conecta el dongle usb al equipo.

- Para saber la mac del modulo bluetooth ejecuta:      hcitool scan
- Luego para asociarse al modulo sustituye y ejecuta: rfcomm connect 0 MAC_DEL_MODULO
  donde MAC_DEL_MODULO es la mac del modulo que obtuviste con hcitool.

- Le va a pedir el pin: En el hc-05 es 1234
- Si todo va bien debería mostrar lo siguiente:




Paso 3: Comunicarse con el Arduino:

- Abre moserial y ve a configuración de puerto

- Allí coloca esta configuración: Desmarca imprimir datos recibidos

- Luego se conecta:

- Y prueba intentando prender el led:


Listo 




Notas: Cuando quieras cargar un sketch al arduino desconecta el rx del módulo bluetooth, Puesto que te va a dar fallas.

Probado en Fedora x86_64 

Links de interés :
http://letsmakerobots.com/node/11178
http://www.flickr.com/photos/ricardo_ferreira/4225911933/

domingo, 7 de abril de 2013

Usar el mouse con C/C++ en linux

La forma más fácil para usar las funcionalidades del mouse es usando xdotool (necesita tenerlo instalado).

Ejemplo 1:
Mover el cursor a la coordenada 1,1
system("xdotool mousemove 1 1");



Ejemplo 2:
Este es otro ejemplo de una clase "Mouse" que hice para probar 



#include <inttypes.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
using namespace std;

#define SIZE_OF_SCRIPT_CLICK 20 // Size script that will run the click

class Mouse{
public:

 /** Mouse buttons **/
 enum MouseButton{
  Left=1,
  Middle=2,
  Right=3
 };

 /** Perform click's
  *
  * @param nClicks Number of clicks to perform
  * @param button Button of the click
  * @param delay Delay time in microseconds
  *
  */
 void click(int nClicks=1, MouseButton button=Left,int delay=0){
  static char script[SIZE_OF_SCRIPT_CLICK];
  memset(script,0,sizeof(char)*SIZE_OF_SCRIPT_CLICK);

  sprintf (script,"xdotool click %d",int(button));

  while (nClicks--){
   system(script);
   if (nClicks)
    usleep(delay);
  }
 }

 /** Type of mouse move **/
 enum TypeOfMove{
  Relative, // Move the cursor with respect to the current position
  Absolute  // Places the cursor at a given position
 };

 /** Change the cursor position
  *
  * @param x Abscissa
  * @param y Ordinate
  * @param typeOfMove Type of move
  */
 void move(int x,int y,TypeOfMove typeOfMove=Absolute){
  static char script[SIZE_OF_SCRIPT_CLICK];
  memset(script,0,sizeof(char)*SIZE_OF_SCRIPT_CLICK);
  sprintf (script,"xdotool mousemove%s %d %d",
    typeOfMove==Relative?"_relative":"",x,y);
  system(script);
 }
};


int main() {
 Mouse m;
 usleep(500000);
 m.click(1,Mouse::Right);
 usleep(500000);
 m.move(0,200,Mouse::Relative);
 m.click(1,Mouse::Left);
 m.move(0,200,Mouse::Absolute);
 m.click(1,Mouse::Left);
 return 0;
}