ruby-nxt Progress
Following up on my ruby nxt datalogger from yesterday, I've got two way communication working now. Doesn't do much yet, just sends a play tone command to the nxt, sends a bluetooth message, or read a mailbox. It's a start.
Unlike the datalogger, this requires creating a serial port for the NXT device using Dev B service. (in OSX that's under Bluetooth Preferences -> Devices -> NXT -> Edit Serial Ports. Device Service: Dev B, Port type: RS-232, require pairing for security)
Also, if you want to send messages to a program running on the NXT, make sure you run this script first before starting your program on the NXT.
One problem I can't figure out is I created an NXT-G program and made it send a bluetooth message on connection 0 but I get no output on the serial port... however, if I go into the NXT and tell it to connect to my computer using my datalogger I get output there. The NXT shows my computer as being connected to both connection 0 and 1, which I thought wasn't possible. The documentation says the NXT can only be a Master or a Slave, not both. So who knows.
require "serialport"
@tty = SerialPort.new("/dev/tty.NXT-B", 57600, 8, 1, SerialPort::NONE)
@tty.flow_control = SerialPort::HARD
puts "bluetooth SPP connected"
if fork
puts "input thread started"
while (res = @tty.getc)
puts "Response: %02x\t%s" % [res,res]
end
else
puts "output thread started"
# play tone
tone_cmd = [0x05,0x00,0x00,0x03,0xff,0x00,0x10,0x00,0x00]
# write True to mailbox 0
write_cmd = [0x06,0x00,0x00,0x09,0x00,0x02,0x01,0x00]
# read mailbox 0 from slave?
read_cmd = [0x05,0x00,0x00,0x13,0x0A,0x00,0x00]
while true
while (key = STDIN.gets.chomp) do
if key == "w"
puts "MessageWrite"
write_cmd.each do |b|
@tty.putc b
end
end
if key == "r"
puts "MessageRead"
read_cmd.each do |b|
@tty.putc b
end
end
if key == "t"
puts "PlayTone"
tone_cmd.each do |b|
@tty.putc b
end
end
end
end
endRuby NXT Bluetooth Data Logger
I just finished writing a simple ruby script that listens for messages from a LEGO Mindstorms NXT robot on a bluetooth serial port and print out the messages in a comma delimited format with a datestamp, mailbox the message was sent to, and the message itself.
I've only tested it on OSX so far, but it should work on linux and windows so long as you have ruby and the ruby-serialport module. It's a little rough at the moment and probably buggy. I couldn't find info on the incoming message bytecodes in the NXT Dev Kit. Found the info in "Appendix 2 - LEGO MINDSTORMS NXT Direct commands.pdf" pages 5 and 9. There doesn't seem to be anything in the message header to indicate what type of message it is (Text, Number, or Logic), so I had to kind of fudge it. If the info is in the docs, please let me know. I put some comments in the code describing the different bytecodes I was able to figure out.
You can always download the latest version of nxtlogger.rb using this link.
Update 2006-08-05: Made the code much cleaner. I've never worked with low level binary data before. :)
Instructions for connecting NXT to OSX via bluetooth.
One step closer to chunky robotic bacon!
Juju