Go Down

Topic: Cargué este código en mi Arduino Micro y ahora la pc no lo reconoce. (Read 330 times) previous topic - next topic

mat885

Buenas, estoy realizando un proyecto para la facultad, el mismo tiene como componentes un mpu6050, arduino micro, un sensor de presión conectado con un hx711. Todo esto es para un mouse que se mueve con la cabeza y el click lo haces soplando. El código inicial andaba bien, el problema surgió cuando quise convertir todo en un objeto. Creé el objeto, compilaba bien, pero cuando la cargue al Arduino este dejó de ser reconocido para la Pc, ahora lo conecto y no hace ni el ruido de cuando se conecta un periférico USB.

Les adjunto el código a ver si alguien me puede guiar en cual puede ser el problema

Maux.ino

Code: [Select]

#include "Maux.h"

Maux maux;

void setup(){}

void loop() {
maux.click();
maux.move();
}


Maux.h

Code: [Select]

#define hx711_data_pin  4
#define  hx711_clock_pin  5
#include <Q2HX711.h>
#include <MPU6050.h>
#include <Wire.h>
#include <I2Cdev.h>
#include <Mouse.h>



class Maux{
 private:
MPU6050 mpu;
Q2HX711 hx711=Q2HX711(hx711_data_pin,hx711_clock_pin);
float valor1;
float valor_anterior=1000;
float tara1;
int16_t ax, ay, az, gx, gy, gz;
int vx=0, vy=0;
unsigned long tiempoEnvio=0;
unsigned long tiempo=0;
long count=0;
boolean clickeado=false;
boolean dobleclick = false;

public:
Maux();
void move();
void click();
};


Maux.cpp

Code: [Select]

#include "Maux.h"

Maux::Maux()
{
    Serial.begin(115200);
    Wire.begin();
    mpu.initialize();
    if (!mpu.testConnection())
    {
        while (1)
            ;
    }

    for (byte y = 0; y < 10; y++)
    {
        valor1 = valor1 + hx711.read();
    }
    tara1 = valor1 / 50;

    valor1 = 0;
    Mouse.begin();
}

void Maux::click()
{
    //for ( byte y = 0; y < 1; y++){
    valor1 = valor1 + hx711.read();
    //}
    //valor1=valor1/1;
    valor1 = (valor1 - tara1) / 223;

    //Serial.print("presion=");
    //Serial.print(valor1,1);
    //Serial.println(" Pas");
    if (valor1 - valor_anterior > 20 && dobleclick == false)
    {
        //Mouse.click(MOUSE_RIGHT);
        Mouse.click();
        Mouse.click();
        clickeado = true;
        dobleclick = true;
        valor_anterior = valor1;
    }
    if (valor1 - valor_anterior > 2 && clickeado == false)
    {
        digitalWrite(LED_BUILTIN, HIGH);
        //Serial.print("Valor click: ");
        //Serial.println(valor1);
        clickeado = true;
        Mouse.press();
        //delay(10);
    }
    else if (valor1 - valor_anterior < 2 && clickeado == true)
    {
        digitalWrite(LED_BUILTIN, LOW);

        clickeado = false;
        if (dobleclick == true)
        {
            dobleclick = false;
        }

        Mouse.release();
    }
    //Serial.print("Valor click: ");
    //Serial.println(valor1);
    /*Serial.println("Valor1 = ");
      Serial.println(valor1);*/
    if (clickeado == true)
    {
        valor_anterior = valor_anterior;
        Serial.print("Valor1 = ");
        Serial.println(valor1 - valor_anterior);
    }
    else
    {
        valor_anterior = valor1;
        Serial.print("Valor2 = ");
        Serial.println(valor1 - valor_anterior);
    }

    valor1 = 0;
}

void Maux::move()
{
    //x, &ay, &az, &gx, &gy, &gz);
    mpu.getRotation(&gx, &gy, &gz);
    vx += -3 * ((gx - 450) / 150); // "+300" because the x axis of gyroscope give values about -350 while it's not moving. Change this value if you get something different using the TEST code, chacking if there are values far from zero.
    vy += 3 * ((gz + 150) / 150);  // same here about "-100"
    count++;

    //click();

    Serial.print(gx);
    Serial.print(',');
    Serial.println(gz);

    if (millis() - tiempoEnvio > 1)
    { //mpu.getMotion6(&a

        if (vx / count < 100 || vx / count > -100 || vx / count > 20 || vx / count < -20 || vy / count > 20 || vy / count < 100 || vy / count > -100 || vy / count < -20)
        {
            //if(vx/count>20||vx/count<-20||vy/count>20||vy/count<-20 ){
            /*Serial.print(vx/count);
Serial.print(',');
Serial.print(vy/count);
Serial.print(',');
Serial.println(0);*/
            tiempoEnvio = millis();
            Mouse.move(vx / count, vy / count);
            count = 0;
            vx = 0;
            vy = 0;
            //valor1=0;
        }
        else
        {
            Mouse.move(0, 0);
        }
    }
}


Nuevamente. Si ese código lo pongo en el archivo .ino anda. El problema fue cuando lo convertí en objeto.

Bueno, espero que me puedan ayudar. Saludos.

surbyte

Y forma parte de tu tarea que crees una librería con todo embebido?

mat885


surbyte

Bueno. Esperá a que alguien mas experimentando en el tema clases te responda. Yo puedo hacerlo poniéndole tiempo, pero ultimamente prefiero si no es mi tema no respondo.

Tu problema lo resolvería fácilmente sin el uso de lo que has armado. Con librerías standard todo funciona bien.



mat885

Sí, no te hagas drama, posteé esto para ver si me podía sacar la duda, nomas.

De todas formas, estuve indagando con un Arduino Nano y probé ejecutar Serial.begin() en el constructor y no se ejecutaba. Sólo se ejecuta si lo haces de void setup().

Asumo que deben ser cuestiones de compatibilidad con la librería de Arduino.

mat885

Porque dejó de ser detectado por la pc en el segundo después de haberle cargado ese código. Además después probé algo parecido en un Arduino Nano, y si bien siguió detectándolo la pc, el micro se bloqueó, dejó de ejecutarse el loop.

surbyte

Tu código esta mal pero como te dije si tomas las librerías por separado seguramente funcionará sin problemas, así que la falla esta en la implementación de la clase casi con seguridad.

Si tuviera tu hardware haría la prueba pero como no lo tengo, es dificil sugerirte algo.

mat885

Sí, es exactamente como vos decís, porque andaba perfecto antes de convertir todo a un objeto.

Por eso, este post es más que nada para poder sacarme la duda de qué está mal. Y de paso si le sirve a alguien para que no cometa el mismo error.

surbyte

Bien, entonces aclarado el punto veamos que le pasa.
Pero entonces aporta bien los enlaces de cada librería que usas porque para repeetir tu caso tenemos que tener todos los enlaces . (usa etiquetas por favor).

PeterKantTropus

En el tema de clases toco de oído, pero me parece que el problema está en


Code: [Select]
class Maux{
 private:
MPU6050 mpu


Estas creando una instancia  de MPU6050, cuando lo correcto sería heredar Maux de MPU6050.
Saludos
"Si no entra como tornillo, entra como clavo"

mat885

En el tema de clases toco de oído, pero me parece que el problema está en


Code: [Select]
class Maux{
 private:
MPU6050 mpu


Estas creando una instancia  de MPU6050, cuando lo correcto sería heredar Maux de MPU6050.
Saludos
No, no es ese el problema. Pero gracias por el aporte.

Hago un breve resumen de la situación actual:

Agarré un Arduino Uno que tenía, lo usé como programador del Arduino Micro y volví a cargar el bootloader y con eso anduvo el micro.

En el código, en vez de iniciar todo desde el constructor del objeto ahora lo hago desde un método que se ejecuta en void setup. Cargué ese código y anduvo perfecto.

mat885

Quote
Pero entonces aporta bien los enlaces de cada librería que usas porque para repeetir tu caso tenemos que tener todos los enlaces .
La librería Q2HX711.h la bajé desde el IDE de Arduino, la segunda que aparece.

https://github.com/queuetue/Q2-HX711-Arduino-Library


I2Cdev y MPU6050 son estas, hay que entrar en la parte de Arduino y está todo:

https://github.com/jrowberg/i2cdevlib

Y las librerías Mouse.h y Wire.h vienen por defecto con el IDE.

Go Up