TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: fco1306 en 14 de Marzo de 2011, 18:27:45
-
Soy aficionado al modelismo ferroviario,utilizo servos para mover los desvíos. En el siguiente enlace aparece el uso de un servo que detecta el final del recorrido que debe hacer. Se mueve hacia un lado ,cuando ya no puede moverse ,se para y se mueve hacia el otro lado.Quedan grabadas las posiciones a derecha e izquierda para volver a hacer el movimiento.
http://www.tamvalleydepot.com/products/octopusservodriver.html
¿Cómo se podría hacer? ¿en qué lenguaje? He estado buscando información por la red y no he encontrado nada. ¿se os ocurre algo?
Un saludo
-
Buscando por la red ,parece que se podría hacer midiendo el consumo del servo mediante el adc del pic. Cuando llega a un punto que no puede moverse aumenta el consumo. Lo que no he encontrado todavía es como se puede utilizar el adc para medir no sé, si sería voltaje o intensidad ¿sabéis de alguna página que hable de cómo utilizar el pic para medir voltaje o intensidad?
-
No es necesario, la mayoria de los servomotores no tienen giro continuo, basta con decirle a que posición se tiene que colocar dentro de los 180º de su recorrido, y cuando llega a la posición deseada se para.
Tienes mucha información en el foro para poder realizar el proyecto, de todas formas en este enlace puede que te sea más fácil comprenderlo.
http://www.pickey.es/uso_practico_del_pic12f675_iv.html
-
Ya, pero se trata de lo contrario. ¿Es posible conocer la posición en la que está un servo sin mandarle antes un pulso de control para que vaya a esa posición?
-
pues claro que es posible conocer la posicion del Servo, por eso nuestros amigo Dogflu te ha puesto un enlace, y para que te entere es mejor que lea sobre programacion, en la Web hay un monton de Info, es solo saber buscar con la palabra Tecnica, cuando programa un servo siempre tiene que calcular todos los parametro, como cualquier otro motor.
por eso te aconsejo que lea sobre los Servos y aqui en el Foro hay muchas informacion.
Saludos
-
Ya, pero se trata de lo contrario. ¿Es posible conocer la posición en la que está un servo sin mandarle antes un pulso de control para que vaya a esa posición?
La posición del servo tiene que ser la ultima que se le indicó, no veo la necesidad de saberla. ¿Por qué la necesitas?.
-
Creo que el compañero fco1306 se refiere a como saber cuando el servo ha hecho tope, tanto a un lado como al otro, mientras este se esta girando. ¿Me equivoco?
Un saludo!
-
Sí así es .Si veis el vídeo que pone octopus II no necesitan saber ni la pocion inicial ni las finales. La electrónica o programación las determinan.
Lo que hacemos para mover los desvíos con servos es ,primero ,sin poner el servo en su sitio, mandar un pulso con la posición central. A continuación ponemos el servo en el desvío elegido y determinados el ángulo que se necesita mover a la derecha e izquierda. Este ángulo se puede conseguir de varias maneras, grabado en el programa, mediante pulsadores ,mediantes potenciómetros conectados al adc, etc. El octopusII determina automáticamente este valor. Si ellos lo han conseguido, de alguna manera se podrá hacer.
Un saludo
-
pues claro que te hemos comprendido, lo que sucede que tu no nos comprende, te decimos que el pic o micro esta programado que reconoce cual su fin y cual es su final, y como se ve el video se puede ajustar el tope fino, si te lee tutorial sobre Servo aprendera mas cosas :P
Saludos
-
Voy a hacer una prueba en una entrenadora a ver como queda.
-
Antes de preguntar he mirado bastante en otros sitios. Gracias a dogflu66, hice un pequeño programa con un 12f629 que mueve un servo ,desde una posición central, a un lado y a otro y se puede ajustar el recorrido con un par de pulsadores y guarda la posición para cuando se desconecta la alimentación.
Cuando mando el valor de un pulso al servo se mueve hasta esa posición, pero ¿si no puede llegar porque hay algo que se lo impide? ¿cómo se puede saber en que valor se ha detenido?, es lo que no veo cómo se puede hacer.
-
Ahora comprendo; los servos analógicos o de posición no indican la posición que tienen, todo se hace por estimación, se supone que un servo no debería tener nada por medio. De todas formas se puede saber cuando un servo quedo bloqueado mediante la monitorización de su consumo, si el consumo sobrepasa un valor determinado se considera bloqueado, en teoría esto se podría realizar intercalando una resistencia de bajo valor en serie con la alimentación y además utilizar un pic con modulo ADC para leer la caída de tensión en ella. Otra opción podría ser colocar un encoder en el servo que nos suministra pulsos mientras su mecanismo esta girando.
-
No lo he probado nunca, pero quizás se podría abrir el servo y tomar una lectura de su potenciómetro interno con el ADC del PIC para saber dónde está situado.
-
Bueno, menos mal que al final me hice entender.
Según me han comentado el octopus determina cuando debe pararse. Cuando pega contra una vía y no puede seguir moviéndose, se para y gira hacia el otro lado. Al servo no le hay que añadirle nada. Sólo enchufar y listo. Por lo poco que he encontrado en la red parece que se consigue midiendo el consumo. Encontré una página de modelismo que hablaban de poner 4 resistencias de 1 omnio 1/4 w en paralelo para obtener 1 de 0.25 y 1w. Decían que había que conectar una entrada al adc y la otra a vref pero no aparecía ni esquema ni nada más. ¿Sabéis de algún sitio a donde pueda dirigirme?.
Un saludo
-
En realidad no necesitas buscar mucho, solo tienes que establecer dos niveles de corriente, una cuando el servomotor esta trabajando normalmente y la otra cuando hace tope. Esto puedes medirlo con un amperímetro. Una vez que tienes estos dos valores solo tienes que aplicar la ley de Ohm.
Ejemplo:
1º) para un consumo de 250mAh, tendrás en el extremo de la resistencia V= 0.250*0.25=62.5mV
2º) para servo parado >500mAh, “ V= 0.5*0.25=125mV
Paso seguido tomamos el camino más simple y calculamos la resolución del ADC suponiendo que Vref = 5v. Y utilizaremos la máxima resolución del módulo, 10bit:
RD= 5000mV/1024puntos adc=4.8mV, por lo que el rango dinámico de trabajo del adc permite trabajar para las lecturas anteriores, porque la resolución mínima del adc es de 4.8mV que es mucho menor que la menor de las lecturas necesarias 62.5mV.
La conexión es simple, negativo del servo a extremo de la resistencia y el otro extremo de la resistencia a masa del circuito. Lo que es un poco más complejo es la conexión de la entrada del pic, hay que poner un condensador de 10nF entre la entrada del pic y masa y, otro en paralelo de unos 3.3uF de tántalo, luego todo esto va conectado al negativo del servo a través de una resistencia de unos 2k2.
La lectura del articulo de este enlace puede que te ayude algo más a comprender lo anterior expuesto:
http://www.pickey.es/uso_practico_del_pic12f675_v.html
-
No lo he probado nunca, pero quizás se podría abrir el servo y tomar una lectura de su potenciómetro interno con el ADC del PIC para saber dónde está situado.
Lo que expone Manolo es interesante, pero hay que tocar el servo internamente.
-
Claro, es que no es lo mismo "saber dónde está el servo en cada momento" que "saber si ha chocado".
Para lo último bastará con medir el consumo.
Para lo primero hay que buscar retroalimentación de algún tipo, un encoder, un potenciómetro, ...
-
Muchas gracias a todos.
Intentaré hacer algo, a ver que sale.
-
Con un servo digital si podrías saber donde se encuentra dentro de la trayectoria , tambien te manda el consumo , etc...Ya que se puede establecer una comunicación bidirecional.
Son mucho más caros pero están buenos para experimentar.
-
De los que tengo son de este tipo
http://cgi.ebay.es/4-X-Micro-9g-Mini-Servo-Futaba-Hitec-HS-55-GWS-walkera-/170609638590?pt=Radio_Control_Parts_Accessories&hash=item27b9207cbe
Aparte del potenciómetro traen un micro. No sé si serán digitales. Por el precio supongo que nó. ¿Cómo se puede saber si son digitales o nó? ya que he encontrado otros del mismo tipo que pone que son digitales, más o menos al mismo precio.
¿Cómo se puede hacer lo que dices? Porque como puedes ver , me habían dejado claro que no era posible.
Un saludo
-
De los que tengo son de este tipo
http://cgi.ebay.es/4-X-Micro-9g-Mini-Servo-Futaba-Hitec-HS-55-GWS-walkera-/170609638590?pt=Radio_Control_Parts_Accessories&hash=item27b9207cbe
Aparte del potenciómetro traen un micro. No sé si serán digitales. Por el precio supongo que nó. ¿Cómo se puede saber si son digitales o nó? ya que he encontrado otros del mismo tipo que pone que son digitales, más o menos al mismo precio.
¿Cómo se puede hacer lo que dices? Porque como puedes ver , me habían dejado claro que no era posible.
Un saludo
Un tema son servos analógicos o de RC y otro tema totalmente distinto es hablar de servos digitales. Si hablamos de servos digitales todo lo expuesto no sirve para nada ya que su funcionamiento es distinto.
-
Pensé que igual daba analógico o digital ya que en lo que he mirado de programación no he encontrado nada del control de servos digitales. Supongo que el que aparece en el vídeo de octopus es analógico y los que tengo también.Buscaré algo de información sobre servos digitales.
-
dogflu66 ¿es así como dices de conectar el micro al servo?
Supongo que no será así.
Un saludo
-
Si, eso es.
-
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : Miguel Noe Garcia Perez *
'* Notice : Copyright (c) 2010 Iberica 2000 *
'* : All Rights Reserved *
'* Date : 03/09/2010 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
' Control a servo motor attached to pin 3 of PORTA
DEVICE 16f876 ' We'll use the new PICmicro
Device = 16F876
XTAL = 4
LCD_TYPE = 0
LCD_LINES = 4
LCD_DTPIN = PORTB.4
LCD_RSPIN = PORTB.3
LCD_ENPIN = PORTB.2
LCD_INTERFACE = 4
DIM Grados as dWORD ' Servo Position
Dim Punto as word
DIM Pos as WORD ' Servo Position
Dim i as word
dim Velocidad as word
SYMBOL Pin = PORTA.5 ' Alias the servo pin
ALL_DIGITAL = ON ' PORTA to digital
CLS ' Clear the LCD
Pos = 400 ' Centre the servo
PORTA = 0 ' PORTA lines low to read buttons
TRISA = %00000111 ' Enable the button pins as inputs
for i = 0 to 15
pos = 400
SERVO Pin , Pos
delayms 5
next
'Check any button pressed to move servo
Main:
PRINT AT 1 , 1 , "Position=" , Dec Pos , " "
DelayMS 500
'for i = 10 to 0 step -1
' print at 2,2,"Tiempo: ", dec2 i
' delayms 1000
' next
' IF PORTA.0 = 0 AND Pos < 3000 Then pos = pos +2 'inc Pos ' Move servo left
' IF PORTA.1 = 0 Then Pos = 1500 ' Centre servo
' IF PORTA.2 = 0 AND Pos > 0 Then pos = pos -2 ' dec Pos ' Move servo right
' Regulacion servo futaba S 3001
Velocidad =1
i=400
grados = 0
inicio:
punto = 1
'for velocidad = 10 to 30
for pos = 400 to 2430 step 10
Servo pin, pos
Delayms 5
Grados = punto/11
gosub pinta
punto = punto +1
'inc velocidad
'DelayMS 500
next
'next
'for velocidad = 1 to 30
for pos = 2430 to 400 step -10
Servo pin, pos
Delayms 5
Grados = punto/11
gosub pinta2
punto = punto -1
'dec velocidad
'DelayMS 500
next
'next
goto inicio
'if pos <= 400 then pos = 2430:Gosub Baja
'if pos >= 2430 then pos = 400:gosub Sube
'delayms 500
GOTO Main
Sube:
DELAYMS 5 ' Servo update rate
PRINT AT 1 , 1 , "Position=" , Dec Pos , " "
pos = pos +1
SERVO Pin , Pos
return
Baja:
DELAYMS 5 ' Servo update rate
PRINT AT 1 , 1 , "Position=" , Dec Pos , " "
pos = pos -1
SERVO Pin , Pos
return
Pinta:
PRINT AT 1 , 1 ,"Posicion: " , Dec4 Pos , " "
print at 2 , 1 ,"Grados: ", Dec3 Grados,223
return
Pinta2:
PRINT AT 1 , 1 ,"Posicion: " , Dec4 Pos , "2for"
print at 2 , 1 ,"Grados: ", Dec3 Grados,223
return