Interfacing the Arduino to the IRCF360 360 degree sensor

Arduino -> IRCF360 Interface



In this tutorial, we assume you're using an Arduino UnoArduino DuemilanoveNano, or Diecimila. If you have another board, read the corresponding page in your getting started guide to ensure you can upload sketches to your Arduino board.

1. Connect the Arduino to the IRCF360 as follows:


 Ensure all wires are connected to a connector underneath the IRCF360 PCB. 

 The digital pins 2 & 3 on the Ardunio UNO will become the 'soft' serial port for controlling the IRCF360. You may like to mount the IRCF360 on wooden stand (about 20cm-30cm high) using the 4 mouting holes on PCB. This will help to avoid noisy signals caused by ground reflections. 

2. Follow the "getting started" steps that came with you Ardunio. This is to ensure your Arduino UNO or other Arduino  is connected to your PC using the USB cable and you are able to upload sketches without any problems. 

3. Copy and paste and upload the Arduino-IRCF360 sketch in the next section on this page.  

The sketch uses the soft serial port developed by Tom Igoe.

4. Read how to interface Processing sketch to Arduino -> here
and 


5. Download and Run the associated IRCF360 processing.org sketch which interfaces with the Arduino (available here soon)


Arduino-IRCF360 Sketch

Copy and paste all code below this line to your Arduino environment. This example code is in the 
public domain. 

Update 24th July 2011
This version will echo any serial command sent from Processing directly via Arduino to the IRCF360
________________________________

/*
    
    
   
   Language: Arduino
   
   This Arduino UNO sketch interfaces the IRCF360 - 360 degree sensor from 
   www.robotmaker.eu
   
   It uses a softserial port Serial Call and Response developed by Tom Igoe
   
   Processing sketch will need to send a corresponding ASCII character
   to it startup. Once started the IRCF360 will either continue on it's 
   own or stop after each command has been completed. This is 
   programmable feature. 
  
   
    The circuit:
   * Plug +5v and +0v to the IRCF360 power and GND pins respectively
   * Connect IRCF360 RX pin to soft TX pin on Arduino
   * Connect IRCF360 TX pin to soft RX pin on Arduino  
   
   Created:   24 July. 2011
   by:        Colin Bacon
   Modified:   
   by:  
   
   This example code is in the public domain.
   
   http://www.robotmaker.eu/products-2/ircf360/sensorium-project/arduino-interface
   
   */
  #include <NewSoftSerial.h>
  
  NewSoftSerial mySerial(2, 3);
  int StartByteReceived = false;
  int serialCommand[5]; //The IRCF360 expects 4 bytes of data (0-3)|| for each command and 1 byte for the acknowledgement received from the IRCF360
  int serialCount=0;
  byte inByte =0;
  
  void setup()  
  {
  //if serialCommmand = 3
  // set the data rate for the Arduino RS232 port (also USB port)
  Serial.begin(9600);
  Serial.println("IRCF360 Interface for processing.org");
  
   
  mySerial.begin(9600);
   
  
  // Turn off serial communication echo
   mySerial.print(10,BYTE);    
   mySerial.print(0,BYTE);    
   mySerial.print(0,BYTE); 
   mySerial.print(0,BYTE); 
  
   
  
  // Turn on serial communication startbit to facilitate handshaking
   delay (100);      
   mySerial.print(18, BYTE);    
   mySerial.print(10,BYTE);    
   mySerial.print(0,BYTE); 
   mySerial.print(255,BYTE); 
  
  
  //Run  the 360 degree sensing command as default
   delay (100);     
   mySerial.print(30, BYTE);    
   mySerial.print(10,BYTE);    
   mySerial.print(0,BYTE); 
   mySerial.print(255,BYTE); 
   serialCount=0;
   Serial.flush();
  }
  
  void loop()                          // run over and over again
  {
    
  //---serial communication with Processing --------- 
   if (Serial.available() > 0 ) //Check if a byte has arrived on USB port from processing Sketch. If not then keep looping
    {                                 
        
      // Read the serial messages comming in from Processing
      inByte = Serial.read();                            
      serialCommand[serialCount]=inByte; //Store the bytes into an array
      serialCount++;                     //Keep count of the array postiion 
         
      if (serialCount>3 )                //Note that softserial does strange things if you use = rather than > here
        { 
          mySerial.print(serialCommand[0] ,BYTE );    //The commmand
          mySerial.print(serialCommand[1] ,BYTE);    // The value related to command  
          mySerial.print(serialCommand[2],BYTE );    // Output Configuration Byte (e.g. if ASCII or DEC output) 
          mySerial.print(serialCommand[3],BYTE );    // continuous or single shot
          serialCount=0; //reset counter
          Serial.flush(); // flush any rubbish
         }
        
   }  
  //Echo whatever comes in from IRCF360 to the USB port/Processing
  
         if (mySerial.available()) 
         {
           Serial.write( mySerial.read() );
         }
    
  
}


/* Corresponding Processing Code


void setup() {
  // Print a list of the serial ports, for debugging purposes:
   
  println(Serial.list());
  size(800, 800, P3D);
  pg = createGraphics(80, 80, P3D);

  // I know that the first port in the serial list on my mac
  // is always my  FTDI adaptor, so I open Serial.list()[0].
  // On Windows machines, this generally opens COM1.
  // Open whatever port is the one you're using.
 
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
  

}

//-------------------------------------------

 void serialEvent(Serial myPort) {
     // read a byte from the serial port:
     int inByte = myPort.read();
     println ("inByte " + inByte);
     if (inByte==255) startByte=true;
     if (startByte==true) {
        
         
         if (inByte !=255) {
           serialInArray[serialCount] = inByte ;  
            println ("inByte " + serialCount + " " + inByte);
           serialCount++;  //if its not the startbit then store this value
             // If we have 8 bytes:
                      if (serialCount > 7) {
                          N = serialInArray[0];
                          NE = serialInArray[1];
                          E = serialInArray[2];
                          SE = serialInArray[3];
                          S = serialInArray[4];
                          SW = serialInArray[5];
                           W = serialInArray[6];
                          NW = serialInArray[7];
                          
                          // print the values (for debugging purposes only):
                          //println(N + "\t" + NE + "\t" + E + "\t" + SE + "\t" + S + "\t" + SW + "\t" + W + "\t" + NW);
                    
                          // Reset serialCount:
                          serialCount = 0;
                          myPort.clear();          // clear the serial port buffer
                          startByte=false; //reset startbyte flag
                          ignore=false;
                    //}
                   }
                   
                }
             }
      }
      
//-------------------------------------------------------------      


void mousePressed()
{
  
 //if(circleOver) {
     
    //myPort.write(200);      //start the transmission)
   //delay (100);
    
   myPort.write(30);      // 
   //delay (100);
   myPort.write(10);      // 
    //delay (100);
    myPort.write(1);      // 
    //delay (100);
        myPort.write(255);      // |
          
    //delay (100);
   myPort.clear();  
    serialCount=0;
//   } 
}

*/