Página 2 de 2

Re: compra de la placa arduino duemilanove

Publicado: 03 Ene 2011, 10:53
por Adolfito121
Muchísimas gracias por la aportación!!!
El caso es que no sé como mover un servomotor 90 grados.

Pensaa que sería algo tan simple com decire pin 3 escribir 90 pero creo que falta esta función:
attach(int)
Turn a pin into a servo driver. Calls pinMode. Returns 0 on failure.
(sacado de arduino.cc).

Es muy complicado portarla a autoit?

Saludos

Re: compra de la placa arduino duemilanove

Publicado: 04 Ene 2011, 18:41
por xapu
Adolfito121 escribió:Muchísimas gracias por la aportación!!!
El caso es que no sé como mover un servomotor 90 grados.

Pensaa que sería algo tan simple com decire pin 3 escribir 90 pero creo que falta esta función:
attach(int)
Turn a pin into a servo driver. Calls pinMode. Returns 0 on failure.
(sacado de arduino.cc).

Es muy complicado portarla a autoit?

Saludos
Adolfito121 escribió:Muchísimas gracias por la aportación!!!
El caso es que no sé como mover un servomotor 90 grados.

Pensaa que sería algo tan simple com decire pin 3 escribir 90 pero creo que falta esta función:
attach(int)
Turn a pin into a servo driver. Calls pinMode. Returns 0 on failure.
(sacado de arduino.cc).

Es muy complicado portarla a autoit?

Saludos
humm...
esque yo no soy muy entendido en este tema.. por eso cree estas funciones en autoit..
pero los servos no podian moverse simplemente con un analogwrite?
si no quizas se podria implementar esta funcion.
prueba y me dices.
x cierto.. que tal te van las demas funciones?

Re: compra de la placa arduino duemilanove

Publicado: 05 Ene 2011, 08:08
por Adolfito121
Gracias por responder.

El caso en que para lo que quiero la placa sólo compré servos y la Arduino Uno

Así que no he podido probar el tema de los leds :(

he probado con tus archivos au3 y la dll a modificar el arduinotest.au3 que habías colgado:

Código: Seleccionar todo

#include <libreriav2.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("PRUEBAS ARDUINO", 240, 165, -1, -1)
$Button2 = GUICtrlCreateButton("90", 20, 25, 200, 50, $WS_GROUP)
$Button3 = GUICtrlCreateButton("0", 20, 85, 200, 50, $WS_GROUP)
GUISetState(@SW_SHOW)
conecta(4,'9600')
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $button2
			digitalwrite(3,"90")
		Case $button3
			digitalwrite(3,"0")
	EndSwitch
WEnd
pero nada. En todos los tutoriales ue he leído los servos tienen un pin que ha de ir conectado a una entrada digital PWM (yo en este caso uso la 3) y la placa a tengo en el puerto COM4, pero no hay manera de que me haga caso
(me imagino que si no se hace el paso...

Código: Seleccionar todo

attach(int)
Turn a pin into a servo driver. Calls pinMode. Returns 0 on failure. 
...la placa no sabe que ese pin debe pilar valores de 0 a 180 (ni idea, soy MUY novato).

Alguna idea? Saludos

Re: compra de la placa arduino duemilanove

Publicado: 06 Ene 2011, 22:29
por xapu
Adolfito121 escribió:Gracias por responder.

El caso en que para lo que quiero la placa sólo compré servos y la Arduino Uno

Así que no he podido probar el tema de los leds :(

he probado con tus archivos au3 y la dll a modificar el arduinotest.au3 que habías colgado:

Código: Seleccionar todo

#include <libreriav2.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("PRUEBAS ARDUINO", 240, 165, -1, -1)
$Button2 = GUICtrlCreateButton("90", 20, 25, 200, 50, $WS_GROUP)
$Button3 = GUICtrlCreateButton("0", 20, 85, 200, 50, $WS_GROUP)
GUISetState(@SW_SHOW)
conecta(4,'9600')
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $button2
			digitalwrite(3,"90")
		Case $button3
			digitalwrite(3,"0")
	EndSwitch
WEnd
pero nada. En todos los tutoriales ue he leído los servos tienen un pin que ha de ir conectado a una entrada digital PWM (yo en este caso uso la 3) y la placa a tengo en el puerto COM4, pero no hay manera de que me haga caso
(me imagino que si no se hace el paso...

Código: Seleccionar todo

attach(int)
Turn a pin into a servo driver. Calls pinMode. Returns 0 on failure. 
...la placa no sabe que ese pin debe pilar valores de 0 a 180 (ni idea, soy MUY novato).

Alguna idea? Saludos
prueba a en vez de hacer digitalwrite() analogwrite() a el pin pwm.
con digitalwrite() o mandas 5V o mandas 0V. por lo que solo tiene dos posiciones el servo. que no se mueva, y vuelta completa.
si lo haces con analogwrite() puedes mandarle una señal intermedia. 5V tendrias que mandarle 255 y para 0V 0 por lo que tienes que hacer la equivalencia para saver que tendrias que mandarle.

Re: compra de la placa arduino duemilanove

Publicado: 06 Ene 2011, 23:25
por Adolfito121
Gracias por la ayuda.

Con analogwrite no he conseguido nada :smt010

Con este ejemplo:

Código: Seleccionar todo

#include <libreriav2.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("PRUEBAS ARDUINO", 240, 165, -1, -1)
$Button2 = GUICtrlCreateButton("90", 20, 25, 200, 50, $WS_GROUP)
$Button3 = GUICtrlCreateButton("0", 20, 85, 200, 50, $WS_GROUP)
GUISetState(@SW_SHOW)
conecta(4,'9600')
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $button2
			analogwrite(3,"240")
		Case $button3
			analogwrite(3,"0")
	EndSwitch
WEnd
Cuando le doy al botón $button2 en la aruino se ilumina un segundo una lucecita que tiene al lado marcado RX y acto seguido otra que pone TX, pero no se mueve ni un ápice :(

Re: compra de la placa arduino duemilanove

Publicado: 07 Ene 2011, 11:58
por xapu
Adolfito121 escribió:Gracias por la ayuda.

Con analogwrite no he conseguido nada :smt010

Con este ejemplo:

Código: Seleccionar todo

#include <libreriav2.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("PRUEBAS ARDUINO", 240, 165, -1, -1)
$Button2 = GUICtrlCreateButton("90", 20, 25, 200, 50, $WS_GROUP)
$Button3 = GUICtrlCreateButton("0", 20, 85, 200, 50, $WS_GROUP)
GUISetState(@SW_SHOW)
conecta(4,'9600')
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $button2
			analogwrite(3,"240")
		Case $button3
			analogwrite(3,"0")
	EndSwitch
WEnd
Cuando le doy al botón $button2 en la aruino se ilumina un segundo una lucecita que tiene al lado marcado RX y acto seguido otra que pone TX, pero no se mueve ni un ápice :(
la funcion analogwrite() no me acabo de funcionar del todo bien..
analiza los codigos y intenta solucionar el problema, cuando yo tenga tiempo intentare crear otras funciones mejores..
dejam tu correo para poder contactar contigo cuando lo aga o azte un usuario en el foro.

Re: compra de la placa arduino duemilanove

Publicado: 07 Ene 2011, 12:59
por Ado121
Gracias por la ayuda.

La verdad es que es un tema que me apasiona este de mover servos y motores pero soy nulo :(

Re: compra de la placa arduino duemilanove

Publicado: 08 Ene 2011, 13:13
por Ado121
He encontrado una libreria llamada Firmata que ya pone al arduino esperando comandos por el puerto com y configuarado para mover servos (o eso he creído entender).

Este es el .pde que hay que subir al arduino:

Código: Seleccionar todo

/* This firmware supports as many servos as possible using the Servo library 
 * included in Arduino 0017
 *
 * TODO add message to configure minPulse/maxPulse/degrees
 *
 * This example code is in the public domain.
 */
 
#include <Servo.h>
#include <Firmata.h>

Servo servos[MAX_SERVOS];

void analogWriteCallback(byte pin, int value)
{
    if (IS_PIN_SERVO(pin)) {
        servos[PIN_TO_SERVO(pin)].write(value);
    }
}

void setup() 
{
    byte pin;

    Firmata.setFirmwareVersion(0, 2);
    Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);

    for (pin=0; pin < TOTAL_PINS; pin++) {
        if (IS_PIN_SERVO(pin)) {
	    servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin));
        }
    }
   
    Firmata.begin(57600);
}

void loop() 
{
    while(Firmata.available())
        Firmata.processInput();
}
En principio ahora deberíamos poder mandar directamente los valores al puerto COM donde este el arduino y al pin que queramos.

Voy a hacer pruebas con la CommMG.au3, pero sigo sin tener ni pajolera idea. Encuentro muchísimos ejemplos de como pasar un pde a la arduino y que ella vaya haciendo un loop con el mismo movimiento todo el rato y ninguno que diga como hacer una gui con un botón y mandar el servo a na posición :smt009

Saludos

Re: compra de la placa arduino duemilanove

Publicado: 10 Ene 2011, 16:15
por BasicOs
Gracias por compartir el código para enviarlo al Arduino, :smt041 :smt041
Si comentas tu experiencia con la librería Au3 CommMG.au3 son bienvenidas,
Salu22:)

Re: compra de la placa arduino duemilanove

Publicado: 10 Ene 2011, 18:48
por xapu
Ado121 escribió:He encontrado una libreria llamada Firmata que ya pone al arduino esperando comandos por el puerto com y configuarado para mover servos (o eso he creído entender).

Este es el .pde que hay que subir al arduino:

Código: Seleccionar todo

/* This firmware supports as many servos as possible using the Servo library 
 * included in Arduino 0017
 *
 * TODO add message to configure minPulse/maxPulse/degrees
 *
 * This example code is in the public domain.
 */
 
#include <Servo.h>
#include <Firmata.h>

Servo servos[MAX_SERVOS];

void analogWriteCallback(byte pin, int value)
{
    if (IS_PIN_SERVO(pin)) {
        servos[PIN_TO_SERVO(pin)].write(value);
    }
}

void setup() 
{
    byte pin;

    Firmata.setFirmwareVersion(0, 2);
    Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);

    for (pin=0; pin < TOTAL_PINS; pin++) {
        if (IS_PIN_SERVO(pin)) {
	    servos[PIN_TO_SERVO(pin)].attach(PIN_TO_DIGITAL(pin));
        }
    }
   
    Firmata.begin(57600);
}

void loop() 
{
    while(Firmata.available())
        Firmata.processInput();
}
En principio ahora deberíamos poder mandar directamente los valores al puerto COM donde este el arduino y al pin que queramos.

Voy a hacer pruebas con la CommMG.au3, pero sigo sin tener ni pajolera idea. Encuentro muchísimos ejemplos de como pasar un pde a la arduino y que ella vaya haciendo un loop con el mismo movimiento todo el rato y ninguno que diga como hacer una gui con un botón y mandar el servo a na posición :smt009

Saludos
en estos momentos estoy enfrascado con el tema...
as provado el programa de ejemplo? http://firmata.org/wiki/Main_Page

Re: compra de la placa arduino duemilanove

Publicado: 11 Ene 2011, 00:21
por BasicOs
Hola,
No tengo la Arduino para probarlo.
Felicidades por el proyecto, parece interesante, lo de conectar el hard del arduino con varios programas, :smt021 :smt021 :smt026
Salu22:)

Re: compra de la placa arduino duemilanove

Publicado: 13 Ene 2011, 21:25
por Ado121
Bueno, a mi de momento me funiona pero de manera un poco limitada.
El .pde que he subido a la arduino no es el mismo que os he colgado anteriormente.

El nuevo .pde que he encontrado es este:

Código: Seleccionar todo

#include <Servo.h>

Servo myServo;

const int servoPin = 9; // the pin the servo is connected to

int val = 0;    // a value accumulated from data on the serial port
int angle = 90; // the current angle of the servo



void setup()
{
  Serial.begin(9600);
  myServo.attach(servoPin);
  myServo.write(angle);  // center the servo
}


void loop()
{
  if ( Serial.available())
  {
    char ch = Serial.read();

    if(ch >= '0' && ch <= '9')        // is ch a number?
   val = val * 10 + ch - '0';        // yes, accumulate the value
    else if(ch == '-') // is this the minus sign?
    {
   angle = angle - val;
   if(angle < 0)
      angle = 0;
   myServo.write(angle);      // write the new angle
   val = 0;
    }
    else if(ch == '+') // is this the plus sign?
    {
   angle = angle + val;
   if(angle > 180)
      angle = 180;
   myServo.write(angle);      // write the new angle
   val = 0;
    }
  }
}
Con este código cargado en la arduino cada vez que le mandemos por el puerto com un número y el signo + o el - ("90+") la placa moverá el servomotor al ángulo nueo (osea, la posición actual más el dato enviado).

Todo esto es posible gracias a la CommMG.au3 y a la libreria de Xapu (muchísimas gracias por tu aportación!!!).

Yo me he hecho un script de prueba:

Código: Seleccionar todo

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=ico.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Language=1027
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <CommMG.au3>
#include <Misc.au3>

_CommSetDllPath(@ScriptDir & "\commg.dll")
conecta(4, '9600')

GUICreate("Mover servo", 400, 500, -1, -1)
GUISetState(@SW_SHOW)


$boton1 = GUICtrlCreateButton("DERECHA", 100, 200, 100, 200)
$boton2 = GUICtrlCreateButton("IZQUIERDA", 200, 200, 100, 200)

While 1
	$msg = GUIGetMsg()

Select
	Case $msg = $boton1
		analogwrite(9, "+90")

	Case $msg = $boton2
		analogwrite(9, "-90")

	Case	$msg = $GUI_EVENT_CLOSE
		Exit
		EndSelect
;### Tidy Error -> "wend" is closing previous "case" on line 25
	WEnd


;### Tidy Error -> while Not closed before "Func" statement.
;### Tidy Error -> "func" cannot be inside any IF/Do/While/For/Case/Func statement.
	Func conecta($port, $baud)
		If $baud = "" Then $baud = 9600
		Local $sportSetError
		ConsoleWrite(_CommListPorts(0))
		_CommSetPort($port, $sportSetError, 9600, 8, "none", 2, 1)
		If $sportSetError = '' Then
			Return 1
			ConsoleWrite("using " & _CommGetVersion(1))
		Else
			ConsoleWrite("error")
			Return $sportSetError
		EndIf
	EndFunc   ;==>conecta

	;=====================================================================================
	;
	; Function Name:  analogwrite($pin,$stat)
	; Description:    le da un valor analogico $stat al pin $pin
	; Parameters:     $pin : el pin al que se envia el valor
	;                 $stat : el valor analogico a enviar al pin
	;
	; Returns:  on success-  1
	;           on failure - @error llamando a la Dll del commMG.au3
	;======================================================================================
;### Tidy Error -> while Not closed before "Func" statement.
;### Tidy Error -> "func" cannot be inside any IF/Do/While/For/Case/Func statement.
	Func analogwrite($pin, $stat)
		Dim $valorx, $valores
		If $pin > 13 Then SetError(1, "pin no existe", -1)
		If $stat < 0 Or $stat > 255 Then SetError(2, "valor mallor que 255 o menor que 0", -2)
		If $pin > 9 Then
			$pin = cambia($pin)
		EndIf
		_CommSendstring("b" & $pin & $stat)
		Return 1
	EndFunc   ;==>analogwrite
	;=====================================================================================
	;
	; Function Name:  analogread($pin)
	; Description:    lee el valor analogico del pin $pin
	; Parameters:     $pin : pin del arduino del que se va a leer el valor
	;
	; Returns:
	;           on success-  el valor
	;           on failure - @error llamando a la dll del commMG.au3
	;======================================================================================
;### Tidy Error -> while Not closed before "Func" statement.
;### Tidy Error -> "func" cannot be inside any IF/Do/While/For/Case/Func statement.
	Func analogread($pin)
		If $pin > 13 Then SetError(1, "pin no existe", -1)
		If $pin > 9 Then
			$pin = cambia($pin)
		EndIf
		_CommSendstring("a" & $pin)
		Sleep(100)
		$valu = _CommGetstring()
		Return $valu
	EndFunc   ;==>analogread
	;=====================================================================================
	;
	; Function Name:  digitalread($pin,$stat)
	; Description:    lee el valor analogico de un pin del arduino
	; Parameters:     $pin: el pin a leer
	;
	; Returns:
	;           on success-  el valor analogico del pin 1 o 0
	;           on failure - @error set to -2 si el valor de stat no es low o high
	;			on failure - @error llamando a la dll del commMG.au3
	;======================================================================================
;### Tidy Error -> while Not closed before "Func" statement.
;### Tidy Error -> "func" cannot be inside any IF/Do/While/For/Case/Func statement.
	Func digitalread($pin)
		If $pin > 13 Then SetError(1, "pin no existe", -1)
		If $pin > 9 Then
			$pin = cambia($pin)
		EndIf
		_CommSendstring('c' & $pin)
		Sleep(125)
		Return _CommGetstring()
	EndFunc   ;==>digitalread
	;=====================================================================================
	;
	; Function Name:  digitalwrite($pin,$stat)
	; Description:    activa o desactiva un pin de arduino
	; Parameters:     $pin: suma de dos numeros menores que 9 que sumen el numero de tu Ping
	; 				  ejemplo: mi pin es el 12 pues $pin sera = a 6+6 o 7+5
	;                 $stat- 0:desactiva 1:activa
	; Returns:  always 1
	;           on success-  1
	;           on failure - @error set to -2 si el valor de stat no es low o high
	;			on failure - @error llamando a la dll del commMG.au3
	;======================================================================================
;### Tidy Error -> while Not closed before "Func" statement.
;### Tidy Error -> "func" cannot be inside any IF/Do/While/For/Case/Func statement.
	Func digitalwrite($pin, $stat)
		Dim $valorx, $valores
		If $pin > 13 Then SetError(1, "pin no existe", -1)
		If $stat <> 1 Or $stat <> 0 Then SetError(2, "digital write no es HIGH o LOW", -2)
		If $pin > 9 Then
			$pin = cambia($pin)
		EndIf
		$stat = 'd' & $pin & $stat
		_CommSendstring($stat)
		Return 1
	EndFunc   ;==>digitalwrite


	;funcion para enviar el numero de pin en un solo bit
;### Tidy Error -> while Not closed before "Func" statement.
;### Tidy Error -> "func" cannot be inside any IF/Do/While/For/Case/Func statement.
	Func cambia($let)
		Switch ($let)
			Case 10
				Return "a"
			Case 11
				Return "b"
			Case 12
				Return "c"
			Case 13
				Return "d"
		EndSwitch
	EndFunc   ;==>cambia
;### Tidy Error -> while is never closed in your script.
Fijaros que he incrustado en mi miniscript la libreria de xapu (no me gusta el tema de que un script llame a otro que a su vez llame a otro).
Para que funcione hay que tener en la carpeta include el CommMG.au3.

Para mi ejemplo yo tengo la commg.dll en el mismo directorio que el programa.

Yo preferiría poder decirle a la placa que envíe el servo al ángulo 120, sin tener que depender del punto en el que me encuentre en ese momento, pero imagino que ya sería cosa de tocar el .pde que se sube a la arduino o tirar de analogread().

Aunque probé a hacer:

Código: Seleccionar todo

$posicionactualdelservo = analogread(9)
$input=GUICtrlCreateInput($servo,10,10,50,40)
GUICtrlSetData($input,$posicionactualdelservo)
(no así, pero para que entendais qué quería hacer), aunque no funcionó.

Alguien más está probando cositas?

Saludos

Re: compra de la placa arduino duemilanove

Publicado: 27 Ene 2011, 02:50
por BasicOs
Aquí mando un link con un HOw to para empezar con Arduino, cuesta unos +-22€ más gastos de envio.

Tutorial de Arduino
Salu22:)
edit:

Otro con discusiones sobre montaje y precios

Re: compra de la placa arduino duemilanove

Publicado: 17 Mar 2011, 23:49
por xapu
se que lo mejor seria traspasar la libreria firmata para el arduino.. pero como no tengo ni ganas ni mucha idea de como hacerlo..
podemos segir creando pequeños programas con intenciones predeterminadas ^^
os presento un programilla que usa el sensor de humedad y temperatura para crear una grafica con la tª ke nos saca el arduino.

colgare los codigos i el eskema del circuito lo antes posible.. pero eske aora mismo lo tengo todo desordenado jeje
espero ke os sirva de algo :P

Re: compra de la placa arduino duemilanove

Publicado: 18 Mar 2011, 00:00
por Chefito
Jejejeje....que chulo :smt023 .
Muy bueno. La proxima vez utiliza un capturador de video de lo que hay en pantalla y así se ve mejor todo lo del ordenador.

Saludos.