domingo, 25 de noviembre de 2012

moviendo el raton con arduino :P

bueno, pues tenia este proyecto a medias desde hace varios años, y al fin! esta tarde me a dado por acabarlo.
consta de dos programas, uno en Autoit para el ordenador(servidor), y otro para el arduino(cliente)
(para la gente que no tenga ni idea.. puede decirse que servidor es el que recibe informacion y la ejecuta.. y cliente el que la envia para decirle al servidor lo que tiene que hacer.)

el programa de arduino lo que hace constantemente es leer la posicion de los potenciometros del nunchuck y el estado de los botones C y Z y los envia en una string mediante el puerto COM al ordenador, mientras que el programa de autoit esta constantemente leyendo los datos, y moviendo el raton en funcion de lo que reciba.
para poder usar el programa de autoit, tendreis que cambiar el puerto com, y poner el que vuestro ordenador use.. el baudaje es mejor dejarlo tal como esta.
conecta(3,115200)
en mi caso es el com3

el hardware es casi nulo, si teneis un conector especial para nunchucks pues usarlo, yo como no tengo, meto los pines por los huecos del nunchuck y los conecto directamente al arduino

2012-11-25 18.15.31


Arduino - nunchuck
SCL     -  CLOCK
SDA    -  Data
GND   - GND
3.3v     - Power

en mi caso al ser el arduino mega el pin scl es el 21 y el sda el 20


importante!
junto al programa principal que es mousemove.au3 va otro programa llamado calibrador. Antes de usar el programa principal teneis que ejecutar este programa y segir estos pasos:
1º situar el joystick del nunchuck lo mas a la izquierda posible, pulsar a y esperar 1 o 2 segundos
2º situar el joystick del nunchuck lo mas a la derecha posible, pulsar d y esperar 1 o 2 segundos
3º situar el joystick del nunchuck lo mas arriba posible, pulsar w y esperar 1 o 2 segundos
1º situar el joystick del nunchuck lo masabajo posible, pulsar x y esperar 1 o 2 segundos
finalmente pulsar s y ya estara calibrado.
(el programa principal debe ir en el mismo directorio que el calibrador)


martes, 20 de noviembre de 2012

actualizacion del coche RC con puente h l299n

despues de muuuucho tiempo.. actualizo el blog que ya era hora XD
Bueno, pues lo "nuevo" del coche es, que en vez de tener protoboard tengo una protoshield para que el montaje sea menos voluminoso, que aora la velocidad puede regularse mediante el pwm gracias al l298n(es un puente en H), y le e añadido un brazillo echo con servos y piezas de un viejo meccano ^^
unas fotillos del "brazo":
2012-11-20 21.14.58 2012-11-20 21.14.43 2012-11-20 21.14.30

el codigo esta echo para un arduino mega, ya que para evitar tener que poner cables en la antena apc220, simplemente la pincho como se ve en esta foto.. y declaro el pin 15, que es en el que el gnd de la antena esta conectado como input, y el 16 y 17 como outputs que es donde estan conectados vcc y enable
por lo que si se va a usar un arduino due uno.. etc.. pueden ahorrarse es parte de codigo, y tendran que remplazar los Serial1 por Serial.
el cableado restante es extremadamente sencillo.
el servo de direccion sera el pin 9 y los pines del brazo los 7 y 8
en el l298n el ena al pin 12, y el in1 y in2 a 11 y 10, gnd a gnd +5v a +5v el vms de la clema al positivo de la bateria y gnd a gnd de la bateria, luego los cables del motor a motorA
la fuente de alimentacion del motor es una bateria de 12V que no se ve en ninguna foto, ya que va debajo del coche.. y la fuente del arduino es un portapilas de 6 pilas
2012-11-20 21.16.11
2012-11-20 21.15.48

en el codigo de autoit añado las teclas q y e para bajar y suvir de velocidad, wasd para manejar el brazillo de servos

agradecimientos a Biketrial de forocoches por explicarme como conectar el puente ;)

aqui el codigo autoit :
#include <CommMG.au3>
#Include <Misc.au3>

FileInstall("C:\Documents and Settings\USUARIO\Mis documentos\samuel\co.jpg",@TempDir&"\co.jpg")
HotKeySet("z","exitt")
HotKeySet("q","mas")
HotKeySet("e","menos")
_CommSetDllPath("C:\Program Files (x86)\AutoIt3\Include\commg.dll")



conecta(2,9600)
$grados = 90
$g1 = 90
$g2 = 90
Global $ve = 0
$v = 0
$D = ","
While 1
;direccion
If (_IsPressed(25) Or _IsPressed(27)) Then
If _IsPressed(25) Then
If $grados >= 45 Then
$grados -= 10
EndIf
EndIf

if _IsPressed(27) Then
If $grados <= 135 Then
$grados += 10
EndIf
EndIf
Else
If $grados <> 90 Then
If $grados >= 90 Then
$grados -= 5
EndIf
If $grados <= 90 Then
$grados += 5
EndIf
EndIf
EndIf
;-----
;balastro s1
If _IsPressed(41) Then
If ($g1 > 0) Then
$g1 -= 3
EndIf
EndIf

If _IsPressed(44) Then
If ($g1 < 180) Then
$g1 += 3
EndIf
EndIf
;-----
;balastro s2
If _IsPressed(57) Then
If ($g2 > 0) Then
$g2 -= 3
EndIf
EndIf

If _IsPressed(53) Then
If ($g2 < 180) Then
$g2 += 3
EndIf
EndIf

If (_IsPressed(26))Or(_IsPressed(28)) Then
Select
Case _IsPressed(26)
$d = ","
Case _IsPressed(28)
$d = ":"
EndSelect
$v = $ve
Else
$v = 0
EndIf

_CommSendString($v&$d&$g1&"."&$g2&";"&$grados&@CRLF,1)
   ConsoleWrite($v&$d&$g1&"."&$g2&";"&$grados&@CRLF)

   ;$lol = _CommGetString()
   ;While $lol = ""
;   $lol = _CommGetString()
;  WEnd
   Sleep(1)
WEnd

;-------
;velocidades

Func mas()
If $ve < 255 Then
$ve += 51
EndIf
EndFunc

Func menos()
If $v > 0 Then
$ve -= 51
EndIf
EndFunc

;-------------

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

Func map($x, $in_min, $in_max, $out_min, $out_max)

  return ($x - $in_min) * ($out_max - $out_min) / ($in_max - $in_min) + $out_min

EndFunc

Func exitt()
   _CommCloseport()
   Exit
EndFunc


y aqui el nuevo codigo del arduino

#include <Servo.h>

String inString = "";
Servo myservo,s1,s2;
int stat,rot,rot1,rot2,D;
void setup() {
  Serial1.begin(19200);
  myservo.attach(9);
  s1.attach(7);
  s2.attach(8);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  // definicion de los pines para la antena
  pinMode(17, OUTPUT);
  digitalWrite(17,HIGH);
  pinMode(16, OUTPUT);
  digitalWrite(16,HIGH);
  pinMode(15,OUTPUT);
  digitalWrite(15,LOW);
}

void loop() {
  int inChar;

  // Read serial input:
  if (Serial1.available() > 0) {
    inChar = Serial1.read();
  }

  if (isDigit(inChar)) {
    inString += (char)inChar;
  }

  if (inChar == '-') {
    D = inString.toInt();
       if (D==1){
        digitalWrite(10,HIGH);
        digitalWrite(11,LOW);
       }else{
        digitalWrite(11,HIGH);
        digitalWrite(10,LOW);
       }
    inString = "";
  }

  if (inChar == ',') {
      stat = inString.toInt();
      analogWrite(12,stat);
      inString = "";
  }
  if (inChar == '.') {
    rot1 = inString.toInt();
    s1.write(rot1);
    inString = "";
}
  if (inChar == ';') {
    rot2 = inString.toInt();
    s2.write(rot2);
    inString = "";
}
  if (inChar == '\n') {
    rot = inString.toInt();
    myservo.write(rot);
    inString = "";
}

}