hiimsoba
hiimsoba

Reputation: 67

Arduino and Processing - RX is blinking on board, but LED is not lighting up

I am trying to run a Processing sketch with my Arduino. I got it a few days ago, so I'm pretty much a noob. I made two similar sketches - one in Arduino and one in Processing. The Arduino one does work, while the Processing sketch doesn't, even though when running the Processing one, the RX lights up on the board.

I have connected an LED into the D9 on the board, with a 220 ohm resistor, and plugged the other leg into the GND. I then proceeded to run the Arduino sketch, which is a simple one, it lights up and down the LED for a second. This one worked.

I then tried running the Processing sketch, exact same code ( adapted for Processing ) using the library for Arduino, and the board seems to communicate with my sketch, as the RX is blinking each second on the board ( I tried different intervals of time and they match with the intervals at which the RX blinks ), but the LED does not turn on and off, like it did with the Arduino sketch.

I tried getting only a serial connection between the Arduino, and it worked - I connected a joystick module to the Arduino and sent the X and Y through the serial port, and the Processing sketch received the information through the serial port, so they are, indeed, communicating.

The port used is COM3 and is running at 9600 baud.

This is the Arduino sketch :

void setup() {
  pinMode(9, OUTPUT);
}

void loop() {
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(9, LOW);
  delay(1000);
}

and this is the Processing ( version 3.4 ) sketch :

import processing.serial.*;
import cc.arduino.*;

Arduino arduino;

void setup() {  
  arduino = new Arduino(this, Arduino.list()[0], 9600);
  arduino.pinMode(9, Arduino.OUTPUT);
}

void draw() {
  arduino.digitalWrite(9, Arduino.HIGH);
  delay(1000);
  arduino.digitalWrite(9, Arduino.LOW);
  delay(1000);
}

Upvotes: 1

Views: 6465

Answers (3)

Sam_Carmichael
Sam_Carmichael

Reputation: 1

I got it working with Arduino but I had to change some details. My port was "COM3" or Arduino.list()[1] (the 2nd port on the list) which you can check in Windows device manager (Ports COM & LPT: USB-SERIAL) after installing the latest drivers (maybe on the usb port that appears when you connect your Arduino under other devices) using the system update and restarting, then you may need to repeat the system update and restart 2 or 3 times. Or on Linux, you can find which port it's on with:

ls /dev/ttyUSB*

Then unplug it and check it again. First I had to upload the Arduino IDE program (running it with the serial monitor window from the tools menu ctrl-shft-m after having the same exact baud rate on the lower right menu option as in the program). Then I could close it and compile the processing one as long as I had input that very same baud rate into the Processing program too. All 3 different bauds that I tried, 9600, 57600, 115200, worked requiring their equality between Arduino IDE, Arduino IDE Serial Monitor and Processing. If I uploaded a different project in IDE, then Processing did not even connect to the Arduino, so it had to be that same project running on it for Processing to communicate with Arduino Uno properly. Processing is basicly USING Arduino IDE by sending or receiving messages already programmed for it to do, it doesn't program the Arduino in this case. I have even gone through a big mess, trying to get Visual Micro to work (Arduino on Visual Studio) cross-platform but it still would not allow me to link other libraries and headers because of how picky Arduino's programming is! One of the best ways to learn is to check the actual arduino.cc or Processing manual command parameters after finding out where your problem is.

Upvotes: 0

George Profenza
George Profenza

Reputation: 51867

Well done on step by step debugging such as double checking the wiring on the electronics side and testing the blink code with the Arduino alone to isolate the issue.

If the Blink sketch is the only Arduino code you have uploaded to your board that won't suffice. Processing does send messages to Arduino (which is why you see the RX LED turn on), but there's nothing in the Arduino code that initialises Serial communication

As you can see in that example, in setup() Serial communication is initialised with 9600 baud rate (communication speed, 9600 bytes/chars per second):

Serial.begin(9600);

Then in draw() if there is data available, each character is read, then printed one at a time with a prefixed message:

// send data only when you receive data:
        if (Serial.available() > 0) {
                // read the incoming byte:
                incomingByte = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(incomingByte, DEC);
        }

If you upload the example linked, if you've got a single Serial port, you should see both the RX then ever so slightly after the TX LED blinking when you run your Processing sketch. If you close that sketch, open Serial Monitor in Arduino and type something then press enter you'll see the debugging message read back from Arduino.

Using these notions you could write a basic sketch like so:

int incomingByte = 0;   // for incoming serial data

void setup() {
  pinMode(9, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // send data only when you receive data:
  if (Serial.available() > 0) {
          // read the incoming byte:
          incomingByte = Serial.read();

          // say what you got:
          Serial.print("I received: ");
          Serial.println(incomingByte, DEC);

          // if we received ASCII character '1', turn LED on
          if(incomingByte == '1'){
            digitalWrite(9,HIGH);
          }
          // if we received ASCII character '0', turn LED off
          if(incomingByte == '0'){
            digitalWrite(9,LOW);
          }
  }
}

Uploading this sketch to your Arduino should allow you to type 1 into Serial Monitor and press Enter to turn the LED on or 0 to turn it off.

The only thing left is to send the same data from Processing:

import processing.serial.*;

Serial arduino;

void setup(){
  try{
    arduino = new Serial(this, Serial.list()[0], 9600);
  }catch(Exception e){
    println("error connecting to serial port, double chek USB connection, serial port and close other programs using Serial");
    e.printStackTrace();
  }
}

void draw(){

}

void keyPressed(){
  if(key == '1'){
    if(arduino != null){
      arduino.write('1');
    }else{
      println("arduino serial connection wasn't initialised");
    }
    background(255);
  }
  if(key == '0'){
    if(arduino != null){
      arduino.write('0');
    }else{
      println("arduino serial connection wasn't initialised");
    }
    background(0);
  }
}

Minor side note: notice I'm not using delay() in Processing, I recommend using millis() instead as it doesn't block the execution of code like delay() does.

So the above looks like quite a bit of code just to blink an LED but the point is to understand the basics of Serial communication which will be useful on the long run:

  1. initialising serial communication with Arduino (understand baud rate)
  2. basic reading/writing of bytes over Serial
  3. initialising serial communication from Processing and sending data

Back to your original question, you've missed an important detail regarding the Arduino library you're using in Processing: it's relying on a special Arduino sketch (firmware) called Firmata. You will be able to read more on that and how to use the library in this Arduino and Processing tutorial.

As the tutorial mentions you need to first upload this sketch from Arduino > Examples > Firmata > StandardFirmata. Also bare in mind baud rate is set to 57600, not 9600 so you need to update your code like so:

arduino = new Arduino(this, Arduino.list()[0], 57600);

Upvotes: 1

Frenchy
Frenchy

Reputation: 17037

To use: are you sure to put the standardfirmata

  • Using the Arduino software, upload the StandardFirmata example (located in Examples > Firmata > StandardFirmata) to your Arduino board.

change the line

arduino = new Arduino(this, Arduino.list()[0], 9600);

to:

arduino = new Arduino(this, "COM3", 57600); // in  Firmata -> Firmata.begin(57600);

you could add this line to look after your serial port:

println(Arduino.list());
  • Modify the "arduino = new Arduino(...)" line below, changing the number in Arduino.list()[0] to the number corresponding to the serial port of your Arduino board. Alternatively, you can replace Arduino.list()[0] with the name of the serial port, in double quotes, e.g. "COM3" on Windows or "/dev/tty.usbmodem621" on Mac.

Upvotes: 1

Related Questions