Go Down

Topic: Sabertooth 2x25 Simpified Serial Mode ( Tank Style (Read 19092 times) previous topic - next topic

Erac

So myPort.write(); So I will just leave it empty? Assuming it already sent data to COM 5.. ?

PaulS

The art of getting good answers lies in asking good questions.

Erac

Noted.. I will link it all and update you.

Thanks

Erac

#33
Oct 21, 2010, 02:37 am Last Edit: Oct 21, 2010, 02:38 am by Erac Reason: 1
Hi Paul,

So how will I run processing to arduino? I will just compile my sketches for my processing and arduino and then upload my arduino sketch to the board?

[glow]My Arduino Code ( edited keypress part only, the others are same)[/glow]

void loop()
{
signed char traverse;
 signed char negotiate;

if(Serial.available()>0)
{
   int data = Serial.read();

  digitalWrite(buttonPin,LOW);

  switch(data)
  {  // key is from the Processing keypress
     case'w':traverse = 100;break; //full forward  
     case's':traverse = -50;break; // half reverse
    case'q':traverse = 0;break; // Stop
     case'a':negotiate = -100;break; // left
     case'd':negotiate = 100;break; // right
   }

   setEngineSpeed( traverse );
   setEngineSpeedDir( negotiate );
 }
}


[glow]My Processing Code: ( edited)[/glow]

void keyPressed()
{
switch(key)
{
  case('w'):
  case('W'):
  case('d'):
  case('D'):
  case('s'):
  case('S'):
  case('a'):
  case('A'):
  case('q'):
  case('Q'):
     myPort.print(key);
     break;
}
}

import processing.serial.*;


Serial myPort;


println(Serial.list());


myPort = new Serial(this, Serial.list()[0], 9600); // I will edit
  • which ever is for COM 5 which I saw in my Arduino IDE..



    Regards

PaulS

Quote
So how will I run processing to arduino? I will just compile my sketches for my processing and arduino and then upload my arduino sketch to the board?

I'm going to quit holding your hand now. There are just some things you are going to have to try on your own.
The art of getting good answers lies in asking good questions.

Erac

Paul,

Sorry to bother you again,but I'm already pulling my hair off because of the expecting EOF, found 'myPort' problem when I run my processing code


processing.app.debug.RunnerException: expecting EOF, found 'myPort'
     at processing.app.Sketch.preprocess(Sketch.java:1326)
     at processing.app.Sketch.preprocess(Sketch.java:1205)
     at processing.app.Sketch.build(Sketch.java:1568)
     at processing.app.Sketch.build(Sketch.java:1553)
     at processing.app.Editor$DefaultRunHandler.run(Editor.java:1485)
     at java.lang.Thread.run(Thread.java:619)

[[glow]highlight]I already verified that 0 is my COM 5 [/glow]




PaulS

The valuation of myPort (the myPort =  statement) belongs in the setup() function. You also need a draw() function, even if it is empty.

Code: [Select]
draw()
{
}
The art of getting good answers lies in asking good questions.

Erac

Paul,

My Processing sketch still won't compile:

Still with the same error of:










processing.app.debug.RunnerException: expecting EOF, found 'myPort'
     at processing.app.Sketch.preprocess(Sketch.java:1326)
     at processing.app.Sketch.preprocess(Sketch.java:1205)
     at processing.app.Sketch.build(Sketch.java:1568)
     at processing.app.Sketch.build(Sketch.java:1553)
     at processing.app.Editor$DefaultRunHandler.run(Editor.java:1485)
     at java.lang.Thread.run(Thread.java:619

//void setup (){



void keyPressed()
{

switch(key)
{
 case('w'):
 case('W'):
 case('d'):
 case('D'):
 case('s'):
 case('S'):
 case('a'):
 case('A'):
 case('q'):
 case('Q'):
    myPort.print(key);
    break;
    Serial myPort;
}
}

import processing.serial.*;

Serial myPort;
//println(Serial.list());
myPort = new Serial(this, Serial.list()[0], 9600);

void draw(){

}

//}

I already placed an empty draw function as you advised, but still with same error, but when I try to place a setup function, it has an error or unexpected void...

Please help :'(

Regards


PaulS

Quote
The valuation of myPort (the myPort =  statement) belongs in the setup() function.

Where is your setup() function?

Why is this code in the keyPressed() event handler?
Code: [Select]
   Serial myPort;
The art of getting good answers lies in asking good questions.

Erac

Hi Paul,

I can't possibly get my Processing code to work, now the error is:

processing.app.debug.RunnerException: The function print(char) does not exist.
     at processing.app.Sketch.placeException(Sketch.java:1543)
     at processing.app.debug.Compiler.compile(Compiler.java:149)
     at processing.app.Sketch.build(Sketch.java:1573)
     at processing.app.Sketch.build(Sketch.java:1553)
     at processing.app.Editor$DefaultRunHandler.run(Editor.java:1485)
     at java.lang.Thread.run(Thread.java:619)

[glow]My Processing Code:[/glow]

void keyPressed()
{

switch(key)
{
case('w'):
case('W'):
case('d'):
case('D'):
case('s'):
case('S'):
case('a'):
case('A'):
case('q'):
case('Q'):
   myPort.print(key);
   break;
   //Serial myPort;
}
}

import processing.serial.*;

Serial myPort;
//println(Serial.list());

void setup (){

myPort = new Serial(this, Serial.list()[0], 9600);
}
void draw(){

}


I got impatient with processing that I tried to go back to my arduino code.. And luckily I made the keypress work.. I added Serial.begin (9600); in my setup function.

The only odd thing is that the stop button Q wont respond, I don't get it? Is there a possible way in the arduino coding that when I release the W ( forward button) then the motor will also cease going forward?  Because when I press/ send the keypress button in the serial monitor it goes on until a new command is sent.. Help



Regards

PaulS

The myPort.print(key); should be myPort.write(key);.

Quote
Is there a possible way in the arduino coding that when I release the W ( forward button) then the motor will also cease going forward?

How would the Arduino know that you released a key on a keyboard attached to a different piece of hardware?

Quote
The only odd thing is that the stop button Q wont respond, I don't get it?

I don't either. If you posted some code, I probably would.
The art of getting good answers lies in asking good questions.

Erac

Thanks Paul, I'll edit my processing code.

[glow]For the Arduino code ( all keypress responded ,but the Q key[/glow])

#include <SoftwareSerial.h>

// Labels for use with the Sabertooth 2x5 motor controller

// Digital pin 13 is the serial transmit pin to the
// Sabertooth 2x5
#define SABER_TX_PIN 13

// NOT USED (but still init'd)
// Digital pin 12 is the serial receive pin from the
// Sabertooth 2x5
#define SABER_RX_PIN 12

// Set to 9600 through Sabertooth dip switches
#define SABER_BAUDRATE 9600

// Simplified serial Limits for each motor
#define SABER_MOTOR1_FULL_FORWARD 127
#define SABER_MOTOR1_FULL_REVERSE 1
#define SABER_MOTOR1_FULL_STOP 64


#define SABER_MOTOR2_FULL_FORWARD 255
#define SABER_MOTOR2_FULL_REVERSE 128
#define SABER_MOTOR2_FULL_STOP 192


// Motor level to send when issuing the full stop command
#define SABER_ALL_STOP 0


SoftwareSerial SaberSerial = SoftwareSerial( SABER_RX_PIN, SABER_TX_PIN );

void initSabertooth( void )
{
// Init software UART to communicate
// with the Sabertooth 2x5
pinMode( SABER_TX_PIN, OUTPUT );

SaberSerial.begin( SABER_BAUDRATE );

// 2 second time delay for the Sabertooth to init
delay( 2000 );
// Send full stop command
setEngineSpeed( SABER_ALL_STOP );
}

/************************************************** ***
* setEngineSpeed
*
* Inputs - cSpeed_Motor1 - Input a percentage of full
* speed, from -100 to +100
*
************************************************** ***/
void setEngineSpeed( signed char cNewMotorSpeed )
{
unsigned char cSpeedVal_Motor1 = 0;

unsigned char cSpeedVal_Motor2 = 0;

// Check for full stop command
if( cNewMotorSpeed == 0 )
{
  // Send full stop command for both motors
  SaberSerial.print( 0, BYTE );

  return;
}

// Calculate the speed value for motor 1
if( cNewMotorSpeed >= 100 )
{
  cSpeedVal_Motor1 = SABER_MOTOR1_FULL_FORWARD;

  cSpeedVal_Motor2 = SABER_MOTOR2_FULL_FORWARD;
}
else if( cNewMotorSpeed <= -100 )
{
  cSpeedVal_Motor1 = SABER_MOTOR1_FULL_REVERSE;

  cSpeedVal_Motor2 = SABER_MOTOR2_FULL_REVERSE;
}
else
{
  // Calc motor 1 speed (Final value ranges from 1 to 127)
  cSpeedVal_Motor1 = map( cNewMotorSpeed,
                         -100,
                          100,
                          SABER_MOTOR1_FULL_REVERSE,
                          SABER_MOTOR1_FULL_FORWARD );

   // Calc motor 2 speed (Final value ranges from 128 to 255)
   cSpeedVal_Motor2 = map( cNewMotorSpeed,
                          -100,
                           100,
                           SABER_MOTOR2_FULL_REVERSE,
                           SABER_MOTOR2_FULL_FORWARD );
}

// Fire the values off to the Sabertooth motor controller
SaberSerial.print( cSpeedVal_Motor1, BYTE );
SaberSerial.print( cSpeedVal_Motor2, BYTE );
}

void setup( )
{
initSabertooth( );
Serial.begin(9600); // Code that made the keypress work
}

//void control( )
//{
//  // Full stop
//  setEngineSpeed( 0 );
//
//  // Half reverse
//  setEngineSpeed( -50 );
//
//  // Full reverse
//  setEngineSpeed( -100 );
//
//  // Half forward
//  setEngineSpeed( 50 );
//
//  // Full forward
//  setEngineSpeed( 100 );
//}

void setEngineSpeedDir( signed char cNewMotorSpeedDir )
{
unsigned char cSpeedValDir_Motor1 = 0;

unsigned char cSpeedValDir_Motor2 = 0;

if( cNewMotorSpeedDir >= 100 )
{
  cSpeedValDir_Motor1 = SABER_MOTOR1_FULL_FORWARD; // GO RIGHT

  cSpeedValDir_Motor2 = SABER_MOTOR2_FULL_STOP;
}
else if( cNewMotorSpeedDir <= -100 )
{
  cSpeedValDir_Motor1 = SABER_MOTOR1_FULL_STOP; // GO LEFT

  cSpeedValDir_Motor2 = SABER_MOTOR2_FULL_FORWARD;
}
else
{
  // Calc motor 1 speed (Final value ranges from 64 to 127)
  cSpeedValDir_Motor1 = map( cNewMotorSpeedDir,
                            -100,
                             100,
                             SABER_MOTOR1_FULL_STOP,
                             SABER_MOTOR1_FULL_FORWARD );

  // Calc motor 2 speed (Final value ranges from 192 to 255)
  cSpeedValDir_Motor2 = map( cNewMotorSpeedDir,
                            -100,
                             100,
                             SABER_MOTOR2_FULL_FORWARD,
                             SABER_MOTOR2_FULL_STOP);
}

// Fire the values off to the Sabertooth motor controller
SaberSerial.print( cSpeedValDir_Motor1, BYTE );

SaberSerial.print( cSpeedValDir_Motor2, BYTE );
}

//void turn ( )
//{
//  // Turn left
//  setEngineSpeedDir( -100 );
//
//  // Turn right
//  setEngineSpeedDir( 100 );
//}




void loop()
{
// setEngineSpeedDir( -100 );
//delay( 5000 );
//setEngineSpeed( 0 );




 signed char traverse;
 signed char negotiate;

 if(Serial.available()>0)
 {
   int data = Serial.read();
//
//    digitalWrite(buttonPin,LOW);

   switch(data)
   {
     case'w':traverse = 100;break; //full forward
     case's':traverse = -50;break; // half reverse
     case'q':traverse = 0;break; // Stop,[glow] Won't respond ( Motors won't stop)[/glow]
     case'a':negotiate = -100;break; // left
     case'd':negotiate = 100;break; // right
   }

   setEngineSpeed( traverse );
   setEngineSpeedDir( negotiate );
 }
}

Regards

PaulS

You can add Serial.print() statements to the Arduino code. They will show up in the Serial Monitor, if you are sending data that way. If you are sending data from the Processing app, you need to add an event handler to respond to the arrival of serial data.

So, try debugging using the Serial Monitor. Put a Serial.print() statement in SetEngineSpeed() to show the value that was entered, using DEC.
Code: [Select]
Serial.print("Engine speed value: ");
Serial.println(cNewMotorSpeed, DEC);


Confirm that SABER_ALL_STOP and the value passed when 'q' is sent are the same value.
The art of getting good answers lies in asking good questions.

Go Up