Servo SG90 + Attiny85

Buon giorno a tutti
dopo diversi giorni spesi a cercare di capire come far funzionare Attiny85 con il servo citato, chiedo aiuto a tutti voi anche per chiarirmi le idee a riguardo
Con il nomale Arduino R3, il breve e semplice sketch che ho scritto funziona alla grande ma se cerco di trasferirlo su attiny85 lo sketch non è corretto..
Ho capito che vi sono delle specifiche librerie da utilizzare .
Arduino.h (trovata e già inclusa nello sketch)
SoftwareServo (inclusa nello sketch)
Chi può farmi chiarezza a riguardo?

come dicevo ho speso giorni a cercare una discussione che facesse chiarezza ma sinceramente non ho trovato nulla che risolvesse il mio problema. (Sia in inglese che italiano)

Allego sketch per completezza e ringrazio tutti.
Lorenzo

isidoro_x_attiny85.ino (1.01 KB)

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

ciao.

La libreria Servo non funziona sull' Attiny85 perché questo non ha un timer a 16 bit.

Una spiegazione su come pilotare (genericamente) un servo la trovi qui.

Se leggi tutto il tread che ti ho linkato trovi anche come usare correttamente la libreria SoftwareSerial.

ciao
pippo72

Ciao Ti ringrazio della risposta.
Si ho letto che la libreria Servo non funziona e non la sto utilizzando ma uso SoftwareServo ( spero non sia la stessa cosa ).
Ho letto tutta la discussione ed essendo un novello non riesco ad apprende per ora tutto quello che tecnicamente andrebbe fatto.
Quindi ti consigli di utilizzare la libreria SofwareSerial se non ho capito male giusto ?
L'errore che mi compare utilizzando SoftwareServo è il seguente :

In file included from /Users/lorenzo/Documents/Arduino/libraries/SoftwareServo/SoftwareServo.h:4:0,
from /var/folders/jq/k7_hpnz5223bnlm_40ngvvg80000gn/T/arduino_modified_sketch_421282/isidoro_x_attiny85.ino:4:
/Users/lorenzo/Documents/Arduino/libraries/Arduino/WProgram.h:1:10: error: #include expects "FILENAME" or
#include Arduino.h
^
exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.

Non so dove iniziare per risolverlo.
Oltretutto ho provato a caricare l'esempio della libreria e mi propone lo stesso errore .
Infine se ho capite bene potrei utilizzare la libreria Servo8Bit come alternativa?

l'errore ti dice che nella SoftwareServo.h

#include Arduino.h

è sbagliato e al suo posto ci deve essere

#include "Arduino.h" <--- questa dovrebbe essere quella corretta

oppure

#include <Arduino.h>

ciao

lrnzlore:
...
Si ho letto che la libreria Servo non funziona e non la sto utilizzando ma uso SoftwareServo ( spero non sia la stessa cosa ).

Nel programma che hai allegato nel primo post NON utilizzi la SoftwareServo perché è commentata. Probabilmente hai allegato lo sketch sbagliato.

Personalmente io non utilizzo nessuna libreria per comandare un servo con un attiny85, gestisco direttamente la tempistica di cui ha bisogno direttamente nello sketch.
Se rileggi il link che ti ho dato nel mio post precedente un servo ha bisogno di un impulso positivo della durata variabile tra i 500 us (-90°)e i 2500(+90°) us ogni 20 millisecondi.
Volendo tradurre in codice:

byte angolo = 90;
byte servoPin = 1; //pin dove è collegato il servo
int pausa;
void setup() {
  pinMode(servoPin, OUTPUT);
  pausa = (500 + (11 * angolo));
}
void loop() {
  digitalWrite(servoPin, HIGH);
  delayMicroseconds(pausa);
  digitalWrite(servoPin, LOW);
  delay(20);
}

Questo sketch (abbastanza barbaro) non fa altro che portare il servo in posizione centrale (circa) e non fa nient'altro (quindi per te è inutilizzabile) ma può essere uno spunto per iniziare.
Naturalmente quel delay(20) lo devi "far sparire" e usare millis() al suo posto se vuoi che il micro possa fare altro (tipo leggere un ingresso). Qui una serie di link sull'utilizzo di millis.

ciao
pippo72

Grazie Pippo

ti ringrazio per il tuo prezioso supporto che studierò approfonditamente (visto che sono un novizio) in modo tale da bypassare la libreria.
Ti ringrazio ancora.

Ciao a tutti,
sono contento di essere riuscito dopo una miriade di tentativi a caricare il programma, che allego, su attiny85 dopo aver utilizzato la libreria servo8bit ( se non ci fossi riuscito avrei tentato la strada di pippo che era la mia via di fuga).
Il problema è che ora il servo non gira ma allegando la foto dei collegamenti fatti vi chiedo se sbaglio qualche cosa a riguardo nelle connessioni.

-Per il programma ho incluso anche le 2 librerie apposite e scelto Timer0

Scopo:
Fondamentalmente il servo alla pressione di un pulsante si dovrebbe muovere la prima volta di 50 gradi(ritornando poi nella pos. iniziale) e dopo una seconda pressione del pulsante, muoversi di 100 gradi e successivamente tornare nella posizione iniziale, dopo un delay
Perciò vi chiedo se vi è qualche errore di connessione che non vedo.

Ultima cosa.
La libreria Servo8bit utilizza i microsecondi e non i millisecondo.
La mia necessità è rimanere in delay per circa 5 sec.
Il valore dovrà essere aggiornato in base ?

Vi ringrazio già in anticipo... :slight_smile:

isidoro_x_attiny85ultimo.ino (898 Bytes)

ciao

riporto qui il tuo quesito arrivatomi in PM

Ciao Pippo,
sto studiando il tuo sketch e cercando di adattarlo alla mia esigenza.
Tuttavia ,ovviamente per mia inesperienza, ti chiedo se mi puoi dare una mano a comprendere meglio il funzionamento software per gestire il servoSG90.
Al tuo sketch ho aggiunto :

pausa2 = (2500 - (11 * angolo)); ( indicando pausa2 prima del setup)

subito dopo il delay (20) che ho aumentato a 2000 (2 sec.)

In effetti il servo ruota avanti ed indietro come previsto ma vorrei capire :

1)Non mantiene la posizione in modo preciso ( ad ogni rotazione "sgarra di qualche tic" e vorrei sapere come ovviare.

  1. In base alla formula che mi hai citato ,pausa = (500 + (11 * angolo)); ho modificato il byte angolo = 1 anziché 90, vorrei capire come portarmi a specifiche posizioni, nella fattispecie a 50 e 100 gradi, riportando poi a posizione zero il servo.

  2. perché moltiplichi *11 ?

Ti ringrazio già in anticipo.

Chiariamo intanto che non è permesso dal regolamento (punto 12) inviare richieste tecniche tramite messaggio privato.

Detto questo cerco di spiegare meglio il mio sketch:

pausa = (500 + (11 * angolo));

questo determina la durata dell'impulso da dare al servo. Sappiamo che un servo ha bisogno di un impulso positivo della durata variabile tra i 500 us (-90°)e i 2500(+90°) us ogni 20 millisecondi. -90° e +90° sono i gradi che il servo gira (in positivo o in negativo) assumendo come 0° la posizione centrale del servo.
La variabile angolo nel mio sketch è invece intesa come 90° posizione centrale, 0° tutto da una parte e 180° tutto dall'altra quindi con angolo = 0 abbiamo 500 +(110) quindi 500 microsecondi; con angolo = 90 abbiamo 500+(1190) quindi 1490 microsecondi e con angolo = 180 abbiamo 500+ (11*180) quindi 2480 microsecondi ecc.
Sarebbe effettivamente più corretto moltiplicare per 11.1 ( oppure anziché 500 usare 510 tanto per "centrare" il servo) ma vista la precisione del servo (SG90) non credo sia influente.

Il delay(20) serve a dare questo benedetto impulso ogni 20 millisecondi; questa tempistica è necessaria al funzionamento del servo (anche se non critica) e come ho spiegato del mio precedente post il mio sketch non fa niente quindi quel delay ci può anche stare, ma per le tue esigenze sarebbe ( è ) da eliminare e sostituire con un altro modo di misurare il tempo ( leggi millis ). Ti consiglio anche di cercare " macchina a stati finiti" nel forum, è un concetto che sicuramente ti servirà per il tuo sletch.

Spero di essere stato più chiaro.

ciao
pippo72

ciao Pippo e scusa per il messaggio in privato.
Ti ringrazio per la risposta
Sono riuscito a capire bene il funzionamento.
Appena comprendo come utilizzare millis ti farò una domanda specifica.
Buona serata.