Analog Read Attiny85

Buongiorno a tutti,
mi sono arrivati degli attiny85 ordinati un po di tempo fa.
Ho scaricato la guida
Programmazione
dei microcontrollori
“piccoli” di Atmel
Guida per l’uso dei microcontrollori
della famiglia tinyAVR di Atmel
con l’IDE 1.5.7 di Arduino
ed ho cominciato a fare i primi sketch. Fin quando ho usato pulsanti digitali è andato tutto bene ma nel momento in cui ho voluto leggere un ingresso Analogico ho trovato difficoltà. Il mio sketch prevede la lettura su ingresso analogico di una tensione che varia in 8 valori corrispondenti ad 8 posizioni di un partitore e fa accendere 3 led in modo da visualizzare il codice binario.

/*
  Prova con pulsante per selezionare i valori da visualizzare
    
    Ain0       (D  5)  PB5  1|    |8   VCC
    Ain3       (D  3)  PB3  2|    |7   PB2  (D  2)  INT0  Ain1
    Ain2       (D  4)  PB4  3|    |6   PB1  (D  1)        pwm1
                       GND  4|    |5   PB0  (D  0)        pwm0
                             +----+
  Quindi se voglio usare il PIN6 come uscita digitale userò pinMode(1,output) 
  e se volessi leggere l’ingresso analogico dal PIN3 userò analogRead(A2).

*/
#define RED 2
#define YELLOW 1
#define GREEN 0
#define BUTTON A2
//Valore posizione pulsante :
int oldPuls;
int newPuls;
//Valori soglie pulsanti
int V_puls1 = 983;  
int V_puls2 = 870;  
int V_puls3 = 749;  
int V_puls4 = 632;
int V_puls5 = 516;
int V_puls6 = 439;
int V_puls7 = 322;
int V_puls8 = 205;
//Tolleranza per la soglia che non sarà perfettamente V_pulsn ma leggermente diversa
int dev = 40;

//int contatore = 0; // il contatore varia da 0 a 7 (8 variazioni)
byte Val_1=0;  //variabile lettura pin analogico
int diff =0; //differenza tra oldPuls e newPuls

void setup() {
  // put your setup code here, to run once:
      pinMode(RED, OUTPUT);
      pinMode(YELLOW, OUTPUT);
      pinMode(GREEN, OUTPUT);
     // pinMode(BUTTON, INPUT);//ingresso analogico

}

void loop() {
  
    LeggiPulsante();
    
    switch (newPuls) {
            case 0:
                //tutti spenti
                write_leds(LOW, LOW, LOW);
                break;
            case 1:
                //Valore 1 (001)
                 write_leds(LOW, LOW, HIGH);
                 break;
            case 2:
                //valore 2 (010)
                 write_leds(LOW, HIGH, LOW);
                 break;
            case 3:
                //valore 3 (011)
                 write_leds(LOW, HIGH, HIGH);
                 break;
            case 4:
                //valore 4 (100)
                 write_leds(HIGH, LOW, LOW);
                 break;
            case 5:
                //valore 5 (101)
                 write_leds(HIGH, LOW, HIGH);
                 break;  
            case 6:
                //valore 6 (110)
                 write_leds(HIGH, HIGH, LOW);
                 break; 
            case 7:
                //valore 7 (111)
                 write_leds(HIGH, HIGH, HIGH);
                 break;     
        }
    
    

}

void write_leds(byte state1, byte state2, byte state3) {
    //modifica le porte dei 3 LED
    digitalWrite(RED, state1);
    digitalWrite(YELLOW, state2);
    digitalWrite(GREEN, state3);
}

void LeggiPulsante(){
  //Val_1 = 0;
  Val_1 = analogRead(BUTTON);  //leggo il valore del pin anologico BUTTON
  
  //confronto tale lettura con i valori in memoria e assegno alla variabile
  //newPuls il valore corrente
    if((Val_1 <=(V_puls1 + dev)) && (Val_1 >(V_puls1-dev)))
      newPuls =0;
  if((Val_1 <=(V_puls2 + dev)) && (Val_1 >(V_puls2-dev)))
      newPuls =1;
  if((Val_1 <=(V_puls3 + dev)) && (Val_1 >(V_puls3-dev)))
      newPuls =2;
  if((Val_1 <=(V_puls4 + dev)) && (Val_1 >(V_puls4-dev)))
      newPuls =3;
  if((Val_1 <=(V_puls5 + dev)) && (Val_1 >(V_puls5-dev)))
      newPuls =4;
  if((Val_1 <=(V_puls6 + dev)) && (Val_1 >(V_puls6-dev)))
      newPuls =5;
  if((Val_1 <=(V_puls7 + dev)) && (Val_1 >(V_puls7-dev)))
      newPuls =6;
  if((Val_1 <=(V_puls8 + dev)) && (Val_1 >(V_puls8-dev)))
      newPuls =7;
  
}

Il problema che riscontro è che i 3 led rimangono sempre accesi indipendentemente dalla tensione in ingresso sul pin analogico dell’attiny85.
Allora ho pensato che stessi usando male l’ingresso analogico ed ho fatto una lettura dell’ingresso analogico con stampa sulla seriale di Arduino(seguendo sempre la guida) ed ho scritto questo :

#include <SoftwareSerial.h>

#define BUTTON A2

#define RX_PIN 0
#define TX_PIN 1

SoftwareSerial mySerial(RX_PIN, TX_PIN);

int analogico=0;
void setup() {
  mySerial.begin(9600);
  
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
  analogico = analogRead(BUTTON);
  mySerial.print(analogico);
  delay(100);
}

Mi sarei aspettato una stampa di numeri in funzione della tensione in ingresso ma l’unica cosa che esce è una serie di lettere
"…ÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…"come se ci fosse errore di comunicazione tra arduino e attiny cosi ho provato a cambiare il boudrate a 1200 ma non cambia nulla.

Qualcuno saprebbe darmi un aiuto su come risolvere questi problemi?
Ringrazio chiunque voglia aiutarmi

Qual è il piedino fisico a cui hai collegato la tensione da leggere?

Per la trasmissione seriale, quella sfilza di caratteri significa che la velocità del trasmittente non è identica a quella del ricevente, ossia stai usando 2 bps diverse. E se metti le velocità identiche, che problemi hai?

Grazie per la risposta, il piedino fisico è il 3 denominato con PB4 o Ain2 o D4 :

    Ain0       (D  5)  PB5    1|          |8   VCC
                 Ain3       (D  3)  PB3    2|         |7   PB2  (D  2)  INT0  Ain1
                 Ain2       (D  4)  PB4   3|         |6   PB1  (D  1)        pwm1
                  GND                             4|         |5   PB0  (D  0)        pwm0
                                                           +----+

La comunicazione seriale l'ho effettuata sempre con la stessa velocità in trasmissione e ricezione prima usando la 9600 come da guida e poi la 1200 pensando che fosse troppo elevata ma nulla cambia. L'unica cosa diversa dalla guida è che non avevo la libreria SoftwareSerial nella IDE 1.5.7 (scaricata due giorni fa) ed ho dovuto scaricarla forse non è adatta alla mia IDE?

Il piedino è giusto. Forse può essere solo un problema di logica del software. Facendo una cosa molto meno complessa della tua, ossia una scrittura su un pin PWM della lettura dell'ingresso, noti se il led si illumina proporzionalmente? ad esempio:

analogWrite(0, analogRead(BUTTON)>>2);

(prende la lettura analogica, da 0 a 1023, e la divide per 4 con uno shift a dx di 2 posizioni, scrivendo il valore direttamente nel pin D0).

Altra cosa, a quanto lavora il tuo Attiny? La SoftwareSerial non funziona ad esempio con i chip impostati a 1 MHz ma solo ad 8 Mhz. Infine, non ricordo se la SoftwareSerial che ho usato io è quella allegata all'IDE 1.0 oppure no. Mi ero dimenticato che dall'IDE 1.5.7 non c'era, ed è un errore commesso nella mia guida perché non l'ho allegata... devo controllare sul PC di casa cos'ho fatto :cold_sweat:

Ho fatto la prova con il PWM e sembra funzionare anche se variando l’analog la luce del led trema( penso sia dovuto alla divisione ).
Ho riprovato ad effettuare la lettura da seriale ma non cambia nulla neanche se utilizzo lo sketch presente nella guida, ottengo sempre quelle lettere strampalate.
Sto usando un Attiny85 a 8Mhz come suggerito dalla guida: internal oscillator; BOD disabled.
Non capisco dove sbaglio

Ho risolto il problema del primo post nel quale non riuscivo a far accendere i 3 led secondo un codice binario. Il problema era che per un errore di distrazione ho passato una variabile

byte Val_1=0;  //variabile lettura pin analogico

come byte al posto di int( perchè deve assumere i 1023 valori )e quindi scrivendo
int Val_1=0;  //variabile lettura pin analogico.
Ora però sono curioso di sapere perchè la comunicazione seriale non va a buon fine. Ho provato in cento modi a cambiare lo sketch test_seriale_tiny per farlo funzionare ma quello che trovo a schermo è sempre
“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”
ogni volta che spingo il pulsante.

Dirò una scemenza, ma il GND dei due dispositivi è in comune ?

Ieri non ce l'ho fatta a mettermi al computer, appena tornato a casa da lavoro c'era la famigliola ad aspettarmi per uscire :sweat_smile: Oggi cerco di verificare, mi spiace per ieri...

Ho fatto un paio di errori nella guida perché: 1) mi sono dimenticato di aggiornare il paragrafo relativo alla seriale, si parla ancora di fare delle modifiche alla libreria ma questa cosa si riferisce alla vecchia NewSoftSerial, che ora con la nuova SoftwareSerial non servono più; 2) ho dimenticato di includere la libreria SoftwareSerial nel pacchetto che ho distribuito ma puoi rimediare semplicemente copiando la libreria SoftwareSerial contenuta nell'IDE 1.0.5 e copiarlo nella cartella /libraries all'interno della cartella che contiene gli sketch per l'IDE 1.5, dove hai messo anche le lib TinyWireS e TinyWireM (se hai seguito la mia guida).

Ho fatto ora dei test: la libreria funziona perfettamente senza modifiche, ho inviato dati da un Tiny85 ad un Arduino UNO, che li ha letti e rispediti sul monitor seriale dell'IDE. Nessun carattere strano, a me.

Ricontrolla quindi di aver impostato le velocità correttamente su: 1) monitor seriale dell'IDE 2) Attiny 3) Arduino

Poi ricontrolla di avere il Tiny85 operante a 8 MHz. Come detto, la SoftwareSerial non funziona a 1 MHz (questo è il clock di default di tutti i chip Atmel appena usciti di fabbrica)