vibration coin motor e Bluetooth

Buonasera a tutti! Sto lavorando su un progetto nella quale ho bisogno di far vibrare un coin motor ogni qual volta tocco un sensore a pressione costruito con il Velostat. I due dispositivi comunicano via Bluetooth. Sulla board che ho costruito ho messo anche un LED per debuggare. Ho scritto il codice selezionando il Pin del LED in modo che una volta che tocco il sensore sulla board 1 si accende il LED su board 2 e il tutto funziona. Nel momento in cui vado a cambiare il pin, selezionando quello del motore, non funziona più. Ho provato a vedere se era un problema di Hardware delle board ma non credo sia così perchè se carico lo sketch di prova del bottone (a pressione vibra il motore), il motore funziona. Cosa c'è che non va? grazie mille

Buonasera, essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

Dopo che avrai fatto quanto suddetto, prova a considerare che ... ... ogni pin di Arduino può dare al massimo, a Vcc, 40 mA (... ma quello è veramente un limite, nel normale funzionamento occorre stare al 60-70% di detto valore) ed inoltre la somma di tutti i pin e dell'assorbimento del chip, non deve superare al massimo i 200 mA (... e anche qui massimo va considerato come valore limite, ma nel normale funzionamento occorre stare al 60-70% di detto valore). Assorbimenti oltre detti limiti possono [u]danneggiare irrimediabilmente[/u] il chip.

Ho idea che quel motorino assorba ben di più, quindi ... lo devi pilotare tramite un transistor/mosfet.

Guglielmo

Perdonami della mancata presentazione.
Comunque nella mia board ho utilizzato un Mosfet N, non avendo altro a disposizione.
E’ possibile che il motore vada impostato come analogico e non digital?
Allego anche i codici che ho utilizzato, uno è per il Bottone e uno è per il Motore.
Grazie

Chiara

SLAVE_BUTTON.ino (1 KB)

MASTER_MOTOR.ino (1.2 KB)

No, il pin per comandare il MOSFET è giusto sia un pn digitale … che schema hai utilizzato ? Prova a guardare QUI.

Mi sembra inoltre di vedere un altro problema nel tuo codice; non mi sembra tu tenga conto dei rimbalzi dei tuoi pulsanti … devi applicare delle tecniche di “debouncing” … prova a leggere QUESTO mio post di oggi pomeriggio.

Guglielmo

come schema elettrico ho utilizzato quello allegato.
Ho letto le regole di debouncing ma non riesco a risolvere.

1.png

beppina: Nel momento in cui vado a cambiare il pin, selezionando quello del motore, non funziona più.

Scusa ma spiega meglio, cosa intendi con "non funziona più"? Il motore non si muove affatto? O vibra leggermente (toccalo per sentire se vibra anche poco)? Hai provato a vedere (non dico con un analizzatore, ma almeno con un tester) cosa esce sul pin che comanda il motore? Nel master hai provato a mettere qualche riga di debug per capire se funziona correttamente e se manda correttamente alto il pin di uscita, e se questo resta alto finché premi o se "balla" tra HIGH e LOW?

Ma comunque sia, prima vedrei meglio il codice, io vedo che metti prima un:

int outPin = ledPin;

poi nel loop():

    state = mySerial.read(); // Reads the data from the serial port
   if (state == '1') {
     //Serial.println("HIGH");
     digitalWrite(ledPin, HIGH); // LED ON
     //digitalWrite(outPin, HIGH); // motor on
     state = 'N';
   }
   if (state == '0') {
     //Serial.println("LOW");
     digitalWrite(ledPin, LOW); // LED ON
     //digitalWrite(outPin, LOW); // motor off
     state = 'N';
   }

Quindi il digitalWrite lo fai sul ledPin, la digital Write commentata immagino sia per poter switchare sul motore, ma c'è qualcosa che non va. Mi pare che tu abbia DUE metodi per fare lo switch, ma se imposti outPin=ledPin anche abilitando le digitalWrite commentate scrivi sempre sul pin LED! Per farlo funzionare dovresti sia mettere "outPin=motPin" sia decommentare le digitalwrite (a questo punto a cosa serve? E a che ti serve anche impostare alla fine "state='N'" se poi la variabile la reimposti?).

Insomma, scommenta quelle righe, togli la "outPin" e lascia il led come controllo visivo e vedi cosa succede:

    state = mySerial.read(); // Reads the data from the serial port
   if (state == '1') {
     //Serial.println("HIGH");
     digitalWrite(ledPin, HIGH); // LED ON
     digitalWrite(motPin, HIGH); // motor on
   }
   if (state == '0') {
     //Serial.println("LOW");
     digitalWrite(ledPin, LOW); // LED OFF
     digitalWrite(motPin, LOW); // motor off
   }

ciao, quando dico "non funziona più" intendo il codice. Quel codice che utilizzavo per far accendere il led su board 2 premendo il bottone su board 1, l'ho utilizzato per il motore cambiando il pin e mettendo quello giusto. Praticamente se accendo il led funziona, se provo ad azionare il motore non funziona più, il motore non dà segni di vita, nemmeno una leggera vibrazione. Ho provato a cambiare il codice come mi dicevi ma niente, non si muove. Non riesco davvero a capire, non credo che sia un problema di comunicazione Bluetooth perchè, con il led funziona e con il motore no. Se provo a far vibrare il motore sulla stessa board premendo il bottone, il motore vibra. C'è qualcosa che non funziona nel momento in cui le voglio far comunicare. Ci sto veramente impazzendo! ahhaha

Chiara

beppina: Praticamente se accendo il led funziona, se provo ad azionare il motore non funziona più, il motore non dà segni di vita, nemmeno una leggera vibrazione. Ho provato a cambiare il codice come mi dicevi ma niente, non si muove.

Ok, hai risposto alla prima domanda (se il motore vibra, magari lentamente) ma se hai fatto le modifiche che ti ho indicato, nel master il LED si accende o no? Se non si accende, devi capire se riceve qualcosa o meno, e cosa riceve.

Però un'altra cosa che ho notato ora: perché usi SoftwareSerial e poi lo agganci ai pin 1 e 2? Il pin 1 è della UART (seriale) di Arduino! Usa altri pin (es. i classici 10 e 11 se sono liberi come sembra) e lascia liberi 0 e 1 così puoi collegare un monitor seriale al master, e se riattivi i Serial.print() puoi fare debugging e capire in che senso "non funziona" ossia se lo sketch sta girando correttamente (fa il setup, e poi il loop()), se ricevi caratteri dal Bluetooth e quali. Facci sapere.

uso software serial perchè sto utilizzando l’IDE di Arduino ma non la scheda Arduino. Le board che comunicano le ho disegnate e costruite io.
Allego il disegno della board e lo schema elettrico.
Il microchip è un ATtiny44

Ah, ok, non lo avevi detto... Comunque sia, se non hai una UART (e l'ATtiny mi pare non l'abbia) modifica lo sketch per fare qualcosa con uno o due LED per far capire se succede qualcosa, ad esempio uno che cambia di stato per ogni byte ricevuto dal BT (indipendentemente se sia uno dei caratteri ammessi), ed uno -quello attuale- per indicare lo stato del motore, che attivi insieme. E prova così, poi posta lo sketch modificato ed i risultati (es. il LED della ricezione caratteri si accende mentre il LED del motore no..) così vediamo di capire.

 mySerial.begin(9200); // Default communication rate of the Bluetooth module

bellissimo quel resistore di PullDown da 4,9 Ohm sull'ingresso del pulsante

brunello22:

bellissimo quel resistore di PullDown da 4,9 Ohm sull’ingresso del pulsante

… be’, almeno non e’ un corto … secco :smiley:

Etemenanki: ... be', almeno non e' un corto ... secco :D

Oddio non so se mi sfugge qualcosa, ma hai ragione... Il problema è quando lo preme, mi suona di corrente altina (e 5W da dissipare) temo :D :D Magari manca solo una "k" ;) Chiedere a Martin :)

la resistenza l’ho cambiata infatti, ma non era quello il problema, continua a non funzionare