posted on Monday, September 03, 2007 10:09 PM |


Video: Relay Board Test for my automated beverage system

YouTube link - MSN SoapBox link

Why do code on a long weekend? Because I haven't done much coding in the past month and it makes me feel happy. Time to brush off some of that rust. Plus these relay boards that Robotics Connection help make were just sitting idle with no LEDs to turn on and off randomly.

So how to make them tick?
Here is some code from my WinForm which is pretty basic yet, still haven't added in all the diagnostic code I want to.

   1:  using (RoboticsConnection rc = new
RoboticsConnection(18, 1, false))
   2:  {
   3:      int totalAmount = 8;
   4:      int boardNumber = (int)numCycleBoard.Value;
   5:   
   6:      RoboticsConnection.RelayBoardPourCommand[] commands =
new RoboticsConnection.RelayBoardPourCommand[totalAmount];
   7:   
   8:      for (int i = 0; i < totalAmount; i++)
   9:      {
  10:          commands[i].BoardNumber = boardNumber;
  11:          commands[i].RelayNumber = i + 1;
  12:          commands[i].Milliseconds = 100;
  13:      }
  14:   
  15:      rc.PourDrinks(commands);
  16:  }

And here is the code from the actual Relayboard object that does all that voodoo.

   1:  public class RoboticsConnection : IDisposable
   2:  {
   3:      //ComPortIO ComPort;
   4:      SerialPort comport;
   5:      ArrayList relayBoards;
   6:      Thread pourThread;
   7:   
   8:      private const string returnLine = "r";
   9:   
  10:   
  11:      private const string pour = "pour";
  12:      private const string pourFormat = " {0}:{1}:{2}";
  13:   
  14:      private const string ack = "ACK" + returnLine;
  15:      private const string firmwareVersion = "fw" + returnLine;
  16:      private const string reset = "reset" + returnLine;
  17:   
  18:      public delegate void DrinkCompleteEventHandler
(object sender, EventArgs e);
  19:      public event DrinkCompleteEventHandler DrinkCompleted;
  20:   
  21:      public void Dispose()
  22:      {
  23:          //ComPort.Dispose();
  24:          if (comport.IsOpen)
  25:              comport.Close();
  26:      }
  27:   
  28:      public RoboticsConnection(int ComPortNumber, int MasterBoardNumber,
bool DisableComWriting, params int[] AdditionalBoardsNumbers)
  29:      {
  30:          //ComPort = new ComPortIO("COM" + ComPortNumber, DisableComWriting);
  31:   
  32:          comport = new
SerialPort("COM" + ComPortNumber, 19200, Parity.None, 8, StopBits.One);
  33:          comport.Open();
  34:   
  35:          relayBoards = new ArrayList();
  36:          relayBoards.Add(MasterBoardNumber);
  37:          for (int i = 0; i < AdditionalBoardsNumbers.Length; i++)
  38:          {
  39:              if (relayBoards.Contains(AdditionalBoardsNumbers[i]))
  40:                  throw new ArgumentException(string.Format(
"Duplicate RelayBoard Detected.  Value: {0} has already been initialized", AdditionalBoardsNumbers[i]), "AdditionalBoardsNumbers");
  41:   
  42:              relayBoards.Add(AdditionalBoardsNumbers[i]);
  43:          }
  44:      }
  45:   
  46:      public string GetFirmwareVersion()
  47:      {
  48:          comport.Write(firmwareVersion);
  49:          return comport.ReadLine();
  50:      }
  51:   
  52:      public void ResetBoards()
  53:      {
  54:          comport.Write(reset);
  55:      }
  56:   
  57:      public void PourDrinks(params RelayBoardPourCommand[] Commands)
  58:      {
  59:          StringBuilder sb = new StringBuilder(pour);
  60:   
  61:          foreach (RelayBoardPourCommand command in Commands)
  62:          {
  63:              sb.AppendFormat(
pourFormat, command.BoardNumber, command.RelayNumber, command.Milliseconds);
  64:          }
  65:   
  66:          sb.Append(returnLine);
  67:  //            ComPort.ComPort.DataReceived += dataReceivedEventHandler;
  68:          comport.Write(sb.ToString());
  69:      }
  70:   
  71:      private void dataReceivedEventHandler(object sender, SerialDataReceivedEventArgs e)
  72:      {
  73:          if (comport.ReadLine() == ack && DrinkCompleted != null)
  74:          {
  75:              DrinkCompleted(this, null);
  76:          }
  77:   
  78:          comport.DataReceived -= dataReceivedEventHandler;
  79:      }
  80:   
  81:      public struct RelayBoardPourCommand
  82:      {
  83:          public int BoardNumber;
  84:   
  85:          /// <summary>
  86:          /// The amount of time in milliseconds that the relayboard should fire
  87:          /// </summary>
  88:          public int Milliseconds
  89:          {
  90:              get { return _milliseconds; }
  91:              set
  92:              {
  93:                  if (value < 0)
  94:                      throw new ArgumentOutOfRangeException(
"Milliseconds", value,
"Value must be greater than zero");
  95:   
  96:                  _milliseconds = value;
  97:              }
  98:          }
  99:          private int _milliseconds;
 100:   
 101:          /// <summary>
 102:          /// Which relay on the board should be fired, a value between 1 and 8
 103:          /// </summary>
 104:          public int RelayNumber
 105:          {
 106:              get { return _relayNumber; }
 107:              set
 108:              {
 109:                  if (value < 1 || value > 8)
 110:                      throw new ArgumentOutOfRangeException(
"RelayNumber", value,
"Value must be between 1 and 8");
 111:   
 112:                  _relayNumber = value;
 113:              }
 114:          }
 115:          private int _relayNumber;
 116:      }
 117:  }
Tags [ General ]

Your Comments.

  • # 

    more hardcore? you got scared of a comcast cable truck driver.

    Left by konks. at 8/9/2007 3:08 PM
  • # 

    Can't leave. Moving is temporary.

    Left by Ian at 8/9/2007 11:08 PM
Post Comment
Title *
Name *
Email
Url
Comment *  
Please add 6 and 8 and type the answer here: