Show Posts
Pages: 1 [2] 3 4 ... 150
16  International / Software / Re: lentezza, sarà il kalman o la seriale? on: September 26, 2013, 04:02:16 pm
Hai scritto un papiro che non mi andava di leggere  smiley-wink
Di sicuro i calcoli in virgola mobile non sono il forte di Arduino. Se poi ci metti anche le divisioni allora fai l'en-plain.  smiley-wink

Però puoi fare una prova empirica molto semplice. Prima dei calcoli salvi il valore dei millisecondi, dopo i calcoli rileggi millis. La differenza fra i 2 valori ti da il tempo impiegato per il calcolo.


ho già una variabile che dovrebbe permette il campionamento ad una determinata velocità (ad ora usa un delay che è la peggio cosa lo so..)  per cercare di tenerlo costante il più possibile.
lo so che ho scritto un papiro ma volevo essere esaustivo  smiley-lol

comunque in effetti quella è la parte dura ma non ho mai visto multiwii andare così lento.

piuttosto che tu sappia passando a delay() un valore negativo cosa succede? ora provo a stampare la durata del ciclo...

ok testando il ciclo in se dura 4-5ms poi causa delay vengono misurati 99-100ms, cosa giusta perchè ho impostato il timeStep (ovvero il tempo tra un campionamento e l'altro) di 0,1 secondi.. provo a ridurre questo di un decimo e verifico...
17  International / Software / lentezza, sarà il kalman o la seriale? on: September 26, 2013, 03:45:29 pm
ciao a tutti dopo molto tempo torno a farvi compagnia con un solito problema  smiley-razz

spiegazione, il tutto è per un progetto di maturità mooooolto complesso (ma ho professori che mi aiutano sulla parte matematica su cui ho più difficoltà) che non girerà su arduino ma su un arm stm32f4 (e mi direte che cavolo chiedi qui allora?)
siccome il progetto vorrei integrarlo con una ricerca per comodità volevo dividere le varie parti e "testarle" su arduino (almeno la parte sensoristica) per poi migrare sull'altra piattaforma (ma potrei anche pensare ad un'arduino due).

tanto per capirci questo progetto integrerà al suo interno filtri di sensori, sensor fusion, algoritmi pid, geometria sferica (e siccome mi servono dei tipi di dati double arduino non è assolutamente indicato, ovvio non mi riferisco alla due) e misurazione inerziale. Credo che gente come astro e lesto abbiano già capito il mio progetto  smiley-razz
siccome non ho voglia di inventare acqua calda ho ripreso dei vari spezzoni di codice in giro e sto usando delle librerie per arduino reperibili in internet giusto per verificare in linea di massima la fattibilità del progetto quindi direi che l'80% del codice che posterò non è lavoro mio ma solo un minimo adattamento.

ora il vero problema:
allo stato attuale sto usando una imu con itg3200 e adxl345 (avrei anche magnetometro hmc5883 sulla imu ma per ora è inutilizzato) e ho trovato un extended kalman che mi permette di fare filtraggio e sensor fusion, così cercando di capire un minimo di teoria (me lo sto studiando ma con abbastanza calma perchè mi pare abbastanza complesso) sono riuscito ad ottenere l'angolo in gradi dell'inclinazione sull'asse x e y.
fin qui nulla di strano.
ho voluto aggiungere un servo, inizialmente volevo usare il pid per comandarlo ma siccome per ora avevo fretta di vedere muoversi qualcosa oltre ad un'onda sul monitor ho deciso di usare un'equazione molto semplice che più o meno si comporta come voglio.

ora il tutto si comporta come voglio ma... lentamente... ovvero passa anche un secondo da quando muovo la imu a quando il servo si sposta e ho lo stesso feedback su monitor seriale.
allego il codice:
Code:
// Include the Wire library so we can start using I2C.
#include <Wire.h>
#include <Servo.h>

Servo servo;  // create servo object to control a servo

// integration variables
int gyroResult[3], accelResult[3];
float movimento[] = {0, 0, 0}; // x, y, z
float velocita[] = {0, 0, 0};

// kalman variables
float timeStep = 0.1;
float biasGyroX, biasGyroY, biasGyroZ, biasAccelX, biasAccelY, biasAccelZ;
float pitchGyro = 0;
float pitchAccel = 0;
float pitchPrediction = 0; //Output of Kalman filter
float rollGyro = 0;
float rollAccel = 0;
double rollPrediction = 0;  //Output of Kalman filter
float giroVar = 0.1;
float deltaGiroVar = 0.1;
float accelVar = 5;
float Pxx = 0.1; // angle variance
float Pvv = 0.1; // angle change rate variance
float Pxv = 0.1; // angle and angle change rate covariance
float kx, kv;
unsigned long timer;

void setup() {
  int totalGyroXValues = 0;
  int totalGyroYValues = 0;
  int totalGyroZValues = 0;
  int totalAccelXValues = 0;
  int totalAccelYValues = 0;
  int totalAccelZValues = 0;
  int i;
 
  delay(2000);
 
  Serial.begin(115200);
//  Serial.println("inizio programma....");
  Wire.begin();
 // Serial.println("I2C inizializzato");
  servo.attach(9);
 
 // Serial.println("inizializzato, inizio loop...");
  writeTo(0x53,0x31,0x09); //Set accelerometer to 11bit, +/-4g
  writeTo(0x53,0x2D,0x08); //Set accelerometer to measure mode
  writeTo(0x68,0x16,0x1A); //Set gyro to +/-2000deg/sec and 98Hz low pass filter
  writeTo(0x68,0x15,0x09); //Set gyro to 100Hz sample rate
 
 
  // Determine zero bias for all axes of both sensors by averaging 50 measurements
  delay(100); //wait for gyro to "spin" up
  for (i = 0; i < 50; i += 1) {
    getGyroscopeReadings(gyroResult);
    getAccelerometerReadings(accelResult);
    totalGyroXValues += gyroResult[0];
    totalGyroYValues += gyroResult[1];
    totalGyroZValues += gyroResult[2];
    totalAccelXValues += accelResult[0];
    totalAccelYValues += accelResult[1];
    totalAccelZValues += accelResult[2];
    delay(50);
  }
  biasGyroX = totalGyroXValues / 50;
  biasGyroY = totalGyroYValues / 50;
  biasGyroZ = totalGyroZValues / 50;
  biasAccelX = totalAccelXValues / 50;
  biasAccelY = totalAccelYValues / 50;
  biasAccelZ = (totalAccelZValues / 50) - 256; //Don't compensate gravity away! We would all (float)!
 
}

void loop() { 
  timer = millis(); //get a start value to determine the time the loop takes
  getGyroscopeReadings(gyroResult);
  getAccelerometerReadings(accelResult);
 
  pitchAccel = atan2((accelResult[1] - biasAccelY) / 256, (accelResult[2] - biasAccelZ) / 256) * 360.0 / (2*PI);
  pitchGyro = pitchGyro + ((gyroResult[0] - biasGyroX) / 14.375) * timeStep;
  pitchPrediction = pitchPrediction + ((gyroResult[0] - biasGyroX) / 14.375) * timeStep;
 
  rollAccel = atan2((accelResult[0] - biasAccelX) / 256, (accelResult[2] - biasAccelZ) / 256) * 360.0 / (2*PI);
  rollGyro = rollGyro - ((gyroResult[1] - biasGyroY) / 14.375) * timeStep;
  rollPrediction = rollPrediction - ((gyroResult[1] - biasGyroY) / 14.375) * timeStep;
 
  Pxx += timeStep * (2 * Pxv + timeStep * Pvv);
  Pxv += timeStep * Pvv;
  Pxx += timeStep * giroVar;
  Pvv += timeStep * deltaGiroVar;
  kx = Pxx * (1 / (Pxx + accelVar));
  kv = Pxv * (1 / (Pxx + accelVar));
 
  pitchPrediction += (pitchAccel - pitchPrediction) * kx;
  rollPrediction += (rollAccel - rollPrediction) * kx;
 
  Pxx *= (1 - kx);
  Pxv *= (1 - kx);
  Pvv -= kv * Pxv;
 
  if(rollPrediction <= 0) {  servo.write(90+((rollPrediction/(sqrt(-1*rollPrediction)+rollPrediction)+0.1))*rollPrediction);
  Serial.println(90+((rollPrediction/(sqrt(-1*rollPrediction)+rollPrediction)+0.1))*rollPrediction);
  }
  else { servo.write(90+((rollPrediction/(sqrt(rollPrediction)+rollPrediction)+0.1))*rollPrediction); Serial.println(90+((rollPrediction/(sqrt(rollPrediction)+rollPrediction)+0.1))*rollPrediction); }
 
  timer = millis() - timer;
  timer = (timeStep * 1000) - timer;
  delay(timer);
 
}
credo che la "lag" sia imputabile alla riga
Code:
  if(rollPrediction <= 0) {  servo.write(90+((rollPrediction/(sqrt(-1*rollPrediction)+rollPrediction)+0.1))*rollPrediction);
  Serial.println(90+((rollPrediction/(sqrt(-1*rollPrediction)+rollPrediction)+0.1))*rollPrediction);
  }
  else { servo.write(90+((rollPrediction/(sqrt(rollPrediction)+rollPrediction)+0.1))*rollPrediction); Serial.println(90+((rollPrediction/(sqrt(rollPrediction)+rollPrediction)+0.1))*rollPrediction); }
 

per completezza metto anche l'altra scheda che si include automaticamente nell'ide che contiene le funzioni di lettura dell'accelerometro e giroscopio
Code:
//Function for writing a byte to an address on an I2C device
void writeTo(byte device, byte toAddress, byte val) {
  Wire.beginTransmission(device); 
  Wire.write(toAddress);       
  Wire.write(val);       
  Wire.endTransmission();
}

//Function for reading num bytes from addresses on an I2C device
void readFrom(byte device, byte fromAddress, int num, byte result[]) {
  Wire.beginTransmission(device);
  Wire.write(fromAddress);
  Wire.endTransmission();
  Wire.requestFrom((int)device, num);
  int i = 0;
  while(Wire.available()) {
    result[i] = Wire.read();
    i++;
  }
}

//Function for reading the gyros.
void getGyroscopeReadings(int gyroResult[]) {
  byte buffer[6];
  readFrom(0x68,0x1D,6,buffer);
  gyroResult[0] = (((int)buffer[0]) << 8 ) | buffer[1]; //Combine two bytes into one int
  gyroResult[1] = (((int)buffer[2]) << 8 ) | buffer[3];
  gyroResult[2] = (((int)buffer[4]) << 8 ) | buffer[5];
}

//Function for reading the accelerometers
void getAccelerometerReadings(int accelResult[]) {
  byte buffer[6];
  readFrom(0x53,0x32,6,buffer);
  accelResult[0] = (((int)buffer[1]) << 8 ) | buffer[0]; //Yes, byte order different from gyros'
  accelResult[1] = (((int)buffer[3]) << 8 ) | buffer[2];
  accelResult[2] = (((int)buffer[5]) << 8 ) | buffer[4];
}

il mio dubbio è:
l'equazione (esecuzione della radice quadrata in particolar modo ed il fatto che siccome ad ora l'ottimizzazione non mi importa è scritta "doppia") è troppo pesante per arduino oppure la scrittura seriale non è abbastanza veloce?
il filtro di kalman potrebbe essere una delle cause?
potrebbe essere una concatenazione di tutto? però io ho un quadricottero con multiwii e non mi pare affatto così "laggoso"

grazie a tutti quelli che mi aiutano  smiley-razz
buonanotte  smiley-sleep

P.S.: visto che ormai ho rotto rompo fino in fondo smiley-lol qualcuno potrebbe spiegarmi in termini mortali come poter estendere il kalman anche per l'asse di yaw magari anche linkando esempi? ho capito che devo usare il magnetometro. infine quanto può influire l'oscillazione sull'accelerazione letta dall'accelerometro sull'asse z (quello che punta verso l'alto) sulla predizione? ho letto che per brevi oscillazioni non influisce molto ma siccome il sistema sarà in costante movimento anche verticale come posso risolvere?
grazie a tutti
18  International / Generale / Re: scuola.arduino.cc on: August 29, 2013, 06:33:37 am
ho frequentato i primi 2 anni di superiori in un iti "elettrotecnica ed automazione applicata alla sicurezza sui luoghi di lavoro", ho conosciuto per caso un professore del triennio di una materia di laboratorio (se non sbaglio teconolgia disegno e progettazione, ovvero TDP) in quanto il figlio fa allenamento di tiro con l'arco con me.
l'ho fatto avvicinare ad arduino ed è riuscito a far comprare alla scuola 3 starter kit con arduino UNO che però come vanno a programmare? tramite software di editing visuale (tipo max msp o matlab, non ricordo esattamente che software usano) che potrebbe aver senso per una mcu che supporti il debug hardware ma un arduino non ha queste possibilità, insomma si sta retogredendo a mio avviso...
19  International / Hardware / Re: Espruino on: August 28, 2013, 01:20:54 pm
per me perderesti tutto:
java è un linguaggio da compilare per il computer, così come il C, l'assembly (anche se in realtà più che una compilazione è una traduzione come ha detto astro), il c++ ecc...
mentre linguaggi quali l'html, javascript e css sono interpretati.
20  International / Generale / Re: mixer midi on: August 08, 2013, 02:47:39 pm
Tu con Arduino puoi creare un controller ovvero invia i comandi a un pc con un software quale mixxx, traktor, ableton, serato, logic ecc poi è il software che fa la miscelazione audio. Puoi usare ableton e mappare gli ingressi dalla scheda audio così come con traktor ma non puoi far fare ad Arduino il compito di una scheda audio, Arduino può funzionare come un ddm4000 ovvero se attacchi un cavo midi controlli il pc ma non trasferisce il suono
21  International / Generale / Re: L'Arduino Leonardo con la tastiera.... on: August 01, 2013, 06:19:48 am
Metti 5 secondi di delay come prima istruzione e carica lo sketch in quei 5 secondi
22  International / Generale / Re: . on: July 23, 2013, 06:29:06 pm
Quote
(in realtà credo che anche così ne esistano pochi e lo hanno 2 aziende in tutto il mondo, credo google e la nasa  smiley-lol )
Sei sicuro che non ti é scapata una A di troppo? NASA o NSA???
Ciao Uwe
tutte e due anche, il processore che cito è l'intel e7-8870 e supporta configurazioni fino a 8 cpu su singola scheda madre (con opportuni chipset che non credo verranno mai rilasciati) e quindi 4096GB di ram e poi dischi in raid per non fare da collo di bottiglia ovviamente...
23  International / Generale / Re: . on: July 23, 2013, 01:20:18 pm
ma dai, basta saper un minimo di programmazione per riconoscere i limiti di arduino  smiley-mr-green
8bit dovrebbe far ragionare la gente  :smiley-mr-green:n:

La gente non si rende conto di cosa sono 8 Bit. Hanno nella tasca un telefonino che fa tutto velocemente e a colori. Non sono consapevoli che quello é un computer con 32 bit quasi 1GHz e qualche GByte di RAM / ROM.
Un Arduino a 8Bit, 16Mhz, 2kB Ram e 32 KB ROM non puó competere.

Comunque il PC della IBM (IBM 5150) era un 8088 a 8 Bit con 4,77Mhz e 16kB di RAM http://it.wikipedia.org/wiki/PC_IBM

Ciao Uwe
correzione uwe, i telefonini di adesso sonno quad core (stanno uscendo gli octo) con 2gb di ram, almeno 8gb di rom, clock a 1.7GHz (ma anche a 2.1) e un sistema operativo vero e proprio che succhia risorse installato (non perchè kernel linux ma perchè almeno android emulando una jvm perde davvero molto.. peccato)  smiley-lol

Con una fuga di notizie stile Datagate/Wikileaks, sono venuto a conoscenza che dopo l'Arduino Yun verrà messo in produzione l'Arduino Gund.  smiley-mr-green smiley-mr-green
Monterà un decacore 64bit a 5GHz, 32Gb di Ram e una flash NAND da 1TB per lo sketch.  smiley-eek-blue
esistono già si chiamano server professionali che hanno 20 thread per processore a 2.8GHz e 512GB di ram... ah e i dischi sono dei sas da 15000 rpm messi in raid (per una macchina simile direi raid 100 circa 12 dischi da 2tb l'uno  smiley-lol

(in realtà credo che anche così ne esistano pochi e lo hanno 2 aziende in tutto il mondo, credo google e la nasa  smiley-lol )


purtroppo in effetti le capacità di arduino (anche due) sono limitate per questo progetto, anche microsoft sta abbandonando il supporto al riconoscimento e comando vocale su pc per portarlo unicamente su console (processore 8 core e 8gb di ram ddr5 che dicono arriverà a 12gb in più tutta la parte di gestione grafica è separata ed affidata ad una scheda video così come l'audio) con un supporto hardware in più esterno...
ora uscirà arduino one4  smiley-lol
24  International / Generale / Re: Consiglio per scrivere una guida on: July 18, 2013, 01:39:49 pm
lo so avevo detto che avrei fatto prima questo post purtroppo il lavoro porta via più tempo di quello che dovrebbe e il tempo libero lo passo in giro con amici, poi settimana prossima verrà qui ratto con amici e devo farli divertire quindi questa guida si terminerà FORSE a settembre  smiley-sad

per ora posto la v0.0.p.alpha  smiley-lol per nulla completa anzi... manca tutta la parte programmazione ed elettronica.

La guida (scusa leo smiley-lol ) è fatta sotto windows se qualcuno volesse farla per linux (la parte di driver, problematica permessi tty/USB, ecc) ne sarei davvero grato, così per mac.

allego il file scaricabile dalla mia cartella dropbox  smiley-razz

se ci sono modifiche da fare, integrazioni, ho sbagliato completamente a scrivere qualcosa ditemelo anche se è solo un dubbio su una supposizione poi mi spulcerò io forum e siti vari per verificare la cosa (quindi non abusate di questa possibilità che non ho tempo infinito  smiley-lol )

https://www.dropbox.com/s/cyjq2j36hm3fwov/guida%20arduino%20V0.0.p.alpha.pdf
ah i collegamenti dell'indice sono sbagliati e non funzionano a dovere!

Grazie a tutti!
25  International / Hardware / Re: Qualche domanda sui quadricotteri on: July 16, 2013, 08:03:14 am
http://vrbrain.wordpress.com/ spingo su questa perché l'ho seguita molto ultimamente.

Motori ricorda che più sono grossi più consumano comunque se vuoi prendili anche più grandi.
http://www.ecalc.ch/xcoptercalc.htm segui questo
26  International / Hardware / Re: Qualche domanda sui quadricotteri on: July 15, 2013, 04:46:31 pm
Schede di controllo o la mikrokopter, o la naza v2 (evita la m e la lite) oppure la vrbrain sviluppata dal team di redfox (che ogni tanto passa di qui)
Le altre te le sconsiglio (per il tuo lavoro intendo)
Prendi un esa pronto della dji per quanto riguarda frame gici ecc

I prezzi comunque si riferiscono a modelli diversi con utilità diverse. Quello da 11000€ include 2 radiocomandi da 700€ l'uno ed ha datalink gimbal ecc.
Vedi anche su mj hanno gli stessi prodotti.

Io prenderei frame del x650-6-950 (450€) poi motori t-motor ms2216-11 (26 l'uno), regolatori t-motor da 30A (26€ l'uno) scheda vrbrain con GPS 200€ radio hitec aurora 9 (350€) poi gimbal e datalink a piacere e batterie 3s da 4000mAh (2 tanto hai payload, 50€ l'una circa) ed eliche 10x4.5 o 11x5.5
Totale sui 1200-1300 senza gimbal direi però è un mezzo perfetto e sicuro.
Concordate con me astro e lesto?
27  International / Hardware / Re: Qualche domanda sui quadricotteri on: July 15, 2013, 12:04:27 pm
Quel prodotto linkato da astro è nella categoria fly for fun e non è molto indicato a fare riprese video.
Se mi dici ti attacco una gopro per fare 2 acrobazie e filmarlo è un conto ma lui ha specificato che la videocamera deve avere anche lo zoom remoto che nessuna action camera o key camera possiede.

Gli serve quindi una minima telecamerina che pesa almeno 500gr che sicuramente quel quadri non può portare (almeno non in sicurezza)
28  International / Generale / Re: Consiglio Acquisto on: July 14, 2013, 04:56:32 pm
caccia, quindi il dispositivo deve durare una decina di ore senza ricarica (se tuo padre va a caccia più a lungo dura più del mio  smiley-razz )
quindi una betteria bella grande visto che il gps consuma molto e ti serviranno arduino+gsm shield+gps+batteria.
18€ di arduino (leonardo)+70€ gsm shield+40€ modulo GPS e direi che per tenere una buona autonomia direi 40€ di batteria.
insomma così ad occhio 170€  smiley-lol
ti conviene comprare uno di quegli smartphone da pochi soldi e usare quello oppure dei sistemi già fatti e funzionanti, ne esistono a palate e spendi meno che fartelo da te. un esempio è http://www.pawtrax.co.uk/main/ che è anche impermeabile ecc (e i cani da caccia trovano più acuqa che animali, almeno il mio fa così smiley-grin )
29  International / Generale / Re: Consiglio per scrivere una guida on: July 14, 2013, 03:49:06 pm
allora ciò che vorrei fare è una guida allo startup con arduino ovvero come si programma di base in C (e per questo sto dando ripetizioni ad un conoscente di C "puro" e capisco circa dove si incaglia), le basi di elettronica al lato pratico ovvero cos'è un collegamento in serie ed uno in parallelo e cosa comporta.
Non gli spiego che un certo kirkhoff o come si scrive tempo fa scrisse che "in un nodo la somma delle correnti entranti è uguale alla somma delle correnti uscenti" ma semplicemente che in parallelo si sommano le correnti ed in serie si sommano le tensioni (la minimalizzo insomma).

Riguardo ai vari modi di raggirare le cose io cercherò di metterne il più possibile però fin dove mi spingono le mie conoscenze, per me la scheda ethernet è un mondo lontanissimo (o quasi) però se mi chiedi di comandarti un display 20x4 tempo fa feci prove con i2c, shift register e collegando direttamente. Però essendo la guida rivolta a chi comincia non importa sapere come si comanda ogni pin dell'interfaccia parallela a cosa serve l'enable il read/write ecc.. semplicemente gli si fa scaricare la libreria e gli si insegna ad usare quella, se poi un giorno vorrà approfondire avrà le basi per poterlo fare.

La maggior parte di ciò che sto scrivendo comunque è un'elaborazione più testuale e generalizzata dei consigli che si danno sul forum come il concatenamento di caratteri in arrivo dalla seriale.
Se un giorno arriverà sul forum e il consiglio sarà "crea un ciclo che ti permetta di mettere tutto in un array" spero che questa guida gli spieghi cosa vuol dire.

comunque grazie Michele appena la terminerò ti farò volentieri leggere purchè tu sia il più critico possibilie  smiley-lol

Comunque non vi aspettate che la finisca domani, ho scritto fin'ora solo 12 pagine ma credo che a guida finita si supereranno le 100. Poi con la nipotina (figlia di mio fratello) nata stanotte e il lavoro estivo inzio a risicare di tempo anche io  smiley-lol

comunque vorrei fare una guida collettiva:
rilascero delle versioni beta che vorrei tutti controllassero perchè non forrei scrivere castronate (nessuno sa tutto).
La prima beta quando scriverò la parte relativa al serial monitor (finendo una volta per tutte l'ide) quindi credo che per domani o martedì potrei avere la versione 0.alpha
30  International / Generale / Re: Consiglio per scrivere una guida on: July 14, 2013, 12:48:02 pm
io invece supporto Alberto perchè in fondo avevate le preview  smiley-lol

il fatto è che un malloppone di svariate pagine potrebbe essere più servibile se diviso.
ad esempio le nozioni di programmazione da come funziona l'ide possono stare separate anche se in fondo una lega l'altra.

comunque in effetti ho già scritto abbastanza "che vedremo in dettaglio più avanti nella parte xy" per poter dividerlo  smiley-lol
Pages: 1 [2] 3 4 ... 150