Hey guys,
I am making a project for school as a thesis. The idea is to use the TouchOsc App op my ipod to control the speed and direction of the two dc motors with the arduino Mega.Basically processing receives the data from touchosc app and sends for example port.write('1'). In my arduino code i have made a switchcase whereby i do a serial.read and uses this decide where button was pushed(like move forward/backwards). Which is working smoothly. My main problem is i have to send in addition to the port.write('1') also my pwmMotorA with is an integer from one the sliders on my touchOsc app.Is there a way to send them both in like port.write( '1',pwmMotorA)? when i do that arduino just sees it as an ASCII code..I have searched almost whole google for this..with no results. I have included my arduino and processing sketch.
by sending my variables one by one.To slow reaction on the arduino.The first line port.write('1') is actually a variabele i use to detect in arduino in which mode the motor is in(like forward/back/stop). Am considering is using seperators like i read somewhere. ie a
port.write(<variabele,pwmMotorA>);
Isnt this going to send all of them as a string? Thx in advance.
The port.write() function sends 1 byte to the serial port. IF one were to create an overloaded method that took multiple bytes as input, the overload would end up calling the existing method in a loop to send all the bytes.
The "delay" with that function is NOT with having to call it multiple times.
It's time to dispense with the academic questions, and post all of your Processing and Arduino code. There may be things that you are doing (unknowingly) that limit the speed that the data is transferred at. We can't tell that without seeing all of the code.
hey guys, sry to say i still havent figured it out.I ll just go ahead and repost the code of what u v got so far
Arduino sketch
int EN1 = 8; //pwm motorA
int EN2 = 9; //pwm motorB
int IN1 = 10; //direction motorA
int IN2 = 11; //direction motorB
int laag = 0;
int hoog= 255;
int pwmMotorA=0;
int pwmMotorB=0;
int dirA,dirB=0 ;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (Serial.available() > 0) { // Check if there is a new message
dirA= Serial.read(); // Put the serial input into the message
dirB= Serial.read(); // Put the serial input into the message
pwmMotorA = Serial.read();
pwmMotorB = Serial.read();
}
switch(dirA)
{
case '1': //Move ahead M1
Motor1(pwmMotorA,true); //You can change the speed, such as Motor(50,true)
break;
case '2': //move back M1
Motor1(pwmMotorA,false);
break;
case '3': //stop M1
Motor1(0,false);
break;
default:
Motor1(pwmMotorA,true);
break;
}
switch(dirB)
{
case '1': //Move ahead M2
Motor2(pwmMotorB,true);//You can change the speed, such as Motor(50,true)
break;
case '2': //move back M2
Motor2(pwmMotorB,false);
break;
case '3': //stop M2
Motor2(0,false);
break;
default:
Motor2(pwmMotorB,true);
break;
}
}
void Motor1(int pwmMotorA, boolean reverse) //handelen van motorA
{
analogWrite(EN1,pwmMotorA); //set pwm control, 0 for stop, and 255 for maximum speed
if(reverse)
{
analogWrite(IN1,hoog);
}
else
{
analogWrite(IN1,laag);
}
}
/*
// importeer de volgende libraries serial,oscP5 en arduino classes voor communicatie met de arduino,IPOD en seriele verbinding.
import oscP5.*;
import netP5.*;
import processing.serial.*;
import cc.arduino.*;
OscP5 oscP5;
NetAddress myRemoteLocation;
Serial arduinoPort;
Arduino arduino;
int [] Toggle1 = new int [8];
int [] Toggle2 = new int [8];
int [] sliderStrip = new int [5];
float [] fader1 = new float [8];
float [] fader2 = new float [8];
boolean sliderNeedsRedraw = true;
int pwmMotorA,pwmMotorB = 0 ;
int EN1 = 12;
int EN2 = 11; //PWM uitgangen
int IN1 = 10;
int IN2 = 9; //Draairichting
int dirA,dirB= 0;
int laag =0;
int hoog =255;
int myMessage1 = 0;
int myMessage2 = 0;
int myMessage3 = 0;
int myMessage4 = 0;
int myMessage5 = 0;
int myMessage6 = 0;
void setup() {
size(290,360);
frameRate(25);
background(0);
fader1[1] = 0.5;
fader2[1] = 0.5;
/* start oscP5, listening for incoming messages at port 8000 */
oscP5 = new OscP5(this,8000);
myRemoteLocation = new NetAddress("192.168.62.55",9000); //IP address for outgoing data
arduinoPort = new Serial(this, "COM4", 9600); // Set arduino to 9600 baud
}
void oscEvent(OscMessage theOscMessage)
{
OscMessage myMessage1 = new OscMessage("/1/led1"); //used to store status of the motor
OscMessage myMessage2 = new OscMessage("/1/led2");
OscMessage myMessage3 = new OscMessage("/1/led3");
OscMessage myMessage4 = new OscMessage("/2/led1");
OscMessage myMessage5 = new OscMessage("/2/led2");
OscMessage myMessage6 = new OscMessage("/2/led3");
String addr = theOscMessage.addrPattern();
// println(addr); // uncomment for seeing the raw meshsage
//float val = theOscMessage.get(0).floatValue();
if(addr.indexOf("/1/fader") !=-1)
{ // one of the faders
String list[] = split(addr,'/');
int xfader = int(list[2].charAt(5) - 0x30);
fader1[xfader] = theOscMessage.get(0).floatValue();
// println(" x = "+fader[xfader]); // uncomment to see x values
sliderNeedsRedraw = true;
pwmMotorA=int(255*(fader1[1]));
}
if(addr.indexOf("/2/fader") !=-1)
{ // one of the faders
String list[] = split(addr,'/');
int xfader = int(list[2].charAt(5) - 0x30);
fader2[xfader] = theOscMessage.get(0).floatValue();
// println(" x = "+fader[xfader]); // uncomment to see x values
sliderNeedsRedraw = true;
pwmMotorB= int((255*(fader2[1])));
}
if(addr.indexOf("/1/toggle") !=-1)// the strip at the bottom
{
int i = int((addr.charAt(9) )) - 0x30; // retrns the ASCII number so convert into a real number by subtracting 0x30
String list[] = split(addr,'/');
Toggle1[i] = int(theOscMessage.get(0).floatValue());
// println(" i = "+i); // uncomment to see index value
sliderNeedsRedraw = true;
}
if(addr.indexOf("/2/toggle") !=-1)// the strip at the bottom
{
int i = int((addr.charAt(9) )) - 0x30; // retrns the ASCII number so convert into a real number by subtracting 0x30
String list[] = split(addr,'/');
Toggle2[i] = int(theOscMessage.get(0).floatValue());
// println(" i = "+i); // uncomment to see index value
sliderNeedsRedraw = true;
}
//bestuderen van de druktoetsen
if (Toggle1[2]==1)
{
dirA= '3';
myMessage1.add(0); /* add an int to the osc message */
myMessage2.add(0); /* add an int to the osc message */
myMessage3.add(1); /* add an int to the osc message */
/* send the message */
oscP5.send(myMessage1, myRemoteLocation);
oscP5.send(myMessage2, myRemoteLocation);
oscP5.send(myMessage3, myRemoteLocation);
}
else {
if(Toggle1[1] == 1)
{
dirA = '2';
myMessage1.add(0); /* add an int to the osc message */
myMessage2.add(1); /* add an int to the osc message */
myMessage3.add(0); /* add an int to the osc message */
/* send the message */
oscP5.send(myMessage1, myRemoteLocation);
oscP5.send(myMessage2, myRemoteLocation);
oscP5.send(myMessage3, myRemoteLocation);
}
else
{
dirA= '1';
myMessage1.add(1); /* add an int to the osc message */
myMessage2.add(0); /* add an int to the osc message */
myMessage3.add(0); /* add an int to the osc message */
/* send the message */
oscP5.send(myMessage1, myRemoteLocation);
oscP5.send(myMessage2, myRemoteLocation);
oscP5.send(myMessage3, myRemoteLocation);
}
}
if (Toggle2[2]==1)
{
dirB= '3';
myMessage4.add(0); /* add an int to the osc message */
myMessage5.add(0); /* add an int to the osc message */
myMessage6.add(1); /* add an int to the osc message */
/* send the message */
oscP5.send(myMessage4, myRemoteLocation);
oscP5.send(myMessage5, myRemoteLocation);
oscP5.send(myMessage6, myRemoteLocation);
}
else {
if(Toggle2[1] == 1)
{
dirB= '2';
myMessage4.add(0); /* add an int to the osc message */
myMessage5.add(1); /* add an int to the osc message */
myMessage6.add(0); /* add an int to the osc message */
/* send the message */
oscP5.send(myMessage4, myRemoteLocation);
oscP5.send(myMessage5, myRemoteLocation);
oscP5.send(myMessage6, myRemoteLocation);
}
else
{
dirB= '1';
myMessage4.add(1); /* add an int to the osc message */
myMessage5.add(0); /* add an int to the osc message */
myMessage6.add(0); /* add an int to the osc message */
/* send the message */
oscP5.send(myMessage4, myRemoteLocation);
oscP5.send(myMessage5, myRemoteLocation);
oscP5.send(myMessage6, myRemoteLocation);
}
}
arduinoPort.write(dirA); //send direction onto serialport
arduinoPort.write(dirB);
arduinoPort.write(pwmMotorA);
arduinoPort.write(pwmMotorB);
}
//here follows the code for drawing the slider and toggle buttons on the screen but i deleted it else couldnt post the sketch
if (Serial.available() > 0) { // Check if there is a new message
dirA= Serial.read(); // Put the serial input into the message
dirB= Serial.read(); // Put the serial input into the message
pwmMotorA = Serial.read();
pwmMotorB = Serial.read();
}
Suppose Serial.available() returns 2, as in there are 2 bytes in the serial input buffer. What is going to happen when you try to read the 3rd and 4th values?
hehe its me again.Thx alot Paul for the guidance. I finally got it all working smoothly!!!!. only thing i did was to start reading the serial port after 4 bytes.
if (Serial.available() >= 4)
{ // Check if there is a new message
dirA= Serial.read(); // Put the serial input into the message
dirB= Serial.read(); // Put the serial input into the message
pwmMotorA = Serial.read();
pwmMotorB = Serial.read();
only thing i did was to start reading the serial port after 4 bytes.
Yep. That's the key. Don't try to read data that isn't there. Doing so will get you all out of sync.
The next step is to change the 4 values being sent to 6 values - including a start of packet marker and an end of packet marker. With these, you can tell if a packet is complete. A start of packet marker followed by 4 value that are not end of packet markers followed by an end of packet marker defines a good packet. Anything else, and that data just gets dumped.
// read the serial port
int GetFromSerial()
{
while (Serial.available()<=0) {
}
return Serial.read();
}
the proble for me is the LCD did not display in proper ...if i remove the GetFromSerial for lcd.print("R :"+ GetFromSerial()); not do not have any problem, can i know any solution??
i need my LCD to display the RED,GREEN,BLUE value from processing
thank you
Suppose that GetFromSerial() returns the value 12. What, exactly, do you expect adding 12 to "R :" to result in? + is NOT a concatenation operator. It is an addition operator.
No .i put + is just to let lcd continue print the variable (RED) i want my LCD to display the data from the Processing ..'which is RED,GREEN ,and BLUE...i have no idea how LCD and display 3 in same time?
port.write('R');
port.write(RED);
port.write('G');
port.write(GREEN);
port.write('B');
port.write(BLUE);
the RED is an interger value
if work perfect in
case 'R':
analogWrite(9, GetFromSerial());//arduino pin 9 for LED
break;
the intensity of the light will change according to the RED value
but i do not know why it can not work in lcd to display out the RED value
i till keep give me the random char
but i do not know why it can not work in lcd to display out the RED value
It can. You MUST use TWO statements to print the "R :" part and the value. You can NOT use the addition operator HOPING that somehow it will magically be interpreted as a concatenation operator, just because that is what you want.
but i do not know why it can not work in lcd to display out the RED value
It can. You MUST use TWO statements to print the "R :" part and the value. You can NOT use the addition operator HOPING that somehow it will magically be interpreted as a concatenation operator, just because that is what you want.
thank you very much i have change the code to
lcd.setCursor(1,0);
lcd.print("R :");
lcd.print(GetFromSerial());
it work !!