Gyro Camera

Buongiorno a tutti , mi chiamo Stefano , mi avvicino ad Arduino per la prima volta , quindi abbiate pazienza.

Dovrei fare uno stabilizzatore ad un asse per mettere la telecamera sulla moto ,

utilizzo Arduino nano + gy 521 + un servo , ho trovato e provato varie soluzioni ma non sono abbastanza

fluide , allego un files che sembra bello ma non riesco ad installarlo troppi errori .

Qualcuno può aiutarmi e dare dei consigli .

Grazie a tutti .

Gyro Camera.txt (3.85 KB)

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Ho idea che hai avuto problemi di copia/incolla dal sito dove hai preso il codice ...
... guardalo, ci sono strani caratteri invalidi, es:

#include ìKalman.hî

... li, chiaramente, nel copia/incolla, < e > sono diventati i due caratteri che vedi.

In tale condizioni è ovvio che il compilatore ti dia errore.

Verifica bene tutto il codice, togli le porcherie, installa le necessaie librerie e riprova.

Guglielmo

Prima di tutto grazie di avermi risposto , mi ero accorto di alcuni caratteri che non erano giusti per la

programmazione , ma sono errati anche nel sito.

A me li da' giusti..

non è che ti sei dimenticato di installare la libreria Kalman ?

Anche io sul sito li vedo giusti ... devi avere qualche impostazione del browser errata ...

/*
  GYRO CAMERA - saft7.com

  Demonstrates auto-leveling Camera Video by using Gyro & Accelerometer with Arduino

  The circuit:
  Servo controlled by Arduino, using Gyro and Accelerometer as reference of movement.

  Created March 12, 2013
  by Firmansyah Saftari
  www.saft7.com

  This code and complete article can be found at:

  http://www.saft7.com/
 
  Programming Language: C++
 
  */


#include <Servo.h>
Servo xservo;

#include <Wire.h>
#include "Kalman.h"
Kalman kalmanX;
Kalman kalmanY;

uint8_t IMUAddress = 0x68; // MPU6050 Address

/* IMU Data */
int16_t accX;
int16_t accY;
int16_t accZ;
int16_t tempRaw;
int16_t gyroX;
int16_t gyroY;
int16_t gyroZ;

int moveX;
int mapX;
int correctionX;

double accXangle;
double accYangle;
double gyroXangle = 9;      
double gyroYangle = 180;
double compAngleX = 90;    
double compAngleY = 90;
double kalAngleX;
double kalAngleY;
uint32_t timer;

// ----------  VOID SETUP START -------------- /
void setup() { 
  Serial.begin(115200);
  xservo.attach(10);
  
  Wire.begin(); 
  i2cWrite(0x6B,0x00);           // Disable sleep mode 
  if(i2cRead(0x75,1)[0] != 0x68) {   // Read "WHO_AM_I" register
    Serial.print(F("MPU-6050 with address 0x"));
    Serial.print(IMUAddress,HEX);
    Serial.println(F(" is not connected"));
    while(1);
  }     
  kalmanX.setAngle(90);  // Set starting angle
  kalmanY.setAngle(90);
  timer = micros();
}

// ----------  VOID SETUP END -------------- /


// ---------------------- VOID LOOP START -------------- /
void loop() {
  /* Update all the values */
  uint8_t* data = i2cRead(0x3B,14); 
  accX = ((data[0] << 8) | data[1]);
  accY = ((data[2] << 8) | data[3]);
  accZ = ((data[4] << 8) | data[5]); 
  tempRaw = ((data[6] << 8) | data[7]); 
  gyroX = ((data[8] << 8) | data[9]);
  gyroY = ((data[10] << 8) | data[11]);
  gyroZ = ((data[12] << 8) | data[13]);
 
  /* Calculate the angls based on the different sensors and algorithm */
 
  accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;  
  accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;  
  double gyroXrate = (double)gyroX/131.0;
  double gyroYrate = -((double)gyroY/131.0); 
  gyroXangle += gyroXrate*((double)(micros()-timer)/1000000); // Calculate gyro angle without any filter 

  gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate
  compAngleX = (0.93*(compAngleX+(gyroXrate*(double)(micros()-timer)/1000000)))+(0.07*accXangle); // Calculate the angle using a Complimentary filter
 
  kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter
  timer = micros();
  mapX = map(kalAngleX, 0, 200, 0, 179);     //calculate limitation of servo mechanical
 
 
// /////////////////////////////

    correctionX = 27;     // EDIT THIS VALUE FOR SERVO CORRECTION ANGLE

// ////////////////////////////


  moveX = 270 - (kalAngleX) + correctionX;
 
// ------- SEND TO SERIAL PRINT START ----- /

  Serial.print("saft7.com X Pos: ");
  Serial.print(moveX);Serial.print("\t");
  Serial.print("\n");
 
// ------- SEND TO SERIAL PRINT END ----- / 



// ------- SEND TO SERVO START ----- /

   xservo.write(moveX);   // Send signal to servo
   delay(15);     // delay to allow servos to move (ms) 
  
// ------- SEND TO SERVO END ----- /


 
  delay(1); // The accelerometer's maximum samples rate is 1kHz
}
// ---------------------- VOID LOOP END -------------- /



// -- FUNCTIONS START --
void i2cWrite(uint8_t registerAddress, uint8_t data){
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.write(data);
  Wire.endTransmission();                       // Send stop
}

uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) {
  uint8_t data[nbytes]; 
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.endTransmission(false); // Don't release the bus
  Wire.requestFrom(IMUAddress, nbytes);   // Send a repeated start and then release the bus after reading
  for(uint8_t i = 0; i < nbytes; i++)
    data[i] = Wire.read();
  return data;
}
// -- FUNCTIONS END --

// GYROCAM BY SAFT7.COM //

// END

Guglielmo

Ho installato la libreria kalman , penso di aver fatto giusto , in allegato il primo errore , correggendo

#include “Kalman.h” con #include <Kalman.h> mi da altri errori.

Ti sei accorto che le virgolette di #include "Kalman.h" non sono quelle corrette.
Prova a riscriverle

Allora, come dicevo nel messaggio precedwnte , avevo corretto le virgolette mettendo minore e maggiore<>

"Kalman.h" modificando con <Kalman.h> ma poi ho provato con un altro pc con lo stesso listato che avevo

postato sopra e funziona tutto .

Se guardi il video la regolazione non funziona per niente.
Ciao Uwe

Buongiorno , si avevo visto , comunque provandolo sembra piu fluido del progetto

http://www.giuseppecaccavale.it/arduino/mpu-6050-gy-521-arduino-tutorial/

anche se non è il massimo , se avete idee o consigli tutto ben accetto .

Ripeto e non mi é ancora stato spiegato che sbaglio se vai in una curva con la moto Ti inclini in modo che la forza centrifuga sia controposta dalla parte vettoriale orizontale della forza gravizionale della moto/guidatore.
Il Acelerometro misura solo accelerazioni.
Se si prende informazioni dei gyro si puó misurare la variazione dell inclinazione ma é una misura inattendibile per tempi lunghi perche piccoli errori si sommano durante tutto il tempo di misura e diventano significanti.

Ciao Uwe

Ok grazie del chiarimento , mi interessava costruirlo artigianalmente , ma a questo punto compro lo

stabilizzatore bello e pronto .

Grazie a tutti.