[Risolto] problema seriale con ATtiny85

Ciao a tutti gli amici del forum e…rieccomi :slight_smile: Di nuovo qui a chiedere “lumi” alla comunità.
Ho deciso di avvicinarmi al mondo dei “tiny”, in quanto mi sono reso conto che una certa percentuale dei progetti che mi trovo a svolgere possono essere svolti con micro di risorse decisamente inferiori rispetto all’ATMega328.

Dato che ormai lavoro su IDE 1.0 (tanto prima o poi bisognerà abituarsi, dato che di certo indietro non si torna, soprattutto dopo le modifiche effettuati ai nomi di alcuni metodi delle classi principali), ho provveduto scaricato il core “attiny” per 1.0 e ho iniziato gli “esperimenti” con un ATtiny85.
La prima cosa positiva che ho notato con questa configurazione è che si possono settare i “fuse” per il clock interno a 8 MHz direttamente dall’IDE senza comandi da shell (proprio come si farebbe con un ATMega328 stand alone), e nessun problema circa la programmazione…

Il vero problema sono le librerie. Alcune, come: SoftwareServo, TinyWireS.h, TinyWireM.h hanno funzionato subito senza problemi.
Ma non sono riuscito assolutamente a ricavare qualcosa di comprensibile con la libreria che dovrebbe gestire la seriale, la “<SoftwareSerial.h>”.
Cercando in rete ho trovato che dovrei scaricare la NewSoftSerial, ma poi nel sito NewSoftSerial | Arduiniana ho letto:

News: NewSoftSerial is in the core! Starting with Arduino 1.0 (December, 2011), NewSoftSerial has replaced the old SoftwareSerial library as the officially supported software serial library. This means that if you have 1.0 or later, you should not download this library. To port your code to 1.0, simply change all NewSoftSerial references to SoftwareSerial.

E in effetti usando questa libreria il compilatore non genera errori, ma quando eseguo lo sketch di prova, collegando il tiny ad Arduino si vedono solo caratteri incomprensibili. Potete darmi qualche consiglio?

Tenete presente che:

  • i collegamenti tra ATtiny85 e Arduino dovrebbero essere corretti (Rx del tinyy su TX di Arduino, e viceversa).
  • lo sketch di test sul tiny viene trasferito correttamente (ne ho provato diversi altri perfettamente funzionanti)
  • la velocità della seriale nella finestra di visualizzazione è coerente con quella dello sketch (in questo caso 9600 baud, ma ho provato anche velocità più basse)

Lo sketch “Test” su attiny85 è il seguente:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(3, 4); //RX=PB3 pin 2; TX=PB4 pin 3

void setup()
{
mySerial.begin(9600);
mySerial.println(“Hello, world?”);
}

void loop() // run over and over
{
mySerial.println(“Test…”);
delay(1000);
}

Come finestra di visualizzazione uso il Serial Monitor dell’IDE, ma ho gli stessi risultati anche collegandomi con altri software (come PuTTY), ovvero si vedono solo caratteri “strani”, come se le velocità di riferimento tra tiny e finestra fossero diverse…

Chiedo: da cosa può dipendere? Forse occorre fare alcune modifiche alla libreria standard fornita con 1.0?

Grazie anticipatamente.

Se ti può rinfrancare, sono 3 giorni che sto litigando con l'IDE 1.0, il core Tiny 1.0 e le varie librerie accessorie. :~

La TinyWireS/M va senza problemi, perché è scritta per questi micro. Ma la SoftwareSerial resta ancora un mistero anche per me. Non riesco a capire se è compatibile oppure no con i Tiny. Sulla carta dovrebbe perché l'IDE 1.0 astrae il software dall'hardware per cui sembra compilare senza problemi. I problemi arrivano nell'uso, perché ad esempio la vecchia NewSoftSerial doveva essere modificata pesantemente per farla funzionare in ricezione con i Tiny85 e 84: la nuova SoftwareSerial non l'ho ancora provata in tal senso.

PS: non è che forse dipende dallo sketch che usi in ricezione sull'Arduino? Ricordati di mandare in stampa convertendo in BYTE, perché questi sono i caratteri che ricevi dalla seriale, forse è un problema di charset.

Pare che abbia risolto... Questo codice, caricato su Arduino, mostra correttamente i dati inviati dal ATtiny85 con il codice postato sopra:

char c;

void setup() { Serial.begin(9600); }

void loop() { delay(10); }

void serialEvent(){ while (Serial.available() > 0) { c = Serial.read(); Serial.print(c); } }

Merito della nuova callback SerialEvent? Chissà...cmq ora che si è aperta la "strada" farò qualche altro esperimento più dettagliato e vi terrò al corrente :)

Controlla in ricezione sul Tiny. Il tallone d'Achille della vecchia NewSoftSerial era questo, non ho ancora fatto dei test per verificare se la nuova lib sistema le cose oppure no.

Leo, ho fatto una prova rapida ma credo non ci sia nessun problema neanche in ricezione.
Ovviamente per evitare problemi di “loop” infiniti tra le seriali Arduino/tiny ho fatto il test (minimalista!) in modo da accendere un particolare led in base al carattere ricevuto in input.

Gli sketch sono i seguenti (ho usato un attiny84 perchè avevo quello sottomano, ma suppongo vada benissimo anche per l’85):

Parte ATtiny84/85 (Ricevente)

#include <SoftwareSerial.h>

SoftwareSerial mySerial(0, 1);  //RX=pin fisico 13; TX=pin fisico 12

char c;

void setup()  {
  mySerial.begin(9600);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
}

void loop() {
  // controllo RICEZIONE dati
  while (mySerial.available() > 0) {
     c = mySerial.read();
     switch (c) {
        case 'A':
        lamp(10);
         break;
        case 'B':
        lamp(9);
         break;
     }
  }  
}

void lamp(byte out) {
  digitalWrite(out, HIGH);
  delay(100);
  digitalWrite(out, LOW);
  delay(200);
}

Parte Arduino (trasmittente)

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("A");
  delay(1000);
  Serial.print("B");
  delay (1000);
}

Il lampeggio alterato dei due led collegati alle porte 10 e 9 testimonia la corretta interpretazione dei caratteri ricevuti.

Bene, se è così è stato risolto il più grosso problema dei Tiny, la seriale :P

Già che ci sono ti chiedo non una ma ben due altre info (scusa ma l'appetito vien mangiando :-) )

Ho provato la libreria TinyWireM.h sull'85 e pare funzionare bene...mentre la stessa libreria mi dà errore di compilazione con l'84. Esiste una versione specifica per quest'ultimo micro o sto sbagliando qualcosa?

Per quanto riguarda la libreria SoftwareServo.h, ho letto vari post sui problemi di micromovimenti del servo sul famoso codice di prova, che si verificano anche a potenziometro fermo. Ci sono le più disparate versioni: c'è a chi il problema NON si verifica per niente, c'è chi lo ha per 85 ma no per 84...ebbene: io questo problema ce l'ho con tutte e due le versioni! Ovvero, il servo ha micromovimenti casuali in entrambi i micro. Ovviamente con Arduino e la sua libreria questo non si verifica (questo esclude possibili difetti HW del servo). Tu che sei aggiornatissimo, sai dirmi se questo problema è stato risolto da qualche utente, con librerie compatibili con la 1.0?

Grazie :)

dalubar: Ho provato la libreria TinyWireM.h sull'85 e pare funzionare bene...mentre la stessa libreria mi dà errore di compilazione con l'84. Esiste una versione specifica per quest'ultimo micro o sto sbagliando qualcosa?

Ora non sono al mio PC per cui non voglio dirti una cosa per un'altra. E cioè se quella lib gira così senza modifiche anche sui Tiny oppure no. Domani controllo.

Per quanto riguarda la libreria SoftwareServo.h, ho letto vari post sui problemi di micromovimenti del servo sul famoso codice di prova, che si verificano anche a potenziometro fermo. Ci sono le più disparate versioni: c'è a chi il problema NON si verifica per niente, c'è chi lo ha per 85 ma no per 84...ebbene: io questo problema ce l'ho con tutte e due le versioni! Ovvero, il servo ha micromovimenti casuali in entrambi i micro. Ovviamente con Arduino e la sua libreria questo non si verifica (questo esclude possibili difetti HW del servo). Tu che sei aggiornatissimo, sai dirmi se questo problema è stato risolto da qualche utente, con librerie compatibili con la 1.0?

Grazie :)

La robotica non è un campo che seguo, per cui non mi interesso molto alla cosa. So solo quello che leggo qui. Mi viene solo da pensare che ci possa essere un problema di frequenze. Cioè che funzioni sull'Arduino per via dei 16 MHz.

Boh. A me la TinyWireM compila senza problemi anche con un Tiny84.
Ho provato uno degli sketch di esempio allegati alla lib e non mi ha dato errori.
Versione IDE: 0022
Versione Tiny: 0022

Mi suonava strano… ed ho ricontrollato la libreria originale. Hai ragione tu, il supporto ai Tinyx4 non c’è, l’ho inserito io :stuck_out_tongue:
Ti allego la versione modificata che funziona sia con i Tinyx5 che con i Tinyx4, sia ad 1 che ad 8 MHz senza ulteriori modifiche da fare.

TinyWireM.zip (15.5 KB)

Grande Leo... :) Ancora grazie.

:sweat_smile:

Ehm, Leo... dato che le librerie TinyWire "M" ed "S" vanno come i carabinieri (sempre insieme) non è che saresti cosi gentile da postare anche la versione da te modificata della TinyWireS ? :)

La TinyWireS non necessita di modifiche, lo avevo anche scritto nella mia guida :P

Credo sia meglio fare un attimo il punto esatto della situazione. In effetti, controllando meglio il comportamento delle librerie originali io riscontro questo:

  • TinyWireW : compila a buon fine su entrambi i micro (85/84)

  • TinyWireS : compila a buon fine su 85, mentre dà [u]errore di compilazione su 84[/u].

In particolare, l'esempio Tiny85_I2C_Slave_Ex dà:

C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c: In function 'usiTwiSlaveInit': C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:313: error: 'DDR_USI' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:313: error: (Each undeclared identifier is reported only once C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:313: error: for each function it appears in.) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:313: error: 'PORT_USI_SCL' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:313: error: 'PORT_USI_SDA' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:316: error: 'PORT_USI' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:339: error: 'USI_START_COND_INT' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c: In function 'USI_START_VECTOR': C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:420: error: 'DDR_USI' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:420: error: 'PORT_USI_SDA' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:429: error: 'PIN_USI' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:429: error: 'PIN_USI_SCL' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:431: error: 'PIN_USI_SDA' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:476: error: 'USI_START_COND_INT' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c: In function 'USI_OVERFLOW_VECTOR': C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:514: error: 'DDR_USI' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:514: error: 'PORT_USI_SDA' undeclared (first use in this function) C:\Users\xxx\Documents\Arduino\libraries\TinyWireS\usiTwiSlave.c:514: error: 'USI_START_COND_INT' undeclared (first use in this function)

Mi rendo conto solo adesso, quindi, che quando ti ho scritto precedentemente dell'errore sulla libreria ho scritto erratamente la "M", mentre in realtà il problema lo avevo con la "S" (ti ho scritto "a memoria" dal lavoro e ho beccato quella sbagliata).

Ricapitolando, dunque, a me capita l'esatto opposto: cioè la "M" che non necessita di modifiche (compila bene anche con la tua versione, naturalmente), mentre la "S" che avrebbe bisogno di una versione dedicata... vai a capire :(

Allora mi prendo il 50% di colpe perché dopo la tua segnalazione non ho verificato la TinyWireS. Ora gli do un'occhiata.

Uhm… che strano. A me compila senza errori…

EDIT:
eh sì. Avevo modificato anche questa, non me lo ricordavo. Domani ricontrollo con calma e rifaccio la guida con i pacchetti corretti. Intanto ti allego il file usiTwiSlave.c che dovresti andare a sostituire al tuo presente nella cartella TinyWireS.

Mi devi scusare ma sono cose che ho fatto 8/10 mesi fa, non mi ricordo molto bene tutte le modifiche apportate, che, alla fine di tutto, sono state veramente diverse.

usiTwiSlave.c (17 KB)

Di che ti dovresti scusare? Anzi, sono sempre io che ti ringrazio. Libreria testata e funzionante!

Se può interessarti, l'ho provata su ATtiny84 insieme alla libreria Stepper.h [u]originale[/u] della IDE 1.0 e funziona tutto perfettamente. In questo modo posso pilotare facilmente (insieme al classico SN754410) tramite comandi I2C, i movimenti di un motore stepper bipolare recuperato da una stampante EPSON (siglato EM-258), e tutto in pochissimo spazio. Fantastique :)

Mi fa piacere perché almeno sono sicuro che chi si scarica la guida ora ha tutti gli strumenti per spremere al massimo i "piccoli" di mamma Atmel.

Purtroppo con IDE 1.01 rc2, con avr aggiornato , compilando l'esempio citato all'inizio del thread mi da il seguente errore:

In file included from sketch_apr11a.cpp:1: C:\Users\xxxx\Desktop\Arduino\arduino-1.0.1-rc2\libraries\SoftwareSerial/SoftwareSerial.h:92: error: conflicting return type specified for 'virtual size_t SoftwareSerial::write(uint8_t)' C:\Users\xxxx\Desktop\Arduino\arduino-1.0.1-rc2\hardware\tiny\cores\tiny/Print.h:71: error: overriding 'virtual void Print::write(uint8_t)'

da cosa può essere generato?

uso lo stesso tinycore di Dalubar :(

Nel core 1.x hanno ridefinito i metodi .print e .write di Serial. Che versione del core Tiny usi?