Pages: [1]   Go Down
Author Topic: Servo control - from Processing?  (Read 898 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 28
architecture | media | computing
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello everyone,

Ok so I've been working all day but to no avail.....  

I'm attempting to control a servo motor via serial communication (characters sent from a simple Processing sketch)
Since I've never done this before I tried to use the LED example (that detects if the mouse cursor is over the square and if so, send power to the LED) as a starting point.  

I assumed that it would be as easy as changing the code to send a pulse to the servo as the serial reads a ASCI character, but I'm getting no movement.

The other problems occur when I attempt to run the Processing sketch - it sometimes disconnects the serial connection leaving error messages etc.

heres the code for the ARDUINO:

Code:
int outputPin = 13;
int val;

int minPulse = 1000;
int maxPulse = 2500;
int pulse = 0;

int lastPulse = 0;
int refreshTime = 20;



void setup()
{
  pinMode(outputPin, OUTPUT);
  pulse = maxPulse;
  Serial.begin (9600);
}

void loop()
{
  if (Serial.available()) {
    val = Serial.read();
    if (val == 'H') {
      pulse = minPulse;
    }
    if (val == 'L') {
      pulse = maxPulse;
    }
  }
 updateServo();
}


void updateServo()
{
   if (millis() - lastPulse >= refreshTime) {
    digitalWrite(outputPin, HIGH);
    delayMicroseconds(pulse);
    digitalWrite(outputPin, LOW);
    
    lastPulse = millis();
   }
}


heres the code for PROCESSING
Code:
import processing.serial.*;

Serial port;

void setup()
{
  size (200,200);
  noStroke();
  frameRate(10);
  
  println(Serial.list());
  
  port = new Serial(this, Serial.list()[0], 9600);
}

boolean mouseOverRect()
{
  return ((mouseX >= 50) && (mouseX <=150) &&(mouseY >= 50) && (mouseY <= 150));
}

void draw()
{
  background(#222222);
  if(mouseOverRect())
  {
    fill(#BBBBB0);
    port.write('H');
  }
  else
  {
    fill(#666660);
    port.write('L');
  }
  rect(50,50,100,100);
}


If anyone has some insight on Serial Servo control, I would greatly appreciate it.
Cheers

- Nick
Logged

Daniel
Guest
 Bigger Bigger  Smaller Smaller  Reset Reset

hi

can you make the Arduino side code work by sending "H" or "L" through the serial monitor?

D
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 28
architecture &#124; media &#124; computing
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I gave that a shot. and it didn't work....  :-?
Logged

Daniel
Guest
 Bigger Bigger  Smaller Smaller  Reset Reset

ah.. so that means there is something wrong on the Arduino side.

Next I would try:
- checking the connections. If using a battery to power the servos, you need to connect the battery gnd to Arduino GND.
- removing the serial checking loop entirely and having the code run the servo back and forth once a second.
- using another output pin, as 13 has an integral resistor.


D
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 28
architecture &#124; media &#124; computing
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I've also just noticed there is something else occurring here....

If I power the board and servo through the USB, a tried and tested code using a potentiometer to move the servo runs perfectly, however that same code does not work correctly when the board is powered with a 9v power source....
There is a massive lag from turning the POT and when the values are actually received by arduino....

stumped on this one  :-/
Logged

Daniel
Guest
 Bigger Bigger  Smaller Smaller  Reset Reset

That sounds like the USB connection is making lots of servo current available, and that the servo may be underpowered by the 5V regulator. The on-board regulator has a little over 400ma available for external connections, and servos can draw a lot of current.

D

« Last Edit: July 22, 2007, 01:31:43 pm by Daniel » Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 223
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I think Daniel is correct. You can try powering the servos with a different 5V power source which should have no problem delivering 1A. I have powered servos from a 9V source directly that's also powering the Arduino, that worked, but it's probably not very good for the servos, since they are designed to run at 5V.

-Z-
« Last Edit: July 23, 2007, 11:44:33 am by zitron » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 28
architecture &#124; media &#124; computing
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks for the replies.

Yes that seemed to be the case - I switched out the servo for another to test it out and it worked fine.

Going back to the Serial communication - I've got the servo working from keypresses (within the serial monitor) so the serial works fine within Arduino - I'm having a little difficulty on the Processing side - I tell it to send a character "k" for instance upon a specific event , but it does not exactly send that information to Arduino thus not moving the motor.

I'm very new at serial - do I need a carriage return in there to clean up the strings and allow arduino it read it clearly?

perhaps I should do some reading on serial communication - i've searched the site for tutorials, anyone have more?

Logged

0
Offline Offline
God Member
*****
Karma: 0
Posts: 731
skcor oniudrA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I had similar problems here:-

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1185507207

Until I added an array for receiving bytes, and then running a sub once a certain number of bytes are received.

I used 'A' like a hand-shake, then two additional bytes are sent over determined by an array stored in a text file. Since 'A' is the starting point, the subsequent bytes are received in the order they are sent. Without that, I had a hard time getting them in the right order.

The code can be easily adapted to work on servo's. I was planning on doing that at some point in time since I have a need for running servo's from a hex script (.txt), so you can either wait, or try hacking the code yourself.

Logged

Pages: [1]   Go Up
Jump to: