Attiny85 e softwareservo, non va !

Ciao sto provando ad usare un servo con un attiny85, ho collegato oltre al servo anche un potenziometro per poter pilotare la posizione del servo.
Sto usando la libreria softwareservo scaricata dal playground, lo sketch che eseguo è il seguente:

#include <SoftwareServo.h> 

SoftwareServo myservo;  // create servo object to control a servo 

int potpin = 2;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin 

void setup() 
{ 
  myservo.attach(1);  // attaches the servo on pin 2 to the servo object 
} 

void loop() 
{ 
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023) 
  val = map(val, 0, 1023, 0, 179);     // scale it to use it with the servo (value between 0 and 180) 
  myservo.write(val);                  // sets the servo position according to the scaled value 
  delay(15);                           // waits for the servo to get there 

  SoftwareServo::refresh();
}

L’attiny85 gira a 8Mhz e il problema che si verifica è che il servo non sta fermo continua a fare dei movimenti di qualche grado su è giu.
C’è qualcuno che ha usato con successo questa libreria sugli attiny85, magari mi passate uno sketch di esempio.

Grazie

Io la uso correttamente, e non mi da alcun problema... con il tuo stesso codice....

bhe allora non so cosa pensare, come servo uso un hitec hs55 , il micro è ATTINY85V-10PU, il potenziometro è da 10k.
Il codice è quello che ho scritto, il micro lo programmo con arduino isp, la frequenza del micro è di 8Mhz settata con avrdude.

Lo sketch con arduino e la libreria servo.h funziona, quindi i collegamenti su breadboard sono quelli, tra l'altro non è che ci vuole tanto a collegare un servo e un potenziometro quindi non credo che sia il circuito il problema...

Ci sto perdendo la testa, se non riesco passo all'attiny84 anche se mi rode sapere che gli altri non hanno problemi.

Ho anche visto la tua discussione dove posti un paio di sketch che a te vanno e copiati pari pari a me non girano, mah...

Roba da matti !

Lo stesso sketch su attiny84 funziona correttamente, mentre sull'attiny85 fa andare il servo a scatti...

Ratto gentilmente mi dici a quale pin colleghi il servo e a quale il potenziometro e i rispettivi pin da dichiarare nello sketch, solo tu mi puoi salvare :grin:

Potresti indicare i piedini fisici usati per i collegamenti?

Con lo sketch nel primo post i pin che uso sull'attiny85 sono: il pin 4 o PB4 o ADC2 per il potenziometro e il pin 6 o PB1 per il servo.
Potrebbe essere che il tiny85 che uso io è la versione ATTINY85V-10PU e non la ATTINY85-20PU, non so forse oltre a cambiare la velocità di clock massima supportata magari cambia qualcos'altro.

Ti chiedevo i piedini fisici :stuck_out_tongue:
Comunque stai mescolando i pin fisici con quelli logici.

ulver85:
Con lo sketch nel primo post i pin che uso sull'attiny85 sono: il pin 4 o PB4 o ADC2 per il potenziometro e il pin 6 o PB1 per il servo.

Il pin 4 del micro è GND, è il pin 3 che è PB4/ADC2/D4. Il pin 6 del micro è PB1/D1.

ulver85:
Potrebbe essere che il tiny85 che uso io è la versione ATTINY85V-10PU e non la ATTINY85-20PU, non so forse oltre a cambiare la velocità di clock massima supportata magari cambia qualcos'altro.

A parte il clock, non dovrebbe cambiare nulla.

Come alimenti il circuito?

Scusa ma prima non potevo rispondere… A me funziona su uno qualsiasi dei pin tranne ovviamente al reset e i due pin dell’alimentazione

Questi sono i pin del micro:

di questi pin io collego al pin fisico 3 il potenziometro da 10k e al pin fisico 6 il filo giallo del segnale del servo.
Con lo sketch nel primo post il risultato è che il servo vibra, con il potenziometro a zero il servo è quasi fermo a 90°, con il potenziometro al massimo il servo vibra come un pazzo e gira di 90° a sinistra.

Il micro e il servo sono alimentati da arduino, il servo è piccolino e non assorbe più di 150mAh senza carico.

Lo stesso sketch e lo stesso circuito funzionano con un attiny84.

Se qualcuno di voi ha un servo e un ATTINY85V-10PU può gentilmente provare cosi mi levo il dubbio sul tipo di micro che sto usando.
Potrebbe essere un problema della libreria softwareservo, ci sono altre versioni più aggiornate in giro ?
Io uso la versione che si trova nel play ground.

Se ci riesco con il vostro aiuto vorrei venire a capo della questione perchè ho diversi attiny85 e volevo realizzare alcuni progettini proprio con i servo.

Grazie a tutti

Finalmente dopo 2 giorni di mal di testa sono riuscito a far funzionare tutto, però non con la libreria softwareservp ma con una libreria chiamata Servo8bit trovata su di un blog all'indirizzo:

http://www.cunningturtle.com/wordpress/wp-content/uploads/2011/11/servo8bit_arduino_example.zip

Spero possa essere utile anche a qualcun'altro.

Grazie comunque a tutti per la mano.

E' molto strano però come comportamento....

In realtà facendo delle prove ho risolto in parte, perchè è vero che ora almeno il servo si muove senza strane vibrazioni ma ho notato che le funzioni delay() e millis() sono sballate completamente e quindi i millisecondi impostati non corrispondo al tempo reale.

Non so cosa pensare perchè cosi poi ho difficolta a gestire correttamente lo sketch ecc.

L'unica cosa che mi è venuta in mente è che forse ho sbagliato a impostare il fuse per l'attiny85 ad 8Mhz, ho usato il seguente comando su win7:

C:\arduino-0022\hardware\tools\avr\bin\avrdude.exe -p t85 -c avrisp -P \.\COM8 -b 19200 -U lfuse:w:0xE2:m -C "C:\arduino-0022\hardware\tools\avr\etc\avrdude.conf"

Anche se caricando lo sketch blink con frequenza di spegnimento accensione led di 1000ms il delay viene rispettato.

Sto impazzendo...

Non è che il tuo tiny è ancora a 1MHz?

cerca nella discussione giocando con gli Attiny85 nella terz'ultima o quart'ultima pagina cè un mio post con tutta la procedura ed i comandi...

Il fuse basso su $E2 va bene.
Se la lib che stai usando tu ti sballa delay e millis significa che sta alterando il timer 1, che sui Tiny85 governa queste funzioni.
Prova a modificare il file /hardware/tiny/cores/tiny/core_build_options.h alla riga 108.
Da così:

#define TIMER_TO_USE_FOR_MILLIS                   1

a così:

#define TIMER_TO_USE_FOR_MILLIS                   0

in modo da spostare le funzioni temporali sull'altro timer.

leo72:
Il fuse basso su $E2 va bene.
Se la lib che stai usando tu ti sballa delay e millis significa che sta alterando il timer 1, che sui Tiny85 governa queste funzioni.
Prova a modificare il file /hardware/tiny/cores/tiny/core_build_options.h alla riga 108.
Da così:

#define TIMER_TO_USE_FOR_MILLIS                   1

a così:

#define TIMER_TO_USE_FOR_MILLIS                   0

in modo da spostare le funzioni temporali sull'altro timer.

Leo ci hai preso in pieno, la libreria usava il timer 1, infatti con la tua modifica tutto va come deve ! :sweat_smile:

Ora però mi chiedo, se rimango il timer 0 come timer di default nel tiny core in modo che la libreria servo funzioni correttamente potrei avere problemi con altre funzionalità o usare un timer al posto di un'altro non cambia nulla ?

ulver85:
Leo ci hai preso in pieno, la libreria usava il timer 1, infatti con la tua modifica tutto va come deve ! :sweat_smile:

:wink:

Ora però mi chiedo, se rimango il timer 0 come timer di default nel tiny core in modo che la libreria servo funzioni correttamente potrei avere problemi con altre funzionalità o usare un timer al posto di un'altro non cambia nulla ?

Usare un timer al posto di un altro per le funzioni temporali non cambia nulla, a meno appunto di sovrapposizioni di librerie. Ma questo va visto caso per caso. Per ora, tieni la modifica e vivi felice XD