Show Posts
Pages: [1] 2 3
1  International / Software / Re: Ayuda librería mpu5060.h on: January 12, 2014, 07:22:20 pm
Hola carlos,

Te recomiendo primero hacer un programa base que te muestre por pantalla (serie) los valores de cada eje del acelerometro y giroscopio.

Con getMotion6 obtienes las 6 lecturas (3 aceleraciones y 3 velocidades angulares), a partir de aquí te tocará calibrar el mpu (hay varias funciones en la librería que lo permiten, offsets, precision, etc) para que trabaje como tu quieras.

Cualquier problema, estoy trabajando en un quadcoptero con justamente ese MPU, osea que puedo ayudarte si hace falta, pero creo que será mejor que primero intentes tu, ya que así aprendes más.

Saludos!
2  International / Software / Re: PROBLEMA CON FLOAT on: December 23, 2013, 07:49:02 am
Cuando dices que te sale 0 es en el monitor Serial??

Para que necesitas esto?? Si es en el monitor, busca que hay creadas ya algunas maneras para mostrar floats "enteros" por monitor.

Saludos
3  International / Software / Re: Recibir numeros tres o mas digitos en mi arduino via serial on: December 18, 2013, 07:12:47 am
Tienes varias opciones: o montarte siempre el mismo mensaje, o montarte un "protocolo" de "inicio-fin" de mensaje, o esperar a recibir la letra, etc.

Por ejemplo, dices que tienes que recibir desde arduino diferentes mensajes. Las 3 soluciones serían:

- Siempre el  mismo mensaje: Letra+ 3 numeros. p.e. A123, A045, B003, etc..... (siempre letra+3 numeros del angulo, rellenando con 0).
- Montar un protocolo de "inicio-fin": crear un inicio de linia y un final de linia, para saber cuando empieza y acaba el mensaje. p.e Inicio: letra Final: \r Mensaje: A120\r B042\r, etc.....
- Esperar a recibir la letra para saber cuando empieza-acaba. p.e. mandar A123B038A003C093 puedes separarlos por: A123/B038/etc.

No se si me he explicado, piensa cual te va mejor (o cual prefieres) y cualquier cosa vuelve aquí!
4  Using Arduino / Programming Questions / Re: Understanding Bits from a byte (i2c) on: December 10, 2013, 02:54:16 pm
When "counting" bits, we do it like 1, 2, 3, 4, 5, 6, 7 and 8. But bitRead starts at 0, so you are missing 1 to the position you are reading.

So, bit 7 of the datasheet is bit 6 for bitRead.

Look at the reference, bitRead's LSB is 0, not 1, and MSB is 7 (if it's a byte). So bit 7 when "counting" is bit 6 for bitRead.
5  International / Español / Re: Tareas simultaneas on: December 10, 2013, 02:46:52 pm
Solo tienes que insertar el for que inicia el encendido del segundo LED dentro del for que apaga el primero.

Intenta escribirtelo en pseudocódigo primero, a ver si así lo ves más claro. Sino, aquí estamos (tampoco creo que te sea útil que te de el programa directamente, así también aprendes) : )
6  Using Arduino / Programming Questions / Re: On button state change run loop once on: December 02, 2013, 03:09:07 pm
If you use a while loop checking when the button is HIGH in the setup(), it will only run once. You can leave loop() blank.
7  Using Arduino / Programming Questions / Re: Problem with Quadcopter code on: December 01, 2013, 02:40:49 pm
Ok, now it seems to work perfectly.

Thanks!!
8  International / Hardware / Re: duda motor DC y resistencia pull down on: December 01, 2013, 02:16:06 pm
Podríamos decir que "da igual" si está en el positivo o en el negativo. Solo tiene que permitir el paso de esta corriente que se crea en la bobina en el momento de desconectarlo del circuito, negandolo en el sentido contrario (ya que destruiría el circuito!). Es por eso que se usa un diodo, porque solo permite el paso de la corriente hacia un sentido.

No se si me explico
9  International / Hardware / Re: duda motor DC y resistencia pull down on: December 01, 2013, 07:48:31 am
A ver si me explico:

1.- La resistencia de pulldown se usa para fijar una tensión cuando el circuito está en "reposo". Osea, que si el Arduino lee un estado mientras nada cambia, ese valor sea el de tierra. Además, y mucho más importante, las resistencias juegan el papel de limitar la tensión que entrará por un pin de Arduino (o saldrá), usando la Ley de Ohm (corriente máxima de unos 40mA). La contraria a la resistencia de pulldown es la de pullup: esta cambia el estado lógico normal (osea, un 0 en arduino es "activado" y un 1 en arduino es "desactivado" en el circuito).

2.- El diodo se usa para proteger el circuito, ya que el motor incluye una bobina. Esta bobina se carga con un campo magnético al pasar corriente por ella. Cuando esta corriente deja de aplicarse, el campo magnético sucumbe, creando una corriente residual en esta bobina, de dirección contraria a la que habías aplicado tu previamente. Eso provoca muchos problemas en los circuitos. Mediante el diodo se evita que esta corriente residual penetre en tu circuito de control y dañe los componentes.

No se si se entiende todo bien, cualquier duda que te haya quedado (o aparecido nueva) no dudes en preguntar.

Saludos
10  Using Arduino / Programming Questions / Re: Problem with Quadcopter code on: November 27, 2013, 07:33:02 pm
Code:
_Left_Front_M.attach(_Left_Front_M_pin);
_Right_Front_M.attach(_Right_Front_M_pin);
_Left_Back_M.attach(_Left_Back_M_pin);
_Right_Back_M.attach(_Right_Back_M_pin);
The hardware is not ready when your constructor is called.

You, like everybody else, need a begin() method where the hardware setup is done, called in the setup() function.

Mmmm... So I need a new function to "attach" the servos in spite of doing it in the constructor, and call that function in setup()?

Ok thank you. I'm new in this world, gonna try this!
11  Using Arduino / Programming Questions / Re: Problem with Quadcopter code on: November 27, 2013, 05:38:36 pm
I simply cannot know what is causing this behaviour, because when I acces the "loop" function, it suddenly does that.

I don't know if it's something caused with the timers of wire or I2C, because separately the library I developed works greatly.

Or maybe I simply use the "updateSpeeds" function I developed too fast or too slow...
12  Using Arduino / Programming Questions / Problem with Quadcopter code on: November 27, 2013, 03:59:58 pm
Hello!

I'm trying to develop my own quadcopter code (with libraries, etc), but I have arrived to some kind of problem.

Here is all what I did:

Quadrotor.cpp:
Code:
#include <Arduino.h>
#include <Servo.h>
#include <Quadrotor.h>



/* Default constructor assigns Digital Pins 6,7,8,9 as
** Pin 6 = Left Front Motor
** Pin 7 = Right Front Motor
** Pin 8 = Left Back Motor
** Pin 9 = Right Back Motor
*/
QUADROTOR::QUADROTOR()
{
_Left_Front_M_pin = 6;
_Right_Front_M_pin = 7;
_Left_Back_M_pin = 8;
_Right_Back_M_pin = 9;
_Left_Front_M.attach(_Left_Front_M_pin);
_Right_Front_M.attach(_Right_Front_M_pin);
_Left_Back_M.attach(_Left_Back_M_pin);
_Right_Back_M.attach(_Right_Back_M_pin);
}

/* If other pins want to be used, use this constructor
** to pass the pins of each motor
*/
QUADROTOR::QUADROTOR(int Left_Front_M_pin, int Right_Front_M_pin, int Left_Back_M_pin, int Right_Back_M_pin)
{
_Left_Front_M_pin = Left_Front_M_pin;
_Right_Front_M_pin = Right_Front_M_pin;
_Left_Back_M_pin = Left_Back_M_pin;
_Right_Back_M_pin = Right_Back_M_pin;
_Left_Front_M.attach(_Left_Front_M_pin);
_Right_Front_M.attach(_Right_Front_M_pin);
_Left_Back_M.attach(_Left_Back_M_pin);
_Right_Back_M.attach(_Right_Back_M_pin);
}

/* Use this to configure one ESC. Use configureAllESC()
** in order to configure the four ESC at once
*/
void QUADROTOR::configureESC(int ESC_pin)
{
  Serial.println("Program begin...");
  Serial.println("This program will calibrate the ESC.");
  _ESC.attach(ESC_pin);
delay(10);
  Serial.println("Now writing maximum output.");
  Serial.println("Turn on power source, then wait 2 'beeps' and press any key.");
  // Send max output
  _ESC.writeMicroseconds(MAX_SIGNAL);
delay(10);
  // Wait for input
  while (!Serial.available());
  Serial.read();
  // Send min output
Serial.println("Sending minimum output");
Serial.println("Wait until battery cell number 'beeps' and a long at end, then press a key..");
_ESC.writeMicroseconds(MIN_SIGNAL);
delay(10);
while (!Serial.available());
  Serial.read();
Serial.println("The ESC has been configured successfully");
}

void QUADROTOR::configureAllESC()
{
  Serial.println("Program begin...");
  Serial.println("This program will calibrate the four ESC at once.");
Serial.println("Attach the ESC to the pins used when calling the constructor");
Serial.println("with the power source disconnected, and press any key + INTRO.");
Serial.println("(in case of using the default constructor, use pins 6,7,8,9");
while (!Serial.available());
  Serial.read();
Serial.println("Now writing maximum output.");
  Serial.println("Turn on power source, then wait 2 'beeps' and press a key.");
_Left_Front_M.writeMicroseconds(MAX_SIGNAL);
delay(10);
_Right_Front_M.writeMicroseconds(MAX_SIGNAL);
delay(10);
_Left_Back_M.writeMicroseconds(MAX_SIGNAL);
delay(10);
_Right_Back_M.writeMicroseconds(MAX_SIGNAL);
delay(10);
while (!Serial.available());
  Serial.read();
Serial.println("Wait until battery cell number 'beeps' and a long at end, then press a key.");
_Left_Front_M.writeMicroseconds(MIN_SIGNAL);
delay(10);
_Right_Front_M.writeMicroseconds(MIN_SIGNAL);
delay(10);
_Left_Back_M.writeMicroseconds(MIN_SIGNAL);
delay(10);
_Right_Back_M.writeMicroseconds(MIN_SIGNAL);
delay(10);
while (!Serial.available());
  Serial.read();
Serial.println("The four ESC has been configured successfully");
}
/* Write min_signal to the ESC in order to make it
** start the control of the motors
*/
void QUADROTOR::initiate()
{
_Left_Front_M.writeMicroseconds(MIN_SIGNAL);
delay(10);
_Right_Front_M.writeMicroseconds(MIN_SIGNAL);
delay(10);
_Left_Back_M.writeMicroseconds(MIN_SIGNAL);
delay(10);
_Right_Back_M.writeMicroseconds(MIN_SIGNAL);
delay(10);
}

void QUADROTOR::updateSpeeds(int speed_M1, int speed_M2, int speed_M3, int speed_M4)
{
_Left_Front_M.writeMicroseconds(speed_M1);
delay(5);
_Right_Front_M.writeMicroseconds(speed_M2);
delay(5);
_Left_Back_M.writeMicroseconds(speed_M3);
delay(5);
_Right_Back_M.writeMicroseconds(speed_M4);
delay(5);
}

Quadrotor.h:
Code:
#ifndef _QUADROTOR_H_
#define _QUADROTOR_H_

#include <Servo.h>
#include <Arduino.h>

/* Change this values if another range of
** work is wanted. Keep in mind that this
** values are MAX and MIN, so bigger or
** lower values for speed in the main program
** will result in errors while flying!!!
*/
#define MAX_SIGNAL 2000
#define MIN_SIGNAL 800


class QUADROTOR {

public:
QUADROTOR();
QUADROTOR(int Left_Front_M_pin, int Right_Front_M_pin, int Left_Back_M_pin, int Right_Back_M_pin);
void configureESC(int ESC_pin);
void configureAllESC();
void initiate();
void takeOff();
void land();
void updateSpeeds(int speed_M1, int speed_M2, int speed_M3, int speed_M4);

private:
int _Left_Front_M_pin;
int _Right_Front_M_pin;
int _Left_Back_M_pin;
int _Right_Back_M_pin;
int _pin;
Servo _ESC;
Servo _Left_Front_M;
Servo _Right_Front_M;
Servo _Left_Back_M;
Servo _Right_Back_M;

};

#endif

Program:
Code:
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
#include "Quadrotor.h"
#include "Servo.h"


MPU6050 accelgyro;

int16_t ax, ay, az;
float axf, ayf, azf;

int speed_M1;
int speed_M2;
int speed_M3;
int speed_M4;
//{FL, FR, BL, BR} refer to the schematics at top
QUADROTOR Quadcopter;

void setup()
{
    Wire.begin();
    Serial.begin(38400);

    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
   
    Serial.println("Updating internal sensor offsets...");
    accelgyro.setXAccelOffset(-1480);
    accelgyro.setYAccelOffset(-310);
    accelgyro.setZAccelOffset(1300);
    Serial.println("Offsets updated. Press a key to continue");
    delay(100);
    Quadcopter.configureAllESC();
    Quadcopter.initiate();
}

void loop()
{
    accelgyro.getAcceleration(&ax, &ay, &az);
    axf = (float)ax;
    ayf = (float)ay;
    azf = (float)az;
    accel_conversion(&axf, &ayf, &azf);
   
    speed_M1 = 1000 - ayf*20; // - pitch*Pp + roll*Pr
    speed_M2 = 1000 - axf*20; // - pitch*Pp - roll*Pr
    speed_M3 = 1000 + axf*20; // + pitch*Pp + roll*Pr
    speed_M4 = 1000 + ayf*20; // + pitch*Pp - roll*Pr

    Serial.print("Motor 1: ");
    Serial.print(speed_M1);
    Serial.print(" Motor 2: ");
    Serial.print(speed_M2);
    Serial.print(" Motor 3: ");
    Serial.print(speed_M3);
    Serial.print(" Motor 4: ");
    Serial.println(speed_M4);
    Serial.print("ax: ");
    Serial.print(axf);
    Serial.print(" ay: ");
    Serial.println(ayf);
    Quadcopter.updateSpeeds(speed_M1, speed_M2, speed_M3, speed_M4);
}

void accel_conversion(float* x, float* y, float* z)
{
    *x = *x/16384.0;
    *y = *y/16384.0;
    *z = *z/16384.0;
}
(I know all can be optimized, but first I want to have the library working good...)

It all compiles and uploads greatly, but when the loop starts, suddenly the Motor goes up to max speed and turns off.

Is there any conflict within the libraries?? I'm stucked here  smiley-confuse
13  International / Software / Re: complemento a uno de un puerto on: November 25, 2013, 05:23:11 pm
Si, es por eso que he dicho que se puede optimizar, y mucho.

Si solo quiere hacer eso mejor ponerlo directamente (como tu has dicho), pero no se si querrá hacer algo más. Por eso la función.

Pero si lo que quiere es únicamente hacer el complemento a 1, no hace falta función.
14  International / Software / Re: complemento a uno de un puerto on: November 25, 2013, 01:30:08 pm
Yo haría algo como:

Code:
byte complemento_a_1(byte valor)
{
    byte valor_C1;
    valor_C1 = ~valor;
    return (valor_C1);
}

Se puede optimizar, y mucho, pero primero mira a ver si funciona, y luego miramos de optimizarlo, porque puedes hacerlo directamente sin la funcion, pasandole el parámetro al puerto.

Saludos!
15  International / Software / Re: complemento a uno de un puerto on: November 24, 2013, 06:53:38 am
Te lo he puesto en pseudocódigo. Tendrías que buscar como hacer esa función (más bien, es un operador, igual que sumar o restar).

Como pista te puedo decir que es un solo carácter, no una función en si. En la web de "Arduino" puedes encontrarlo. Busca un poco, sino postea de nuevo y te lo digo, pero así también buscas y tal vez encuentres algo más que te ayude!  smiley

Saludos
Pages: [1] 2 3