Lo primero que vamos a necesitar es un chasis para mini robot proposito general, arduino, un puente H, pilas, bluetooth shield para arduino y algunos cables para las conexiones. (No abarcaremos las conexiones puesto que el objetivo del post es la programación)
Estamos utilizando en este ejemplo una versión de Linux en este caso Mint para poder hacer toda la programación, para eso necesitamos las librerías estándar de programación y en este caso bluez que ya viene prácticamente ya viene instalado solo necesitamos las librerías que usaremos.
Pues vamos a instalarlo lo primero que debemos hacer es poner el siguiente comando:
$ sudo apt-get install libbluetooth-dev
Una vez que tenemos instalado las librerias, vamos a trabajarlo directamente en el codigo que estamos utilizando para la interfaz por lo que para este ejemplo el arduino tiene programado que cuando reciba una "a", prenda los motores para que avance el carro, cuando recibe una "r" hacia atrás, "i" a la izquierda y "d" a la derecha.
Empezaremos por declarar el socket para podernos comunicarnos por bluetooth
struct sockaddr_rc addr = { 0 }; int status; char dest[18] = "00:13:03:19:00:50"; s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); addr.rc_family = AF_BLUETOOTH; addr.rc_channel = (uint8_t) 1; str2ba( dest, &addr.rc_bdaddr ); status = connect(s, (struct sockaddr *)&addr, sizeof(addr));
Donde en el arreglo de "dest" tenemos la dirección tarjeta por ultimo con status(si es 0 se conecto) revisamos que realmente se haya podido dar la conexión.
Una vez que todo haya salido correcto, añadiremos los cuatro metodos para que puedan mover el carro:
//methods static void go(GtkWidget *widget, gpointer data){ int status = write(s,"a",6); if( status < 0 ) perror("uppps error"); //printf("avanzo"); } static void back(GtkWidget *widget, gpointer data){ int status = write(s,"r",6); if( status < 0 ) perror("uppps error"); } static void left(GtkWidget *widget, gpointer data){ int status = write(s,"i",6); if( status < 0 ) perror("uppps error"); } static void right(GtkWidget *widget, gpointer data){ int status = write(s,"d",6); if( status < 0 ) perror("uppps error"); }
Por ultimo verificamos que cuando salgamos de la ventana se cierre la conexión
static gboolean delete_window(GtkWidget *widget, GdkEvent *event, gpointer data){ close(s); gtk_main_quit(); return FALSE; }
Aquí muestro el código completo no hay separación por lo que basta seguirlo de la siguiente manera
///Bluetooth Library #include#include #include #include #include //variables int s; //methods static void go(GtkWidget *widget, gpointer data){ int status = write(s,"a",6); if( status < 0 ) perror("uppps error"); //printf("avanzo"); } static void back(GtkWidget *widget, gpointer data){ int status = write(s,"r",6); if( status < 0 ) perror("uppps error"); } static void left(GtkWidget *widget, gpointer data){ int status = write(s,"i",6); if( status < 0 ) perror("uppps error"); } static void right(GtkWidget *widget, gpointer data){ int status = write(s,"d",6); if( status < 0 ) perror("uppps error"); } static gboolean delete_window(GtkWidget *widget, GdkEvent *event, gpointer data){ close(s); gtk_main_quit(); return FALSE; } static void close2(GtkWidget *widget, gpointer data) { close(s); } int main (int argc, char *argv[]) { //manager bluetooth struct sockaddr_rc addr = { 0 }; int status; char dest[18] = "00:13:03:19:00:50"; s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); addr.rc_family = AF_BLUETOOTH; addr.rc_channel = (uint8_t) 1; str2ba( dest, &addr.rc_bdaddr ); status = connect(s, (struct sockaddr *)&addr, sizeof(addr)); //A program that has a window and four buttons to control the mini-robot //Declaration of variables or components GtkWidget *window; GtkWidget *buttonUp; GtkWidget *buttonDown; GtkWidget *buttonLeft; GtkWidget *buttonRight; GtkWidget *grid; GtkWidget *label; GtkWidget *cerrar; //initialization gtk_init (&argc, &argv); /// create a new Window window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Set title for window gtk_window_set_title (GTK_WINDOW (window), "Control automatico"); // Set window resize gtk_window_set_default_size(GTK_WINDOW(window), 385, 395); // Method for destroying the window g_signal_connect(window,"delete_event",G_CALLBACK(delete_window),NULL); if(status==0){ //create grid grid = gtk_grid_new(); gtk_grid_set_row_homogeneous(GTK_GRID(grid),TRUE); gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE); //add container gtk_container_add(GTK_CONTAINER(window),grid); //Create buttons and append in to Grid buttonUp = gtk_button_new_with_label("Avanzar"); g_signal_connect(buttonUp,"clicked",G_CALLBACK(go),NULL); gtk_grid_attach(GTK_GRID(grid),buttonUp,2,0,1,1); buttonDown = gtk_button_new_with_label("Atras"); g_signal_connect(buttonDown,"clicked",G_CALLBACK(back),NULL); gtk_grid_attach(GTK_GRID(grid),buttonDown,2,2,1,1); buttonLeft = gtk_button_new_with_label("Izquierda"); g_signal_connect(buttonLeft,"clicked",G_CALLBACK(left),NULL); gtk_grid_attach(GTK_GRID(grid),buttonLeft,1,1,1,1); buttonRight = gtk_button_new_with_label("Derecha"); cerrar = gtk_button_new_with_label("Read"); gtk_grid_attach(GTK_GRID(grid),cerrar,0,0,1,3); g_signal_connect(cerrar,"clicked",G_CALLBACK(close2),NULL); g_signal_connect(buttonRight,"clicked",G_CALLBACK(right),NULL); gtk_grid_attach(GTK_GRID(grid),buttonRight,5,1,1,1); //show the widgets }else { label = gtk_button_new_with_label("No se encontro Device"); g_signal_connect(label,"clicked",G_CALLBACK(delete_window),NULL); gtk_container_add(GTK_CONTAINER(window),label); } gtk_widget_show_all (window); gtk_main (); }
Lo guardamos con extensión .c (en mi caso carro.c) y lo compilamos de la siguiente manera
$ gcc carro.c -o carro `pkg-config --cflags --libs gtk+-3.0` -lbluetooth
$ ./carro
Funcionamiento:
No hay comentarios:
Publicar un comentario