Go Down

Topic: Official topic: multicotteri con arduino! (Read 358613 times) previous topic - next topic

lestofante

@flameman: superlol ha parlato di una discussione dove si è arrivati a delle stesse conclusioni. Ovvero: usare unix per la stabilizzazione impiega troppa latenza, e modificare il kernel porta vari possibili problemi di piantamento del sofware, che già è complesso di suo. Seguendo il ragionamento di "cio che non c'è non si può rompere/impallare", supporto l'idea di usare un micro che si occupi semplicemente della stabilizzazione, comandato da un sistema più complesso (unix o quant'altro), che se anche si mette a fare stream video, o si impalla da qualche parte, non pregiudica la "vita" del mezzo.

ora non la trovo, sinceramente non ricordo nemmeno se era su questo forum
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

FEDERICO

Il che significa che svilupparai l'interfaccia multiwii - freeIMU ?
Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

lestofante

c'è assolutamente da modificare la wire, oggi sto facendo un po' di prove col WMP...
leggere 6 byte da seriale: 16microsec
elaborali in rad/sec: 108microsec
codice che segue (richesta prossimo dato): 1005microsec!!!
Code: [Select]
Wire.beginTransmission(0x52);
 Wire.send(0x00);
 Wire.endTransmission();
 Wire.requestFrom (0x52,6);

Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

astrobeed


c'è assolutamente da modificare la wire, oggi sto facendo un po' di prove col WMP...


Per questa applicazione la wire la puoi pure buttare in quel posto dove ci sediamo tutti quanti almeno una volta al giorno  :)
Tocca riscriverla completamente.
Scientia potentia est

lestofante

me ne sono accorto.. ora devo andar a dare da mangiare alle anatre (!), più tardi gioco con le funzioni usate dal multiwii:

Code: [Select]
// ************************************************************************************************************
// I2C general functions
// ************************************************************************************************************

// Mask prescaler bits : only 5 bits of TWSR defines the status of each I2C request
#define TW_STATUS_MASK  (1<<TWS7) | (1<<TWS6) | (1<<TWS5) | (1<<TWS4) | (1<<TWS3)
#define TW_STATUS       (TWSR & TW_STATUS_MASK)

void i2c_init(void) {
  #if defined(INTERNAL_I2C_PULLUPS)
    I2C_PULLUPS_ENABLE
  #else
    I2C_PULLUPS_DISABLE
  #endif
  TWSR = 0;        // no prescaler => prescaler = 1
  TWBR = ((16000000L / I2C_SPEED) - 16) / 2; // change the I2C clock rate
  TWCR = 1<<TWEN;  // enable twi module, no interrupt
}

void i2c_rep_start(uint8_t address) {
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN) | (1<<TWSTO); // send REPEAT START condition
  waitTransmissionI2C(); // wait until transmission completed
  checkStatusI2C(); // check value of TWI Status Register
  TWDR = address; // send device address
  TWCR = (1<<TWINT) | (1<<TWEN);
  waitTransmissionI2C(); // wail until transmission completed
  checkStatusI2C(); // check value of TWI Status Register
}

void i2c_rep_stop(void) {
  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
  waitTransmissionI2C();
  checkStatusI2C();
}

void i2c_write(uint8_t data ) {
  TWDR = data; // send data to the previously addressed device
  TWCR = (1<<TWINT) | (1<<TWEN);
  waitTransmissionI2C(); // wait until transmission completed
  checkStatusI2C(); // check value of TWI Status Register
}

uint8_t i2c_readAck() {
  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
  waitTransmissionI2C();
  return TWDR;
}

uint8_t i2c_readNak(void) {
  TWCR = (1<<TWINT) | (1<<TWEN);
  waitTransmissionI2C();
  return TWDR;
}

void waitTransmissionI2C() {
  uint8_t count = 255;
  while (count-->0 && !(TWCR & (1<<TWINT)) );
  if (count<2) { //we are in a blocking state => we don't insist
    TWCR = 0;  //and we force a reset on TWINT register
    neutralizeTime = micros(); //we take a timestamp here to neutralize the value during a short delay after the hard reset
  }
}

void checkStatusI2C() {
  if ( TW_STATUS  == 0xF8) { //TW_NO_INFO : this I2C error status indicates a wrong I2C communication.
    // WMP does not respond anymore => we do a hard reset. I did not find another way to solve it. It takes only 13ms to reset and init to WMP or WMP+NK
    TWCR = 0;
    if (!GYRO) {
      POWERPIN_OFF //switch OFF WMP
      delay(1); 
      POWERPIN_ON  //switch ON WMP
      delay(10);
      WMP_init(0);
    }
    neutralizeTime = micros(); //we take a timestamp here to neutralize the WMP or WMP+NK values during a short delay after the hard reset
  }
}

void i2c_getSixRawADC(uint8_t add, uint8_t reg) {
  i2c_rep_start(add);
  i2c_write(reg);         // Start multiple read at the reg register
  i2c_rep_start(add +1);  // I2C read direction => I2C address + 1
  for(uint8_t i = 0; i < 5; i++) {
    rawADC[i]=i2c_readAck();}
  rawADC[5]= i2c_readNak();
}

void i2c_writeReg(uint8_t add, uint8_t reg, uint8_t val) {
  i2c_rep_start(add+0);  // I2C write direction
  i2c_write(reg);        // register selection
  i2c_write(val);        // value to write in register
}

uint8_t i2c_readReg(uint8_t add, uint8_t reg) {
  i2c_rep_start(add+0);  // I2C write direction
  i2c_write(reg);        // register selection
  i2c_rep_start(add+1);  // I2C read direction
  return i2c_readNak();  // Read single register and return value
}


per esempio waitTransmissionI2C è bloccante, fa un reset di twint, ma non ho capito
1: perchè  l'if (count<2) (notare il ; dopo il while, quindi l'if è fuori dal corpo di esso.
2: se fa quel reset, non deve reinizializzare la comunicazione?

devo ancora leggermi bene tutto il codice per capire come funziona questo protocollo, però piuttosto che fare una wait transmission alla fine, non conviene farla all'inizio (se la flag che sono stati inviati dati è settata a true)? in questo modo si rimarrebbe bloccati molto meno tempo.
per il resto devo ancora leggere bene, mi sembra ok(ricordo che NON conosco il protocollo i2c)
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

astrobeed

Stasera assemblo la IMU completa (giro,accelerometro,magnetometro,barometro) così da iniziare a scrivere i primi mattoni del software.

Step 0, definizione della struttura base del programma e inizializzazione dei vari file.
Step 1, funzioni I2C ottimizzate.
Step 2, funzioni per la lettura dei sensori che compongono la IMU.
Step 3, funzioni di base per la telemetria.
Steo 4, prima GUI semplificata per la verifica dei dati tramite telemetria.
Step 5, Kalman e funzioni per la determinazione assetto.

Solo per questi punti ci vorranno diversi giorni di lavoro, però sono la base per sviluppare il tutto, senza questi non si va da nessuna parte.

Scientia potentia est

lestofante

lo schema base potrebbe essere

aggiorna sensori
se aggiornati
  leggi sensori
  aggiorna orizzonte (kallman?)
  leggi input RX
  aggiorna PID (con input RX e orizzonte)
  aggiorna motori (con valori PID)
se ci sono dati disponibili in seriale
  esegui funzione di comunicazione (lettura sempre, scrittura ad 1Hz)
se è in debug_mode
  se è trascorso abbastanza tempo (50 o 60Hz)
     stampa angoli di inclinazione attuali(per debug grafico)
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

superlol


Stasera assemblo la IMU completa (giro,accelerometro,magnetometro,barometro) così da iniziare a scrivere i primi mattoni del software.

Step 0, definizione della struttura base del programma e inizializzazione dei vari file.
Step 1, funzioni I2C ottimizzate.
Step 2, funzioni per la lettura dei sensori che compongono la IMU.
Step 3, funzioni di base per la telemetria.
Steo 4, prima GUI semplificata per la verifica dei dati tramite telemetria.
Step 5, Kalman e funzioni per la determinazione assetto.

Solo per questi punti ci vorranno diversi giorni di lavoro, però sono la base per sviluppare il tutto, senza questi non si va da nessuna parte.



mi raccomando documenta tutto nel playground e passa il link che vogliamo essere partecipi (tutti o sicuramente io :P )

poi dicci se incontri difficoltà, il perchè di certe scelte se hai tempo così impariamo qualcosa anche noi comuni mortali  :)

inoltre che scheda usi alla fine che non ho capito?
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

ratto93



Stasera assemblo la IMU completa (giro,accelerometro,magnetometro,barometro) così da iniziare a scrivere i primi mattoni del software.

Step 0, definizione della struttura base del programma e inizializzazione dei vari file.
Step 1, funzioni I2C ottimizzate.
Step 2, funzioni per la lettura dei sensori che compongono la IMU.
Step 3, funzioni di base per la telemetria.
Steo 4, prima GUI semplificata per la verifica dei dati tramite telemetria.
Step 5, Kalman e funzioni per la determinazione assetto.

Solo per questi punti ci vorranno diversi giorni di lavoro, però sono la base per sviluppare il tutto, senza questi non si va da nessuna parte.



mi raccomando documenta tutto nel playground e passa il link che vogliamo essere partecipi (tutti o sicuramente io :P )

poi dicci se incontri difficoltà, il perchè di certe scelte se hai tempo così impariamo qualcosa anche noi comuni mortali  :)

inoltre che scheda usi alla fine che non ho capito?

Esatto... Noi neofiti io più di tutti dobbiamo e vogliamo imparare :P
Se corri veloce come un fulmine, ti schianterai come un tuono.

astrobeed

#519
Aug 04, 2011, 08:50 pm Last Edit: Aug 04, 2011, 09:05 pm by astrobeed Reason: 1

mi raccomando documenta tutto nel playground e passa il link che vogliamo essere partecipi (tutti o sicuramente io :P )


Sono allergico all'editor del playground  :)
Il software è open source ed è mia abitudine commentarlo molto, le varie scelte e le soluzioni le discutiamo qui, serve un volontario che riporta  le cose importanti sul playground e che scrive la documentazione estesa, quest'ultima non ho il tempo per farla io.

Quote

inoltre che scheda usi alla fine che non ho capito?


L'hardware è quello che ho già indicato, per la Fli.C una qualunque scheda UNO like, anche standalone, fino a salire alla Mega 2560, cosa sarà possibile fare solo con la UNO non posso dirlo adesso, ma di sicuro non meno di quello che fa MultiWii.
Per la IMU utilizzo tutti i sensori, sotto forma di singola breakout board, presenti sulla  9 d.o.f. di Sparkfun con in più il sensore di pressione BMP085, però per la prima stesura uso il WMP come giroscopio al posto del ITG3200 (al momento non l'ho disponibile), finiti i primi step integro anche l'ITG che mi dovrebbe arrivare la prossima settimana.
Scientia potentia est

ratto93

Io sto tentando di capire come funziona il Playground e i passi fondamentali posso inserirli io per la descrizione totale e fatta bene minimo mi aiuta superlol oppure lascio a lui il compito se lo fa..... :)

faccio una domanda extra ed OT....
astrobeed hai detto che non hai mai usato veicoli con turbina....
usi per caso anche aerei o solo elicotteri ???
mai pensato ai pulsoreattori ???  8)


Se corri veloce come un fulmine, ti schianterai come un tuono.

superlol


.... serve un volontario che riporta  le cose importanti sul playground e che scrive la documentazione estesa, quest'ultima non ho il tempo per farla io.


ecco sarò il tuo volontario scelto  ;)

in effetti l'editor del PG è un po ehm.. bruttino :smiley-zipper:
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

superlol

l'hai detto tu stesso, Keep It Simple, perchè ti sei incasinato la vita a mettere su apparecchiature da 2000€ quando basta che sfiori qualcosa con un elica che tutto viene giù?  ]:D

io con quei soldi mi sarei preso un mk completo ed avrei risparmiato soldi (costano massimo 1800€ completi di tutto, poi vabbè radio e batterie) tempo ed avrei una piattaforma quasi infalllibile con sensori quasi perfetti.

comunque conta che noi con 300€ faremo una scheda non posso dire migliore ma che potrebbe anche essere più veloce e precisa della tua perchè al mondo c'è sempre chi ti fa il (|)  :P

non voglio sminuire il tuo lavoro ma da come hai detto io avrei fatto scelte diverse..

tu vuoi studiare il comportamento in volo? allora DEVI togliere il cavo perchè fa attriti con aria e ha comportamenti che devi prevedere e quindi devi andare su batterie ed onde radio e quinid arrivi sul nostro stesso piano!
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

FEDERICO

Qual'e' la nostra prima milestone?
Io domenica parto e torno a settembre (credo almeno, o a fine luglio)
Il mio primissimo obiettivo e' finire di procurarmi un po' di pezzi e montare un coso volante, cioe' basta che voli. (Che gia' non mi pare poco)
Da li in poi posso spippolare tutto quello che serve...
Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

astrobeed


ecco sarò il tuo volontario scelto  ;)


Intanto comincia a mettere questo sul playground, è una cosa che sicuramente può tornare utile ed è dispersa in mezzo alla marea di post di questo thread.
Scientia potentia est

Go Up