Go Down

Topic: Java with Arduino (Read 2224 times) previous topic - next topic

8hll1

Nov 21, 2011, 06:14 am Last Edit: Nov 22, 2011, 01:30 am by al1221 Reason: 1
Hi

I had get digital input from motion sensors that are connected to Arduino uno board. I got the Arduino uno board and java program setup correctly. In my java display, it is displaying the numbers that are getting from motion sensors, which is displaying 0 (when there is a movement) and 1 (no movement) continuously. Here comes the question, I'm trying to just display 0, when there is an movement. I do not want the sensors to sense any motion at all when there are no motion. This is because the java display will keep running and continuously displaying 1, when there are no movement. How do I solve this problem?

PaulS

Quote
How do I solve this problem????

One question mark is all that is needed. More than one makes you look clueless. Is that the impression you are trying to give.

Perhaps it's not entirely inappropriate, since you are asking how to fix your code but you have not shown us any code.
The art of getting good answers lies in asking good questions.

8hll1

sorry about that, I'm still new to this forum, but here is a copy of my arduino code:


/*
  Input from Motion sensor
*/

void setup() {
  Serial.begin(9600);
  pinMode(7, INPUT);
  pinMode(4, INPUT);

}

void loop() {

  int RightValue = digitalRead(4);
  int LeftValue = digitalRead(7);
  int R = 0;
  int L = 0;
  int myArray[8];
  delay(50);
    if (LeftValue == 0 && RightValue == 1)
     {   
       L = LeftValue;
       R = RightValue;
     }
     else if (RightValue == 0 && LeftValue == 0)
     {   
       L = LeftValue;
       R = RightValue;
     }
     else if (RightValue == 0 && LeftValue == 0)
     {
       L = LeftValue;
       R = RightValue;
     }
     else
     {
       L = LeftValue;
       R = RightValue;
     }
 

  Serial.print(L);
  Serial.println(R);
}


Here are my Java code:


import java.io.InputStream;
import java.io.OutputStream;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.util.Enumeration;

public class SerialTest implements SerialPortEventListener {
   SerialPort serialPort;
        /** The port we're normally going to use. */
   private static final String PORT_NAMES[] = {
         "/dev/tty.usbmodemfa.131" // Mac OS X
         //"/dev/ttyUSB0", // Linux
         //"COM3", // Windows
         };
   /** Buffered input stream from the port */
   private InputStream input;
   /** The output stream to the port */
   private OutputStream output;
   /** Milliseconds to block while waiting for port open */
   private static final int TIME_OUT = 2000;
   /** Default bits per second for COM port. */
   private static final int DATA_RATE = 9600;

   public void initialize() {
      CommPortIdentifier portId = null;
      Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

      // iterate through, looking for the port
      while (portEnum.hasMoreElements()) {
         CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
         for (String portName : PORT_NAMES) {
            if (currPortId.getName().equals(portName)) {
               portId = currPortId;
               break;
            }
         }
      }

      if (portId == null) {
         System.out.println("Could not find MAC OSx USB port.");
         return;
      }

      try {
         // open serial port, and use class name for the appName.
         serialPort = (SerialPort) portId.open(this.getClass().getName(),
               TIME_OUT);

         // set port parameters
         serialPort.setSerialPortParams(DATA_RATE,
               SerialPort.DATABITS_8,
               SerialPort.STOPBITS_1,
               SerialPort.PARITY_NONE);

         // open the streams
         input = serialPort.getInputStream();
         output = serialPort.getOutputStream();

         // add event listeners
         serialPort.addEventListener(this);
         serialPort.notifyOnDataAvailable(true);
      } catch (Exception e) {
         System.err.println(e.toString());
      }
   }

   /**
    * This should be called when you stop using the port.
    * This will prevent port locking on platforms like Linux.
    */
   public synchronized void close() {
      if (serialPort != null) {
         serialPort.removeEventListener();
         serialPort.close();
      }
   }

   /**
    * Handle an event on the serial port. Read the data and print it.
    */
   public synchronized void serialEvent(SerialPortEvent oEvent) {
      if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
         try {
            int available = input.available();
            byte chunk[] = new byte[available];
            input.read(chunk, 0, available);

            // Displayed results are codepage dependent
            System.out.print(new String(chunk));
         } catch (Exception e) {
            System.err.println(e.toString());
         }
      }
      // Ignore all the other eventTypes, but you should consider the other ones.
   }

   public static void main(String[] args) throws Exception {
      SerialTest main = new SerialTest();
      main.initialize();
      System.out.println("Started");
   }
}

TobyM

So you're trying to display 1 when there isn't any movement, and 0 when there is, but the Java program is just constantly displaying 0? I haven't looked through your Java code, as I don't know much about Java, but if I were you I would do a few things to test the code.

First of all, to test the Java code, try just using a simple piece of Arduino code to print a serial value to the program.
For example:
Code: [Select]

void setup()
{
  Serial.begin(9600);
}
void loop() {
  Serial.print('1');
  delay(1000);
}

will send the character 1 to the program. Change 1 to whatever it is you want your Java program to have read when it show's 1. If you're program works, then there's either something wrong with your Arduino code, or there's something wrong with your motion sensor.

PaulS

Code: [Select]
    if (LeftValue == 0 && RightValue == 1)
     {   
       L = LeftValue;
       R = RightValue;
     }
     else if (RightValue == 0 && LeftValue == 0)
     {   
       L = LeftValue;
       R = RightValue;
     }
     else if (RightValue == 0 && LeftValue == 0)
     {
       L = LeftValue;
       R = RightValue;
     }
     else
     {
       L = LeftValue;
       R = RightValue;
     }

The body of all 4 blocks is identical. The condition for the third block is the same as the condition for the second block, so it will never be executed. At the end of this mess, L and R will have the same values no matter which path was taken. So this mess accomplishes nothing. The use of L and R is unnecessary, too.

Code: [Select]
  Serial.print(L);
  Serial.println(R);

This will cause one of 4 possible sets of values to be sent:
"00<cr><lf>"
"01<cr><lf>"
"10<cr><lf>"
"11<cr><lf>"

Quote
I do not want the sensors to sense any motion at all when there are no motion.

Lucky for you, they wont. Sending something to the serial port, or not, has nothing to do to with what the sensor senses.

Which of the 4 values above do you want to send, under what circumstances?
The art of getting good answers lies in asking good questions.

8hll1

I'm trying to display 00, 01, and 10. So its kind of like displaying

00
00  ---meaning both eye blink
01 ----meaning  left eye blink and right eye does not blink
10  --- meaning left eye does not blink and right eye blink
10

But it is not continuously displaying, it only display it senses a motion.

PaulS

Quote
But it is not continuously displaying, it only display it senses a motion.

Your Arduino code is continually sending values, probably faster than the PC can handle. If the Java application is not handling the data correctly, you might need to fix it, or you might need to give it a break, and slow down the Arduino's continuous, rapid stream of data. Add a delay(100); at the end of loop.
The art of getting good answers lies in asking good questions.

Go Up