GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Publicar nuevo tema   Responder al tema

Página 2 de 3. Precedente  1, 2, 3  Siguiente

Ver el tema anterior Ver el tema siguiente Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Vie 10 Jul 2009 - 9:18

Bueno después de darle un poquito al código tengo el siguiente resultado
Se agregó un botón extra que se llama limpia para borrar después de grabar la posición inicial como final en las etiquetas, después serán las de los servos Very Happy
Ademas fueron usadas dos variables globales Laughing que denominé flag y flag2 para el control de envio de datos a los labels que contienen la informacion de posicion inicial y de posicion final, y que no grabara mas de dos posiciones; si el usuario intenta grabar mas de dos posiciones, aparecerá una ventana de advertencia que debe ser presionado el botón de Limpiar si se desean grabar mas posiciones.

En la imagen se verá un pantallazo del como quedó el programa!! cyclops
Aún le falta un boton más para que envié los datos "almacenados" al microcontrolador Idea
Se me olvidaba, si modifico el valor del spinner no se mueve aún el slider correspondiente eso ya lo haré al ratin Sleep , pero si se guarda en los labels la posicion del spinbox!! Twisted Evil
Así como configurar el puerto serial entre otras cosas!!, espero sus comentarios para ir mejorando este pequeño proyecto, gracias! por los comentarios de los listeros



cheers cheers cheers cheers cheers


aqui les presento el código que se implemento!
Código:

' Gambas class file
PUBLIC flag AS Boolean = FALSE ' variable global para meter datos en los labels
PUBLIC flag2 AS Boolean = FALSE

PUBLIC SUB _new()

END

PUBLIC SUB Form_Open()
  DIM flag AS Boolean = FALSE
END

PUBLIC SUB Button2_Click()

  ME.Close

END

PUBLIC SUB sldServo1_Change()

  spnServo1.Value = sldServo1.Value

END

PUBLIC SUB btnSalir_Click()

  ME.Close()

END

PUBLIC SUB btnGraba_Click() ' graba las posiciones de los servos

 

  IF flag = FALSE AND flag2 = FALSE THEN
    lblS1a.Text = lblS1a.text & " " & spnServo1.Value
    lblS2a.Text = lblS2a.text & " " & spnServo2.Value
    lblS3a.Text = lblS3a.Text & " " & spnServo3.Value
    lblS4a.Text = lblS4a.Text & " " & spnServo4.Value
    lblS5a.Text = lblS5a.Text & " " & spnServo5.Value
    flag = TRUE
  ELSE IF flag = TRUE AND flag2 = FALSE
    lblS1b.Text = lblS1b.Text & " " & spnServo1.Value
    lblS2b.Text = lblS2b.Text & " " & spnServo2.Value
    lblS3b.Text = lblS3b.Text & " " & spnServo3.Value
    lblS4b.Text = lblS4b.Text & " " & spnServo4.Value
    lblS5b.Text = lblS5b.Text & " " & spnServo5.Value
    flag2 = TRUE
  ELSE
    Message.Warning("No puedes grabar mas de dos posiciones pulsa LIMPIAR")
  END IF
END

PUBLIC SUB sldServo2_Change()

  spnServo2.Value = sldServo2.Value

END

PUBLIC SUB sldServo3_Change()

  spnServo3.Value = sldServo3.Value

END

PUBLIC SUB sldServo4_Change()

  spnServo4.Value = sldServo4.Value

END

PUBLIC SUB sldServo5_Change()

  spnServo5.Value = sldServo5.Value

END

PUBLIC SUB btnLimpia_Click() 'este boton pone en falso la flag para iniciar una nueva grabacion de posiciones

  flag = FALSE
  flag2 = FALSE
  lblS1a.Text = "Pos="
  lblS1b.Text = "Pos="
  lblS2a.Text = "Pos="
  lblS2b.Text = "Pos="
  lblS3a.Text = "Pos="
  lblS3b.Text = "Pos="
  lblS4a.Text = "Pos="
  lblS4b.Text = "Pos="
  lblS5a.Text = "Pos="
  lblS5b.Text = "Pos="

END


maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Miér 29 Jul 2009 - 7:45

Saludos a todos!!, de nuevo por aqui en el foro, ya hace tiempo que no me paraba por aqui, puesto que ando con un buen de chamba, bueno

Ahora las actualizaciones.

Debido a que la tarjeta controladora de los servos, para mover cada servo utiliza un caracter, cada caracter que recibe por el puerto serie del micro, hace que el servo se mueva un grado.

Pues bien, rediseñe (mas bien hice un poco mas fea Razz ) la interfaz, para cuestiones de prueba, bueno, pues los sliders ahora van de 0 a 180 junto con los spinners, almacena la posicion y no deja que se graben mas de dos posiciones, una a la que llamo posicion final del servo y otra posicion inicial, bueno ahora lo interesante es que mueva cada servo por "pasos" de un grado, pues el problema que se plantea es el siguiente

Si un servo esta en la posición de 30° por ejemplo, y lo queremos mover a una posicion de 150°, moveriamos el slider correspondiente de la posicion 30 a 150 (o bien tambien se puede hacer con el spinner) ahora la tarjeta tendria que recibir un caracter por cada grado, es decir la simple resta entre el valor inicial y el valor final, pero si queremos que ahora se mueva de 150° a 120° entonces ahora notamos que la diferencia es negativa, bueno ¿cómo arreglamos esto? hacemos uso del valor absoluto!, con la instruccion abs(argumento) obtenemos el valor absoluto de la diferencia.

Otro detalle, pero que es mas simple, es lo siguiente, si el movimiento del servo es en el sentido positivo, pues debera enviar un numero, y si es negativo deberá enviar una letra, bueno esa parte es sencilla, solo con un if, bueno aqui presento el codigo de la parte que menciono.

Código:

 vfin5 = sldServo5.Value
  tempo = 0
  tempo = Abs(vfin5 - vini5)
  IF (vfin5 - vini5) < 0
  lblpossld_5.Text = ("Manda letras " & tempo & " a")
  ELSE
  lblpossld_5.Text = ("Manda numeros " & tempo & " 1")
  ENDIF
  vini5 = vfin5


ya comenze a entender el funcionamiento de las librerias del puerto serial en gambas, y la neta esta muy bueno!, espero pronto publicar mas avances con este tema.

Coloco a continuacion el codigo que he generado, disculpen las faltas al programar, pero ya queria avanzar y asi se me hizo muy rapido, sin uso de funciones.




Código:


' Gambas class file
'http://www.alcancelibre.org/staticpages/index.php/introduccion-a-gambas-datos-variables

PUBLIC flag AS Boolean = FALSE ' variable global para meter datos en los labels
PUBLIC flag2 AS Boolean = FALSE
'Vaiables para saber cuantos pasos hubo de diferencia entre la posicion actual y la previa
PUBLIC vini1 AS Integer
PUBLIC vfin1 AS Integer
PUBLIC vini2 AS Integer
PUBLIC vfin2 AS Integer
PUBLIC vini3 AS Integer
PUBLIC vfin3 AS Integer
PUBLIC vini4 AS Integer
PUBLIC vfin4 AS Integer
PUBLIC vini5 AS Integer
PUBLIC vfin5 AS Integer

'Variable temporal para realizar los calculos, este valor será usado para enviar los
'caracteres por el puerto serial
PRIVATE tempo AS Integer



PUBLIC SUB _new()
 
END

PUBLIC SUB Form_Open()
  DIM flag AS Boolean = FALSE
  vini1 = 0  'Damos un valor inicial = 0  con este numero inicia el sld
  vini2 = 0
  vini3 = 0
  vini4 = 0
  vini5 = 0

 
 
 
END

PUBLIC SUB Button2_Click()

  ME.Close

END

PUBLIC SUB sldServo1_Change()
  spnServo1.Value = sldServo1.Value
  vfin1 = sldServo1.Value
  tempo = 0
  tempo = Abs(vfin1 - vini1)
  IF (vfin1 - vini1) < 0
  lblpossld_1.Text = ("Manda letras " & tempo & " a")
  ELSE
  lblpossld_1.Text = ("Manda numeros " & tempo & " 1")
  ENDIF
  vini1 = vfin1
END

PUBLIC SUB btnSalir_Click()

  ME.Close()

END

PUBLIC SUB btnGraba_Click() ' graba las posiciones de los servos

 

  IF flag = FALSE AND flag2 = FALSE THEN
    lblS1a.Text = lblS1a.text & " " & spnServo1.Value
    lblS2a.Text = lblS2a.text & " " & spnServo2.Value
    lblS3a.Text = lblS3a.Text & " " & spnServo3.Value
    lblS4a.Text = lblS4a.Text & " " & spnServo4.Value
    lblS5a.Text = lblS5a.Text & " " & spnServo5.Value
    flag = TRUE
  ELSE IF flag = TRUE AND flag2 = FALSE
    lblS1b.Text = lblS1b.Text & " " & spnServo1.Value
    lblS2b.Text = lblS2b.Text & " " & spnServo2.Value
    lblS3b.Text = lblS3b.Text & " " & spnServo3.Value
    lblS4b.Text = lblS4b.Text & " " & spnServo4.Value
    lblS5b.Text = lblS5b.Text & " " & spnServo5.Value
    flag2 = TRUE
  ELSE
    Message.Warning("No puedes grabar mas de dos posiciones pulsa LIMPIAR")
  END IF
END

PUBLIC SUB sldServo2_Change()

  spnServo2.Value = sldServo2.Value
  vfin2 = sldServo2.Value
  tempo = 0
  tempo = Abs(vfin2 - vini2)
  IF (vfin2 - vini2) < 0
  lblpossld_2.Text = ("Manda letras " & tempo & " a")
  ELSE
  lblpossld_2.Text = ("Manda numeros " & tempo & " 1")
  ENDIF
  vini2 = vfin2

END

PUBLIC SUB sldServo3_Change()

  spnServo3.Value = sldServo3.Value
  vfin3 = sldServo3.Value
  tempo = 0
  tempo = Abs(vfin3 - vini3)
  IF (vfin3 - vini3) < 0
  lblpossld_3.Text = ("Manda letras " & tempo & " a")
  ELSE
  lblpossld_3.Text = ("Manda numeros " & tempo & " 1")
  ENDIF
  vini3 = vfin3

END

PUBLIC SUB sldServo4_Change()

  spnServo4.Value = sldServo4.Value
  vfin4 = sldServo4.Value
  tempo = 0
  tempo = Abs(vfin4 - vini4)
  IF (vfin4 - vini4) < 0
  lblpossld_4.Text = ("Manda letras " & tempo & " a")
  ELSE
  lblpossld_4.Text = ("Manda numeros " & tempo & " 1")
  ENDIF
  vini4 = vfin4

END

PUBLIC SUB sldServo5_Change()

  spnServo5.Value = sldServo5.Value
  vfin5 = sldServo5.Value
  tempo = 0
  tempo = Abs(vfin5 - vini5)
  IF (vfin5 - vini5) < 0
  lblpossld_5.Text = ("Manda letras " & tempo & " a")
  ELSE
  lblpossld_5.Text = ("Manda numeros " & tempo & " 1")
  ENDIF
  vini5 = vfin5

END

PUBLIC SUB btnLimpia_Click() 'este boton pone en falso la flag para iniciar una nueva grabacion de posiciones

  flag = FALSE
  flag2 = FALSE
  lblS1a.Text = "Pos="
  lblS1b.Text = "Pos="
  lblS2a.Text = "Pos="
  lblS2b.Text = "Pos="
  lblS3a.Text = "Pos="
  lblS3b.Text = "Pos="
  lblS4a.Text = "Pos="
  lblS4b.Text = "Pos="
  lblS5a.Text = "Pos="
  lblS5b.Text = "Pos="

END

PUBLIC SUB spnServo1_Change()

  sldServo1.value = spnServo1.Value

END

PUBLIC SUB spnServo2_Change()

  sldServo2.Value = spnServo2.Value

END

PUBLIC SUB spnServo3_Change()
 
  sldServo3.Value = spnServo3.Value
 
END

PUBLIC SUB spnServo4_Change()
 
  sldServo4.Value = spnServo4.Value
 
 
END

PUBLIC SUB spnServo5_Change()
 
  sldServo5.Value = spnServo5.Value
 
END


PUBLIC SUB lblpossld_1_MouseDown()

 
 

END

PUBLIC SUB radioCierraPuerto_Click()

  IF SerialPort1.Status = Net.Active THEN
    CLOSE SerialPort1
    Message.Info("El puerto ha sido cerrado")
  ELSE
    Message.Info("El puerto no ha sido abierto")
  ENDIF

END

PUBLIC SUB radioAbrePuerto_Click()

  IF SerialPort1.Status = Net.Active THEN
  Message.Info("El puerto ya esta abierto")
  ELSE
  Message.Info("Abriendo el puerto")
  ENDIF

END

PUBLIC SUB ToolButton1_Click()

  IF radioCierraPuerto.Value = TRUE
    Message.Info("Da clic en la opcion abre el puerto")
  ELSE
    'Aqui viene lo de la apertura del puerto serial
    'tomando los valores seleccionados de los combo box
    'Me base en el ejemplo que trae la documentacion de gambas
   
    Message.Info("Abriendo el puerto serial NOW!")
  ENDIF   

END




tambien les coloco una foto de la nueva placa que armamos y un juego de engranes donde esta acoplado uno de los servos a controlar, esa parte no la hago yo, pero esta quedando muy cool:!:

[img=]

[img=]
Por cierto, debido a que se usa un gusano sinfin, y una corona, el servo no podrá mover un amplitud grande al eje principal, por lo que se ha optado por la siguiente solución, quitarle el freno mecanico del servo, y adaptar con un engranaje con igual relacion, al eje principal el potenciometro del servo, de esta forma, el servo queda libre de giro, pero el sensado, será en el eje principal, por lu cual, digamos que se hace una extension de la caja de engranes del propio servo a la que se ve en la fotografia.

Cabe aclarar que yo no soy quien diseña la parte mecánica, sino es mi compañero ruben, aquien le agradezco su trabajo y que ademas trabaja muy bien con el torno y la fresa.

Dejenme sus comentarios, espero no desorientarlos tanto, y pues en el caso de las partes mecanicas, pues lo poco que se, con gusto se los comparto, pero si tienen preguntas un poco mas avanzadas, pues le preguntaré a Ruben y les dire bounce

maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  Pikitin el Jue 30 Jul 2009 - 5:23

Esto va tomando forma..ehh?

Tiene muy buena pinta el proyecto, la parte mecánica también se ve muy bién trabajada (felicitaciones a Rubén)... que envidia!! Smile

Veo que estás empezando con el tema del puerto serie, esto me interesa. Por lo poco que he visto en Gambas hay una función que lee automaticamente el puerto serie cuando llegan datos y uno puede leer el bufer en cualquier momento o algo así... es algo diferente a como funciona en python y se me hace complicado.

Una cosa que he notado es que el programa parece quedarse bloqueado mientras el puerto está abierto, las pocas pruebitas que he hecho tengo que abrir y cerrar continuamente para que no se me bloquee... a ver si me aclaro cuando publiques el código completo que maneja el puerto.

No dejes de publicar fotos y explicaciones de la parte electrónica y mecánica, creo que pueden ser muy útiles

Saludos y ánimo con el proyecto, se está poniendo muy interesante.

Pikitin
veterano
veterano

Cantidad de envíos: 329
Fecha de inscripción: 26/11/2008

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Sáb 8 Ago 2009 - 10:07

Saludos de nuevo, aqui como siempre de noctambulo Cool

Bueno le he avanzado un poco al tema, y bueno espero que les gusten los avances,

He probado el funcionamiento de la tarjetita, por el momento en esta prueba no le meti nada por el puerto serial, unicamente es la tarjeta alimentada, y la estamos monitoreando a través de un osciloscopio de dos canales,

bueno pero menos palabras y mas imagenes
Circuito Funcionando
Dos canales cercanos en la tarjeta

La dos señales mas alejadas.




maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Sáb 8 Ago 2009 - 16:36

Probando el ejemplo que trae GAMBAS

Bien, como sabran, gambas trae un ejemplo base Smile (de hecho a mi se me hizo muy completo!!), del manejo del puerto serial, para esto, probe la tarjeta que mostre en el anterior post, pero ya con la maquina.

Antes que nada el ejemplo si lo instalas en ubuntu, lo vas a encontrar en la siguiente ruta

/usr/share/gambas2/examples/Networking/SerialPort

copia esta carpeta a lugar donde desees de tu home, esto hace que al colocarla en otro lugar, ahora esta carpeta, junto con su contenido te pertenezcan alien

bueno, ahora aqui tuve un gran problema. probe mi tarjeta con la aplicacion minicom, y pues funciona perfecto, con cada caracter que recibe el micro, este modifica el ancho de pulso del servo que esta controlando, por lo tanto su posicion.

Sin embargo al trabajar con el ejemplo que trae gambas, pues nada que me reconocia el caracter, y es que en el programa del micro que tengo, pasa lo siguiente

*lee el caracter desde el buffer del puerto serial
* lo convierte a mayuscula
* usa switch y case para definir como va a tratar al dato recien llegado
* genera las interrupciones adecuadas para modificar el ancho del pulso
Código:

do{

  if(comando!='\0')

  {  //solo entra aqui si comando es diferente a nulo

  //comando = toupper(comando);

  ComandoValido=0;

  printf("%c\r\n",comando);

  //delay_ms(1000);

  switch(comando){
  case '1':{

        printf("> S_1 +\r\n");

        Servo_PWM[0]+=20;

        ComandoValido=1;

        }break;

  case 'A':{

        printf("> S_1 -\r\n");

        Servo_PWM[0]-=20;

        ComandoValido=1;

        }break;

  case '2':{

        printf("> S_2 +\r\n");

        Servo_PWM[1]+=20;

        ComandoValido=1;

        }break;

  case 'B':{

        printf("> S_2 -\r\n");

        Servo_PWM[1]-=20;

        ComandoValido=1;

        }break;
default:{

      printf("<%c>no se encontro \n",comando);

      ComandoValido=0;

        disable_interrupts(int_rda);

        delay_ms(10);

        enable_interrupts(int_rda);

        //delay_ms(10);

        }break;

    }

  if(ComandoValido==0) {

    if(comando== '\0'){printf("EOL\n");}

      else

  printf("*%c \n",comando); }

  comando='\0';

  //delay_ms(1);

  }

  //delay_ms(50);

  }while(1);

imprimiendo entre cada etapa, ahora, pasa algo extraño Question , el caracter recibido, si me lo imprimia, pero no me lo reconocía, es como si lo borrara. bueno anduve de arriba para abajo con esto.

Sin embargo no me di cuenta de algo!!, despues de unas horas Embarassed , que el problema no era tanto el codigo del micro, si no mas bien el codigo de gambas, ya que en una parte hace lo siguiente
Código:

PUBLIC SUB Button2_Click()

  IF Sport.Status = Net.Inactive THEN
    Message("Open port first!")
  ELSE
  'Cuando damos clic al boton 2, lee el texto que hay en txtSend y lo manda por el flujo Sport
  ' Pero ademas de eso envia dos caracteres mas, un Retorno de Carro y Alimentacion de Línea
  'Esto me daba en la torre    (T_T)
    PRINT #Sport, txtSend.Text; Chr$(13); Chr$(10);
  END IF

END


En efecto, ahora como pude evitar eso, pues la forma mas sencilla y más rapida que se me ocurrio fue la siguiente.

Si el primer caracter me lo detecta, pero tambien el segundo y hace lo que quiere la tarjeta
Pues entonces, mandale 2 caracteres iguales!!!, pero ambos deben ser mayusculas!!, ya que el programa únicamente
recibe el primer dato, y lo transforma, pero aun no averiguo que diablos le hace al segundo, ya que este ultimo mencionado
es el que acepta. affraid
Bueno aqui les coloco unas imagenes y un video, espero sea de su agrado, algo que se me hizo interesante, deje funcionando la aplicacion un buen de horas y con todo conectado y nunca se trabo, o tuve que cerrar el puerto o abrirlo



Pikitin, la funcion de lectura es la siguiente:

Código:

PUBLIC SUB SPort_Read()
  DIM s AS String 'Variable donde se almacena lo recibido por el buffer
  READ #Sport, s, Lof(Sport) 'Leer el stream del puerto, almacenarlo en s y medir su tamaño 
  TextArea1.Text = TextArea1.Text & s  'manda el texto recibido por el puerto paralelo a un textArea
END

maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  Pikitin el Dom 9 Ago 2009 - 9:24

Gracias maigke, en cuanto pueda lo pruebo y te comento... a ver si me aclaro con el puerto serie en Gambas.

Y tu proyecto se va poniendo cada vez más interesante, me alegro de que ya estés obteniendo resultados y todo esté funcionando.

Por ahora no estoy haciendo nada con servos, pero la parte del puerto serie si que me interesa. Tengo una pequeña aplicación para graficar datos enviados por el PIC (estilo Liberlab) hecha en Gambas... la verdad es que es muy facil y rápido hacer y modificar interfaces gráficas en Gambas. Pero lo del puerto serie me tenía bloqueado, a ver si ahora consigo avanzarla un poco hasta llegar al siguiente escollo (los gráficos).


Saludos.

Pikitin
veterano
veterano

Cantidad de envíos: 329
Fecha de inscripción: 26/11/2008

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Dom 30 Ago 2009 - 15:37

Hola a todos!!, despues de como 20 días sin avance, y bueno por fin podre mas o menos seguir adelante con esto !!!

Espero que no hayan pensado que deje abandonado pero bueno, poe el momento y asi como que de rápido, por fin consegui una interfaz serial usb, y eso es lo que estaba deteniendo mucho.

acabo de probar mi tarjeta controladora de servos con la interfaz usb-rs232 y minicom, que es una aplicacion muy padre de comunicacion serial para linux en linea de comandos., para que podamos usar la interfaz haremos lo siguiente.

conectar nuestro cable
abrir una terminal
teclear el siguiente comando $dmesg y esperar que nos diga algo como esto
[ 2106.356084] usb 3-1: new full speed USB device using uhci_hcd and address 3
[ 2106.521639] usb 3-1: configuration #1 chosen from 1 choice
[ 2106.525273] pl2303 3-1:1.0: pl2303 converter detected
[ 2106.545611] usb 3-1: pl2303 converter now attached to ttyUSB0

En este caso la interfaz es reconocida por ubuntu de forma automática como ttyUSB0, ahora solo toca configura el minicom.

para esto tecleamos

minicom -s
+-----------------------------------------------------------------------+
| A - Dispositivo Serial : /dev/ttyUSB0 |
| B - Localización del Archivo de Bloqueo : /var/lock |
| C - Programa de Acceso : |
| D - Programa de Salida : |
| E - Bps/Paridad/Bits : 115200 8N1

Al terminar si estamos en una lap, conviene guardar la configuracion,
así que al salir, pues a guardar como

| Salvar configuración como dfl |<--- Esta!!
| Salvar configuración como.. |
| Salir |

y pues a comunicarse!!.
+--------------------------------------
boxpic> 1
> S_1 +
1
> S_1 +
2
> S_2 +
2
> S_2 +
3
> S_3 +
3
> S_3 +
4
> S_4 +
4
> S_4 +
5
> S_5 +
+-----------------------------------------

La verdad el programa del microcontrolador no tiene muchos printf
ya que estos se acaban la memoria, entonces, mejos solo uso los necesarios

El unico detalle que hasta el momento le veo es el siguiente.
cuando cierro el minicom, automáticamente se desconecta la interfaz USB-RS

y entonces tengo sacar el cable y conectarlo de nuevo. espero, que en el
siguiente post, pues ya tenga mas avances!

Por cierto hoy no coloco imagenes por que ando de prisas, hoy, voy a la casa
de mi novia, y pues voy por ella!! cheers cheers cheers



+------------------------------------------+

maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Mar 1 Sep 2009 - 7:22

Hola a todos de nuevo!

Bien, pues el dia de hoy y despues de varios infructuosos intentos de hacer la comunicacion con la aplicacion que estoy desarrollando, me puse a pensar un poquito Laughing

Me volví a fijar en el archivo que viene de ejemplo en GAMBAS 2, y pues ya que me cayo el 20, decidi, de nuevo emplear todas las opciones de la conexion por el puerto serial, y bueno ahora usando la interfaz usb-serie, que por cierto para linux no requiere de algún tipo en partícular de driver.

basado en esto y analizando mas a conciencia el código de ejemplo vi los siguientes aspectos

1. Existe una funcion para abrir el puerto (Demasiado obvio, pero por esto mismo me equivoque en el anterior), no unicamente se pasan los paramtros, sino que tambien, se hace necesario un chequeo de estado pasando a unos indicadores chkbox los valores de algunos valores importantes de la comunicacion serial como son Ring, DCD, CTS, etc. en este caso, si todo va bien, al hacer el chequeo, unicamente se marcarán DTR, RTS (Data Terminal Ready - Request to Send) Que nos indican que la terminal de datos esta lista para funcionar y que ademas esta en petición para enviar datos
Fuente: http://www.beyondlogic.org/serial/serial.htm

2. Una parte de asignación de cambio de valores booleanos a los chkbox de los pines del RS232

3. La implementación de la función de lectura, usando el comando READ a través de un flujo (stream) que viene del objeto instanciado hacia el Puerto Serial. y almacenandolo en una cadena llamada s.

4. El envio de datos, es la parte que personalizamos, para poder enviar datos, primero debemos verificar que se encuentre activo el puerto serie, esto se hace usando el siguiente comando

IF ttyUSB.Status = Net.Inactive THEN

posterior a esto puede colocar una ventana de mensaje o algún otro tipo de dato; en el ELSE usted podrá colocar el envio de los datos, para nosotros fué más facil el pensar en trabajarlo con un PRINT a través de flujo (stream) #ttyUSB, quedando de esta forma

PRINT #ttyUSB, "a" 'Esto envia el caracter ascii de la letra 'a' por el puerto serial, siempre y cuando este abierto dicho puerto.

para el envio de los datos use, dos commmandButton, que envian únicamente una letra por cada clic, y un slider con un spinbox, como lo hice en el programa anterior, pero ademas, coloque, dos toolbutton, que ya se que no son para eso pero los use como indicadores cyclops cambiando de color cuando un dato ha sido enviado.

Tuve problema primero, pues al enviar cantidades pequeñas de datos, es decir, unas 3 letrs, todo trabajaba a la perfección, el problema se sucitó, cuanod enviaba mas de 10 elementos, y pues esto se moría, y bueno como se arreglo mas o menos el asunto, espero en verdad encontrar una mejor solución.

Colocando un wait 0.1 que genera un retardo de 100ms, tiempo suficiente para que enie el dato y le de chance a nuestro programa que responda de forma adecuada, de hecho así lo hizo!!!

les dejo el código fuente que hemos realizado

Código:

' Gambas class file
'Midiendo con el Osciloscopio, el ancho de pulso de la tarjeta mide 1500us
'si con en programa, suponemos que por cada caracter que envie al micro, un servo tendrá un
'movimiento de un grado, parece que este dato es totalmente erroneo, a pesar de que los
'calculos esten bien realizados.

'Para iniciar el programa solo manda caracteres, pero creo que estos incluyen muchos
'CR & LF en los cuales el micro al recibirlos se ataranta.
'como recibi muchos datos y tambien los envia, es impresindible que solo
'envie una señal cuando yano reciba datos, pero como asegurarnos que ha recibido
'el correcto numero de pulsos, que no sea a traves del uso del printf
' y/o de alguna incorrecta inicializacion de otro dispositivo
' el uso de wait, realmente ha hecho que el programa sea muy lento

'Variables Globales

PUBLIC vini1 AS Integer
PUBLIC vfin1 AS Integer

PUBLIC tempo AS Integer




PUBLIC SUB Form_Close()
  IF ttyUSB.Status = Net.Active THEN CLOSE ttyUSB
END


'***************************Seccion para la comunicacion del puerto serial
'Esta parte es bastante modificable

PUBLIC SUB Check_Status()
 
  ChkDSR.Value = ttyUSB.DSR
  ChkDTR.Value = ttyUSB.DTR
  ChkCTS.Value = ttyUSB.CTS
  ChkRTS.Value = ttyUSB.RTS
  ChkDCD.Value = ttyUSB.DCD
  ChkRNG.Value = ttyUSB.RNG
 
 
END

PUBLIC SUB Form_Open()
  cmdVelocidad.Index = cmdVelocidad.Find("115200")
  vini1 = 0
  vfin1 = 0
  sldS1.Value = 90
END



PUBLIC SUB Button1_Click()

  ME.Close

END



PUBLIC SUB cmdAbreCierra_Click()

  IF ttyUSB.Status = Net.Active THEN
  CLOSE ttyUSB
  cmdAbreCierra.Text = "Abre"
  ELSE
  'Linea de parametros
  ttyUSB.PortName = txtPortText.Text
  ttyUSB.Speed = cmdVelocidad.Text
  ttyUSB.Parity = cmbParidad.Index
  ttyUSB.DataBits = cmbDataBits.Text
  ttyUSB.FlowControl = cmbControlFlujo.Index
  ttyUSB.StopBits = cmbBitParo.Text
 
  ttyUSB.Open()
  Check_Status()
  TextArea1.Text = "Puerto Abierto : " & ttyUSB.PortName & " Ajustes : " &
  ttyUSB.Speed & " , " & ttyUSB.Parity & " , " & ttyUSB.DataBits & " , " &
  ttyUSB.StopBits & " , " & Chr(13) & Chr(10)
  cmdAbreCierra.Text = "Cierra"
  ENDIF
END

PUBLIC SUB ttyUSB_Read()
  DIM s AS String
 
 
  IF TabStrip1.Text = "Configuracion" THEN
  READ #ttyUSB, s, Lof(ttyUSB)
  TextArea1.Text = TextArea1.Text & s
  ELSE IF TabStrip1.Text = "Servo 1" THEN
  READ #ttyUSB, s, Lof(ttyUSB)
  TextArea2.Text = TextArea2.Text & s
  ENDIF
END


PUBLIC SUB ttyUSB_RNGChange(ival AS Boolean)
 
  ChkRNG.Value = ival
 
END

PUBLIC SUB ttyUSB_DTRChange(ival AS Boolean)
 
  ChkDTR.Value = ival
 
END

PUBLIC SUB ttyUSB_DSRChange(ival AS Boolean)
 
  ChkDSR.Value = ival
 
END

PUBLIC SUB ttyUSB_CTSChange(ival AS Boolean)
 
  ChkCTS.Value = ival
 
END

PUBLIC SUB ttyUSB_DCDChange(ival AS Boolean)
 
  ChkDCD.Value = ival
 
END

PUBLIC SUB ttyUSB_RTSChange(ival AS Boolean)
 
  ChkRTS.Value = ival
 
END

PUBLIC SUB ChkDTR_Click()

  ttyUSB.DTR = ChkDTR.Value
  Check_Status

END

PUBLIC SUB ChkRTS_Click()

  ttyUSB.RTS = ChkRTS.Value
  Check_Status

END

PUBLIC SUB cmbControlFlujo_Click()
 
  ttyUSB.FlowControl = cmbControlFlujo.Index
 
END



'************************************************************************************************
'Esta parte corresponde a los controles que se encuentran en el tab SERVO 1
'Los primeros son dos botones con dos toolbuttons que sirven como leds indicadores
'La segunda parte corresponde a un spinbox y aun slider

PUBLIC SUB cmdAtras_Click()

  IF ttyUSB.Status = Net.Inactive THEN
    Message("Primero abre el Puerto, NO JODAS")
  ELSE
    PRINT #ttyUSB, "a"
    ToolButton2.Background = &FF0000&
    ToolButton2.Text = "A"
    WAIT 0.3  'Este retardo es para el parpadeo, entre colores, pero no tiene mucho caso
    ToolButton2.BackColor = &00FF00&
    ToolButton2.Text = ""
  ENDIF
END

PUBLIC SUB cmdAdelante_Click()

  IF ttyUSB.Status = Net.Inactive THEN
    Message("Primero abre el puerto NO JODAS")
  ELSE
    PRINT #ttyUSB, "11"
    ToolButton1.Background = &FF0000&
    ToolButton1.Text = "1"
    WAIT 0.3
    ToolButton1.Background = &00FF00&
    ToolButton1.text = ""
  ENDIF
END
'**************************************************************************
PUBLIC SUB spnboxS1_Change()
  DIM maximo AS Integer
  DIM i AS Integer
 
  sldS1.Value = spnboxS1.Value
  vfin1 = spnboxS1.Value
  tempo = 0
 
  tempo = Abs(vfin1 - vini1)

  IF (vfin1 - vini1) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "AAA"
    ToolButton2.Background = &FF0000&
    ToolButton2.Text = "A"
    WAIT 0.1  'Este retardo es importante, ya que la tarjeta no responde muy rápido
   
    ToolButton2.BackColor = &00FF00&
    ToolButton2.Text = ""
    NEXT
    maximo = 0
    ELSE
      Message.Info("NO  JODAS  A")
    ENDIF
   
  ELSE
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "111"
    ToolButton1.Background = &FF0000&
    ToolButton1.Text = "1"
    WAIT 0.1
    ToolButton1.Background = &00FF00&
    ToolButton1.text = ""
    NEXT
    maximo = 0
    ELSE
    Message.info("NO JODAS 1")
    ENDIF 
  ENDIF
  vini1 = vfin1
 
END
'**********************************************************************************
PUBLIC SUB sldS1_Change()
  DIM maximo AS Integer
  DIM i AS Integer
 
  spnboxS1.Value = sldS1.Value
    vfin1 = spnboxS1.Value
  tempo = 0
 
  tempo = Abs(vfin1 - vini1)

  IF (vfin1 - vini1) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "AAA"
    ToolButton2.Background = &FF0000&
    ToolButton2.Text = "A"
    WAIT 0.3
    ToolButton2.BackColor = &00FF00&
    ToolButton2.Text = ""
    NEXT
    maximo = 0
    ELSE
      Message.Info("NO  JODAS  A")
    ENDIF
   
  ELSE
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "111"
    ToolButton1.Background = &FF0000&
    ToolButton1.Text = "1"
    WAIT 0.3
    ToolButton1.Background = &00FF00&
    ToolButton1.text = ""
    NEXT
    maximo = 0
    ELSE
    Message.info("NO JODAS 1")
    ENDIF 
  ENDIF
  vini1 = vfin1
 
 
END

PUBLIC SUB cmdBorrar_Click()

  TextArea2.Text = ""

END

PUBLIC SUB cmdColor_Click()

  cmdColor.text = "Rojo"
  FMain.BackColor = &H00FF0000&

END








Lo mas padre de todo esto es que si funciona aunque lento pero funciona pig

maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Lun 7 Sep 2009 - 20:15

Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy Very Happy

Hola a todos!!, bueno aqui estoy dando avances del proyecto que llevamos Twisted Evil , bueno pues he seguido trabajando con GAMBAS con el Puerto serial y con un adaptador USB-RS232, el cual en el post anterior mencione que me funcionaba muy bien!!, bueno, pues les comento que el anterior interfaz tuve que abandonarla ya que no me gusto mucho y se revolvio todo el codigo Sad , sin embargo decidi comenzar casi desde cero con la interfaz, pero basandome en los códigos anteriores que puse al inicio de este hilo y de los ejemplos que he estado haciendo.

Bueno ahora en lugar de un solo panel colocamos un panelStrip que son las solapas o pestañas, para que en cada una de ellas estuviera el control de un servomotor, controlando el ancho del pulso por medio del envio de caracteres ascii, a través de un spinbox y de un slider, pero ahora ya mas separado, con un textArea, donde se puede visualizar la respuesta del micro, unos botones que puse como indicadores LEDs ( bueno simulandolos cyclops ) y pues por el momento un grabado de posicionado home.

Ya medimos los anchos de pulsos con un oscilosocipio y la variacion que tiene es muy aceptable, digamos unos 20us de variacion de ancho de pulso, pero como estos servo, van a unos engranajes un tanto grandes, esta variacion no me perjudica mucho, bueno esta respuesta es empirica aun, luego nos meteremos con los numeritos What a Face

Lo que aun nos falta, es que grabe mas posiciones, que sea mas raṕido, bueno eso por el momento no creo que sea posible debido al
formato de datos que acepta el micro, luego lo reprogramamos, que este mas bonita la GUI, mmmm y bueno las sugerencias que me hagan favor de hacerme. Smile

Una disculpa de antemano si no coloco imagenes, pero aqui esta retringido el servicio de internet y todo lo que es multimedia, no pasa, si alguien me sugiere el uso de TOR y privoxy se lo agradezco, pero realmente no quiero romper las politicas ya que me dejarian sin servicio al localizarme, ademas de que seria facil ya que sus servidores Linux esta bien configgurados.

Las imagenes las colacaré al rato cuando esté en casa. Les coloco de mientras el código

Rolling Eyes Me dice que el post es muy largo!!!

maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Lun 7 Sep 2009 - 20:39

Esta es la Parte de la comunicacion

Código:

' Gambas class file

'Variables Globales

PUBLIC flag1 AS Boolean = FALSE
PUBLIC flag2 AS Boolean = FALSE
PUBLIC fTermine AS Boolean = FALSE  ' bandera para indicar que ya acabo de mover un servo

'Variables para posicionamiento
PUBLIC S1Pos1 AS Integer PUBLIC S2Pos1 AS Integer PUBLIC S3Pos1 AS Integer PUBLIC S4Pos1 AS Integer
PUBLIC S5Pos1 AS Integer
PUBLIC S1Pos2 AS Integer PUBLIC S2Pos2 AS Integer PUBLIC S3Pos2 AS Integer PUBLIC S4Pos2 AS Integer
PUBLIC S5Pos2 AS Integer

'Variables para HOME
PUBLIC s1 AS Integer PUBLIC s2 AS Integer PUBLIC s3 AS Integer PUBLIC s4 AS Integer PUBLIC s5 AS Integer
PUBLIC vini1 AS Integer PUBLIC vfin1 AS Integer PUBLIC vini2 AS Integer PUBLIC vfin2 AS Integer PUBLIC vini3 AS Integer
PUBLIC vfin3 AS Integer PUBLIC vini4 AS Integer PUBLIC vfin4 AS Integer PUBLIC vini5 AS Integer PUBLIC vfin5 AS Integer
PUBLIC tempo AS Integer

PUBLIC SUB Form_Close()
  IF ttyUSB.Status = Net.Active THEN CLOSE ttyUSB
END


'***************************Seccion para la comunicacion del puerto serial
'Esta parte es bastante modificable

PUBLIC SUB Check_Status()
  ChkDSR.Value = ttyUSB.DSR
  ChkDTR.Value = ttyUSB.DTR
  ChkCTS.Value = ttyUSB.CTS
  ChkRTS.Value = ttyUSB.RTS
  ChkDCD.Value = ttyUSB.DCD
  ChkRNG.Value = ttyUSB.RNG
 END

PUBLIC SUB Form_Open()
  cmdVelocidad.Index = cmdVelocidad.Find("115200")  'Lo que sigue no es valido separa las lineas indicadas por ';'
  vini1 = 0; vfin1 = 0; vini2 = 0; vfin2 = 0; vini3 = 0; vfin3 = 0; vini4 = 0; vfin4 = 0; vini5 = 0; vfin5 = 0; sldS1.Value = 250
  sldS2.Value = 250; sldS3.Value = 250; sldS4.Value = 250; sldS5.Value = 250
  END

PUBLIC SUB Button1_Click()
ME.Close
END

PUBLIC SUB cmdAbreCierra_Click()
IF ttyUSB.Status = Net.Active THEN
  CLOSE ttyUSB
  cmdAbreCierra.Text = "Abre"
  ELSE
  'Linea de parametros
  ttyUSB.PortName = txtPortText.Text
  ttyUSB.Speed = cmdVelocidad.Text
  ttyUSB.Parity = cmbParidad.Index
  ttyUSB.DataBits = cmbDataBits.Text
  ttyUSB.FlowControl = cmbControlFlujo.Index
  ttyUSB.StopBits = cmbBitParo.Text
  ttyUSB.Open()
  Check_Status()
  TextArea1.Text = "Puerto Abierto : " & ttyUSB.PortName & " Ajustes : " &
  ttyUSB.Speed & " , " & ttyUSB.Parity & " , " & ttyUSB.DataBits & " , " &
  ttyUSB.StopBits & " , " & Chr(13) & Chr(10)
  cmdAbreCierra.Text = "Cierra"
  ENDIF
END

'Funcion para leer puerto serial RS232
PUBLIC SUB ttyUSB_Read()
  DIM s AS String
  IF TabStrip1.Text = "Configuracion" THEN
  READ #ttyUSB, s, Lof(ttyUSB)
  TextArea1.Text = TextArea1.Text & s
  ELSE IF TabStrip1.Text = "Servo 1" THEN
  READ #ttyUSB, s, Lof(ttyUSB)
  TextArea2.Text = TextArea2.Text & s
  ELSE IF TabStrip1.text = "Servo 2" THEN
  READ #ttyUSB, s, Lof(ttyUSB)
  TextArea3.Text = TextArea3.Text & s
  ELSE IF TabStrip1.Text = "Servo 3" THEN
  READ #ttyUSB, s, Lof(ttyUSB)
  TextArea4.Text = TextArea4.text & s
  ELSE IF TabStrip1.Text = "Servo 4" THEN
  READ #ttyusb, s, Lof(ttyUSB)
  TextArea5.Text = TextArea5.text & s
  ELSE IF TabStrip1.Text = "Servo 5" THEN
  READ #ttyUSB, s, Lof(ttyUSB)
  TextArea6.Text = TextArea6.Text & s
  ENDIF
END

PUBLIC SUB ttyUSB_RNGChange(ival AS Boolean)
  ChkRNG.Value = ival
  END

PUBLIC SUB ttyUSB_DTRChange(ival AS Boolean)
  ChkDTR.Value = ival
  END

PUBLIC SUB ttyUSB_DSRChange(ival AS Boolean)
  ChkDSR.Value = ival
  END

PUBLIC SUB ttyUSB_CTSChange(ival AS Boolean)
  ChkCTS.Value = ival
  END

PUBLIC SUB ttyUSB_DCDChange(ival AS Boolean)
  ChkDCD.Value = ival
  END

PUBLIC SUB ttyUSB_RTSChange(ival AS Boolean)
  ChkRTS.Value = ival
  END

PUBLIC SUB ChkDTR_Click()
ttyUSB.DTR = ChkDTR.Value
  Check_Status
END

PUBLIC SUB ChkRTS_Click()
ttyUSB.RTS = ChkRTS.Value
  Check_Status
END

PUBLIC SUB cmbControlFlujo_Click()
  ttyUSB.FlowControl = cmbControlFlujo.Index
  END

maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Lun 7 Sep 2009 - 20:41

Esta parte es la que envia los datos a los seis servos upps, ¿de cuál fumé? si son solo 5 Laughing

Código:

'************************************************************************************************
PUBLIC SUB cmdAtras_Click()
IF ttyUSB.Status = Net.Inactive THEN
    Message("Primero abre el Puerto")
  ELSE
    PRINT #ttyUSB, "a"
    ToolButton2.Background = &FF0000&
    ToolButton2.Text = "A"
    WAIT 0.3  'Este retardo es para el parpadeo, entre colores, pero no tiene mucho caso
    ToolButton2.BackColor = &00FF00&
    ToolButton2.Text = ""
  ENDIF
END

PUBLIC SUB cmdAdelante_Click()
IF ttyUSB.Status = Net.Inactive THEN
    Message("Primero abre el puerto")
  ELSE
    PRINT #ttyUSB, "11"
    ToolButton1.Background = &FF0000&
    ToolButton1.Text = "1"
    WAIT 0.3
    ToolButton1.Background = &00FF00&
    ToolButton1.text = ""
  ENDIF
END
'**************************************************************************
'Control del primer servo
'Para el envio de datos, fue probada la tarjeta con varios valores
'en el tiempo medido por osciloscopio, cuando la tarjeta es reiniciada
'con escala de 0.5ms por division, el tiempo en alto esta establecido a 1500ms
'tomado este valor como referencia, el slider y el spinbox, tienen el valor de
'250 de forma inicial, ya fueron medidos los tiempos de forma repetida, para
'verificar la presición del numero de datos enviados a la tarjeta.
PUBLIC SUB spnboxS1_Change()
  DIM maximo AS Integer
  DIM i AS Integer
  sldS1.Value = spnboxS1.Value
  vfin1 = spnboxS1.Value
  tempo = 0
  tempo = Abs(vfin1 - vini1)
  'TextArea2.Text = "Vini1=" & vini1 & " Vfin1= " & vfin1 & " ciclo= " & tempo
  'wait 1
IF (vfin1 - vini1) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "AAA"
    ToolButton2.Background = &FF0000&
    ToolButton2.Text = "A"
    WAIT 0.1  'Este retardo es importante, ya que la tarjeta no responde muy rápido
    ToolButton2.BackColor = &00FF00&
    ToolButton2.Text = ""
    NEXT
    maximo = 0
    ELSE
      ENDIF
    ELSE
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "111"
    ToolButton1.Background = &FF0000&
    ToolButton1.Text = "1"
    WAIT 0.1
    ToolButton1.Background = &00FF00&
    ToolButton1.text = ""
    NEXT
    maximo = 0
    ELSE
    ENDIF 
  ENDIF
  vini1 = vfin1
  tempo = 0
  fTermine = TRUE
END
'**********************************************************************************
PUBLIC SUB sldS1_Change()
  DIM maximo AS Integer
  DIM i AS Integer
  spnboxS1.Value = sldS1.Value
    vfin1 = spnboxS1.Value
  tempo = 0
  tempo = Abs(vfin1 - vini1)
  'TextArea2.Text = "Vini1=" & vini1 & " Vfin1= " & vfin1 & " ciclo= " & tempo
  'WAIT 1
  IF (vfin1 - vini1) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "A"
    ToolButton2.Background = &FF0000&
    ToolButton2.Text = "A"
    WAIT 0.1
    ToolButton2.BackColor = &00FF00&
    ToolButton2.Text = ""
    NEXT
    maximo = 0
    ELSE
      ENDIF
    ELSE
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "1"
    ToolButton1.Background = &FF0000&
    ToolButton1.Text = "1"
    WAIT 0.1
    ToolButton1.Background = &00FF00&
    ToolButton1.text = ""
    NEXT
    maximo = 0
    ELSE
    ENDIF 
  ENDIF
  vini1 = vfin1
  tempo = 0
  fTermine = TRUE
END
'***********************************************************************************
'Control del segundo servo
PUBLIC SUB spnboxS2_Change()
  DIM maximo AS Integer
  DIM i AS Integer
  sldS2.Value = spnboxS2.Value
  vfin2 = spnboxS2.Value
  tempo = 0
  tempo = Abs(vfin2 - vini2)
'Usese solo en caso de que olvide el cable de comicacion como a mi me paso :(
'TextArea3.Text = "Vini2=" & vini2 & " Vfin2= " & vfin2 & " ciclo= " & tempo
 ' WAIT 1
IF (vfin2 - vini2) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "B"
    ToolButton3.Background = &FF0000&
    ToolButton3.Text = "B"
    WAIT 0.1  'Este retardo es importante, ya que la tarjeta no responde muy rápido
    ToolButton4.BackColor = &00FF00&
    ToolButton4.Text = ""
    NEXT
    maximo = 0
    ELSE
      ENDIF
    ELSE
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "2"
    ToolButton1.Background = &FF0000&
    ToolButton1.Text = "2"
    WAIT 0.1
    ToolButton1.Background = &00FF00&
    ToolButton1.text = ""
    NEXT
    maximo = 0
    ELSE
    ENDIF 
  ENDIF
  vini2 = vfin2
  tempo = 0
END
'**********************************************************************************
PUBLIC SUB sldS2_Change()
  DIM maximo AS Integer
  DIM i AS Integer
  spnboxS2.Value = sldS2.Value
    vfin2 = spnboxS2.Value
  tempo = 0
  tempo = Abs(vfin2 - vini2)
IF (vfin2 - vini2) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "B"
    ToolButton2.Background = &FF0000&
    ToolButton2.Text = "B"
    WAIT 0.1
    ToolButton2.BackColor = &00FF00&
    ToolButton2.Text = ""
    NEXT
    maximo = 0
    ELSE
      ENDIF
    ELSE
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
    FOR i = 1 TO maximo
    PRINT #ttyUSB, "1"
    ToolButton2.Background = &FF0000&
    ToolButton2.Text = "1"
    WAIT 0.1
    ToolButton2.Background = &00FF00&
    ToolButton2.text = ""
    NEXT
    maximo = 0
    ELSE
    ENDIF 
  ENDIF
  vini2 = vfin2
  tempo = 0
  fTermine = TRUE
END
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'Control del tercer servo
PUBLIC SUB spnboxS3_Change()
  DIM maximo AS Integer
  DIM i AS Integer
  sldS3.value = spnboxS3.Value
  vfin3 = spnboxS3.Value
  tempo = 0
  tempo = Abs(vfin3 - vini3)
  IF (vfin3 - vini3) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
      FOR i = 1 TO maximo
      PRINT #ttyUSB, "C"
      ToolButton5.BackColor = &FF0000&
      ToolButton5.Text = "C"
      WAIT 0.1
      ToolButton5.BackColor = &00FF00&
      ToolButton5.Text = ""
      NEXT
      maximo = 0
      ELSE
      END IF
    ELSE
      IF ttyUSB.Status = Net.Active THEN
      maximo = tempo
        FOR i = 1 TO maximo 
        PRINT #ttyUSB, "3"
        ToolButton6.BackColor = &FF0000&
        ToolButton6.Text = "3"
        WAIT 0.1
        ToolButton6.BackColor = &00FF00&
        ToolButton6.Text = ""
        NEXT
        maximo = 0
      ENDIF
  END IF 
  vini3 = vfin3
  tempo = 0
  fTermine = TRUE
END

PUBLIC SUB sldS3_Change()
DIM maximo AS Integer
  DIM i AS Integer
  spnboxS3.value = sldS3.Value
  vfin3 = sldS3.Value
  tempo = 0
  tempo = Abs(vfin3 - vini3)
  IF (vfin3 - vini3) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
      FOR i = 1 TO maximo
      PRINT #ttyUSB, "C"
      ToolButton5.BackColor = &FF0000&
      ToolButton5.Text = "C"
      WAIT 0.1
      ToolButton5.BackColor = &00FF00&
      ToolButton5.Text = ""
      NEXT
      maximo = 0
      ELSE
      END IF
    ELSE
      IF ttyUSB.Status = Net.Active THEN
      maximo = tempo
        FOR i = 1 TO maximo 
        PRINT #ttyUSB, "3"
        ToolButton6.BackColor = &FF0000&
        ToolButton6.Text = "3"
        WAIT 0.1
        ToolButton6.BackColor = &00FF00&
        ToolButton6.Text = ""
        NEXT
        maximo = 0
      ENDIF
  END IF 
  vini3 = vfin3
  tempo = 0
  fTermine = TRUE
  END
'***********************************************************************************************************
'Control del 4to servo
PUBLIC SUB spnboxS4_Change()
  DIM maximo AS Integer
  DIM i AS Integer
  sldS4.value = spnboxS4.Value
  vfin4 = spnboxS4.Value
  tempo = 0
  tempo = Abs(vfin4 - vini4)
  IF (vfin4 - vini4) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
      FOR i = 1 TO maximo
      PRINT #ttyUSB, "D"
      ToolButton7.BackColor = &FF0000&
      ToolButton7.Text = "D"
      WAIT 0.1
      ToolButton7.BackColor = &00FF00&
      ToolButton7.Text = ""
      NEXT
      maximo = 0
      ELSE
      END IF
    ELSE
      IF ttyUSB.Status = Net.Active THEN
      maximo = tempo
        FOR i = 1 TO maximo 
        PRINT #ttyUSB, "4"
        ToolButton8.BackColor = &FF0000&
        ToolButton8.Text = "4"
        WAIT 0.1
        ToolButton8.BackColor = &00FF00&
        ToolButton8.Text = ""
        NEXT
        maximo = 0
      ENDIF
  END IF 
  vini4 = vfin4
  tempo = 0
  fTermine = TRUE
END

PUBLIC SUB sldS4_Change()
DIM maximo AS Integer
  DIM i AS Integer
  spnboxS4.value = sldS4.Value
  vfin4 = sldS4.Value
  tempo = 0
  tempo = Abs(vfin4 - vini4)
 IF (vfin4 - vini4) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
      FOR i = 1 TO maximo
      PRINT #ttyUSB, "D"
      ToolButton7.BackColor = &FF0000&
      ToolButton7.Text = "D"
      WAIT 0.1
      ToolButton7.BackColor = &00FF00&
      ToolButton7.Text = ""
      NEXT
      maximo = 0
      ELSE
      END IF
    ELSE
      IF ttyUSB.Status = Net.Active THEN
      maximo = tempo
        FOR i = 1 TO maximo 
        PRINT #ttyUSB, "4"
        ToolButton8.BackColor = &FF0000&
        ToolButton8.Text = "4"
        WAIT 0.1
        ToolButton8.BackColor = &00FF00&
        ToolButton8.Text = ""
        NEXT
        maximo = 0
      ENDIF
  END IF 
  vini4 = vfin4
  tempo = 0
  fTermine = TRUE
END
'***********************************************************************************************************
'control Servo 5
PUBLIC SUB spnboxS5_Change()
  DIM maximo AS Integer
  DIM i AS Integer
  sldS5.value = spnboxS5.Value
  vfin5 = spnboxS5.Value
  tempo = 0
  tempo = Abs(vfin5 - vini5)
  IF (vfin5 - vini5) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
      FOR i = 1 TO maximo
      PRINT #ttyUSB, "E"
      ToolButton9.BackColor = &FF0000&
      ToolButton9.Text = "E"
      WAIT 0.1
      ToolButton9.BackColor = &00FF00&
      ToolButton9.Text = ""
      NEXT
      maximo = 0
      ELSE
      END IF
    ELSE
      IF ttyUSB.Status = Net.Active THEN
      maximo = tempo
        FOR i = 1 TO maximo 
        PRINT #ttyUSB, "5"
        ToolButton10.BackColor = &FF0000&
        ToolButton10.Text = "5"
        WAIT 0.1
        ToolButton10.BackColor = &00FF00&
        ToolButton10.Text = ""
        NEXT
        maximo = 0
      ENDIF
  END IF 
  vini5 = vfin5
  tempo = 0
  fTermine = TRUE
END

PUBLIC SUB sldS5_Change()
DIM maximo AS Integer
  DIM i AS Integer
  spnboxS5.value = sldS5.Value
  vfin5 = sldS5.Value
  tempo = 0
  tempo = Abs(vfin5 - vini5)
  IF (vfin5 - vini5) < 0 THEN
    IF ttyUSB.Status = Net.Active THEN
    maximo = tempo
      FOR i = 1 TO maximo
      PRINT #ttyUSB, "E"
      ToolButton9.BackColor = &FF0000&
      ToolButton9.Text = "E"
      WAIT 0.1
      ToolButton9.BackColor = &00FF00&
      ToolButton9.Text = ""
      NEXT
      maximo = 0
      ELSE
      END IF
    ELSE
      IF ttyUSB.Status = Net.Active THEN
      maximo = tempo
        FOR i = 1 TO maximo 
        PRINT #ttyUSB, "5"
        ToolButton10.BackColor = &FF0000&
        ToolButton10.Text = "5"
        WAIT 0.1
        ToolButton10.BackColor = &00FF00&
        ToolButton10.Text = ""
        NEXT
        maximo = 0
      ENDIF
  END IF 
  vini5 = vfin5
  tempo = 0
  fTermine = TRUE
  END
'***********************************************************************************************************


Última edición por maigke el Lun 7 Sep 2009 - 20:45, editado 1 vez

maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Lun 7 Sep 2009 - 20:45

La última parte del código borra los textareas y manda a posicionar al servo, aqui hay una parte importante con un ciclo while - wend, y tiene mucho que ver la bandera que puse en cada seccion de movimiento de servos, ya que sin esta bandera no se saldría de dicho ciclo. Very Happy

Código:

'Area de borrados de textAreas, cada text area solo contendra la info necesaria para su propio servo
PUBLIC SUB cmdBorrar_Click()
TextArea2.Text = ""
END

PUBLIC SUB Button2_Click()
TextArea3.Text = ""
END

PUBLIC SUB Button3_Click()
TextArea4.Text = ""
  END

PUBLIC SUB Button4_Click()
TextArea5.Text = ""
END

PUBLIC SUB Button5_Click()
TextArea6.Text = ""
END

'Rutina de grabar las posiciones de los servos

PUBLIC SUB cmdGrabar_Click()
IF flag1 = FALSE AND flag2 = FALSE THEN
    cmdGrabar.Text = "Grabar"
    S1Pos1 = spnboxS1.Value
    S2Pos1 = spnboxS2.Value
    S3Pos1 = spnboxS3.Value
    S4Pos1 = spnboxS4.Value
    S5Pos1 = spnboxS5.Value
    flag1 = TRUE
ELSE IF flag1 = TRUE AND flag2 = FALSE THEN
S1Pos2 = spnboxS1.Value
    S2Pos2 = spnboxS2.Value
    S3Pos2 = spnboxS3.Value
    S4Pos2 = spnboxS4.Value
    S5Pos2 = spnboxS5.Value
    flag2 = TRUE
ELSE
    Message.Error("Solo dos posiciones")
    cmdGrabar.Text = "Borra"
    S1Pos1 = 0
    S1Pos2 = 0
    S2Pos1 = 0
    S2Pos2 = 0
    S3Pos1 = 0
    S3Pos2 = 0
    S4Pos1 = 0
    S4Pos2 = 0
    S5Pos1 = 0
    S5Pos2 = 0
    flag1 = FALSE
    flag2 = FALSE
    END IF
END

PUBLIC SUB cmdHome_Click()
s1 = spnboxS1.Value
  s2 = spnboxS2.Value
  s3 = spnboxS3.Value
  s4 = spnboxS4.Value
  s5 = spnboxS5.Value
TextArea1.text = "Home ha sido selecionado con las siguientes
posiciones " & s1 & " " & s2 & " " & s3 & " "
& s4 & " " & s5
  'TabStrip1.Action =
END

PUBLIC SUB ToolButton11_Click()
'Ir a home
  'Colocamos una bandera que se llama fTermine que nos indica si un ciclo de envio de datos ya termino
  ' ahora preguntamos si los valores del spinbox y del valor dado como home son iguales
  ' esto pasa si un eje no lo mueves desde un inicio, en caso de ser cierto, pues entonces
  ' no hace nada, ya que si no se pone el if por alguna razon entra en un bucle infinito
  ' si los valores actuales del spinbox y de la pos de home no son iguales,
  ' mandamos a modificar ahora el valor del spinbox, enviando los correspondientes
  ' a través del puerto serial
  fTermine = FALSE             
  IF (spnboxS1.Value <> s1) THEN
  spnboxS1.Value = s1
  WHILE fTermine = FALSE
  WEND
  END IF
  fTermine = FALSE
  IF (spnboxS2.Value <> s2) THEN
  spnboxS2.Value = s2
  WHILE fTermine = FALSE
  WEND
  END IF
  fTermine = FALSE
  IF (spnboxS3.Value <> s3) THEN
  spnboxS3.Value = s3
  WHILE fTermine = FALSE
  WEND
  END IF
  fTermine = FALSE
  IF (spnboxS4.Value <> s4) THEN
  spnboxS4.Value = s4
  WHILE fTermine = FALSE
  WEND
  END IF
  fTermine = FALSE
  IF (spnboxS5.Value <> s5) THEN
  spnboxS5.Value = s5
  WHILE fTermine = FALSE
  WEND
  END IF
  'Ir a la posicion 1
  'Ir a la posicion 2
  'Regresar a home
  END

maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Sáb 12 Sep 2009 - 6:10

Ya casi esta listo!, bueno, ya dandole toques finales para que sea funcional mi prueba con Gambas, después de unos meses de estar trabajando con esto, pues la verdad ha sido bien satisfactorio, el ver que ya esta mas vivo el programa.

El código, se ha quedado como se muestra, solo que hemos hecho un pequeño trucaje al servo que mostre en fotos anteriores, puesto que se transporto el potenciometro del servo que lleva interno, a una parte externa, de estar forma se hizo, debido a que el mecanismo de gusano sinfin + corona, exigia dos cosas:

  • El servo pudiera dar vueltas completas y varías, debido a la relacion que hay entre los engranajes
  • El posicionamiento del eje deberia ser exacto, con respecto a la horizontal que forma con la base.
Esto se puede ver claramente en la siguiente imagen

Lamentablemente, la corona que va con el gusano sin fin, al estar hecha de aluminio, y soportar una gran fuerza, pues, los dientes sufrieron los estragos, desgastandose, me comenta, Ruben, que sería mejor que dichos engranes fueran hechos de bronce, espero que consigamos una pieza pronto

El codigo fuente, hasta el momento, es el que presente en post anteriores, y el programa lo deje trabajando un buen de horas solo conectado con la tarjeta de control de servomotores y funciona de forma muy adecuada, detalles aun hay muchos, sin embargo, prodria decir, ¡Ya casí esta listo!


Falta el video donde se ve como se mueve el servo con el slider del GUI desarrollado, en este momento esta de subida.

maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  maigke el Sáb 12 Sep 2009 - 16:49

Bueno ya es de día!! y por fin ha subido el video donde se muestra como podemos controlar el servomotor con Gambas usando el Puerto Serial, bueno por el momento solo es un servo, pero mas adelante colocaremos mas servos para mover un mecanismo. y bueno creo que con esto doy terminado el hilo, y en la parte de proyectos continuaré con las siguientes partes y por menores.



Aqui coloco los fuentes para instalar, solo recuerda que debes tener el runtime de Gambas 2 en tu caja Linux y la version que trabajo es 2.8 de Gambas



Download testSerial_Paquetes.tar.bz2 from FileFactory.com
El hosting tiene ads y cosillas de esas, pero como usamos linux, pues no nos preocupemos
saludos!!!

maigke
Participante Activo
Participante Activo

Cantidad de envíos: 49
Fecha de inscripción: 12/04/2009
Edad: 32
Localización: Mexico

Volver arriba Ir abajo

Re: GAMBAS Almenos es basic- Puerto Serie - PIC16F628A

Mensaje  Pikitin el Lun 14 Sep 2009 - 12:54

Buenísimo el proyecto.

Con tu permiso he puesto las fuentes en una nueva carpeta para cosas en gambas en la sección descargas.
Y ya nos contarás como evoluciona el tema...

Saludos.

Pikitin
veterano
veterano

Cantidad de envíos: 329
Fecha de inscripción: 26/11/2008

Volver arriba Ir abajo

Página 2 de 3. Precedente  1, 2, 3  Siguiente

Ver el tema anterior Ver el tema siguiente Volver arriba


Permiso de este foro:
No puedes responder a temas en este foro.