/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Codigo para controlar Servo motores y Muestrear señal de Wif

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
kds



Registrado: 11 Nov 2007
Mensajes: 2

MensajePublicado: 11/11/2007 6:08 pm
Título: Codigo para controlar Servo motores y Muestrear señal de Wif

Hola que tal mi primer post en este foro, y bueno no pierdo tiempo con presentaciones.


Estoy haciendo un codigo para controlar un servo motor, que enrealidad ya controlo con un PIC y solo tiene 3 botones izq, der, centro, y esos los voy a manejar desde el puerto paralelo.


Bueno entonces son solo 3 bits. Pero no es todo para posicionarlo hay que leer la señal de una tarjeta USB wireless conectada.

Es muy sencillo, solo hay 3 posiciones extremos y centro, mi programa va ( a un no sive todo) mover el servo a esas posiciones y a leer la señal luego solo las compara y donde este mejor la señal ahi se pone


bueno se escucha facil aun no llevo mucho tiene mucho que no escribo en c y por eso les pido que revisen mi codigo y me digan conforme voy avansando que puedo mejorar. gracias

Programa principal
Código:

//programa que lee la señal de wireless y manda señal a servo motores
#include <stdio.h>
#include <stdlib.h>

int main()
{

FILE *punt;
char texto[80]; //cadena de cada linea de texto
char *c;
int pos[2], x, valAct;


pos[0]=pos[1]=pos[2]=x=0;

printf("/a ----Programa para controlar una antena wifi con servo motores--- /n/n");
printf("Realizando muestreo.../n/n");


do{

//rutina para leer la señal y almacenarla
usleep(1000000); //retardo necesario
system("iwconfig eth1 >/home/kds/antena/ejemplo.log");
punt = fopen("/home/kds/antena/ejemplo.log","r");
//fin

//rutina para leer el archivo y extraer el valo de la señal xxx/1000
//fin

//se guarda el valor en una variable
pos[x]=valAct;
//fin
 printf("la selal en la posicion %d es de %d",x,valAct);

x++;
}while (x!=3);


//se compara la mejor señal y se posiona

if ((pos[0] == pos[1]) &&  (pos[1]== pos[2]))
//a poscion 1
    printf("se tiene la misma señal en las 3 zonas");
if ( (pos[0] >= pos[1]) && (pos[0] >= pos[2]))
//a posicion 0
if ( (pos[1] >= pos[0]) && (pos[1] >= pos[2]))
//a posicion 1
if ( (pos[2] >= pos[0]) && (pos[2] >= pos[1]))
//a posicion 2






fclose(punt);
return (0);
}



progama que lee el comando ifconfig eth1

Código:

ejecutar: ./ejemplo
que hace el programa:  usa system para mandar la salida a un archivo temporal y luego la lee

*/
#include <stdio.h>
#include <stdlib.h>

int main()
{

FILE *punt;
char texto[80];
char *c;

system("iwconfig eth1 >/home/kds/antena/ejemplo.log");
punt = fopen("/home/kds/antena/ejemplo.log","r");

 do
 {
c = fgets(texto, 50, punt);
if (c != NULL)
printf("%s",texto);
/* En este lugar la variable texto ya contiene la  primer linea  */
/* en el proximo ciclo tendra lo que dice la linea siguiente */

 }while (c != NULL);





fclose(punt);
return (0);
}


Programa que intenta saber la señal ,muy malo
Código:

#include <stdio.h>
#include <stdlib.h>

int main()
{

FILE * archivo;
char str [4];
//int cal;



archivo = fopen ("ejemplo.log", "a+t");


 fseek (archivo, 246, SEEK_CUR);
 fscanf (archivo, "%s", str);
printf ("I have read:%s \n",str);


fclose (archivo);


return (0);
}





Como pueden ver estoy medio perdido, acepto cualquier mejora

tengo dudas en

como saber la señal.
comparar mas efectivamente la señal de cada posicion.
mandar los bits para el puerto paralelo.

gracias espero tambien que alguien aprenda de esto[/code]
Volver arriba
digies



Registrado: 18 Nov 2005
Mensajes: 478
Ubicación: Cono Sur

MensajePublicado: 14/11/2007 5:37 am
Título:

Muy interesante lo que estás haciendo (yo lo hice hace algún tiempo pero en Visual Basic).

Con respecto a mandar los bits al puerto paralelo, el C estándar no te lo permitirá. Si estás trabajando bajo Windows investiga las funciones propias del APIWin o alguna librería que maneje estas cosas. Hay una página dando vueltas por ahí, si la ubico edito el link.

Un saludo
Volver arriba
kds



Registrado: 11 Nov 2007
Mensajes: 2

MensajePublicado: 18/11/2007 7:25 am
Título: listo!!!

listo ya esta por si alguien quiere mas detalles que postee

el puerto en bit 32 es izq 64 es centro y 128 es der.
y lo demas pues creo que esta entendible solo me falta agregar algo para el segundo servo que va a moverse si un parametro solo para que este vistoso .

Código:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
//#include <asm/io.h>
#include <sys/io.h>
/*direccion del puerto*/
#define BASEPORT 0x378

int main()
{

FILE *punt;
char texto[80];
char *c;

FILE * archivo;
char signal[15];
int sig,x;
int pos[2];
sig=x=pos[0]=pos[1]=pos[2]=0;

/* Obtiene acceso al puerto */
if(ioperm(BASEPORT, 3, 1)) { perror("ioperm"); printf(" Error en ioperm ");
}
  /* se apaga todo */
  outb(0, BASEPORT);



printf("\a\n \033[31m PROGRAMA   \033[0m \n");
printf("\033[31m lINEAS DE TRANSMISION \033[0m \n");
printf("\033[31m ANTENA WI-FI CON 2 SERVOMOTORES \033[0m \n");
printf("\033[31m MUESTREANDO SEÑAL... \033[0m \n");






//ejecutar comando
do{
//posicion de la antena
  //cuando x==0
if(x==0)
{/* Envia la señal */
outb(32, BASEPORT);
/* Espera un rato para enviar otra cosa si se desea (100 ms) */
usleep(100000);
}

  //cuando x==1
if(x==1)
{/* Envia la señal */
outb(64, BASEPORT);
/* Espera un rato para enviar otra cosa si se desea (100 ms) */
usleep(100000);
}

  //cuando x==2
if(x==2)
{/* Envia la señal */
outb(128, BASEPORT);
/* Espera un rato para enviar otra cosa si se desea (100 ms) */
usleep(100000);
}

usleep(3000000);




system("iwconfig eth1 >/home/kds/antena/ejemplo.log");
punt = fopen("/home/kds/antena/ejemplo.log","r");
 do
 {
c = fgets(texto, 70, punt);

//if (c != NULL)  //se muestra la salida del comando
//{
//printf("%s",texto);
//}
/* En este lugar la variable texto ya contiene la  primer linea  */
/* en el proximo ciclo tendra lo que dice la linea siguiente */

 }while(c != NULL);
//fin de comando


//leemos señal
archivo = fopen ("ejemplo.log", "a+t");
fseek (archivo, 253, SEEK_CUR);  //nos ponemos en la señal contando cada caracter
fscanf (archivo, "%s ", signal);
//printf ("I have read:%s \n",signal);

sig=atoi(signal);
printf("\n\n\033[31m Señal:%d \033[0m \n",sig);
fclose(archivo);
pos[x]=sig;  //guardamos las 3 señales
x++;
usleep(3000000);
}while(x<=2);


//se compara la mejor señal y se posiona

if ((pos[0] == pos[1]) &&  (pos[1]== pos[2]))
//a poscion 1
    printf("\033[34m Misma señal en las 3 posiciones \033[0m \n");


if ( (pos[0] >= pos[1]) && (pos[0] >= pos[2]))
//a posicion 0
   { printf("\033[34m En la posicion  0 \033[0m \n");
    outb(32, BASEPORT);
   /* Espera un rato para enviar otra cosa si se desea (100 ms) */
   usleep(100000);
   }


if ( (pos[1] >= pos[0]) && (pos[1] >= pos[2]))
//a posicion 1
    {printf("\033[34m En la posicion  1 \033[0m \n");
    outb(64, BASEPORT);
    /* Espera un rato para enviar otra cosa si se desea (100 ms) */
    usleep(100000);
    }


if ( (pos[2] >= pos[0]) && (pos[2] >= pos[1]))
//a posicion 2
    {printf("\033[34m En la posicion  2 \033[0m \n");
    outb(128, BASEPORT);
    /* Espera un rato para enviar otra cosa si se desea (100 ms) */
    usleep(100000);
    }


//bye
printf("\033[7m Termino satisfactoriamente. ;) \033[0m \n");
printf("\033[7m Presione una tecla para salir. \033[0m \n");
getchar();


  /* se apaga todo  */
  outb(0, BASEPORT);

/* Cierra el puerto */
if(ioperm(BASEPORT, 3, 0))

 { perror("ioperm"); printf(" Error en ioperm ");
 }
 //exit(0);


fclose(punt);
return (0);
}



recuerden hacer todo como root, porque la salida del comando si eres root te pone mas caracteres y puede que en la cadena de texto no salga la señal es cuestion de checar
a y la rede debe de tener 7 caracteres en la essid.

saludos
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com