0
Offline
Newbie
Karma: 0
Posts: 46
Arduino rocks
|
 |
« on: April 28, 2010, 03:30:16 pm » |
Salve a tutti, sono nuovo di queste parti, anche se da già un po seguo il forum. Fra le tanti post interessanti ne ho trovato uno in particolare...pilota per ardupilot, ma troppo complesso x me...non riesco a stargli dietro, quindi ho deciso di cominciare da zero. Detto questo, avendo il mio arduino, mi sono preocurato un accelerometro 3 assi,(motori,eliche, radio ecc li avevo già) ed ho cominciato... ecco un video dei miei test. (perche non riesco ad aggiungere un video sul post???come si fa??)) Primo problema: :o il sensore sembra essere troppo sensibile alle vibrazioni provocate dai motori, infatti , tenendolo in mano il tutto funziona discretamente, mettendolo sul telaio le letture sono imprecise, facendo impazire i motori. come primo tentativo per rimediare ho fatto: una prima lettura, delay(5), seconda lettura confronto fra le due letture scrittura. nel video si vede lampegiare il led al pin 13, indica ke le letture coincidono. con questo sistema va meglio...ma non credo possa ancora stare in aria... stavo pensado di far calcolare una media dalle letture... ovviamente si accettano consigli/collaborazioni... cmq, continuerò ad aggiornare il post...sprando di suscitare qualke interessante collaborazione... saluuuuuti 8-)
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15742
+39 349 2158303
|
 |
« Reply #1 on: April 28, 2010, 05:48:12 pm » |
ciao maxmili80 2 possibilitá o fai una media di piú letture oppure colleghi 3 condensatori sulle uscite del sensore in modo da fare elettricamente una media. grandezza tra 1 e 10 µF. Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 46
Arduino rocks
|
 |
« Reply #2 on: April 29, 2010, 02:27:35 am » |
Ottima intuizione quella dei condesatori!  ci ho già provato, ma solo con uno..il difetto era uguale, ma rispondeva più lentamente....come dici di collegarne 3?? Premetto che al momento, solo per i test, sto usando solo uno degli assi del sensolre, dopo mi basterà fare "copia incolla" ... Cmq non mi arrendo...
|
|
|
|
« Last Edit: April 29, 2010, 02:33:31 am by maxmili80 »
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 16
Arduino rocks
|
 |
« Reply #3 on: April 29, 2010, 04:09:22 am » |
buongiorno....scusate ma sono nuovo nuovo...se posso provare a darvi un consiglio...poco elettronico ma molto piu pratico....ma cosa ne pensi di mettere un quadratino di gommapiuma tra il telaio e il sensore...o qualcosa che possa attenuare le vibrazioni...con poca densità...tipo della spugna...o qualcosa del genere...magari ci hai già pensato...ma passavo di qua e se fossi nelle tue stesse condizioni e quello che avrei fatto.... booo che dici? 
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15742
+39 349 2158303
|
 |
« Reply #4 on: April 29, 2010, 06:19:25 am » |
ciao @ maxmili80 Il sensore misura l'acelerazione nelle 3 assi e ha 3 uscite. Ogni uscita deve avere un condensatore. @ mkmax Ti serve una massa che fa da inerzia per il sensore. che devi collegare molleggiato all' apparecchio. 2 problemi: masse é peso; un sitema molleggiato ha una frequenza di risonanza. ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Milan
Offline
Edison Member
Karma: 1
Posts: 1128
gioblu.com
|
 |
« Reply #5 on: April 29, 2010, 07:07:10 am » |
prova ad ancorare il sensore alla strruttura portante con due strati di nastro bi-adesivo (quello morbido bianco in schiuma) io avevo risolto cosi'.
|
|
|
|
|
Logged
|
|
|
|
|
Pistoia
Offline
God Member
Karma: 0
Posts: 775
Arduino è una figata
|
 |
« Reply #6 on: April 29, 2010, 07:20:30 am » |
ho alcune domande: 1. che motori usi? 2. che radiocomando usi e come lo hai interfacciato con arduino? 3. che struttura userai? 4. come piloti i motori? 5. usi una lipo? e se si come la ricarichi? metterai un circuito di carica embedded oppure il classico caricatore esterno? 6. pensi che un solo accelerometro ti basti per un quadcopter oppure ne metterai diversi?
io voglio costruirmi un elicottero però con 3 bracci. sono sempre in fase di progettazione però!
|
|
|
|
|
Logged
|
|
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 46
Arduino rocks
|
 |
« Reply #8 on: April 30, 2010, 05:50:37 am » |
Quante belle domande ...  Io provengo dal mondo del modellismo (per hobby) a dall'elletronica (per lavoro) sto cercando di unire i mondi. Per uwefed, avevi ragione, ho rimesso un condensatore, ma un po più grande, siamo a 47 µF, ed insieme alla doppia lettura che dicevo, ho risolto il primo grande problema. Di seguito i test ... 1 2 3 ho scoperto acnhe una GRANDE cosa: quando arduino opera e si alimenta attraverso il cavo usb, rallenta parecchio :o, provabilmente per il flusso dei dati con il pc; infatti , alimetnandolo con apposita alimentzione esterna ...mette il turbo...DA NON DIMENTICARE PER IL FUTURO... I motori sono i famigerati brushless(con appositi regolatori che si comportano più o meno come un servo), che il buon gbm sponzorizza..vanno stra-benissimo!!!! e le celle li-po(costano un po) ed hanno una particolare procedura per la carica...infatti i carica, sono abbastanza complessi... Per interfacciare la radio non è difficile...ne parliamo fra qualche giorno... Buona anche l'idea di ammortizzare le vibrazione, in maniera "ardware" ci avevo pensato, ma non ho ancora provato...anche se le cose adesso sembrano andare abbastanza bene... Per il momento è tutto...a presto!!!!!
|
|
|
|
|
Logged
|
|
|
|
|
Global Moderator
Milano, Italy
Offline
Edison Member
Karma: 10
Posts: 1098
Arduino rocks
|
 |
« Reply #9 on: April 30, 2010, 06:02:13 am » |
Per filtrare il segnale dell'accelerometro (o di qualsiasi altra cosa) un'altra soluzione potrebbe essere quella di implementare un filtro di kalman, ho visto che ne parlavano sul forum internazionale. Il mio parere che non è quello di un esperto è che questa soluzione è troppo esagerata per un Arduino, visto che non ha capacità di calcolo straordinarie e poi dietro c'è una teoria mica da poco.
W la gommapiuma
|
|
|
|
|
Logged
|
F
|
|
|
|
Milan
Offline
Edison Member
Karma: 1
Posts: 1128
gioblu.com
|
 |
« Reply #10 on: April 30, 2010, 07:29:39 am » |
Grande Max complimenti ottimo risultato!! Magari se puoi posta il codice!!
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 46
Arduino rocks
|
 |
« Reply #11 on: April 30, 2010, 12:53:18 pm » |
Nn male l'idea del bi-adesivo...che combinata all'idea della massa inerziale di uwefed, potrebbe dare discreti risultati. Quindi proverò mettendo 2 strati di biadesivo..una moneta(giusto per provare), altri 2 strati..ed in fine il sensore.
al momento preferisco postaee solo il codice riguardante al test con il servo...
#include <Servo.h> Servo servo1; int xpin = 0, xpin1 = 0; //prima e seconda lettura asse x int val, val1; // variabile di lettura asse X int led = 13;
void setup() { servo1.attach(9); // collegamento Serial.begin(9600); pinMode(led, OUTPUT); } void loop() { val = analogRead(xpin); // legge valore dal sensore(da 363 a 284) 1° lettura val = map(val, 363, 284, 0, 180); // imposta scala
delay(5); //attesa per 2° lettura val1 = analogRead(xpin1); // legge valore dal sensore(da 363 a 284) 2° lettura val1 = map(val1, 363, 284, 0, 180); //imposta scala if (val == val1) //confronto letture {servo1.write(val), //scrittura sl servo digitalWrite(led, HIGH); //scrittura su led } else { digitalWrite(led, LOW); } Serial.println(); Serial.print(val); Serial.print(" VAL "); Serial.print(val1); Serial.print(" VAL1 "); }
(ma xkè non mi funzionano i tasti per inserire??ma c'è qualche trucco?? devo chiedere attivazione??)
Il prossimo passo sarà quello di miscelare il risultato della lettura, per dividerlo ai 2 motori dell'asse, cioè, i giri che tolgo ad un motore li aggiungo all'altro e viceversa....presto vi informerò... Ciauuuuuu
|
|
|
|
« Last Edit: April 30, 2010, 12:55:57 pm by maxmili80 »
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 46
Arduino rocks
|
 |
« Reply #12 on: May 02, 2010, 04:27:37 pm » |
Rieccoci con un problema...ed ammeto che questo mi sembra più scocciante. >  fin ora ero riuscito senza grandi problemi a leggere i dati di un accelerometro, e scriverlo in un servo; ero riuscito senza problemi a leggere il segnale PPM dalla mia ricevente e scrivere su un servo...qui nasce il problema: unendo i due codici, tutto continua a funzionare..ma a rallentatore, cioè i servi vengono aggiornati circa ogni secondo...anche le letture sulla seriale sono molto lente... Non credo che sia questione di prestazioni fisiche...almeno spero.. Tempo fa ho visto un codice con una libreria servodecode.h...qualcuno ne sa qualcosa?? Consigli??? #include <Servo.h> Servo servo1, servo2; //motori 1 e 2 asse x Servo servo3, servo4; //motori 1 e 2 asse x
int xpin = 0, xpin1 = 0; //prima e seconda lettura asse x accelerometro int ypin = 1, ypin1 = 1; //prima e seconda lettura asse y accelerometro
int valx, valx1; // variabile di lettura asse X accelerometro int valy, valy1; // variabile di lettura asse y accelerometro
int assex, assey;
int letturagas = 7, letturaroll = 6; //ingresso segnale radio GAS,ROLL unsigned long gas, roll; //variabile di lettura(radio) int led = 13;
void setup() { servo1.attach(9), servo2.attach(10); // collegamento motori assex servo3.attach(11), servo4.attach(12); // collegamento motori assey Serial.begin(9600); //imposta letturagas imput pinMode(letturagas, INPUT),(letturaroll, INPUT); pinMode(led, OUTPUT); } void loop() { valx = analogRead(xpin); // legge valore x dal sensore(da 363 a 284) 1° lettura valx = map(valx, 363, 284, 0, 180); // imposta scala valy = analogRead(ypin); // legge valore y dal sensore(da 363 a 284) 1° lettura valy = map(valy, 363, 284, 0, 180); // imposta scala
delay(2); valx1 = analogRead(xpin1); // legge valore dal sensore(da 363 a 284) 2° lettura valx1 = map(valx1, 363, 284, 0, 180); //imposta scala valy1 = analogRead(ypin1); // legge valore dal sensore(da 363 a 284) 2° lettura valy1 = map(valy1, 363, 284, 0, 180); //imposta scala if (valx == valx1) //confronto letture asse x {servo3.write(valx), digitalWrite(led, HIGH); //scrittura su led } else { digitalWrite(led, LOW); } if (valy == valy1) //confronto letture asse x {servo2.write(valy); } gas = pulseIn(letturagas, LOW); gas = map(gas, 870, 1990, 0, 180); //imposta scala gas roll = pulseIn(letturaroll, LOW); roll = map(roll, 870, 1990, 0, 50); //imposta scala roll servo1.write(gas); //scrive gas su servo2 Serial.print(gas); Serial.print(" gas "); Serial.println(); Serial.print(valx); Serial.print(" VALx "); Serial.print(valy); Serial.print(" VALy "); }
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15742
+39 349 2158303
|
 |
« Reply #13 on: May 02, 2010, 04:42:35 pm » |
ciao maxmili80
Usa una velocitá della seriale piú alta. Puoi andare fino a 115200. Spesso quello rallenta tanto l'esecuzione di un sketch. Devi considerare che 9600 Baud sono meno di 1kbyte al secondo.
Domanda: la fiunzione pulseIn() blocca l' esecuzione dello sketch? nel senso continua l' esecuzione o l'arduino aspetta finche la lettura sia terminata - cosa analoga al delay()?
Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Milan
Offline
Edison Member
Karma: 1
Posts: 1128
gioblu.com
|
 |
« Reply #14 on: May 02, 2010, 08:58:11 pm » |
Complimenti max, molto utile! Sperimento la stessa anomalia con tutti i codici in cui "decodo" impulsi servo tramite pulseIn() ho paura che mentre aspetta la fine dell'impulso non possa fare nient'altro!!
|
|
|
|
« Last Edit: May 02, 2010, 08:59:27 pm by gioscarab »
|
Logged
|
|
|
|
|
|