Pages: [1]   Go Down
Author Topic: Mecanum/Holonomic Drive  (Read 619 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

My current project uses an Arduino Uno with Ethernet Shield and a RobotOpen shield (http://www.team221.com/robotopen/product.php?id=105) but they don't have Mecanum (sometimes called Holonomic) drive examples, only Tank, Swerve, and Arcade style drive systems. So this is the robots current Tank setup:
Code:
#include <SPI.h>
#include <Ethernet.h>
#include <RobotOpen.h>


/* I/O Setup */
USBJoystick usb1('0');  // Assign the logitech USBJoystick object to bundle 0


void setup()
{
  /* Initiate comms */
  RobotOpen.begin();
}


/* This is your primary robot loop - all of your code
 * should live here that allows the robot to operate
 */
void enabled() {
  // Constantly update PWM values with joystick values
  RobotOpen.setPWM(SIDECAR_PWM1, usb1.makePWM(ANALOG_LEFTY, NORMAL));
  RobotOpen.setPWM(SIDECAR_PWM2, usb1.makePWM(ANALOG_RIGHTY, NORMAL));
}


/* This is called while the robot is disabled
 * You must make sure to set all of your outputs
 * to safe/disable values here
 */
void disabled() {
  // PWMs are automatically disabled
}


/* This loop ALWAYS runs - only place code here that can run during a disabled state
 * This is also a good spot to put driver station publish code
 * You can use either publishAnalog, publishDigital, publishByte, publishShort, or publishLong
 * Specify a bundle ID with a single character (a-z, A-Z, 0-9) - Just make sure not to use the same twice!
 */
void timedtasks() {
  RobotOpen.publishAnalog(ANALOG0, 'A');   // Bundle A
  RobotOpen.publishAnalog(ANALOG1, 'B');   // Bundle B
  RobotOpen.publishAnalog(ANALOG2, 'C');   // Bundle C
  RobotOpen.publishAnalog(ANALOG3, 'D');   // Bundle D
  RobotOpen.publishAnalog(ANALOG4, 'E');   // Bundle E
  RobotOpen.publishAnalog(ANALOG5, 'F');   // Bundle F
}


/* This is the main program loop that keeps comms operational
 * There's no need to touch anything here!!!
 */
void loop() {
  RobotOpen.pollDS();
  if (RobotOpen.enabled())
    enabled();
  else
    disabled();
  timedtasks();
  RobotOpen.outgoingDS();
}

And my question is wether i could take the drive part out of Kiwi library's basic mecanum code

Code:
/* Kiwi drive macros and functions
 * By Jonathan M. Guberman, 2011
 * http://upnotnorth.net
 *
 * Use this code however you like, but don't blame me if it doesn't work!
 */

#include <Servo.h>

#define SPEED(x) (90 + (x))
#define DRIVE(x,y,z)   servo1.write(90 + (x)); servo2.write(90 + (y));servo3.write(90 + (z))
 
#define MAXSPEED 20
 
Servo servo1;
Servo servo2;
Servo servo3;
 
void setup()
{
 
}
 
 
void loop()
{

}

void setDrive(int angle, int maxspeed){
  float x = cos(3.14159 * (float) angle / 180);
  float y = sin(3.14159 * (float) angle / 180);
 
  DRIVE((int)(x*maxspeed),(int)((-0.5*x + 0.866*y)*maxspeed),(int)((-0.5*x-0.866*y)*maxspeed));
}

void setDrive(int angle){
  setDrive(angle, MAXSPEED);
}

void stopDrive(){
  DRIVE(0,0,0);
}

void stopDrive(int time){
  stopDrive();
  delay(time);
}

And copy & paste it into the RobotOpen code, replacing the tank drive bit. This possible? and where would the code be inserted?
Logged

Pages: [1]   Go Up
Jump to: