Hello,
I try to write a code to programm my trinamic stepper-motor driver. The card has an RS485 interface.
I connected my arduino via a RS485 PCB and got it working physical.
After some coding I got this program working (The motor turns right and stops after 2 seconds):
#include <SoftwareSerial.h> // just in case I have to use a MEGA
#define TX_ENABLE_PIN 4 // define the EIA-485 transmit driver pin ( RE + DE pin's modules)
SoftwareSerial rs485(2, 3); // SoftwareSerial rs485(RO, DI)
// commands to be send
// rotate right 0A 02 00 00 00 00 30 D4 10
// motor stop 0A 03 00 00 00 00 00 00 0D
byte rot_r [] = {
0x0A, // address
0x02, // Command
0x00, // type
0x00, // motor #
0x00, // val0
0x00, // val1
0x30, // val2
0xD4, // val3
0x10 // checksum
};
byte mstop [] = {
0x0A, // address
0x03, // Command
0x00, // type
0x00, // motor #
0x00, // val0
0x00, // val1
0x00, // val2
0x00, // val3
0x0D // checksum
};
void setup() {
pinMode(TX_ENABLE_PIN, OUTPUT); // driver output enable
rs485.begin (57600);
Serial.begin(57600);
Serial.println("SETUP DONE\n");
}
void loop() {
// rotate right
digitalWrite (TX_ENABLE_PIN, HIGH); // enable transmit driver
for (int i = 0; i < 9; i++) {
rs485.write(rot_r[i]); // rotate right
}
digitalWrite(TX_ENABLE_PIN, LOW); // disable transmit driver
delay(2000);
// stop motor
digitalWrite (TX_ENABLE_PIN, HIGH); // enable transmit driver
for (int i = 0; i < 9; i++) {
rs485.write(mstop[i]); // stop motor
}
digitalWrite(TX_ENABLE_PIN, LOW); // disable transmit driver
delay(2000);
}
As I want the commands to be in an array which should be filled with content, read from an SD-Card, I need a function to convert from string to byte.
After aditional research through the internet I found a function which converts String to byte. I enhanced my code as followed
#include <SoftwareSerial.h>
#define TX_ENABLE_PIN 4 // define the EIA-485 transmit driver pin
SoftwareSerial rs485(2, 3); // SoftwareSerial rs485(RO, DI); pins name on the module
// rotate right 0A 02 00 00 00 00 30 D4 10
// motor stop 0A 03 00 00 00 00 00 00 0D
char command[18] = {"0A020000000030D410"}; // rotate right
byte stringToByte(char *src, int numBytes)
{
char charBuffer[18];
int charToInt;
byte intToByte;
Serial.print("BUFFER ");
Serial.println(charBuffer);
memcpy(charBuffer, src, numBytes);
charToInt = atoi(charBuffer);
Serial.print("INT ");
Serial.println(charToInt);
intToByte = (byte)charToInt;
return intToByte;
}
void setup() {
pinMode(TX_ENABLE_PIN, OUTPUT); // driver output enable
rs485.begin (57600);
Serial.begin(57600);
Serial.println("INIT DONE\n");
digitalWrite (TX_ENABLE_PIN, HIGH);
rs485.write("\n\r RS485-INIT-DONE\n\r"); // 485 Alive ?!
digitalWrite (TX_ENABLE_PIN, LOW);
Serial.println(stringToByte(command,18));
}
void loop() {
digitalWrite (TX_ENABLE_PIN, HIGH); // enable transmit driver
rs485.write(stringToByte(command,18));
digitalWrite(TX_ENABLE_PIN, LOW); // disable transmit driver
delay(2000);
}
but with no success.Only 0 or $ arrive in my controlling "minicom-RS485-linux-pc". Could someone please help me, convert my string(s) to byte?
Thanks