Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

The Lynxmotion Smart Servos (LSS) are compact, modular and configurable actuators that provide greater control than standard PWM servos. The servo lineup currently includes three “smart servos” which appear physically the same, sharing the same dimensions and mounting points but differing in maximum torque and speed. 

...

The lynx motion has a simple serial protocol for controlling the motor, that is human-readable:

  1. Number sign #

  2. Servo ID number as an integer

  3. Action command (two to three letters, no spaces, capital or lower case)

  4. Configuration value in the correct units with no decimal

  5. End with a control / carriage return '<cr>'

Ex: #5PD1443<cr>

Additional Parts:

...

Code Block
languagec#
#include <LSS.h>
#include <SoftwareSerial.h>

SoftwareSerial servoSerialmySerial(8, 9);

// ID set to default LSS ID = 0
#define LSS_ID_old (254)354 // ID 254 to broadcast to every motor on bus
#define LSS_ID   (0) // the new ID 
#define LSS_BAUD
(LSS_DefaultBaud)

// Create one LSS object
LSS myLSS = LSS(LSS_ID);

void setup()
{
  mySerial.begin(115200); // Important! this setis the datastandard ratespeed for thetalking SoftwareSerialto portLSS
  servoSerialmySerial.begin(LSS_BAUDprint("#0D1500\r");   // this is used to clear the serial buffer
  servoSerial.print("#0D1500\r");
  delay(1000);

 LSS::initBus(servoSerial, LSS_BAUD);
  //change ID 
  servoSerialmySerial.print(String("#") + LSS_ID_old + String("CID") + LSS_ID + "\r");
  delay(2000);
}
void loop() {
}

...

Code Block
languagecpp
#include <LSS<SoftwareSerial.h>
#include
<SoftwareSerial.h>
SoftwareSerial servoSerialmySerial(8, 9);

#define LSS_ID1    (1) 
#define LSS_ID2   (0)
#define
LSS_BAUD
int (LSS_DefaultBaud)

// Create two LSS objects
LSS myLSS1 = LSS(LSS_ID1);
LSS myLSS2 = LSS(LSS_ID2);
int direction = direction = -1;

void setup() {
  servoSerialmySerial.begin(LSS_BAUD115200); // Important! //this Initializeis the LSSstandard busspeed for talking LSS::initBus(servoSerial, LSS_BAUD);
  Serial.begin(LSS_BAUD);
}

void loop() {
  // motor direction 
  myLSS1.wheelRPM(-direction*60);
  myLSS2.wheelRPM(60*direction);
  delay(4000to LSS
  mySerial.print("#0D1500\r");  // this is used to clear the serial buffer
}

void loop() {
  // motor direction 
  mySerial.print(String("#") + LSS_ID + String("WR") +-direction*60) + "\r"); // RPM move
  mySerial.print(String("#") + LSS_ID + String("WR") + 60*direction  + "\r"); // RPM move
  delay(5000);
  // reversreverse dierctiondirection 
  direction = -direction;
}

...


Possible Solution:  This is one solution but it could use some improvement: It needs a denounce and a pause without delay function to avoid blocking your code. This solution uses an older arduino library that might need to be updated.

Code Block
languagec#
#include <LSS.h>
#include <SoftwareSerial.h>
SoftwareSerial servoSerial(8, 9);

// ID set to default LSS ID = 0
#define LSS_ID    (0)
#define LSS_BAUD  (LSS_DefaultBaud)

// Create one LSS object
LSS myLSS = LSS(LSS_ID);
int ServoPosition = 0;
bool counting = true;
int resetTime = 0;
int lastMovement;

void setup() {
  servoSerial.begin(LSS_BAUD);
  // Initialize the LSS bus
  LSS::initBus(servoSerial, LSS_BAUD);
  Serial.begin(LSS_BAUD);
  myLSS.move(0);
  // allow time to move to 0 position
  delay(3000);
  myLSS.setMaxSpeed(600, LSS_SetConfig);
  //buttons 
  pinMode(11, INPUT);
  pinMode(10, INPUT);
}

void loop() {
 delay(1000);
  if (counting) {
    int seconds = (millis() - resetTime)/1000; // see below for an explanation of resetTime 
    ServoPosition = seconds * 60;  // if we divide 360 by 60 we get 6.0 degrees
    myLSS.move(ServoPosition); // move servo to position
    Serial.println(seconds);
    lastMovement = millis();
  } else {
    resetTime = millis() - lastMovement; // this helps us return to the last position of the clock movement
  }
  // buttons 
  if (digitalRead(10) == HIGH) {
      // stop or start
     counting = !counting;
     Serial.println("Start/Stop");
     // this could be improved on with a debounce!
  }
   if (digitalRead(11) == HIGH) {
    // reset
      Serial.println("reset");
      myLSS.move(0);
      delay(2000);
      resetTime = millis();  // we use this to restart our counter from 0 
  }
}

...