To LUGNET HomepageTo LUGNET News HomepageTo LUGNET Guide Homepage
 Help on Searching
 
Post new message to lugnet.roboticsOpen lugnet.robotics in your NNTP NewsreaderTo LUGNET News Traffic PageSign In (Members)
 Robotics / 22349
22348  |  22350
Subject: 
RCX to Spybot communication
Newsgroups: 
lugnet.robotics, lugnet.robotics.rcx, lugnet.robotics.rcx.nqc
Date: 
Wed, 24 Mar 2004 14:18:34 GMT
Viewed: 
5871 times
  
This is a reposting of a message I posted yesterday in just the Spybotics
newsgroup.  I forgot to add .rcx and .rcx.nqc so I thought it was worth the
double post.  My apologies.

In lugnet.robotics.spybotics, Ed Parrent wrote:
Yes it
works, but SPY seems to react only to very specific code strings (message A:
byte 0=0x92, byte1=0x23; message B: byte 0=0x92, byte1=0xab; ... etc.), and
immediately performs the message code! (The two messages [above] are two
separate SPY led animations). I am looking for a way to send a more general
number code IR message from the RCX  to Spy

Okay, after banging my head against this for WAY too long I think I have finally
figured out (somewhat) a few things that were previously completely lost to my
understanding.

If you want an RCX (running RCX2 firmware) to simulate a Spybot Ping you can use
the following code:

  SetSerialComm(SERIAL_COMM_4800|SERIAL_COMM_76KHZ);
  SetSerialPacket(SERIAL_PACKET_DEFAULT);
  SetSerialData(0,0x80); // sometimes this is 0x81.  I don't know why
  SetSerialData(1,0xd8); // my ID
  SetSerialData(2,0x00); // my ping info
  SetSerialData(3,0xa8); // checksum (adjust so that sum of all 4 == 0)
  SendSerial(0,4);

If you want to send a Spybot message to a Spybot using an RCX (running the RCX2
firmware) you can use the following code:

  SetSerialComm(SERIAL_COMM_4800|SERIAL_COMM_76KHZ);
  SetSerialPacket(SERIAL_PACKET_DEFAULT);
  SetSerialData(0,0x8a); // broadcast
//  SetSerialData(0,0x89); // linkcast
//  SetSerialData(0,0x88); // individual message
  SetSerialData(1,0xd8); // my ID
  SetSerialData(2,0x04); // my ping info (when broadcasting)
//  SetSerialData(2,0x04); // linkcast link-id (when linkcasting)
//  SetSerialData(2,0x04); // id of a bot at an index in the relation table
  SetSerialData(3,0x40); // command byte
  SetSerialData(4,0x40); // hi byte
  SetSerialData(5,0x40); // lo byte
  SetSerialData(6,0xda); // checksum (adjust so that sum of all 7 == 0)
  SendSerial(0,7);

Now we need somebody really smart to write a function for the built-in API that
works something like SendSpybotMessage in the Spybot API.  Here's my feeble stab
at it:

#define MSG_BROADCAST 0x8a
#define MSG_LINKCAST 0x89
#define MSG_DIRECT 0x88

__nolist void SendSpybotMessage(const int &nMode, const int &nMyID,
  const int &nAddress, const int &nCmd, const int &nHiByte, const int &nLoByte)
{
  SetSerialComm(SERIAL_COMM_4800|SERIAL_COMM_76KHZ);
  SetSerialPacket(SERIAL_PACKET_DEFAULT);
  SetSerialData(0,nMode);
  SetSerialData(1,nMyID);
  SetSerialData(2,nAddress);
  SetSerialData(3,nCmd);
  SetSerialData(4,nHiByte);
  SetSerialData(5,nLoByte);
  SetSerialData(6,0x100-((nMode+nMyID+nAddress+nCmd+nHiByte+nLoByte)&0xff));
  SendSerial(0,7);
}


I have tried this with broadcasting (0x8a) and the Spybot receives a message as
expected.  I haven't figured out how to get linkcast or directed message to
work.  It might require doing a simulated ping to get the RCX into the Spybot's
world relation table with its own ping ID.  The linkcast mode also might require
knowing the Spybot's link-id.

I figured this stuff out by monitoring the IR received by the tower when I had a
Spybot send out messages using SendMessage and the Mindscript equivalent of that
built-in subroutine (which you can find in the postdemo program in the
MindStorms SDK help file).  I modified my RCXTool program so that it can monitor
the Spybot IR output.  I tried monitoring using the ScriptEd tool from LEGO but
I couldn't get it to work for some reason.

I also discovered that when you set the Spybot serial type (SetSerialType) using
SERIAL_TYPE_USER it just outputs the 4 raw bytes (index, cmd, hi, lo) but when
you set it to SERIAL_TYPE_SPYBOT it outputs the 7 byte sequence discussed above
on the call to SendSerial when using the Spybot NQC API.  I presume something
analogous occurs when you switch to SERIAL_TYPE_RC.  That doesn't seem to be the
case for SERIAL_TYPE_RCX, however.

Hopefully someone will find this useful.

John Hansen
http://bricxcc.sourceforge.net/



1 Message in This Thread:

Entire Thread on One Page:
Nested:  All | Brief | Compact | Dots
Linear:  All | Brief | Compact
    

Custom Search

©2005 LUGNET. All rights reserved. - hosted by steinbruch.info GbR