Ciao a tutti chiedo scusa già in anticipo per la banalità della mia domanda: parto da praticamente zero elettronica e poco con programmazione e seguendo il libro di mc roberts su arduino in cui accendeva un led facendolo pulsare con legge sinusoidale volevo modificarlo per mettere 2 led e farli pulsare uno con legge sinusoidale e uno cosinusoidale così mentre uno si accende l'altro si spegne e viceversa ma non mi viene.
schema circuitale: jumper da ground a seconda colonnina della breadboard, e2 jumper ognuno da un led a tale colonnina per metterli a terra, e poi 2 resistenze da 150 ohm(sono 2 led da 5mm) una per led e poi connesse una al pin 12 e una al pin11
codice
int ledPin11 = 12;
int ledPin12 = 11;
float cosVal;
float sinVal;
int ledVal11;
int ledVal12;
void setup() {
pinMode(ledPin11, OUTPUT);
pinMode(ledPin12, OUTPUT);
}
void loop() {
for (int x=0; x<180; x++) {
sinVal = (sin(x*(3.1412/180)));
ledVal11 = int(sinVal*255);
analogWrite(ledPin11, ledVal11);
cosVal=(cos((x-90)*(3.1412/180)));
ledVal12 =int(cosVal*255);
analogWrite(ledPin12, ledVal12);
delay(25);
}
}
noto già da me che con il codice così scritto quando x arriva a 180 il seno muore e il coseno è appena arrivato a 1 solo che esce dal for e muore subito anche il coseno. prima di scrivere un script verificato ma che fa pasticci su arduino( e siccome essendo alle primissime armi ho paura di romperlo) qualcuno mi sa dare qualche dritta??grazie!
@Nid:
XD anche tu hai dimenticato di usare il "code" nella seconda parte della risposta XD
@Mattia:
sin e cos se ben ricordo restituiscono valori double e vogliono argomenti float (comunque tanto poi lo converti a int è solo una piccola nota),
ledpin11 = 12 e ledpin12 = 11 li hai messi appositamente per confondere il nemico?
cos (x - 90)... ma se lasciavi x?
Ma a parte questo, ti limiti a dire che non ottieni il risultato voluto ma non ci dici cosa ottieni, così ci viene difficile aiutarti.
Se usi Arduino Uno, attenzione che il PIN 12 non è PWM quindi non puoi fare l'analogWrite, usa 10 ed 11 (i PIN PWM hanno l'onda disegnata accanto).
che poi che vuol dire che seno e coseno muoiono? vanno a zero? occhio che arduino con i floa al massimo rege 5 cifre decimali e 9 cifre in totale (il dioscorso è più complesso mavabè)
... ed aggiungerei che sulla UNO (ed altre schede ATMEGA), float e double sono la stessa cosa ... sempre 32 bit usa
Solo sulla DUE sono veramente a 64 bit ...
Guglielmo
Edit : ... e ancora : "Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float." Quindi occhio con la precisione che ... è piuttosto scarsa ...
Grazie!stasera dopo gli allenamenti e il tema d'esame provo ccon il debug!invece ho fatto proprio l'errore di usare la 12 con tale comando in analogico, ho fatto un pasticcio che può aver rovinato la scheda?sul x-90 era per dare lo sfasamento tra sine e coseno in modo da avere sempre valori positivi sia di seno sia coseno!ps si con ledPin 11 etc ho veramente voluto male al mio nemico! putroppo sono anni che non programmo e sono arrugginitissimo!voi che codice avreste fatto per far si che mentre un led si accende piano l'altro si spegne piano con leggi sinusoidali??grazie!pps ok ora ho imparato anche come postare i frammenti di codici tra i 2 # grazie!
vedo che un angelo custode ha modificato il primo post in maniera corretta grazie non sbaglierò più!
sull'abs: si è vero siccome ho arduino da una settimana non ricordo bene i nomi dei comandi(e ribadisco la mia vecchiaia in termini di programmazione) e l ho arrangiato alla "mangia e bevi e non capisci una mazza" cioè mettendo una cattiveria in più, cioè definendo una nuova(ennesima) variabile che poi assegno o come valore coseno o come meno valore coseno, il ciò fatto con 2 if...lo so è un insulto alla buona logica di programmazione(infatti avrei potuto anche definire nel set up i due pin con un array ma va be...). Ergo io concluderei risolto appieno!con premio speciale a paulus1969 perchè mi ha ricordato che son tonto a non guardare sulla board i pin, e a nid69ita che mi ha aperto un mondo con la serial.begin! è piacevole imparare, grazie a tutti!
ps se qualcuno visionandolo fosse interessato al codice corretto:
int ledPin11 = 10;
int ledPin10 = 11;
float cosVal;
float sinVal;
int ledVal11;
int ledVal10;
void setup()
{delay(1000);
Serial.begin(9600);
pinMode(ledPin11, OUTPUT);
pinMode(ledPin10, OUTPUT);
}
void loop() {
for (int x=0; x<180; x++) {
// convert degrees to radians then obtain sin value
sinVal = (sin(x*(3.1412/180)));
ledVal11 = int(sinVal*255);
analogWrite(ledPin11, ledVal11);
cosVal=(cos((x)*(3.1412/180)));
if (cosVal<0)
{ledVal10 =int(-cosVal*255);
analogWrite(ledPin10, ledVal10);
}
else {
ledVal10=int(cosVal*255);
analogWrite(ledPin10,ledVal10);
}
Serial.print("x="); // mando a video Monitor seriale i valori
Serial.print(x);
Serial.print("sinval=");
Serial.print(sinVal);
Serial.print("cosVal=");
Serial.print(cosVal);
Serial.print(" ledval11=");
Serial.print(ledVal11);
Serial.print(" ledval10=");
Serial.println(ledVal10);
delay(25);
}
}
vedo che un angelo custode ha modificato il primo post in maniera corretta smiley grazie non sbaglierò più!
leo72:
Difatti, altra cosa su cui ho soprasseduto: titolo non esplicativo.
leo hai messo le ali? stai troppo tempo al garr
sul x-90 era per dare lo sfasamento tra sine e coseno in modo da avere sempre valori positivi sia di seno sia coseno!
Ma se sfasi l'angolo di 90 gradi...
no, anzi è una soluzione elegante essendo seno e cosenso funzioni con periodo 180. certo non leggibilissimo a primavista, ma si fa spesso quandi si ha a che fare con la geometria;anzi in teria si pensa sempre in radianti e non in gradi
*garc: l'informazione non è presente nel mio database.... 8)
Non usare l'SMSese con me, sono rintronato di mio... già non capisco le cose quando me le dicono in faccia chiaramente, figurati usando sigle che non capisco