Send Value from ControlP5 to arduino serial communication

I have 3 motors , DC motor , servo motor and stepper motor, for this project. Everything would I run with the processing and arduino . But I really feel stuck . The main problem is I can not send data from the toggle , slider and textfield of ControlP5 to be sent to the arduino, please help me make a sketch for how to send each value of the slider toggle and the other to be accepted by the arduino . thank you your help would be greatly appreciated.

this is processing code :

    import controlP5.*;
    import processing.serial.*;

    ControlP5 cP5a;
    ControlP5 cP5b;
    ControlP5 cP5c;
    ControlP5 cP5d;
    ControlP5 cP5e;

    Serial arduino;

    int MOTOR_DC_SPEED_CONTROL = 0;
    boolean CHANGE_DIRECTION = false;
    String STEPPER_STEP = "";
    String STEPPER_SPEED_CONTROL = "";
    int SERVO_ANGLE = 0;


    void setup() 
    {
      size(600, 450);
      String portName = Serial.list()[0];
      arduino = new Serial(this, portName, 9600);

      cP5a = new ControlP5(this);
      cP5a.addSlider("MOTOR_DC_SPEED_CONTROL", 0, 255, 0, 30, 95, 255, 35);
      cP5b = new ControlP5(this);
      cP5b.addToggle("CHANGE_DIRECTION", false, 30, 145, 35, 35);
      cP5c = new ControlP5(this);
      cP5c.addTextfield("STEPPER_STEP")
         .setPosition(30,235)
         .setSize(128,35)
         .setAutoClear(false);
      cP5c.addBang("clear")
         .setPosition(168,235)
         .setSize(80,35)
         .getCaptionLabel().align(ControlP5.CENTER, ControlP5.CENTER);
      cP5d = new ControlP5(this);
      cP5d.addTextfield("STEPPER_SPEED_CONTROL")
         .setPosition(30,295)
         .setSize(128,35)
         .setAutoClear(false);
      cP5d.addBang("clear")
         .setPosition(168,295)
         .setSize(80,35)
         .getCaptionLabel().align(ControlP5.CENTER, ControlP5.CENTER);
      cP5e = new ControlP5(this);   
      cP5e.addSlider("SERVO_ANGLE", 0, 180, 0, 30, 380, 255, 35);   
    }

    void draw() 
    {
      background(128);
      fill(0, 0, 153);
      text("DC MOTOR STEPPER MOTOR  & SERVO MOTOR CONTROLLER", 115, 20);
      text("FIANSYAH AFANDI RAKHMAN, ELECTRICAL ENGINEERING, SILIWANGI UNIVERSITY, INDONESIA", 45,43);
      text("A. DC MOTOR", 15,75);
      text("B. STEPPER MOTOR", 15,215);
      text("C. SERVO MOTOR", 15,365);
      text("created by: Fiansyah Afandi Rakhman", 375, 442);

    }
        void controlEvent(ControlEvent theEvent) {
        //if(theEvent.isAssignableFrom(Textfield.class)) 
        if(theEvent.isController()) {  

        print("control event from : "+theEvent.controller().name());
        println(", value : "+theEvent.controller().value());
        println("controlEvent: accessing a string from controller '"
                +theEvent.getName()+"': "
                +theEvent.getStringValue());





        if(theEvent.controller().name()=="MOTOR_DC_SPEED_CONTROL") {

        }
        if(theEvent.controller().name()=="CHANGE_DIRECTION") {

        }
        if(theEvent.controller().name()=="STEPPER_STEP") {

        }
        if(theEvent.controller().name()=="STEPPER_SPEED_CONTROL") {

        }
        if(theEvent.controller().name()=="SERVO_ANGLE") {

            } 
          }
        }
       public void clear() {
        cP5c.get(Textfield.class,"STEPPER_STEP").clear();
        cP5d.get(Textfield.class,"STEPPER_SPEED_CONTROL").clear();
    }

I am confused in this section :

                if(theEvent.controller().name()=="MOTOR_DC_SPEED_CONTROL") {

                }
                if(theEvent.controller().name()=="CHANGE_DIRECTION") {

                }
                if(theEvent.controller().name()=="STEPPER_STEP") {

                }
                if(theEvent.controller().name()=="STEPPER_SPEED_CONTROL") {

                }
                if(theEvent.controller().name()=="SERVO_ANGLE") {

                    } 

how to continue sending signals generated by each of the objects , and how to differentiate between each other in order to command the right target .

and this is the arduino code to receive a signal :

        #include <Servo.h>
        #include <Stepper.h>

        Servo myservo;

        int in1Pin = 5;   // for stepper
        int in2Pin = 6;   // for stepper
        int relayPin = 8;  // for dcmotor change direction
        int in1dcPin = 10;  // for dcmotor
        int in2dcPin = 9;   // for dcmotor
        int enablePin = 11;   // for dcmotor
        int switchPin = 7;   // for dcmotor change direction

        char val;           // for relay as changer direction
        int valServo;   // for servo angle

        Stepper motor(48, in1Pin, in2Pin);

        void setup(){
          pinMode(in1Pin, OUTPUT);
          pinMode(in2Pin, OUTPUT);
          pinMode(in1dcPin, OUTPUT);
          pinMode(in2dcPin, OUTPUT);
          pinMode(enablePin, OUTPUT);
          pinMode(switchPin, INPUT_PULLUP);
          pinMode(relayPin, OUTPUT);
          myservo.attach(9);
          while (!Serial);
          Serial.begin(9600);

          motor.setSpeed('myspeed');
        }

        void loop(){
            boolean reverse = digitalRead(switchPin);
             if (Serial.available()) {
            {
              int incomeByte = Serial.parseInt(); // read from motordcspeedcontrol's 1st slider
              setMotor(incomeByte, reverse);
              analogWrite(enablePin, incomeByte);    }  //

            {
              val = Serial.read(); // read from changedirection's togggle
              if (val == '1')
              { digitalWrite(relayPin, HIGH);}
              else
              {digitalWrite(relayPin, LOW);}
              delay(10);                             } // for relay changer of motor direction

            {
              int steps = Serial.parseInt(); // read from stepperstep's 2nd slider
              motor.step(steps);                     } // for step of steppermotor

            {
              int myspeed = Serial.parseInt(); // read from stepperspeedcontrol's 3rd slider
              motor.setSpeed(myspeed);               } // for speed of steppermotor
              static int v = 0;
            {
              valServo = Serial.read(); 
              valServo = map(val, 0, 1024, 0, 180);
              myservo.write(valServo);   
              delay(15);                             }
          }
        }

          void setMotor(int speed, boolean reverse)
            {

            digitalWrite(in1dcPin, ! reverse);
            digitalWrite(in2dcPin, reverse);
            }

Answers

  • Hi, in response to the part where you are confused, here is an example how to check if a controlEvent was sent by a particular controller. I included some comments, I hope they are useful

    import controlP5.*;
    
    ControlP5 cp5;
    
    void setup() { 
      size( 700, 500 );
      cp5 = new ControlP5( this );
      cp5.addSlider("mySlider").setPosition(20,20).setSize(200,20);
    }
    
    void draw() {
    }
    
    void controlEvent(ControlEvent theEvent) {
      if(theEvent.getController().getName().equals("mySlider")) {
        // use equals to compare strings not ==
        println("mySlider value is ", theEvent.getController().getValue());
        // now do other things with the controller's value
        // for example send it to a Serial Device:
        //
        // int val = int(theEvent.getController().getValue());
        // arduino.write("m1="+val);
      }
    }
    

    to send data to a serial port and receive data on a serial device, you need to use a library that supports serial communication. I see you are already importing processing's serial library, but you are not using it to send data to the connected serial device. Have a look at the processing examples that cover Serial Communication (they can be found on the processing website or just make a google search 'processing Arduino serial communication')

    since you are dealing with 3 different outputs which you want to control with the Arduino, you need to find a way to distinguish between the different values sent from processing. Have you checked if the firmata library can be useful here for your project? Otherwise I would prefix each value (sent from processing) with an identifier for example m1=100 or m2=0. m1=100 would be used to change the state of the motor associated with m1 and m2=0 would make changes to m2. of course the latter would require more implementation work.

  • Thank you so much, I will try the explanation you have given . sorry if my english is not raw , because I only use " google translate " . If I find a back trouble , I will be asked back to you . Thanks so much, your help is very precious for me.

  • hi sojamo , have given way you can send a signal from tiap2 ( slider , textfield , etc.) , but all that was not enough resolve my problem , it seems arduino confusion read any data coming in , how to distinguish arduino sketch reception of data that each data received by the receiver which is desired. Thank You. and this is a sketch that I tried from the way you give , ( please correct any mistakes )

            void controlEvent(ControlEvent theEvent) {
             if(theEvent.getController().getName().equals("MOTOR_DC_SPEED_CONTROL")) {  
    
            print("control event from : "+theEvent.controller().name());
            println(", value : "+theEvent.controller().value());
            println("controlEvent: accessing a string from controller '"
                    +theEvent.getName()+"': "
                    +theEvent.getStringValue());
    
            int val = int(theEvent.getController().getValue());
            arduino.write("m1="+val); 
              }
    
            if(theEvent.isController())   {
            if(theEvent.controller().name()=="CHANGE_DIRECTION")
            if(theEvent.controller().value()==1) {
             arduino.write("m2="+'1');
            }
            else
            {arduino.write("m2="+'0');
            } 
              }
    
           if(theEvent.getController().getName().equals("STEPPER_STEP")) {
            int val1 = int(theEvent.getController().getValue());
            arduino.write("m3="+val1); 
              }
            if(theEvent.getController().getName().equals("STEPPER_SPEED_CONTROL")) {
            int val2 = int(theEvent.getController().getValue());
            arduino.write("m4="+val2); 
              }
            if(theEvent.getController().getName().equals("SERVO_ANGLE")) {
            int val3 = int(theEvent.getController().getValue());
            arduino.write("m5="+val3); 
              }
    

    actually I was a little hesitant with the sketch that I made it , I ask that you vote and give a true example if it is wrong . thank you very much

Sign In or Register to comment.