inviare con bluetooth un byte

ciao a tutti,
devo creare un programma che mi invia tramite bluetooth un byte composto da una serie di codici.
questo è il programma che ho ipotizzato :

#include <SoftwareSerial.h>
byte msg[] ={ 0x00,0x09,0x00,'A',0x02}; //byte da inviare
const int rxPin=12;
const int txPin=13;


SoftwareSerial bluetooth(rxPin, txPin);
void setup()
{
  
 bluetooth.begin(9600);
 Serial.begin(9600);
}

void loop()
{Serial.println(msg);
delay(1000);
  
 bluetooth.println(msg);
}

ma il compilatore mi restituisce errori :

inviare_byte.ino: In function 'void loop()':
inviare_byte:28: error: call of overloaded 'println(byte [5])' is ambiguous
C:\Users\simone\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:68: note: candidates are: size_t Print::println(const String&) <near match>
C:\Users\simone\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:69: note:                 size_t Print::println(const char*) <near match>
C:\Users\simone\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:70: note:                 size_t Print::println(char) <near match>
C:\Users\simone\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:71: note:                 size_t Print::println(unsigned char, int) <near match>
C:\Users\simone\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:72: note:                 size_t Print::println(int, int) <near match>
C:\Users\simone\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:73: note:                 size_t Print::println(unsigned int, int) <near match>
C:\Users\simone\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:74: note:                 size_t Print::println(long int, int) <near match>
C:\Users\simone\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h:75: note:                 size_t Print::println(long unsigned int, int) <near match>

mi sapreste aiutare?
grazie

Tu dici di voler inviare un byte ma crei e cerchi di spedire un ARRAY di byte.

si ok hai ragione quello è un array di byte;
ho scritto male .

comunque ci sono delle soluzioni oppure devo convertire quel byte in stringa?

Scorri l'array e spedisci un elemento alla volta, basta un ciclo for.

il problema è che devo inviare tutti i dati assieme perchè costituiscono un codice di "riconoscimento".

Forse non ti è chiaro il concetto di come lavora la seriale: la seriale spedisce SEMPRE 1 byte alla volta. Anche se mandi un numero, tu non te ne accorgi ma il tuo numero viene scomposto nei byte che compongono la variabile che lo contiene e poi spedito 1 byte alla volta. Idem per le stringhe. E' il destinatario che poi deve preoccuparsi di ricomporre il dato. A cosa devi spedire questo codice? Ad un altro Arduino? Devi solo ricomporre i dati riversando i byte in un array via via che ti arrivano

ahh okok perfetto ! grazie per la spiegazione.
scusate per l'ignoranza ma non è da molto che sono entrato nel mondo della programmazione quindi alcuni concetti non sono ancora molto chiari.
comunque questo codice devo spedirlo ad un lego mindostrorm nxt 2.0 .

Solo per curiosità, anche io possiedo Nxt 2.0 Cos'e' il comando per avviare motore A ?

in teoria quel codice dovrebbe servire per instaurare una comunicazione bluetooth tra arduino e nxt.
in pratica è da un po' di giorni che cerco di inviare una stringa di codice da arduino a nxt.
arduino invia correttamente i dati ma nxt non riceve nulla come se non li leggesse.
allora girando per la rete ho trovato che forse l'nxt non legge i dati "entranti" perchè vuole che prima della mia stringa ci sia "un codice di riconoscimento " che è il byte che sto cercando di inviare.

Solo per curiosità, anche io possiedo Nxt 2.0 Cos'e' il comando per avviare motore A ?

tu hai mai provato a inviare da arduino a nxt tramite bluetooth qualcosa?

No, spiacente. Anzi con il bluetooth ci litigo abbastanza. Lo odio proprio. :smiley:

Probabilmente mi sbaglio ma a me quei valori sembrano l'invio di un comando MESSAGEWRITE. Sai che tra due Nxt puoi mandare dei messaggi tramite bluetooth. Ma la connessione deve essere già stabilita.

Quando connetti un Nxt a telefonino o PC viene richiesta la password/pin. Mi sembra strano che per collegarsi basti spedire quei pochi byte. Ti allego pdf in inglese dei comandi diretti (da sito della Lego) Purtroppo in inglese.

Appendix 2-LEGO MINDSTORMS NXT Direct commands.pdf (1.07 MB)

nid69ita:
No, spiacente. Anzi con il bluetooth ci litigo abbastanza. Lo odio proprio. :smiley:

siamo in due allora :smiley:

comunque è possibile che ci sia un codice di controllo oppure no ?

Bella domanda. Io ho letto questo, sempre da Lego e sempre in inglese.. Purtroppo non è chiaro. C'e' una sezione come mdnare comandi da device esterni al Nxt, ma non si capisce come i due dispositivi debbano essere collegati precedentemente. Da un telefonini tipo smartphone hai i tasti per stabilire connessione. Da Arduino con modulino bluetooth non saprei come fare.

LEGO MINDSTORMS NXT Bluetooth Developer Kit.pdf (960 KB)

Qui nei megatopic si parla in generale di bluetooth:
http://forum.arduino.cc/index.php?topic=104903.0

Secondo me bisogna capire bene prima come si possa stabilire collegamento tra un Nxt e questi modulini BT collegati ad Arduino.
Sò che ci sono nelle connessioni da tener conto di chi è master e chi è slave. Ma non me ne intendo.

Non conosco gli NXT e quindi non vi posso aiutare molto, ma, leggendo la documentazione che Nid ha allegato vedo che è possibile inviare comandi anche da telefonini o PDA (Vd. allegato)...

Telefonini e PDA sono tipicamente device bluetooth "master" e quindi, per collegarcisi, i moduli NXT devono comportarsi da "slave", cosa che, sempre leggendo la documentazione, possono fare (in realtà fanno sia da master che da slave ... ma non si capisce come passino da una modalità all'altra).

Se questo è vero, allora il modulo HC-05 va configurato come "master" e in tale modalità occorre fare le prove ...
... probabilmente, prima di pensare ai comandi NTX, sarà il caso che fate delle verifiche mettendo il HC-05 on modlità "comandi AT" e facendo tutte le opportune verifiche ...

Guglielmo

Speravo in un tuo aiuto @Guglielmo, io con BT di solito litigo.
Per completezza, il NXT può collegarsi a PC oppure a telefonini (tipo il mio smartphone HTC winmobile 5.0 sono antico )
Un NXT si può anche collegare ad altri NXT e in questo caso penso uno faccia da master e gli altri slave, mentre nel caso di collegamento con PC/pda/etc. fa da slave.
Anche secondo me bisogna capire come fare prima la connessione. Ho un HC-05 ma ci ho pacioccato poco.
Quindi con comandi AT si "configura" e con quei comandi si può fare come su un cellulare per stabile la connessione?
Nel link in megatopic ci sono le info ai comandi AT o suggerisci una documentazone migliore?

Allego un esempio stupido che feci anni fa per VB.NET 2005, un programmino per smartphone.
Rivedendolo mi ricordo che vedevo il Nxt attraverso una porta seriale COMx impostata in precedenza tramite i vari pannelli di configurazione BT del cellulare.

Poi tramite seriale spedisci semplicemente dei comandi diretti come specificato in uno dei documenti che ho linkato, ad esempio per far suonare Nxt comando 3:

Private Sub playTone(ByVal freq As Int16, ByVal durata As Int16)
    Dim NxtMsg(6) As Byte
    NxtMsg(0) = &H80                           ' Risposta non richiesta
    NxtMsg(1) = &H3                            ' Comando PLAYTONE
    NxtMsg(2) = freq - (freq / 256) * 256      ' Parametro frequenza (LSB)
    NxtMsg(3) = freq / 256                     ' Parametro frequenza (MSB)
    NxtMsg(4) = durata - (durata / 256) * 256  ' Parametro durata(LSB)
    NxtMsg(5) = durata / 256                   ' Parametro durata (MSB)
    NXTSendCommand(NxtMsg)
  End Sub
Private Function NXTSendCommand(ByVal Cmd As Byte()) As Byte
    Dim MsgLen(2) As Byte
    Dim Response(16) As Byte
    Dim i As Integer

    NXTSendCommand = 0
    Try
      MsgLen(0) = Cmd.Length
      MsgLen(1) = 0
      SerialPort1.Write(MsgLen, 0, 2)
      SerialPort1.Write(Cmd, 0, Cmd.Length)
      If Cmd(0) = 0 Then     '&H80 = no reply expected
        'now read the reply
        Response(0) = SerialPort1.ReadByte ' number of bytes in message
        Response(1) = SerialPort1.ReadByte ' should be 0 for NXT
        For i = 2 To 1 + Response(0)       ' read rest of message
          Response(i) = SerialPort1.ReadByte()
        Next
        NXTSendCommand = Response(1)
      End If
    Catch ex As Exception
      MsgBox(ex.ToString)
    End Try
  End Function

Il codice è VB.NET ma posso tradurlo in Arduinese, se serve. Il problema grosso rimane far collegare il HC-05 al Nxt.
Su questo però sono ignorante.

NxtProva_VB2005.rar (108 KB)

Ti allego un po' di documentazione che sicuramente ti è utile per giocare con quei moduli :wink:

Fammi sapere come va XD

Guglielmo

HC-Serial-Bluetooth-Products-201104.pdf (938 KB)

HC-05 datasheet 201104 revised.pdf (634 KB)

HC-05 AT Commamd.pdf (83.7 KB)

HC-05 Manual.pdf (898 KB)

Mercy :smiley:

nid69ita:
Mercy :smiley:

Pas de quoi XD

Guglielmo