Go Down

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

astrobeed


si ma io la "lunghezza dei cateti" la so in base alla differenza delle coordinate, a me serve sapere di quanto devo ruotarmi, per trovarmi rivolto verso il target


E in base a quale riferimento sai questa distanza ?
Non ti è chiaro il concetto che a seconda della latitudine/longitudine la distanza che intercorre tra ogni singolo grado, o frazione, non è una costante e che varia notevolmente tra l'equatore e i poli ?
Inoltre non puoi ricavare una distanza solo da due misure angolari, come minimo ti serve anche un modulo, e infatti per il calcolo delle distanze basandosi su coordinate GPS entra in gioco la radiale.
Ti pongo un quesito pratico, prendi tramite google maps le coordinate GPS di due città a tuo piacere e prova a calcolarti la distanza col tuo sistema, vediamo cosa viene fuori, è un caso semplice dove non serve una precisione matematica estrema, non importa se la distanza è sbagliata di qualche km.


Scientia potentia est

milvusmilvus

io so che se x = y devo ruotare di 45° se y = 0 devo ruotarmi di 90 e cosi via...

astrobeed

#362
Jul 30, 2011, 01:52 pm Last Edit: Jul 30, 2011, 01:54 pm by astrobeed Reason: 1
Un regalo per tutti quelli che non hanno un radiocomando e vogliono "giocare" con l'elettronica per il multi coso, uno sketch che trasforma Arduino in un servo controller a 8 canali, o se preferite l'equivalente di una ricevente RC a otto canali.
Il controllo dei segnali PPM avviene tramite un Nunchuk, nella prossima release anche tramite porta seriale, il cui joystick aziona i primi due canali (1 e 2) e l'accelerometro gli ultimi due (7 e 8 )
Premendo il tasto C il joystick aziona i canali 3 e 4, i primi due rimangono al valore precedente la pressione del tasto, premendo il tasto Z si prende il controllo dei canali 5 e 6, premendo tutti e due i tasti l'accelerometro prende il controllo dei canali 1 e 2.
Leggete attentamente tutte le note in testa allo sketch.
Lo sketch è diviso in due file .pde il primo è quello principale.

nun_Servo.pde
Code: [Select]

/*
Servo Controller basato sul Nunchuk
(c) 2011 By MdA Project

v1.0.0, build 30.07.2011

*/

/*
Collegamenti Nunchuk
_________
| 1 2 3 |
|       |
| 6 5 4 |
|_-----_|

•pin 1: verde - data (Arduino analog pin 4)
•pin 2: (not connected)
•pin 3: rosso - 3.3V
•pin 4: giallo - clock (Arduino analog pin 5)
•pin 5: (not connected)
•pin 6: bianco - GND

Il nunchuk originale Nintendo incorpora delle resistenze di pullup I2C da circa 1.8k.
Se utilizzate un Nunchuk non Nintendo verificate la presenza dei 3.3V su SDA e SCL
ed eventualmente aggiungere due resistenze di pull up, collegate al 3.3V,
con un valore compreso tra 1.5k e 3.3k
*/

/*
NOTE GENERALI

a) Non è garantito il corretto funzionamento con Nunchuk non originali.

b) In questa versione non è presente una routine per la calibrazione del Joystick
e dell'accelerometro.
Tutti i calcoli sono eseguiti sulla base dei valori medi forniti dai
sensori pertanto sia il punto centrale che i punti estremi possono differire
sensibilmente da quanto atteso e in modo diverso con diversi Nunchuk.
La calibrazione verrà aggiunta nelle future release.

c) Nella funzione "nun_read()" sono contenute delle serial.print() commentate, vanno
utlizzate, decommentandole, solo a scopo diagnostico per verificare il corretto
funzionamento del Nunchuk, visualizzano tutti i valori letti sul monitor seriale.

d) Nella prossima release verrà aggiunto il controllo tramite seriale con protocollo
dedicato e una GUI per pc (in futuro anche per Android) che permetterà di muovere
i servo tramite cursori e/o joystik collegato al pc.

*/

#include <Wire.h>      // include per I2C
#include <Servo.h>     // include per i Servo

// creazione degli oggetti servo
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;
Servo servo7;
Servo servo8;

int pos = 1500;              // posizione servo
char Led_stat = 0;
unsigned char nun_buf[6];    // buffer dati in arrivo dal nunchuck,  

unsigned char z_but = 0;
unsigned char c_but = 0;
unsigned char joy_x_axis;
unsigned char joy_y_axis;
int accel_x_axis;
int accel_y_axis;
int accel_z_axis;

void setup()
{
 pinMode(13, OUTPUT);
 Serial.begin(115200);      // per uso futuro della seriale
 nunchuck_init();           // inizializza il nunchuck

 // attaches servo ai pin 3-10
 servo1.attach(3);    
 servo2.attach(4);
 servo3.attach(5);
 servo4.attach(6);
 servo5.attach(7);
 servo6.attach(8);
 servo7.attach(9);
 servo8.attach(10);
}

void loop()
{
 Led_stat ^=1;                  // inverte il valore di Led_stat
 digitalWrite(13, Led_stat);    // lampeggio led
 nun_get();
 nun_read();

 if (z_but & c_but)
 {
   pos = 800 + joy_x_axis * 6;
   servo1.writeMicroseconds(pos);
   pos = 800 + joy_y_axis * 6;
   servo2.writeMicroseconds(pos);
 }

 if (z_but & !c_but)
 {
   pos = 800 + joy_x_axis * 6;
   servo3.writeMicroseconds(pos);
   pos = 800 + joy_y_axis * 6;
   servo4.writeMicroseconds(pos);
 }

 if (!z_but & c_but)
 {
   pos = 800 + joy_x_axis * 6;
   servo5.writeMicroseconds(pos);
   pos = 800 + joy_y_axis * 8;
   servo6.writeMicroseconds(pos);
 }

 if (!z_but & !c_but)
 {
   pos = 500 + accel_x_axis * 2 ;
   servo1.writeMicroseconds(pos);
   pos = 500 + accel_y_axis * 2;
   servo2.writeMicroseconds(pos);
 }

 pos = 500 + accel_x_axis * 2 ;
 servo7.writeMicroseconds(pos);
 pos = 500 + accel_y_axis * 2 ;
 servo8.writeMicroseconds(pos);
 delay(50);
}


nun_Func.pde
Code: [Select]

void nunchuck_init()
{
 Wire.begin();                    
 Wire.beginTransmission(0x52);
 Wire.send(0x40);
 Wire.send(0x00);
 Wire.endTransmission();
}

void nunchuck_send_request()
{
 Wire.beginTransmission(0x52);
 Wire.send(0x00);
 Wire.endTransmission();
}

int nun_get()
{
 int cnt=0;
 Wire.requestFrom (0x52, 6);  
 while (Wire.available ())
 {
   nun_buf[cnt] = nun_decode(Wire.receive());
   cnt++;
 }
 nunchuck_send_request();  

 if (cnt >= 5) {
   return 1;  //restituisce 1 se fallisce
 }
 return 0; //restituisce 0 se i dati sono stati ricevuti in maniera corretta
}

// decodifica valori nunchuck
char nun_decode (char x)
{
 x = (x ^ 0x17) + 0x17;
 return x;
}

void nun_read()
{
 joy_x_axis   = nun_buf[0];
 joy_y_axis   = nun_buf[1];
 accel_x_axis = nun_buf[2] << 2;
 accel_y_axis = nun_buf[3] << 2;
 accel_z_axis = nun_buf[4] << 2;
 z_but = 0;
 c_but = 0;

 if ((nun_buf[5] >> 0) & 1) z_but = 1;
 if ((nun_buf[5] >> 1) & 1) c_but = 1;

 if ((nun_buf[5] >> 2) & 1) accel_x_axis += 1;
 if ((nun_buf[5] >> 3) & 1) accel_x_axis += 2;

 if ((nun_buf[5] >> 4) & 1) accel_y_axis += 1;
 if ((nun_buf[5] >> 5) & 1) accel_y_axis += 2;

 if ((nun_buf[5] >> 6) & 1) accel_z_axis += 1;
 if ((nun_buf[5] >> 7) & 1) accel_z_axis += 2;

 // da decommentare solo per verifica corretto funzionamento Nunchuk
/*
 Serial.print(accel_x_axis, DEC);
 Serial.print(",");
 Serial.print(accel_y_axis, DEC);
 Serial.print(",");
 Serial.print(accel_z_axis, DEC);
 Serial.print(",");
 Serial.print(joy_x_axis,DEC);
 Serial.print(",");
 Serial.print(joy_y_axis, DEC);
 Serial.print(",");
 Serial.print(z_but, DEC);
 Serial.print(",");
 Serial.println(c_but, DEC);
*/
}
Scientia potentia est

ratto93



Scusate ancora se rompo riguardo l'MCU... questa andrebbebene ?


E' la brutta copia delle chipKIT di Digilent, decisamente meglio gli originali  :)
Per quanto riguarda il discorso potenza di calcolo, si un PIC32 è idoneo per la navigazione real time con GPS, potrebbe esserci il problema ingombro per mettere sul multicoso una scheda aggiuntiva grande come una UNO.
Verso fine della prossima settimana mi arriva una chipKIT Max32, l'equivalente a 32 bit della MEGA2560, così vediamo quali sono i reali problemi di compatibilità software con Arduino, l'ultima release dell'IDE per questa scheda ha corretto svariati bug e incompatibilità rilevate dagli utenti.


veramente.... il pinguino a 32 bit nella prima versione è uscito a genneio o febbraio di quest'anno :P
capito.... comunque eventualmente si potrebbe creare una scheda apposita per i cotteri, una schedina di ridotte dimensioni che integri sia un ATmega per le normali utenze ed un PIC per la navigazione... magari se si riuscisse ad estrarre il boot della max32 si potrebbe usare lo stesso pic e programmarla con l'IDE modificato.. che sia possibile ?
Se corri veloce come un fulmine, ti schianterai come un tuono.

astrobeed


veramente.... il pinguino a 32 bit nella prima versione è uscito a genneio o febbraio di quest'anno :P


Le prime chipKIT sono uscite l'anno scorso, è da noi che sono arrivate in ritardo.

Quote

capito.... comunque eventualmente si potrebbe creare una scheda apposita per i cotteri, una schedina di ridotte dimensioni che integri sia un ATmega per le normali utenze ed un PIC per la navigazione


Tutto si può fare, il problema sono i costi, una scheda di quel tipo come minimo viene fuori a 4 layer e se non ne produci almeno un centinaio il solo pcb ti costa più di tutta la scheda, meglio appoggiarsi a qualcosa di commerciale già pronto.

Quote

... magari se si riuscisse ad estrarre il boot della max32 si potrebbe usare lo stesso pic e programmarla con l'IDE modificato.. che sia possibile ?


Il bootloader delle chipkit è open source, quindi nulla vieta di utilizzarlo su una scheda diversa con sopra un micro della stessa famiglia, idem per l'ide a patto di utilizzare lo stesso modello di micro se non vuoi metterti a riscrivere buona parte delle librerie e del core.
Scientia potentia est

ratto93

An dell'uscita in ritardo non lo sapevo...

cavolo 4Layer sarebbero tantini... già due lo sono...

beh che dire io sto aspettando ricevente telecomando e quant'altro per cominciare.. nel frattempo vi saguirò ;)
Se corri veloce come un fulmine, ti schianterai come un tuono.

astrobeed


io so che se x = y devo ruotare di 45° se y = 0 devo ruotarmi di 90 e cosi via...


La nuova risposta "alla domanda fondamentale sulla vita, l'universo e tutto quanto"  è 6371  :)
Per il momento di più non ti dico, vediamo se ci arrivi da solo a cosa significa quel numero che è indispensabile per il nostro calcolo.
Scientia potentia est

FEDERICO

42 e' passato di moda? :-)
Scusate se scoccio con una domanda stupidissima... il mio WMP ha delle viti fatte tipo a stella con 3 tagli, non sono a croce e non sono torx. Devo dare una mano di dremel per aprirlo??
Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

astrobeed


Scusate se scoccio con una domanda stupidissima... il mio WMP ha delle viti fatte tipo a stella con 3 tagli, non sono a croce e non sono torx. Devo dare una mano di dremel per aprirlo??


Io sono riuscito a svitarle usando un piccolo cacciavite a lama piatta inserendolo in uno solo dei tre tagli, non serve molta forza per girarle.
Scientia potentia est

milvusmilvus

ma non era 42???  :D

comunque quello è il "raggio medio" della terra...

le coordinate, tipo 40°n e 16°sono i gradi(ripettivamente verso nord, e verdo est) dal ipotetico centro della terra, sulla quale si trova la retta (sempre ipotetica) sulla quale si trova il punto, che deve essere indentificato da un altro dato, l' altezza(che si prende in considerazione rispetto al livello del mare...)
ora assumendo costante il raggio dela terra (o mettendo 90 costanti, 1 per ogni grado di latitudine) il calcolo non è impossibile...

1 domanda su un altro argomento, utilizzando un barometro, misura l' altitudine del mezzo rispetto al livello del mare, quindi dovrebbe inizializzarsi prima di partire, e calcolare l altezza in base a quel punto, quindi escluso di volare in un luogo con altitudine fissa, non si avrebbe mai la reale altezza del mezzo da terra giusto?

un altra domanda.... ho visto multicotteri volare a 100m di altezza, qual' è la quota massima a cui posono arrivare(so che dipende dai motori e dalle eliche, intendo in generale..) dipende dalla quantità s'aria spostata dalle eliche giusto?? quindi piu altitudine vuol dire meno spinta... lo chiedo perche io abito a 500m slm e non vorrei che la quota raggiungibile sia inferiore.... e quindi mi ritroverei con un multicoso che non vola....

astrobeed


il calcolo non è impossibile...


Mai detto che è impossibile, ho detto che non si può fare in tempi sufficientemente rapidi su una mcu a 8 bit.
Ti voglio dare un altro aiuto, quello che ci serve si chiama rotta ortodromica, tutti quelli che hanno la patente nautica, o il brevetto di volo, sanno bene cosa sia e quanto è complesso da fare usando solo la calcolatrice perché è un problema di geometria sferica, non può essere semplificato a geometria piana nemmeno per le brevi distanze.

Quote

1 domanda su un altro argomento, utilizzando un barometro,


L'altimetro barometrico deve sempre essere tarata, prima del decollo, alla pressione sul livello del mare, che non è una costante, altrimenti è impossibile conoscere l'altitudine s.l.m., oppure si azzera sul punto di decollo e dal quel momento l'altitudine è relativa a quel punto.

Quote

quindi piu altitudine vuol dire meno spinta... lo chiedo perche io abito a 500m slm e non vorrei che la quota raggiungibile sia inferiore.... e quindi mi ritroverei con un multicoso che non vola....


Non posso darti un limite preciso, posso solo dirti che ho fatto volare un mio elicottero partendo da quasi 1800 metri s.l.m. senza particolari problemi salvo il dover ricarburare completamente il motore (a scoppio) perché non voleva saperne di erogare la potenza.
La pressione atmosferica cala quasi linearmente per i primi 2000 metri in ragione di circa un millibar ogni 27 metri, a 500 metri la differenza di pressione rispetto al livello del mare è meno di 19 millibar, una forte perturbazione atmosferica causa variazioni maggiori.
Scientia potentia est

ratto93

Navigazione Ortodromica e Lossodromica.....
Sono queste qui le equazioni da implementare ?
http://www.betasom.it/forum/index.php?showtopic=28367
Se corri veloce come un fulmine, ti schianterai come un tuono.

superlol

beh ma scusate ardupilot riesce a gestire il GPS senza problemi con tutte le navigazioni possibili ma è basato su un mega  :smiley-eek-blue:
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

ratto93

#373
Jul 30, 2011, 04:49 pm Last Edit: Jul 30, 2011, 04:52 pm by ratto93 Reason: 1

beh ma scusate ardupilot riesce a gestire il GPS senza problemi con tutte le navigazioni possibili ma è basato su un mega  :smiley-eek-blue:

Cè ardupilot "normale=ATmega 328" ed il mega 1° versione ATmega 1280 e 2°con ATmega 2560
però gestisce il volo per way point sugli aerei... non so sui cotteri come se la cava... anche perchè negli aerei ha meno variebili da gestire che qui....
Se corri veloce come un fulmine, ti schianterai come un tuono.

astrobeed


Navigazione Ortodromica e Lossodromica.....


Si e no al tempo stesso, è giusto l'argomento, ma non il problema risolto, comunque la strada è quella anche se incompleta perché manca il riferimento al modello geodetico usato dal GPS e la correzione dovuta alla differenza di altezza tra il punto di arrivo e quello di partenza.
Scientia potentia est

Go Up