BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   Qualcuno sperimenta con Arduino? (https://www.baronerosso.it/forum/circuiti-elettronici/241145-qualcuno-sperimenta-con-arduino.html)

gawain 16 aprile 12 23:24

1 Allegato/i
Citazione:

Originalmente inviato da gawain (Messaggio 3120869)
io ho messo un diodo per ogni uscita dispari poi collegati tutti a una resitenza da 2.7 k
e con arduino leggevo sia fronti di salita che di di scesa del segnale somma cosi ottieni i canali pari per differenza...(ma non devi fare nessun calcolo)


mi autoquoto per spiegare con un disegnino quello che confusamente ho tentato di dire...
in aggiunta per leggere fronti alterni basta porre inPPM.h
#define EDGE_DETECTOR_TOGGLE 1 // 0=reading PPM stream 1=reading alternate channel sequence from rx

ovviamente questo per quelle rx che non hanno il canale ppm

Tom_1971 17 aprile 12 13:35

Citazione:

Originalmente inviato da romoloman (Messaggio 3150306)
Scusa ma secondo te fra un Arduino e una Turnigy9x che monta un ATMEGA64A o una gruvin 4.1 (scheda modificata della turnigy9x) che monta un ATMEGA2560 ci passa molta differenza ???

No no, è chiaro che hai ragione. Il mio era un ragionamento semplificato per capire di cosa stiamo parlando e quali sono le potenzialità. Come dicevo all'inizio del thread io ho preso Arduino per realizzare l'illuminazione del presepe (?!) e sto cercando pian piano di capire cosa altro ci si possa fare :D
Lo dico scherzando, ma è vero che chi non ha dimestichezza con il SW/FW a volte se si perde nelle discussioni tecniche non riesce a capire lo scopo ultimo di quello di cui si parla. Invece capire a cosa serve o può servire uno strumento è la pre-condizione per farne un uso creativo!

Tom_1971 17 aprile 12 13:38

Ma veramente con uno di questi aggeggi ci si riesce a fare un altimetro con risoluzione centimetriche o perlomeno decimetrica? Ma quanta sarà mai la variazione di pressione su una quota così piccola... oddio ci vuole pochissimo a fare il conto ma non ho voglia. Ho sempre odiato la termodinamica e tutti gli annessi e connessi... e alle 12:30 sono già troppo stanco dalla giornata :icon_rofl

gawain 17 aprile 12 15:07

Citazione:

Originalmente inviato da Tom_1971 (Messaggio 3151979)
Ma veramente con uno di questi aggeggi ci si riesce a fare un altimetro con risoluzione centimetriche o perlomeno decimetrica? Ma quanta sarà mai la variazione di pressione su una quota così piccola... oddio ci vuole pochissimo a fare il conto ma non ho voglia. Ho sempre odiato la termodinamica e tutti gli annessi e connessi... e alle 12:30 sono già troppo stanco dalla giornata :icon_rofl

è un sensore differenziale...serve per fare il pitot
ovvero misurare la differenza tra pressione d'arresto e pressione statica che alle velocita di un f3k richiede la risoluzione di 0.1 Pa se vuoi usarlo come controllo di assetto rispetto all'aria (angolo di attacco AoA)
per l'altimetro bisogna prendere un assoluto

Tom_1971 17 aprile 12 20:24

Capito. Infatti ho visto che sullo stesso sito ce n'è un altro come altimetro...
Il limite è solo la fantasia (oddio, anche il tempo e il... portafoglio!)

Sent from my Xoom using Tapatalk 2

faustog_2 18 aprile 12 00:16

ok
 
Ok ho capito!

quindi in pratica è come eseguire :

BTFSC REGISTRO,BIT
SE NON è ZERO
SE E' ZERO

qui invece sinttatticamente significa spostati di ICF1 posizioni a partire da quella a zero, (estrema destra) e piazza un 1 (uno) , quindi se facendo l'AND ovvero

per esempio ICF1 = 2 allora sposta un 1 (uno) in posizione 2 a sinistra, poi esegui una AND e valuta il risultato

0110.0101
0000.0100 Vero


oppure

0110.0001
0000.0100 Falso

Altra osservazione, partendo dalla tua osservazione in merito agli interrupt, mi sembra strano che però con il convertitore ADC non ci siano questi brutti effetti!
In sistanza facendo la prova non mi dà nessuna imperfezione.

leggi qui:
Arduino - Knob


Servo myservo;

int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}









Citazione:

Originalmente inviato da romoloman (Messaggio 3149741)
ICF1 è una costante numerica che rappresenta il valore posizionale del BIT ICF1,
1<<ICF1 esegue un left shift di 1 di ICF1 posizioni, a quel punto viene fatto un & con il registro del timer e se il risultato è vero (!=0) viene eseguito il codice.

PS: Consiglio, lascia perdere l'assembler con gli AVR usa il C e un buon compilatore (AVR-GCC 4.7.0) il codice risultante è meglio di quello che puoi fare tu....


faustog_2 18 aprile 12 00:48

alternativa
 
un alternativa potrebbe essere quello che facevo con i Pic

in questo caso dovrei usare la funzione digitalRead
____ _____
_____| |__________________| |_______


while (digitalReadA==Down)
[

]

while(digitalRead==HIGH)
[
conta milli secondi
]

adesso vado a nanna sto iniziando a delirare!

gawain 18 aprile 12 01:13

Citazione:

Originalmente inviato da faustog_2 (Messaggio 3153074)
Ok ho capito!

quindi in pratica è come eseguire :

BTFSC REGISTRO,BIT
SE NON è ZERO
SE E' ZERO

qui invece sinttatticamente significa spostati di ICF1 posizioni a partire da quella a zero, (estrema destra) e piazza un 1 (uno) , quindi se facendo l'AND ovvero

per esempio ICF1 = 2 allora sposta un 1 (uno) in posizione 2 a sinistra, poi esegui una AND e valuta il risultato

0110.0101
0000.0100 Vero


oppure

0110.0001
0000.0100 Falso

Altra osservazione, partendo dalla tua osservazione in merito agli interrupt, mi sembra strano che però con il convertitore ADC non ci siano questi brutti effetti!
In sistanza facendo la prova non mi dà nessuna imperfezione.

leggi qui:
Arduino - Knob


Servo myservo;

int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
delay(15); // waits for the servo to get there
}


la libreria servo forza periodicamente l'azzeramento del contatore che ti impedisce ti utilizzarlo senza glitch nella lettura del ppm...
i metodi usati in ppm.h non non modificano mai il valore del contatore, solo cosi riesci a ottenere piu funzioni indipendenti come lettura ppm e driver servi.
inoltre il driver dei servi basato su una una lookup table e sul xor tra due byte garantisce una omogeneita di timing tra canali assoluta e le uniche operazioni diverse avvengono durante il segnale di sincro quindi senza effetto.

gawain 18 aprile 12 01:22

Citazione:

Originalmente inviato da faustog_2 (Messaggio 3153127)
un alternativa potrebbe essere quello che facevo con i Pic

in questo caso dovrei usare la funzione digitalRead
____ _____
_____| |__________________| |_______


while (digitalReadA==Down)
[

]

while(digitalRead==HIGH)
[
conta milli secondi
]

adesso vado a nanna sto iniziando a delirare!


una sccansione di questo tipo ti da un errore che è dipendente dal tempo di scansione...
la lettura di ICR1 ti permette di leggere con un scansione che puo essere il 99% dellintervallo piu corto ovvero molto lenta senza inficiare la precisione..
la lettura di quel registro necessita un tempo costante che quindi nelle letture differenziali non genera errore

faustog_2 18 aprile 12 08:47

ok
 
credo di aver capito.... ....dammi un feedback

quindi il controllo
if (TIFR1 & (1<<ICF1))
serve per capire se il timer è arrivato a fondo scala ?

PPM.h lascia scorrere il timer 1 .. e si regola facendo differenze matetmatiche.. lo zero diventa il punto di partenza.. X, poi da esso si sviluppa il treno di PPM..

quindi non lo azzera.. anche perchè appena arriva in fondo a 65.000 scala e ricomincia da zero..

..ho realizzato tempo fa un sistema su Pic che fa lo stesso lavoro, un gruppo di registri li utilizzo , uno per ogni canale, gestito con FSR, il tmr0 quando scadeva in modo naturale, 16 mS , ricominciava.. finchè non scadevano i 16 mS leggevo la seriale & il sensore infrarosso.. appena scaduti i 16 mS allora eseguiva il treno di impulsi secondo quello che trovava nel buffer.. precedentemente riempito durante l'attesa.. quindi non c'erano tempi morti..

In pratica la libreria Servo è una cosa relativamente affidabile! però è strano perchè nei sorgenti di ARDUPILOT si fa uso della libreria Servo.. magari loro raggirano il problema ..chi sa in che modo.. devo studiare tanto.. ancora sono un principiante!



Citazione:

Originalmente inviato da gawain (Messaggio 3153160)
la libreria servo forza periodicamente l'azzeramento del contatore che ti impedisce ti utilizzarlo senza glitch nella lettura del ppm...
i metodi usati in ppm.h non non modificano mai il valore del contatore, solo cosi riesci a ottenere piu funzioni indipendenti come lettura ppm e driver servi.
inoltre il driver dei servi basato su una una lookup table e sul xor tra due byte garantisce una omogeneita di timing tra canali assoluta e le uniche operazioni diverse avvengono durante il segnale di sincro quindi senza effetto.



Tutti gli orari sono GMT +2. Adesso sono le 21:40.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002