Go Down

Topic: Servo control (Read 1 time) previous topic - next topic

dattasaurabh82

I've modified the reciever arduino code a little. But not working still. Is it because there is something missing in the code or since I've not used Pull ups in tn the I2C bus? The servo keeps on rotating.

Code: [Select]

#include <Wire.h>
#include <Servo.h>

Servo myservo;
int pos = 0;

void setup()
{
  Wire.begin(4);               
  Wire.onReceive(receiveEvent);
  myservo.attach(9);
}

void loop()
{
  delay(100);
}

void receiveEvent(int howMany)
{
  pos = Wire.read();   
  myservo.write(pos);
}

PeterH

Does your servo work correctly if you just call servo.write() with a sequence of values to move it through a sequence of positions? You need to prove it's working correctly before you try to control it remotely.

Is your interrupt actually being called and receiving the value that was sent? Rather than write it directly to the servo, I suggest you write it to a volatile variable and then in loop read that and call servo.write to move the servo to that position - then you can use Serial.print statements to show what movements were received.
I only provide help via the forum - please do not contact me for private consultancy.

dattasaurabh82

My servo's working fine(ran the "sweep" example with success). Also I tried to read the data coming to the 2nd arduino in the serial monitor (for my case COM-4) as I applied on the slider in applet running by processing, sending serial data to the first arduino(COM-14). I was communicating successfully.
Here are the codes :
------------Processing applet code--------------
Code: [Select]
import processing.serial.*;
import controlP5.*;

Serial port;
ControlP5 cp5;

int tilt = 0;

void setup()
{
size(200, 200);

port = new Serial(this, "COM4", 9600);
//port.bufferUntil('\n');

cp5 = new ControlP5(this);

cp5.addSlider("tilt")
     .setPosition(88,7)
     .setSize(20,180)
     .setRange(0,180)
     .setValue(90)
     ;
}

void draw()
  {
    background(0);
    println(tilt);
    port.write(tilt);
  }


Arduino code which will receive serial data from the Processing & communicate with other arduino through I2C.

------------Arduino One Code-------------------
Code: [Select]
#include <Wire.h>

void setup()
{
  Wire.begin();
  Serial.begin(9600);
}

int x = 0;

void loop()
{
  while(Serial.available())
  {
    x = Serial.read();
   
    Wire.beginTransmission(4);
    Wire.write(x);
    Wire.endTransmission();
   
    Serial.flush();
   
    delay(20);
  }
}


the code for Arduino which will receive data fro the 1st arduino & print the results in the serial monitor.

----------------Arduino Two Code--------------------

Code: [Select]
#include <Wire.h>
#include <Servo.h>

Servo myservo;

void setup()
{
  Serial.begin(9600);
  myservo.attach(9);
  Wire.begin(4);               
  Wire.onReceive(receiveEvent);
}

void loop()
{
   delay(5);
}

void receiveEvent(int howMany)
{
   int x = Wire.read();
   myservo.write(x);
   Serial.println(x);
   Serial.flush(); 
  }


I guess the servo is getting same value multiple times & thus is freaking out(As it is coming serially all the time). I need to use something that will let the servo pick up a changed values once (as they change) only to make it move & not the same value continuously coming over serially to first arduino & to it through I2C finaly.
Something to flush the excess data.

Can any body test anything on this & help with a modified code please?

PeterH

Isn't the Wire event handler called from an interrupt? If so you want to avoid doing Serial I/O in that - I suggest using a volatile variable to store the received value and put code in loop() to pass it on to the servo, and print the value out from there. Is Arduino 2 receiving the correct values?
I only provide help via the forum - please do not contact me for private consultancy.

dattasaurabh82

Yes; Arduino 2 is receiving the correct values. Can you please state how to do that. I'm new new to this.
Do you mean something like this:

Code: [Select]
#include <Wire.h>
#include <Servo.h>

Servo myservo;
volatile int x = 0;

void setup()
{
  Serial.begin(9600);
  myservo.attach(9);
  Wire.begin(4);               
  Wire.onReceive(receiveEvent);
}

void loop()
{
   myservo.write(x);
   Serial.println(x);
   Serial.flush(); 
   delay(5);
}

void receiveEvent(int howMany)
{
   x = Wire.read();
   
  }

Go Up