miércoles, 29 de julio de 2015

Control de puntero láser mediante 2 servos

Control de puntero láser mediante 2 servos.
Manejados por arduino y controlados mediante PC.
Programación gambas (linux)
xsetaseta@gmail.com


De mi anterior tenia dos servos montados y manejados por una placa arduino nano. Me vino a la cabeza un proyecto que tenía en mente, manejar un puntero láser mediante un ordenador. Solo tenía que realizar un programa que mandase las coordenadas de posicionamiento desde el PC al arduino, y este manejaría los servos.
La realización fue rápida, no me he complicado mucho en el interface del PC, la he realizado en gambas (una especie de Visual Basic) bajo linux.
Toma las coordenadas de una superficie azul de 360x360 , y manda los datos X e Y como valores entre 0 y 179 mediante el interface serie al arduino.
Si se cambia la potencia se manda también con datos entre 0 y 254, que maneja el puntero mediante PWM, me hubiera gustado hacerlo con voltios reales, pero el proyecto debía realizarse rápidamente.
Para poder mover el puntero, se debe pulsar el botón izquierdo del ratón.
Para dar la potencia máxima, se debe pulsar el botón derecho del ratón.
Como los servos están construidos mediante motores, estos producen interferencia en el propio arduino, por lo cual debemos de alimentar los servos desde una fuente externa.


Esquema de conexionado.



Colocación de láser en los servos.


Montaje del circuito con todos los componentes.


El montaje funcionando
 




Vídeo del montaje funcionando

Programa  gambas

Programa arduino





Hasta pronto.
Juan Galaz


BIBLIOGRAFÍA

http://cursos.olimex.cl/tutoriales/
http://www.electroensaimada.com/servomotor.html
http://arduino.cl/servo-motor-con-arduino/



domingo, 26 de julio de 2015

nRF24L01 Control de 2 servos + 1 servo o motor



nRF24L01
Control de 2 servos + 1 servo o motor
xsetaseta@gmail.com


Revisión del circuito. 17/11/2017
Después de bastante tiempo de realizar el montaje, tuve la necesidad de hacer otro montaje con el nRF24.
Montado todo bien no me funcionaba, o el funcionamiento era errático.
Después de muchas pruebas, descubrí que en algún que otro módulo se necesitaba un condensador entre Vcc y GND.
Colocados los condensadores en todos los módulos el funcionamiento era correcto.

____________________________________________________________

En este montaje he utilizado dos placas arduino y dos módulos nRF24L01 para el control de 2 servos  y un motor de DC o 1 servo.
El control se realiza desde el circuito emisor donde existen 3 potenciómetros a modo de joystick, donde 2 hacen de modo coordenadas  X-Y , y el tercer potenciómetro a modo de control de potencia.
Mi objetivo era realizar el control de un avión RC de ala fija, donde el control se realiza con el timón de dirección y con el timón de profundidad, y la potencia del motor con el tercer potenciómetro de potencia.
En este montaje solo he utilizado el modo de transmisión de un módulo emisor  a el otro módulo receptor.
El nRF24L01+ integra un completo transceptor RF de 2,4 GHz, un sintetizador de RF y toda la lógica de banda base incluyendo un acelerador de protocolo por hardware Enhanced ShockBurstTM con una interfaz  SPI de alta velocidad para el controlador de la aplicación. El módulo Transceptor es de baja potencia y corto alcance, 200 metros más o menos.
Estos transceivers utilizan la banda de 2,4 GHz como muchos routers WiFi, algunos teléfonos inalámbricos, etc y no necesitan licencia. Estos transceptores pueden tanto enviar, como recibir datos en “paquetes” de varios bytes a la vez.

La librería utilizada es la RF24             https://github.com/maniacbug/RF24






Conexión del Arduino al nFR24L01
3V3 ----VCC (3.3V )
pin D8-----------CE (chip enable in)
pin D7----------CSN (chip select in)
SCK pin D13----------SCK (SPI clock in)
MOSI pin D11----------SDI (SPI Data in)
MISO pin D12----------SDO (SPI data out)
GND----------GND


Los pin CE y CS se pueden cambiar a otros pin del arduino en el programa.
//RF24 (cepin, cspin)
RF24 radio(8,7);


La alimentación del nFR24L01 debe estar entre 1.9 to 3.6V, por lo cual debemos utilizar la salida de 3.3V del arduino. En algunas páginas recomiendan colocar un condensador en la salida de 3.3V para minimizar posibles caídas de tensión debido a un consumo puntual alto.

Para el control de potencia del motor DC se utiliza el modo PWM (control mediante ancho de pulso) que maneja un MOSFET IRF630, es el que tenía a mano, puede servir cualquier otro.



Los servos se controlan mediante el ancho de pulso.


Emisor


Programa emisor Arduino
//xsetaseta@gmail.com
#include <SPI.h>
#include <nRF24L01.h>

#include <RF24_config.h>
#include <RF24.h>


#define debug 0

int sensorPin1 = A0;
int sensorPin2 = A1;
int sensorPin3 = A2;

unsigned char cadena[10];

RF24 radio(8,7);

unsigned int z;

// Topology
// Radio pipe addresses for the 2 nodes to communicate.
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

void setup(void)
{

  Serial.begin(9600);

  radio.begin();
  radio.setRetries(15,15);
  radio.openWritingPipe(pipes[0]);
  radio.openReadingPipe(1,pipes[1]);
  Serial.println("Transmitiendo datos");
}

void loop(void)
{
    radio.stopListening();
    cadena[0]='A';
    cadena[1] = analogRead(sensorPin1)>>2;
    cadena[2] = analogRead(sensorPin2)>>2;
    cadena[3] = analogRead(sensorPin3)>>2;
    cadena[4] = 'A';
    cadena[5] = 'A';
#if debug    
    Serial.print(cadena[1],DEC);Serial.print(" ");
    Serial.print(cadena[2],DEC);Serial.print(" ");
    Serial.print(cadena[3],DEC);
#endif     
    enviarS();    
    radio.startListening();  
    delay(21); //20
  
}

void enviarS()
{
    if (radio.write( cadena, 6 ))
      { Serial.println(" ok send.");}
    else
      { Serial.println(" failed send.");}
}


Receptor


Programa receptor Arduino
//xsetaseta@gmail.com
#include <SPI.h>
#include <nRF24L01.h>

#include <RF24_config.h>
#include <RF24.h>

#include <Servo.h>

#define debug 0

Servo myservo1;
Servo myservo2;
Servo myservo3;

int posicion;

bool done;

const int analogOutPin = 5;

unsigned char cadena[10];
int z;

//RF24 (cepin, cspin) 
RF24 radio(8,7);

// Topology
// Radio pipe addresses for the 2 nodes to communicate.
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

void setup()
{
  Serial.begin(9600);
  myservo1.attach(2);
  myservo2.attach(3);
  myservo3.attach(4);
  
  radio.begin();
  radio.setRetries(15,15);
  radio.startListening();
  radio.openWritingPipe(pipes[1]);
  radio.openReadingPipe(1,pipes[0]);
  Serial.println("Esperando datos");
}

void loop()
{
  delay(10);
  if ( radio.available() )
    {
      done = false;
      while (!done)
        {
        done = radio.read( cadena, 6);
#if debug        
         Serial.print(cadena[0]);Serial.print(" ");
         Serial.print(cadena[1],DEC);Serial.print(" ");
         Serial.print(cadena[2],DEC);Serial.print(" ");
         Serial.print(cadena[3],DEC);Serial.println(" ");
#endif      
         z=cadena[0];
         switch(z)
          {
           case 65:
              posicion = map(cadena[1], 0, 254, 0, 179); myservo1.write(posicion);
              posicion = map(cadena[2], 0, 254, 0, 179); myservo2.write(posicion);
              posicion = map(cadena[3], 0, 254, 0, 179); myservo3.write(posicion);
              analogWrite(analogOutPin, cadena[3]);
             break;
          }

        radio.stopListening();
       delay(10);
        radio.startListening();
        }
    }
}

Los dos servos se controlan desde los pins D2 y D3 .
Como podemos ver podemos controlar un tercer servo en el pin D4 o un motor DC se utiliza el modo PWM en el pin D5.
El sistema funciona en prototipo, pero no lo he montado en circuito impreso, ni montado en el avión como me hubiera gustado hacer.
Tampoco he probado el alcance real en campo abierto para ver el alcance real. Cierto es que si necesitamos mucho más alcance existe un módulo nFR24L01 con antena que promete llegar hasta 1Km.
La alimentación normal de todo el circuito es de 5V a excepción del módulo nFR24L01 que es de 3.3V , pero lo he alimentado todo a 3.4V y funciona perfectamente.

Librerías
Programas


Hasta pronto.
Juan Galaz


BIBLIOGRAFÍA

https://github.com/maniacbug/RF24
https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
http://openhardware.pe/transceptores-nrf24l01-2-4ghz-radio-wireless-how-to/
http://cursos.olimex.cl/tutoriales/
http://www.electroensaimada.com/servomotor.html
http://arduino.cl/servo-motor-con-arduino/


jueves, 16 de julio de 2015

Proyector UNIC UC40 no funciona

09/09/2015
Me he puesto en contacto con el vendedor chino.
Le explique el caso mandandole fotos, y me a mandado la fuente totalmente gratis.
Vendedores como estos son dificiles de encontrar.  *****


Un saludo
 _________________________

UNIC UC40 no funciona
Hace un mes me compre un proyector portátil para ver películas y fotos. Mi presupuesto no era mucho, 100€ como máximo. Después de ver diferentes proyectores que tenían resoluciones bajas 320x240  por un precio de 40€, me decidí por un UNIC UC40 que tiene una resolución real de 800x480. Su precio ronda los 79€ incluidos los gasto de envío desde china. Por este precio no existe un proyector mejor, para ver DVD  con resoluciones  de 720x480 píxeles (para NTSC) y 720x576 (para PAL) es suficiente. Después de ver durante este tiempo bastantes películas  le di el aprobado por su tamaño, resolución y su calidad/precio bastante ajustado. Yo estaba satisfecho con la compra.
Un buen día mientras estaba viendo una película, se apago de golpe y se volvió a encender. Lo achaqué a una posible caída de tensión, pero a partir de entonces empezó a encenderse y apagase bastantes veces, hasta que ya no se encendía, o amagaba con encenderse pero al encenderse la lampara se apagaba completamente.
Mandarlo arreglar no merece la pena, y como yo soy muy manitas con esto de la electrónica me dispuse a desarmarlo para ver si podía arreglarlo.
En las siguientes imágenes veréis el despiece del aparato.






Después de hacer varias pruebas, descubrí que si quitaba la alimentación de 19V al led de proyección el aparato no se apagaba, aunque claro no se veía proyectada la imagen. Probé alimentar el led a 19V con otra fuente externa, y el proyector funcionaba perfectamente.

Conclusión la fuente de alimentación estaba estropeada y no daba suficiente  potencia para alimentar el led de proyección.
Como me temía esto ya le a pasado a mas de uno, y existe repuesto de la fuente de alimentación en aliexpress por 13€
 http://es.aliexpress.com/item/Original-UNIC-UC40-Power-board-accessories-For-UC40-Projector/32393578961.html?s=p
Como he dicho antes, soy un manitas en la electrónica y he hecho un apaño para poder disfrutar del proyector sin gastarme nada hasta que decida si compro la fuente de alimentación.
La fuente de alimentación del proyector entrega 19V para alimentar al led , y 12V para alimentar al resto de la electrónica del proyector. El mayor consumo del aparato es para el led, el resto consume unos 250mA a 12V. Como tengo alimentadores de portatiles que funcionan con 19V, he alimentado el led de proyección con dicha tensión, comprobando que funcionaba perfectamente. Para alimentar al resto de los circuitos del proyector, he utilizado un regulador 7812 que nos proporciona 12V y 1000mA. He colocado un pequeño disipador al 7812 para que no se estropee. Debido a que en cuanto alimento el proyector se enciende el led de proyección pero no el ventilador, he tenido que alimentar directamente el ventilador desde los 12V.
Cerrado el proyector y probado, funciona perfectamente, esperemos que no se rompan mas cosas.

Un saludo.
Juan Galaz