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