ST3215 Servo

From Waveshare Wiki
Revision as of 08:35, 18 August 2022 by Eng52 (talk | contribs) (→‎Feature)
Jump to: navigation, search
ST3215 Servo
ST3215 Servo.png

TTL bus servo interface
{{{name2}}}

{{{name3}}}

{{{name4}}}

{{{name5}}}

Overview

As a high-torque programmable serial bus servo, it is equipped with a 360° high-precision magnetic encoder, which can realize 360-degree absolute angle control. With the program to control, any angles can be set as the middle of the position, and it can also be switched to the continuously rotating motor or stepper motor mode. The built-in acceleration start-stop function makes the action softer. There are two interfaces on each servo, which can be used in series. In theory, 253 bus servos can be controlled at the same time, and each servo can obtain its own current angle, load, voltage, mode, and so on. It is suitable for robot projects, such as robotic arms, hexapod walkers, humanoid robots, wheeled robots and so on, which require real-time feedback for closed-loop control.
At the same time, we provide an open-source 12-DOF robot dog model for this servo. You can download the model and project files of the open-source structure in #Resource.

Specification

  • Input Voltage: 6-12.6V
  • Mechanical Limited Angle: No Limit
  • Rotating Angle: 360° (servo mode angle control) / motor mode continuous rotation
  • Baudrate: 1Mbps
  • Gear: high precision metal gear
  • Idling Speed: 0.222sec/60°(45RPM)@12V
  • Pos Sensor Resolution: 360°/4096
  • ID Range: 0-253
  • Feedback: Position, Load, Speed, Input Voltage
  • Idling Current: 180 mA
  • Stalling Current: 2.7 A
  • Dimension: 45.22mm x 35mm x 24.72mm

Feature

  • Up to 253 servos can be connected in series at the same time (requires full power), also can obtain feedback information from each servo.
  • 360°magnetic encoder, larger angle control range.
  • High precision, the angle control accuracy reaches 360°/4096.
  • Any angles can be set as the middle of the position, which is convenient for assembly.
  • Acceleration start and stop function, the movement effect is softer.
  • Compact structure design and the product appearance is more beautiful.
  • 6-12.6V wide-voltage input, it can directly supply power with 2s or 3s lithium battery.
  • High torque, up to 30kg.cm@12V.
  • The working mode can be set by the program: servo angle control/motor model can be rotated continuously.

How to Use the Hardware

  • You can use our Servo Driver to control the bus servo.
  • If you want to use the bus servo in your own project, you can refer to the following schematic diagram:

Bus servo drive circuit schematic.

How to Use the Software

Install Arduino IDE

  • You can directly click this link to download the Arduino IDE from Arduino.cc.

QQ screenshot 20220107175437.png

  • Choose the Arduino IDE suitable for your system.

QQ screenshot 20220107175603.png

  • Run the installation package.

QQ screenshot 20220107175730.png

  • Click on I Agree.

QQ picture 20211130105649.png

  • Check Install USB driver and Associate.ino files, then click Next.

QQ screenshot 20211130110050.png

  • Select the installation path of Arduino IDE, then click Install.

QQ screenshot 20211130110425.png

  • Wait for the installation to complete.

QQ screenshot 20211130110501.png

  • Install the required drivers.
  • Click to install.

QQ screenshot 20211130110721.png

  • Click to install.

QQ screenshot 20211130110952.png

  • Click to install.

QQ screenshot 20211130111022.png

  • Arduino IDE installation is complete.

QQ screenshot 20211130111127.png

Install Arduino Core for the ESP32

  • Run Arduino IDE, click File.

QQ screenshot 20211130112221.png

  • Click on Preferences.

QQ screenshot 20211130112341.png

QQ screenshot 20211130113232.png

  • Restart the IDE, click Tools > Board > Boards Manager to open the Boards Manager.
  • Fill in ESP32 and click Install. [Note: ESP32 version 1.0.6 needs to be installed here.]

QQ screenshot 20211130113827.png

  • Wait for the installation to complete.

QQ screenshot 20211130114001.png

  • After installation, you can use Arduino IDE to develop ESP32.

Download the Program & Install Dependency Libraries

  • Please install the following libraries through Manage Libraries:
    • Adafruit SSD1306
    • Adafruit NeoPixel
  • Click Tools > Manage Libraries to open the library manager.

QQ screenshot 20211130115318.png

  • Enter the libraries that need to be installed through the library manager in the search box, and install:
    • Adafruit SSD1306
    • Adafruit NeoPixel
  • Click "Update", and if there is no "Update", please click "Install" for the newest version.

QQ screenshot 20211130135130.png QQ screenshot 20211130135223.png

  • Download the bus servo library and the Arduino program for the servo driver board:
  • ServoDriverST Open Source Program (Arduino)
  • After downloading, unzip it and you can get the product demo.
  • Copy the SCServo folder to \Documents\Arduino\libraries after decompression, and install them for controlling the servo.

Upload the Program to Robot

  • Double click to run SERVO DRIVER WITH ESP32 ST/ServoDriverST/ServoDriverST.ino.

QQ screenshot 20211130140519.png

  • Click Tools -> Port to remember the existing COM Port, no need to click it.
  • The COM displayed here is different for different computers, remember this COM.

QQ screenshot 20211130140744.png

  • Connect the driver board and computer.
  • Click Tools -> Port, and click on this new COM.
  • The newly-appearing COM is different for different computers, click it.

Program to Robot4.png

  • Click Tools -> Boards -> ESP32 Arduino -> ESP32 Dev Module and select ESP32 Dev Module.

QQ screenshot 20211130141904.png

  • Other settings are as follows:
Upload Speed: "921600"
CPU Frequency: "240MHz(WiFi/BT)"
Flash Frequency: "80MHz"
Flash Mode: "QIO"
Flash Size: "4MB(32Mb)"
'''Partition Scheme: "Huge APP(3MB No OTA/1MB SPIFFS)"
PSRAM: "Disabled"'''
  • Click "Upload" in the upper left corner to upload the demo.
  • Note that the automatic downloading circuit will fail when WAVEGO uses the serial port to connect with the Raspberry Pi. You need to disconnect the serial port from the Raspberry Pi before uploading the program to WAVEGO.

QQ screenshot 20211130142717.png

  • Wait for uploading the demo.
  • After displaying "Leaving... Hard resetting via RTS pin...", it means that the upload has been successful.

QQ screenshot 20211130145013.png

Product Usage Tutorial

  • The following tutorial uses servo driver by default to explain how to use the servo, if you need to use it in your own project, you can refer to the sample program and the bus servo drive circuit schematic for secondary development.
  • The factory default ID of the servo is 1. Among the servos connected to the same servo drive board, the same ID can only correspond to one servo, and there cannot be more than one servo with the same ID in the one control circuit. When you set the ID for the servo, try to ensure that only one servo whose ID is to be changed is connected to the driver board. After the ID is changed, it will be permanently saved in the servo and will not be lost even if the power is off.
  • First of all, you need to set an independent ID for each servo. When setting an ID for one servo, the driver board should not be connected to other servos.
  • If you use the ST3215 servo, after connecting it to the driver board, you need to provide 6-12.6V (12V is recommended) via the DC port (5.5*2.1mm) on the board, and the port will directly power the servo. If you use a large number of servos, you need to provide enough currents for the port.
  • After the driver board is powered on, a WiFi hotspot will be created by default. The default hotspot name is ESP32_DEV, and its password is 12345678. Please connect to this hotspot with your phone.
  • After connecting to the hotspot issued by the servo driver board, it is recommended to use Google Chrome to access the address 192.168.4.1. Noted that the phone will fail to verify the server with ping after connecting the WiFi, so it may automatically switch to the other known WiFi. In this case, you should connect ESP32_DEV again, and the phone will not connect to other WiFi automatically after the reconnection is successful.
  • The driver board will automatically scan the servo ID (0-20) when it is powered on (in order to save the boot time). If your servo ID is more than 20, you must change the MAX_ID value in ServoDriverST.ino and upload it to the driver board again.

ST3215-Servo-details-023.jpg

  • If the servo is connected after the driver board is powered on, you need to click Start Searchingon the mobile browser page to scan again.
  • Active IDis the currently selected servo ID number, ID to Setis the new ID number to be set, adjust the value of ID to Setthrough ID to Set+andID to Set-, and press the Set New ID button to set the servo ID Active ID as ID to Set.
  • When the IDs of all servos are set, you can connect them all. If you do not restart the device, you need to clickStart Searchingto scan all servos.
  • ID: shows all ID numbers of servos currently connected to the servo driver board.
  • Active ID The currently selected servo ID number, and the subsequent operations are all controlling thisActive ID servo.
  • You can select the Active ID servo via the ID to Set+ and ID to Set- buttons.
  • Middlekey, you can turn the servo to the middle position, the position range of the servo is 0-4095, and the middle position is 2047.
  • Stopkey, the default program will not let the servo move all the time. If the servo cannot be stopped after the secondary development, you can press the Stop key to hault the servo movement.
  • Releasekey, press it and the servo will close torque lock (Torque Off), then you can turn the servo by hand.
  • Torquekey, after pressing the servo, the servo will turn on the torque lock (Torque On), at this time, the servo will maintain the specified position with force.
  • Position+key, after pressing the servo, the servo will start to rotate clockwise. When the servo is in the servo mode, it will not continue to rotate after turning to the 4095 position.
  • Position-key, after pressing the servo, the servo will start to rotate counterclockwise. When the servo is in the servo mode, it will not continue to rotate after turning to the 0 position.
  • Speed+ and Speed- are used to set the speed of the servo. The maximum setting for ST series servos is about 3073. The speed is the number of steps per second, 50 steps/sec≈0.732RPM.
  • Set Middle Positionkey, no matter what position the current servo is in, when this key is pressed, the servo will set the current position to the middle position (2047).
  • Set Servo Modekey, set the servo to servo mode, 360° absolute angle control can be performed in the servo mode, the setting will be permanently saved and will not be lost even if the power is turned off.
  • Set Motor Modekey, set the servo to stepper motor mode, the servo can rotate continuously 30,000 steps. If you press it continuously, the motor will keep rotating. This mode can control the relative angle within ±7 circles and the number of circles will not be saved when power is off, but the stepper motor mode settings will be permanently saved even if power is off.
  • Start Serial Forwardingbutton, set the servo driver board to serial forwarding mode, you can directly control the servo and get the feedback of the servo with the typeC interface on the board. This function is used to debug the servo.
  • Normalkey, set the servo driver board to normal mode, in this mode, it will not send or receive any information via ESP-NOW.
  • Leaderkey, set the servo driver board as the host, in this mode, the driver board continuously sends the ID, position, and speed of the current Active ID servo to the driver board of the controlled slave through the ESP-NOW protocol. After the servo driver board is turned on, the MAC:on the first line of the screen is the MAC address of this development board, which is unique, such as MAC: 08 3A F2 93 5F A8. The premise of ESP-NOW communication is to get the MAC address of the slave, please write down the address, and fill it in the broadcastAddress[] = {0x08, 0x3A, 0xF2, 0x93, 0x5F, 0xA8} of ServoDriverST.ino, then upload it to the driver of the host and the function is enabled.
  • Followerkey, set the servo drive board as the slave, after changing the MAC address of the slave in the program of the host, it can act under the remote control of the host.
  • RainbowONand RainbowOFFkeys are used to turn on and off the rainbow effect of RGB lights.

Secondary Development Tutorial

  • Servo initialization

Each program for controlling the servo needs to initialize servo before it can be used.

#include <SCServo.h>
SMS_STS st;
void setup(){
Serial1.begin(1000000); //Initialize the serial port, if you use ESP32 and other devices, you can also choose a custom serial port
// Serial1.begin(1000000, SERIAL_8N1, RX, TX); // custom serial port
st.pSerial = &Serial1;
while(!Serial1) {}
}
  • Change servo ID

In the servos connected in series, each ID corresponds to only one servo, otherwise the information fed back by the servos cannot be obtained normally. When changing the servo ID, please try to ensure that the driver board is connected to only one servo, and the ID will be permanently saved in the servo.

#include <SCServo.h>
SMS_STS st;
int ID_ChangeFrom = 1; // Change the original servo ID, and the factory default is 1
int ID_Changeto = 2; // new ID
void setup(){
  Serial1.begin(1000000);
  st.pSerial = &Serial1;
  while(!Serial1) {}

  st.unLockEprom(ID_ChangeFrom); //Unlock EPROM-SAFE
  st.writeByte(ID_ChangeFrom, SMS_STS_ID, ID_Changeto);//Change ID
  st.LockEprom(ID_Changeto); // EPROM-SAFE is locked
}

void loop(){
}
  • Ping

Used to test whether a servo is connected normally.

#include <SCServo.h>
SMS_STS st;
int TEST_ID = 3; // Servo ID to test
void setup()
{
  Serial.begin(115200);
  Serial1.begin(1000000, SERIAL_8N1, RX, TX); // custom serial port
  st.pSerial = &Serial1;
  while(!Serial1) {}
}

void loop()
{
  int ID = st.Ping(TEST_ID);
  if(ID!=-1){
    Serial.print("Servo ID:");
    Serial.println(ID, DEC);
    delay(100);
  }else{
    Serial.println("Ping servo ID error!");
    delay(2000);
  }
}
  • write location

Can be used to control the rotation of individual servos.

#include <SCServo.h>
SMS_STS st;
void setup()
{
  Serial1.begin(1000000);
  st.pSerial = &Serial1;
  while(!Serial1) {}
}

void loop()
{
  st.WritePos(1, 1000, 1500, 50); // Control the servo with ID 1 to rotate to the position of 1000 at a speed of 1500 and start and stop the acceleration of 50.
  delay(754);//[(P1-P0)/V]*1000+100

  st.WritePos(1, 20, 1500, 50); // Control the servo with ID 1 to rotate to the position 20 at a speed of 1500 and start and stop the acceleration at 50.
  delay(754);//[(P1-P0)/V]*1000+100
}
  • Synchronous write

Can be used to control multiple servos at the same time (turn to different positions and different speeds).

#include <SCServo.h>
SMS_STS st;

// the uart used to control servos.
// GPIO 18 - S_RXD, GPIO 19 - S_TXD, as default.
#define S_RXD 18
#define S_TXD 19

byte ID[2];
s16 Position[2];
u16 Speed[2];
byte ACC[2];

void setup()
{
  Serial1.begin(1000000, SERIAL_8N1, S_RXD, S_TXD);
  st.pSerial = &Serial1;
  delay(1000);
  ID[0] = 1;
  ID[1] = 2;
  Speed[0] = 3400;
  Speed[1] = 3400;
  ACC[0] = 50;
  ACC[1] = 50;
}

void loop()
{
  Position[0] = 3000;
  Position[1] = 3000;
  st.SyncWritePosEx(ID, 2, Position, Speed, ACC);//servo(ID1/ID2) speed=3400, acc=50, move to position=3000.
  delay(2000);

  Position[0] = 100;
  Position[1] = 100;
  st.SyncWritePosEx(ID, 2, Position, Speed, ACC);//servo(ID1/ID2) speed=3400, acc=50, move to position=100.
  delay(2000);
}
  • Get servo information feedback.
#define S_RXD 18
#define S_TXD 19
#include <SCServo.h>

SMS_STS sms_sts;

void setup()
{
  Serial1.begin(1000000, SERIAL_8N1, S_RXD, S_TXD);
  Serial.begin(115200);
  sms_sts.pSerial = &Serial1;
  delay(1000);
}

void loop()
{
  int Pos;
  int Speed;
  int Load;
  int Voltage;
  int Temper;
  int Move;
  int Current;
  if(sms_sts.FeedBack(1)!=-1){
    Pos = sms_sts.ReadPos(-1);
    Speed ​​= sms_sts.ReadSpeed(-1);
    Load = sms_sts.ReadLoad(-1);
    Voltage = sms_sts.ReadVoltage(-1);
    Temper = sms_sts.ReadTemper(-1);
    Move = sms_sts.ReadMove(-1);
    Current = sms_sts.ReadCurrent(-1);
    Serial.print("Position:");
    Serial.println(Pos);
    Serial.print("Speed:");
    Serial.println(Speed);
    Serial.print("Load:");
    Serial.println(Load);
    Serial.print("Voltage:");
    Serial.println(Voltage);
    Serial.print("Temper:");
    Serial.println(Temper);
    Serial.print("Move:");
    Serial.println(Move);
    Serial.print("Current:");
    Serial.println(Current);
    delay(10);
  }else{
    Serial.println("FeedBack err");
    delay(500);
  }
  
  Pos = sms_sts.ReadPos(1);
  if(Pos!=-1){
    Serial.print("Servo position:");
    Serial.println(Pos, DEC);
    delay(10);
  }else{
    Serial.println("read position err");
    delay(500);
  }
  
  Voltage = sms_sts.ReadVoltage(1);
  if(Voltage!=-1){
Serial.print("Servo Voltage:");
    Serial.println(Voltage, DEC);
    delay(10);
  }else{
    Serial.println("read Voltage err");
    delay(500);
  }
  
  Temper = sms_sts.ReadTemper(1);
  if(Temper!=-1){
    Serial.print("Servo temperature:");
    Serial.println(Temper, DEC);
    delay(10);
  }else{
    Serial.println("read temperature err");
    delay(500);
  }

  Speed ​​= sms_sts.ReadSpeed(1);
  if(Speed!=-1){
    Serial.print("Servo Speed:");
    Serial.println(Speed, DEC);
    delay(10);
  }else{
    Serial.println("read Speed ​​err");
    delay(500);
  }
  
  Load = sms_sts.ReadLoad(1);
  if(Load!=-1){
    Serial.print("Servo Load:");
    Serial.println(Load, DEC);
    delay(10);
  }else{
    Serial.println("read Load err");
    delay(500);
  }
  
  Current = sms_sts.ReadCurrent(1);
  if(Current!=-1){
    Serial.print("Servo Current:");
    Serial.println(Current, DEC);
    delay(10);
  }else{
    Serial.println("read Current err");
    delay(500);
  }

  Move = sms_sts.ReadMove(1);
  if(Move!=-1){
    Serial.print("Servo Move:");
    Serial.println(Move, DEC);
    delay(10);
  }else{
    Serial.println("read Move err");
    delay(500);
  }
  Serial.println();
}

Resource

3D Module

2D Drawing

Document

Demo

Software

Open Source Structure

WAVEGO PRO BETA v3.png