Arduino impazzito

Salve,
Tutto è iniziato oggi pomeriggio. Stavo provando a pilotare un motore dc con un transistor. All'inizio avevo fatto un semplice on/off e funzionava regolarmente poi ho voluto provare un pin pwm per giocare con la velocità ed è impazzito arduino.
Avevo fatto un semplice codice che chiedeva in input un numero e se era compreso tra 0 e 255 cambiava la velocità del motore. Quando inserivo un numero però arduino faceva un rumore strano continuo e il motore era fermo. Non capendo il motivo ho riprovato più volte eliminando pezzi di codice per semplificare fino ad ottenere un codice che chiede in input un intero e lo stampa. Anche qui arduino funziona completamente a caso. Inserisco ad esempio 50 e mi stampa 53 e 48 su 2 righe differenti. Bhoooo
Davvero non capisco che stia succedendo, ho staccato tutti i jumper e ho lasciato come unico codice questo:

void setup (){
Serial.begin (9600);
}
void loop (){
if (Serial.available ()){
Serial.println (Serial.read ());
}
}

Mi aiutate a capire che succede? Grazie in anticipo

Edit: un'altra cosa che ho notato è che in base alle cifre che inserisco in input tante volte mi stampa i numeri sballati. Cioè inserendo 3 mi stampa un numero (tipo 51), inserendo 33 mi stampa 2 numeri (51 e 51), inserendo 333 mi stampa e numeri (51 51 e 51), tutti su righe differenti. È come se leggesse ogni numero che inserisco una cifra per volta e me lo stampa distorto in qualche altro numero.

Quando inserivo un numero però arduino faceva un rumore strano continuo

non vedo come arduino possa fare rumore, al massimo scoppietta il chip o fa fumo.

forse era il relè

Non so descrivertelo come rumore, era tipo quello del PC appena si avvia.

Adesso ho provato a rifare il circuito col transistor e il motore dc. Ho fatto un semplice codice che prende in ingresso un intero i e lo uso come velocità per il motore usando digitalWrite (3,i) ma mettendo valori piccoli il motore si accende e si spegne, più aumento il valore più tempo dura il periodo di accensione, ma la velocità è sempre la stessa.
Che succede? Sembra che abbia una vita sua :open_mouth:

l'ho sempre sostenuto, mai fidarsi ciecamente dell'elettronica, prima o poi impazzisce e ti frega :frowning:

prova caricare blink così vedi se arduino non è ko.
ciao

L'ho caricato e funziona regolarmente

ixol:
Adesso ho provato a rifare il circuito col transistor e il motore dc. Ho fatto un semplice codice che prende in ingresso un intero i e lo uso come velocità per il motore usando digitalWrite (3,i) ....

Ehhhhh ? ? ? :o :o :o

La digitalWrite() può solo mettere un pin HIGH o LOW ... per quello che vuoi fare tu dei usare dei pin che supportano il PWM ed utilizzare la analogWrite() !!!

Guglielmo

Ops.. non mi ero accorto di aver scritto digital

In ogni caso mettendo analog fa più o meno la stessa cosa: mettendo numeri bassi fa quel rumore di cui parlavo prima per poco tempo, aumentando il numero oltre i 1000 il rumore si sente per più tempo e così via. Comunque non è una cosa normale..

Il codice l'hai postato. Ora metti anche uno schema o una foto di come hai fatto i collegamenti. Grazie.

Ma li leggete i reference o cosa ? :o

Il valore del PWM, che metti nella analogWrite() può andare da 0 a 255 ... altro che 1000 !!!

E inoltre metti anche uno schema dei collegamenti .. perché voglio proprio vedere come hai collegato questo motore ...

Guglielmo

P.S.: Quello che vedi sul monitor seriale è il valore ASCII del carattere che trasmetti ... '3' = 0x33 = 51

So benissimo che i valori vanno da 0 a 255... sentendo quel rumore strano ho fatto delle prove e ho visto che la durata del rumore aumenta con l'aumentare del numero, anche oltre i 255. Infatti mettendo 999999 dura per circa 1 secondo.

Ora pubblico la foto ma non so se capisce granché e ho problemi con la rete internet di casa quindi non posso scaricare software per disegnare schemi elettrici. Al massimo provo con paint se volete.
http://postimg.org/image/3ukrsdrkx/
Sotto arduino ci sono 4 pile da 1.5 volt che tramite il filo rosso vanno al motore. Il fill nero del motore va al collettore del transistor e c'è un diodo (quello che mantengo in mano). Dall'emettitore del transistor esce un filo nero che va alla terra di arduino e delle pile.

Per quanto riguarda il 51 che vedo al posto del 3 a cosa è dovuto?

ixol:
So benissimo che i valori vanno da 0 a 255... sentendo quel rumore strano ho fatto delle prove e ho visto che la durata del rumore aumenta con l'aumentare del numero, anche oltre i 255. Infatti mettendo 999999 dura per circa 1 secondo.

... tu puoi arrivare a quello che ti pare ... il numero viene sempre troncato e sempre gli 8 bit meno significativi vengono presi :smiling_imp:

ixol:
Ora pubblico la foto ma non so se capisce granché e ho problemi con la rete internet di casa quindi non posso scaricare software per disegnare schemi elettrici. Al massimo provo con paint.

... va benissimo un disegnino fatto con un qualsiasi programma, purché sia leggibile.

Guglielmo

Ho messo il link nel messaggio precedente

mmm .. non è che si vedano molto chiaramente le connessioni sicuro dei collegamneti su B-C-E del transistor ?

Comunque, lo schema che devi rispettare è quello che ti allego, in alto a sinistra ... solo che al posto del relè ci metti il motore.

Guglielmo

scheda_3.pdf (408 KB)

Si li ho connessi così.
Ho il cellulare sotto il 5% quindi non posso fare foto... aspetto che si carica un po e ne mando qualcun altra.

Per quanto riguarda il 51 che vedo al posto del 3 nel primo codice che ho postato a che è dovuto?

Te l'ho spiegato nel PS di prima ... '3' è il carattere, 0x33 è il valore esadecimale corrispondete nella codifica ASCII, 51 è il valore in decimale.

Quando ricevi dei 'caratteri' essi sono codificati in ASCII quindi, per ogni carattere ricevi un byte con il valore ASCII del carattere ... '0' = 0x30 ... 'A' = 0x41 ... e così via.

Cerca tabella ASCII.

Guglielmo

...probabilmente hai attivato una modalità GIGO :wink:

gpb01:
Te l'ho spiegato nel PS di prima ... '3' è il carattere, 0x33 è il valore esadecimale corrispondete nella codifica ASCII, 51 è il valore in decimale.

Quando ricevi dei 'caratteri' essi sono codificati in ASCII quindi, per ogni carattere ricevi un byte con il valore ASCII del carattere ... '0' = 0x30 ... 'A' = 0x41 ... e così via.

Cerca tabella ASCII.

Guglielmo

Ah ho capito devo usare Serial.parseInt () per leggere interi. Ora ha più senso la cosa.

Per l'altro problema cercherò di risolverlo domani o manderò delle foto migliori. Per ora grazie :slight_smile:

Ho ridotto all'osso anche questo codice

void setup ( ) { 
pinMode (9,OUTPUT);
}
void loop ( ) { 
analogWrite (9,50);
delay (10);
}

Ma mi da quel rumore fisso di cui parlavo.
Il circuito è corretto perché con arduino senza alimentazione se simulo la saturazione del transistor con un jumper il motore funziona. E se con arduino dico accendi spegni va. Solo quando inserisco una speed non va più e dà quel rumore strano...

Edit: facendo delle prove ho scoperto che con alcuni valori funziona.
Se metto come velocità un valore superiore a 115 e un delay di 2 millisecondi funziona. Se aumento il delay devo aumentare la velocità almeno a 150 per farlo funziona sennò fa il rumore strano.
Ora le mie domande sono:
Perché con valori di velocità bassi o di delay alti non funziona regolarmente?
Il rumore da dove previene e a cosa è dovuto?

Giusto per curiosità, ma se non colleghi nulla ad arduino e lo avvii con quello sketch senti qualcosa?
Arduino fa comunque rumore?
Altrimenti è il motore che tentando di girare vibra ad una certa frequenza che riesci a sentire...