Salve a tutti,
Il mio problema riguarda il software per il controllo attraverso PWM di un motore in corrente continua alimentato a 3,3 Volt.
Principalmente il problema credo sia nella parte software in quanto quando chiedo al programma di scrivere su seriale la percentuale a cui viene alimentato il motore il valore rimane sempre nullo. Su seriale infatti mi viene notificato correttamente la variazione del PWm mentre la percentuale ottenuta con la funzione map rimane sempre all estremo inferiore e non capisco affato il motivo...
potreste aiutarmi?
ovviamente vi posto il programma.
In ultima istanza volevo sapere se esiste un programma che permetta di disegnare rapidamente i collegamenti con arduino...in modo che in futuro vi potrò mostrare anche il circuito senza disegnarlo su carta e penna.
grazie infinite e ditemi come posso aiutarvi ad aiutarmi!
David
ecco il codice
byte motorPin=3; //motore attaccato al pin da 3,3 V
byte pwm=9; // pin attaccato alla base del transistor
int valPwm; // variabile che regola il PWM
byte percento; // variabile di comodo per avere la percentuale di
void setup()
{
Serial.begin(9600);
Serial.println("system startup");
pinMode(motorPin,OUTPUT);
}
void loop()
{
percento=map(valPwm, 0, 255, 0,100); //mappatura della variabile PWM
for(valPwm=0;valPwm<255;valPwm++)
{
analogWrite(pwm,valPwm);
Serial.print("PWM : ");
Serial.print(valPwm);
Serial.print(" ");
Serial.print("percentuale : ");
Serial.println(percento); //print su seriale del valore percentuale
delay(100);
}
for(valPwm=255;valPwm>0;valPwm--)
{
analogWrite(pwm,valPwm);
Serial.print("PWM : ");
Serial.print(valPwm);
Serial.print(" ");
Serial.print("percentuale : ");
Serial.println(percento);
delay(100);
}
}
Sarebbe stato meglio postare nella sezione software.
Attenzione, map() calcola sul momento il valore non è che magicamente ogni volta che modifichi una variabile lei ricalcola.
Il codice percento=map(valPwm, 0, 255, 0,100);
devi metterlo nei for prima di stampare percento.
Per i disegni di schemi puoi usare il free Fritzing (per i neofiti) ma sarebbe meglio imparare ad usare qualcosa di più sofisticato come EagleCAD (è free per uso privato).
Il problemino di Fritzing e che molti esperti del forum lo "odiano" 
Il problemino di EagleCAD è che ha un fracco di librerie dentro e trovare i componenti da mettere nello schema è complicato.
Per EagleCAD ci sono dei tutorial anche in italiano ben fatti. Ti conviene scaricare la libreria di Adafruit e di Sparkfun (come mi consigliarono @xxxpighi e @gb)
Grazie mille per la risposta!
ma non capisco perchè tecnicamente dovrebbe calcolarlo ogni volta che inizia il ciclo!
potresti essere più chiaro?
Grazie della disponibilità!
David
->> QUI valPwm vale 0, perciò percento=0
percento=map(valPwm, 0, 255, 0,100); //mappatura della variabile PWM
->> dopo questo punto percento NON viene mai più ricalcolato
for(valPwm=0;valPwm<255;valPwm++)
{ analogWrite(pwm,valPwm);
Serial.print("PWM : ");
Serial.print(valPwm);
Serial.print(" ");
percento=map(valPwm, 0, 255, 0,100); ->> RICALCOLO DI PERCENTO qui, ora sarà okay
Serial.print("percentuale : ");
Serial.println(percento); //print su seriale del valore percentuale
delay(100);
}
E' un pò come se io chiedessi di fare in un punto un calcolo e poi non lo facessi più in nel ciclo (nel ciclo però valPwm lo aumenti di 1)
valPwm=0;
pippo=valPwm*10; // un calcolo a caso
for(valPwm=0;valPwm<255;valPwm++)
{ Serial.print(valPwm); // sarà 0, poi 1 poi 2 etc.
Serial.print(" ");
Serial.println(pippo); sarà sempre a 0
}
Ho capito il problema...almeno credo...
Non lo ricalcola perchè il loop è solo 1? è possibile?
grazie per i programmi penso che inizialmente userò il primo e spero che i Pro abbiano pietà di me... 
Ora funziona comunque ma se il programma non fa un ciclo solo allora la tua soluzione non mi convince...
Grazie mille per tutto.
David
Confermo il ciclo è uno solo!
Credo che la combinazione di cicli for faccia si che il ciclo sia uno solo, mentre se avessi usato due cicli if il programma avrebbe continuato a cilare le istruzioni. Non sapevo questa cosa fondamentale dei cicli for...
Ci ho preso?
Grazie...ho imparato (o credo di aver imparato) una lezione molto importante.
David
Ora non mi è chiaro il tuo dubbio.
La loop() viene eseguita continuamente da Arduino.
Logicamente viene eseguito tutto il codice che hai scritto e poi, una volta finito, Arduino lo ri-inizia.
Hai un ciclo 0-255 e poi 255-0 ma non finisce qui, poi riprende da 0-255 e ripeti all'infinito.
Spero di non confonderti ma per chiarire (spero)
Praticamente se leggi un manuale di C qualsiasi troverai che i programmi in C sono fatti cosi:
int main()
{ // istruzione 1
// istruzione 2
...
}
In maniera, diciamo, sequenziale. Arrivato all'ultima istruzione finisce.
In Arduino di "nascosto" viene fatto questo:
int main()
{ ...
setup(); // chiamo solo 1 volta la setup()
...
while(1)
{ loop(); // richiamo la loop all'infinito !!!!!!
}
}
chiaro chiaro...
chiedevo alla funzione map di mappare il valore quando questo era nullo. ovvero all inizio di ogni ciclo mentre questo variava all interno del ciclo.
Grazi mille anche per le dritte di c.
Saluti e alla prossima. Grazie mille della competenza e disponibilità!!!!
David
Di nulla.
Se tutto okay, puoi cambiate il titolo aggiungendo [Risolto] (lo puoi fare solo tu)
ops non so come fare! dimmi un pò...
david
Se premi modify sul tuo primo messaggio, dovresti poter modificare anche il titolo