I am connecting four stepper motors to arduino, controlled by processing (connected to touchOSC). I am trying to determine the best way to send information to independently control each motor.
Here is how im doing it: TouchOSC(on iphone) >> Processing >> arduino >> motors
Arduino receives a single number through serial connection! How can I distinguish different values and connect them to the proper motor?
Processing code****
/**
- TouchOSC
- Example displaying values received from
- the "Simple" layout (Page1 only so far)
- TouchOSC | hexler.net
*/
import oscP5.;
import netP5.;
import processing.serial.*;
Serial arduinoPort;
OscP5 oscP5;
float v_fader1 = 0.0f;
float v_fader2 = 0.0f;
float v_fader3 = 0.0f;
float v_fader4 = 0.0f;
float v_fader5 = 0.0f;
float v_toggle1 = 0.0f;
float v_toggle2 = 0.0f;
float v_toggle3 = 0.0f;
float v_toggle4 = 0.0f;
float v_fadera = 0;
float v_faderb = 0;
float v_faderc = 0;
float v_faderd = 0;
int int_fader1;
int int_fader2;
int int_fader3;
int int_fader4;
void setup() {
size(320,440);
frameRate(25);
/* start oscP5, listening for incoming messages at port 8000 */
oscP5 = new OscP5(this,8000);
arduinoPort=new Serial(this,Serial.list()[0],9600);
}
void oscEvent(OscMessage theOscMessage) {
String addr = theOscMessage.addrPattern();
float val = theOscMessage.get(0).floatValue();
if(addr.equals("/1/fader1")) {
v_fader1 = val;
}
else if(addr.equals("/1/fader2")) {
v_fader2 = val;
}
else if(addr.equals("/1/fader3")) {
v_fader3 = val;
}
else if(addr.equals("/1/fader4")) {
v_fader4 = val;
}
else if(addr.equals("/1/fader5")) {
v_fader5 = val;
}
else if(addr.equals("/1/toggle1")) {
v_toggle1 = val;
}
else if(addr.equals("/1/toggle2")) {
v_toggle2 = val;
}
else if(addr.equals("/1/toggle3")) {
v_toggle3 = val;
}
else if(addr.equals("/1/toggle4")) {
v_toggle4 = val;
}
}
void draw() {
background(0);
// fader5 + toggle 1-4 outlines
fill(0);
stroke(0, 196, 168);
rect(17,21,287,55);
rect(17,369,60,50);
rect(92,369,60,50);
rect(168,369,60,50);
rect(244,369,60,50);
// fader5 + toggle 1-4 fills
fill(0, 196, 168);
rect(17,21,v_fader5*287,55);
if(v_toggle1 == 1.0f) rect(22,374,50,40);
if(v_toggle2 == 1.0f) rect(97,374,50,40);
if(v_toggle3 == 1.0f) rect(173,374,50,40);
if(v_toggle4 == 1.0f) rect(249,374,50,40);
// fader 1-4 outlines
fill(0);
stroke(255, 237, 0);
rect(17,95,60,255);
rect(92,95,60,255);
rect(168,95,60,255);
rect(244,95,60,255);
// fader 1-4 fills
fill(255, 237, 0);
rect(17,95 + 255 - v_fader1255,60,v_fader1255);
rect(92,95 + 255 - v_fader2255,60,v_fader2255);
rect(168,95 + 255 - v_fader3255,60,v_fader3255);
rect(244,95 + 255 - v_fader4255,60,v_fader4255);
v_fadera = map(v_fader1, 0, 1,0, 200);
v_faderb = map(v_fader2, 0, 1,201, 400);
v_faderc = map(v_fader3, 0, 1,401, 600);
v_faderd = map(v_fader4, 0, 1,600, 800);
int_fader1 = int(v_fadera);
int_fader2 = int(v_faderb);
int_fader3 = int(v_faderc);
int_fader4 = int(v_faderd);
println(int_fader4);
// println(int_fader1);
// println(int_fader3);
// println(int_fader4);
// arduinoPort.write(int_fader1);
//arduinoPort.write(int_fader2);
//arduinoPort.write(int_fader3);
arduinoPort.write(int_fader4);
//arduinoPort.write(int_fader2);
//arduinoPort.write(int_fader3);
//arduinoPort.write(int_fader4);
//println(int_fader);
}
arduino code***
/*
- MotorKnob
- A stepper motor follows the turns of a potentiometer
- (or other sensor) on analog input 0.
- Stepper - Arduino Reference
- This example code is in the public domain.
*/
#include <Stepper.h>
// change this to the number of steps on your motor
#define STEPS 100
// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper1(STEPS, 2, 3, 4, 5);
Stepper stepper2(STEPS, 6, 7, 8, 9);
Stepper stepper3(STEPS, 10, 11, 12, 13);
Stepper stepper4(STEPS, A0, A1, A2, A3);
// the previous reading from the analog input
int previous = 0;
void setup()
{
// set the speed of the motor to 30 RPMs
stepper1.setSpeed(30);
stepper2.setSpeed(30);
stepper3.setSpeed(30);
stepper4.setSpeed(30);
// begin serial connection (readings)
Serial.begin(9600);
}
void loop()
{
if(Serial.available() > 0)
{
// get the sensor value
int val = Serial.read();
if (val <= 600){
val = val-600;
}
if (val >= 200){
stepper1.step(val-previous);
previous = val;
}
if (val < 200){
stepper4.step(val-previous);
previous = val;
}
//uncomment for manual testing
//stepper.step(-90);
//delay(500);
// remember the previous value of the sensor
// previous = val;
}
}