Attiny84 e HC-05

Ciao a tutti..!
Sto tentando di fare una connessione tra due moduli bluetooth HC-05 utilizzando un attiny84.. Ho scritto un abbozzo di codice, che funziona perfettamente con arduino uno (infatti riesce a fare il pair e il link, e me lo segnala), ma se faccio girare lo stesso codice sull'attiny arriva fino al pair, lo esegue, ma non riesce a leggere la stringa in entrata dalla seriale, quindi non riesce a capire ce che l'ha fatta a fare il pair..
Probabilmente è un codice un pò stupido, ma non sono riuscito a farmi venire in mente altro..

#include <SoftwareSerial.h>
SoftwareSerial bluetoothSerial(2, 3); // RX, TX

boolean checkFlag = 0;

void setup() {
  pinMode(10, OUTPUT);  
  
  bluetoothSerial.begin(38400);      //Avvio la seriale bluetooth, baudrate 38400

  btSendCommands("RESET");
  btSendCommands("ROLE=1");
  btSendCommands("CMODE=0");
  btSendCommands("INIT");
  btSendCommands("CLASS=0");
}

void loop() {
  btSendCommands("PAIR=0014,01,61751,50");
  if(checkFlag==1){
    btSendCommands("LINK=0014,01,61751");
    if(checkFlag==1){
      digitalWrite(10, HIGH);
    }
  }
  delay(1000);
}

void btSendCommands(char *atCommand){
  //Dichiaro variabili
  char recString[10] = {};
  int i = 0;
  checkFlag = 0;
  
  //Invio comando a bluetooth
  bluetoothSerial.write("AT+");
  bluetoothSerial.write(atCommand);
  bluetoothSerial.write("\r\n");
  
  //Aspetto risposta
  while (!bluetoothSerial.available());
  
  //Ricevo risposta
  while(bluetoothSerial.available()){
    recString[i]=bluetoothSerial.read();
    i++;
  }
  
  //Verifico la risposta
  if ((recString[0]=='O') && (recString[1]=='K'))
    checkFlag = 1;
  else
    checkFlag = 0;
   
  delay(1000);
}

In pratica invia i vari comandi alla seriale, fino a che non arriva al ciclo 'loop', li deve inviare il comando PAIR, nel caso la risposta della seriale sia ERR riprova ad inviare il PAIR, fino a che la risposta non è OK, quindi invia il LINK, e se anche questo ha OK come risposta, accende un led.. Penso sia proprio la ricezione che ha qualche problema..!
Sono nelle vostre mani..!

Mmm ... ho idea che 38400 ... sia pretendere veramente troppo dalla SoftwareSerial su ATtiny ...
... io non ho avuto problemi con ATtiny85 fino a 9600 ... oltre non mi sono spinto ... :roll_eyes:

Guglielmo

P.S. : A che frequenza fai lavorare il ATtiny ?

Ho provato a cambiare con 9600.. Il risultato è che non invia neanche il primo comando..
Anche se io imposto il baud a 9600 sull'HC05, (e scrivendo AT+UART mi esce 9600), funziona solo se imposto la softwareserial a 38400..

Comunque l'attiny gira a 8Mhz..

Il problema è che in modalità comandi (AT) il HC-05 lavora a 38400, mentre poi nel normale colloquio lavora alla velocità che imposti.

Ma lo usi come master ? Altrimenti non capisco il perché comandi tu il pair quando, in modalità slave, lo fa automaticamente ... :roll_eyes:

Guglielmo

Ok.. penso di non aver capito come usare un hc05.. :sweat_smile:
Tempo fa l'avevo usato per collegarmi all'obd della macchina tramite un elm327, e l'ho tenuto in modalità at.. Per questo stavo cercando di rifare le stesse cose adesso..

Adesso a cosa lo devi collegare ? In che modalità ti serve ?

Risolti questi due punti il resto è una passeggiata ... :wink:

Guglielmo

Allora.. sinceramente ho paura di dirti una cavolata sulla modalità, quindi ti spiego che voglio fare..

La mia idea è usare 2 attiny comunicanti tra di loro tramite due HC05.. Un attiny deve continuare a cercare il bluetooth dell'altro attiny, fino a che non lo trova e si collega.. Una volta collegato deve inviare all'altro attiny una serie di comandi...

EDIT: Ok, sono riuscito a capire quello che mi hai detto.. ora penso di essermi rimesso in carreggiata.. Ho impostato uno come master, l'altro come slave, CMODE=0, UART=9600 su tutti e due, sul master ho impostato il BIND con l'indirizzo dello slave.. In teoria cosi si collega solo allo slave, e a nessun'altro?
Comunque.. come posso far capire all'attiny che ha trovato l'altro? E soprattutto come li faccio comunicare tra di loro?

Allora te ne serve uno programmato come master ed uno programmato come slave.

Secondo me, se non vuoi incasinarti, ti conviene pre-programmarli ...
... li colleghi ad un Arduino UNO (o quello che hai) e fai tutta la programmazione AT, se vuoi assegnando identificativi e limitando gli indirizzi riconosciuti (così il master accetta la connessione solo dallo slave che avrai programmato).

Poi, una volta programmati (... ricorda che la programmazione viene salvata all'interno) ... li colleghi a 9600 agli ATtiny e ti inventi un semplice protocollo per capire quando lo slave si connette al master (... così eviti i comandi AT). Esempio ... lo slave può trasmettere in continuazione una sequenza fissa e, quando il master si connette e comincia a riceverla sulla seriale, avverte lo slave ed inizia il colloquio.

In ogni caso un "protocollo" dovrai metterlo in piedi ... sai quante volte ti può capitare che il collegamento possa cadere anche nel bel mezzo di una trasmissione ... :roll_eyes:

Guglielmo

Perfetto..! Sono riuscito a buttare giù 2 righe di codice veloce, in modo che quando da arduino invio un '1' via serial, lo riceve l'attiny e accende un led... Ora ho constatato che funziona tutto.. Con calma comincio a scrivere il resto del codice..!!

Ti ringrazio per l'aiuto.. Non sapevo proprio di sta cosa, io mi connettevo ancora usando i comandi AT..!
Spero di non aver altre difficoltà..!

Un'ultima domanda.. Ma è il master che ci connette allo slave, o lo slave che si connette al master? Non sono riuscito a capirla questa..!

Ora onestamente non ricordo bene l'esatto protocollo bluetooth ...
... mi sembra che è il master che vede chi c'è e, se lo riconosce, ci si collega ... :roll_eyes:

Guglielmo

Un altra cosa ...
... non so cosa ci devi fare, ma se devi scambiare parecchi dati e vuoi essere sicuro ... scrivi un protocollo affidabile, che controlla, magari anche con un CRC la validità del messaggio.

Ad esempio, un qualche cosa del tipo ...
... slave invia STX (0x02) ETX (0x03) CRC EOT (0x04)
... se il master riceve tutto bene e il CRC quadra allora risponde con ACK (0x06) e la trasmissione si è conclusa positivamente
... se il master riceve errori, allora risponde con NAK (0x15) e lo slave ritrasmette il tutto
... se lo slave non riceve ne ACK ne NAK entro tot secondi, c'è un timeout e probabilmente il link si è interrotto.

Inoltre, a garanzia, ci potrebbe anche essere un numero di sequenza del messaggio, in modo che, anche se il master risponde ACK ma lo slave capisce NAK e ritrasmette lo stesso messaggio, il master se ne accorge perché ha lo stesso numero di sequenza.

E così via ...
... la parte protocollo, nelle trasmissioni affidabili, è sempre un gran casino ... XD XD XD

Guglielmo

Ooooh no.. Devo solo trasmettere massimo una decina di char nell'arco di un minuto.. Niente di cosi importante, e che necessita affidabilità a sicurezza.. Penso che quello che hai scritto sia, ancora, fuori dalla mia portata.. Per quello che devo fare un semplice botta e risposta vada più che bene!

AleCune93:
Per quello che devo fare un semplice botta e risposta vada più che bene!

:grin: :grin: :grin: ... ok, ok ... allora non vado oltre .. già stavo immaginando codici "autocorrettori" d'errore ... XD XD XD

Guglielmo