AnalogWrite

Chiedo scusa in anticipo nel caso si trattasse di una cosa banale.

Ho fatto un circuitino elettronico con un fototransistor ed un led.

L'uscita analogica legge il valore del fototransistor (analogRead) e imposta un valore su un'altra uscita analogica (analogWrite) che dovrebbe variare l'intensità luminosa di un led in base al valore letto sull'uscita analogica del fototransistor.

ipotizziamo che il led sia connesso all'uscita analogica 5 (ovviamente l'altro capo è a GND).

Ho avviato il tutto e i valori vengono letti in ingresso dall'uscita del fototransistor e inviati al led.

il problema che dall'uscita analogica 5 non esce tensione!

ho provato a spostare (Senza cambiare il codice) il piedino del led sul PWM 5 e funziona!

però non ho capito perchè utilizzando analogWrite non ottengo tensione in uscita dall'analogica bensì dalla PWM..

ps: utilizzo l'arduino Mega.

grazie a chi risponderà

Ciao streetspirit!!

Se hai chiesto qualcosa, vuol dire che hai avuto qualche difficoltà, quindi non è una cosa banale.

Io sto usando arduino da due settimane dopo essermi documentato.

Ti voglio consigliare un libro proprio per chi comincia ad utilizzare arduino: Si chiama "Getting started with arduino" e lo puoi ordinare dal sito della smartproject: http://www.smartprj.com/catalog/index.php?main_page=product_info&cPath=1&products_id=35

Su questo libro troverai degli utilissimi esercizi.
Se stai utilizzando le funzioni analogRead() e analogWrite(), ti consiglio di guardare il capitolo 5, che presenta esempi con tali funzioni.

Ti riporto brevemente lo scopo di queste funzioni:

  • int analogRead(pin)
    //Legge la tensione applicata ad un pin analogico e ritorna un valore numerico 0 e 1023 che rappresenta una tensione tra 0V e 5V. (step conversione: 5mV -->1 unità)
    Esempio: tensione di 2,5V al pin 0. AnalogRead(0) restituisce 512.

  • analogWrite(pin,value)
    //Cambia il livello PWM di un segnale presente sui pin (3,5,6,9,10,11).
    value deve essere un valore numeric compreso tra 0 e 255 che rappresenta una tensione tra 0V e 5V. (step conversione: 20mV-->1 unità)
    Esempio: analogWrite(9,128); Imposta un segnale PWM per il pin 9 con duty cycle del 50%

Se non sbaglio c'è anche un esercizio che tratta l'esperimento che stai facendo, o molto simile, se ti interessa ti posso passare il link dove ci sono i codici di una decina di esercizi molto utili per capire l'uso di tutte le funzioni.

Ecco il link: http://makezine.com/getstartedwitharduino/

Leggendo il tuo post mi è venuto qualche dubbio...
(preciso che è da poco che lo utilizzo, quindi spero di non darti informazioni errate ;))

Tu dici:
"L'uscita analogica legge il valore del fototransistor (analogRead) e imposta un valore su un'altra uscita analogica (analogWrite) che dovrebbe variare l'intensità luminosa di un led in base al valore letto sull'uscita analogica del fototransistor."

Perchè dici l'uscita analogica legge...? se mai è un input analogico
Per le uscite analogiche devi usare un pin PWM (3,5,6,9,10,11).
Usi il 5, quindi quello va bene.

"Ho avviato il tutto e i valori vengono letti in ingresso dall'uscita del fototransistor e inviati al led.
il problema che dall'uscita analogica 5 non esce tensione!"

Come fa a leggere i valori se dall'uscita 5 non esce tensione?
Il led tra che pin è collegato? e il fototransistor?
Prova a scrivere qualcosa in dettaglio che magari riesco a dirti qualcosa di più.

"però non ho capito perchè utilizzando analogWrite non ottengo tensione in uscita dall'analogica bensì dalla PWM.."

la ottieni dalla PWM perchè il PWM è utilizzato per trattare un pin digitale come analogico.

Prova a guardare questo esempio:

// Example 04: Fade an LED in and out like on
// a sleeping Apple computer
//
// Copy and paste this example into an empty Arduino sketch

#define LED 9 // the pin for the LED (oppure un pin PWM)
int i = 0; // We'll use this to count up and down

void setup() {
pinMode(LED, OUTPUT); // tell Arduino LED is an output
}

void loop(){

for (i = 0; i < 255; i++) { // loop from 0 to 254 (fade in)
analogWrite(LED, i); // set the LED brightness

delay(10); // Wait 10ms because analogWrite
// is instantaneous and we would
// not see any change
}

for (i = 255; i > 0; i--) { // loop from 255 to 1 (fade out)

analogWrite(LED, i); // set the LED brightness
delay(10); // Wait 10ms
}

}

è semplice, se ti servisse qualcosa ti posso aiutare, dato che l'ho realizzato sulla basetta.
(Ho acquistato il kit workshop è c'è il necessario per fare un pò di prove... http://www.smartprj.com/catalog/index.php?main_page=product_info&cPath=1&products_id=10)

Ultima cosa... esercizio molto simile al tuo è il seguente:

06b) Impostare la luminosità di un led in base a un valore analogico di input (sensore LDR)
Avrà un'analogRead() per leggere il segnale del sensore, e un'analogWrite() per impostare la luminosità del led.

Nota: commento a due istruzioni
val = analogRead(0); //legge il valore dal sensore
analogWrite(LED, val/4)
Il valore val viene diviso per 4 perché analogRead() restituisce un numero tra 0 e 1023, ma analogWrite() accetta valori tra 0 e 255.

Codice:

#define LED 9 // the pin for the LED

int val = 0; // variable used to store the value
// coming from the sensor

void setup() {

pinMode(LED, OUTPUT); // LED is as an OUTPUT

// Note: Analogue pins are
// automatically set as inputs
}

void loop() {

val = analogRead(0); // read the value from
// the sensor
analogWrite(LED, val/4); // turn the LED on at
// the brightness set
// by the sensor

delay(10); // stop the program for
// some time
}

P.S: scusa se ho scritto tanto!!

@cecco88:
non per fare il puritano, ma scaricarlo illegalmente non è giusto e oltre tutto fa un po' a botte con la filosofia di OpenSource!!! (Non per altro lo si trova anche a meno di 10 euro)

@streetspirit:
i pin analogici sono solo ingressi, questo perchè l'elettronica che c'è dietro consente solo di convertire una tensione in un dato digitale e non viceversa, per questo le uscite chiamate analogiche sono quelle PWM.

Scusa Cecco88.

E' veramente figo che tu sia interessato ad aiutare streetspirit a mandare un segnale analogico dentro e fuori da Arduino.

(questo é il mio contributo di link e tutorial - legale - alla causa)
http://todbot.com/blog/bionicarduino/
o anche questo (più elettronico)
https://sites.google.com/a/divinechildhighschool.org/electronics/Home/Arduino-Lessons

ma ti chiederei di togliere il più presto possibile quel link dal tuo post.
Arduino é openSource. il 95% dei materiali per impararlo é online, basta cercarlo. Il resto é solo sbattimento e volontà di apprendere.

gli skecth di Arduino dei libri di Massimo ma anche di Tom Igoe sono online, ad uso di tutti.

il libro é aquistabile online ad una somma di 10 dollari.

E' ovvio che ormai si puà scaricare tutto. Programmi che costano migliaia di euro. Plug-ins che costano diverse migliaia di euro.
per la carità!

ma 10$!? per una cosa come Arduino.
E postarlo sul Forum di Arduino.

Considera la possibilità di regalartelo o di regalarlo a streetspirit

Ciao

Come richiesto, ho provveduto a modificare il mio post... mettendo il link da cui acquistare il libro.

Io ho voluto portarmi avanti, per capirne di più su arduino, tanto che alla fine ho acquistato il kit workshop e mi sto trovando veramente bene.

Per l'azienda per la quale sto facendo il tirocinio ne servirebbero un pò, circa 10/15. Quindi penso che un pò di soldi torneranno indietro.

Saluti!

...ovviamente ho tolto anch'io il quote, che se no non avrebbe senso...

Visto che è capitato l'argomento potrebbe interessare:

versione stampata!!!!

grazie a tutti, soprattutto a cecco, adesso ho capito :slight_smile:

Mi fa piacere streetspirit, sei il primo a cui ho dato una mano!!!

su questo forum comunque sono tutti molto disponibili!!
hanno aiutato molto anche me!!

ciao ciao :wink: