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);
}
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 .
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.
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.
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.
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 ...
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.