@motcart

Как передать данные через монитор порта в этот скетч?

Есть скетч для управления 5 шаговиками (по 2 на x, y и 1 на z ось). Есть ардуино нано, драйвера для моторов с отдельным БП и сами моторы. Железная часть работает.

Помогите разобраться как передавать данные для управления моторами через монитор порта в Arduino IDE? Точнее какие данные ждет контролер, чтобы я ему отправил для вращения моторов?
//velocity control added

byte MotorState[]={1,1,1};  //X Y Z A Ex1 Ex2
word Movement_of_Motor[]={0,0,0};
char Direction_of_Motor[]={'+','+','+'};
int MotorNumber;
byte NewMotorState;

int PinX[]={9,11,12,10};
int PinY[]={13,3,4,2};
int PinZ[]={8,6,7,5};
int i;
byte b[32];
byte a[18];
word DMAX;
word stepcounter;
word s[5];
float OP1;
float OP2;
word period=0;

// the setup routine runs once when you press reset:
void setup()
  {                
  for (i = 0; i < 4; i = i + 1) 
      {
      pinMode(PinX[i], OUTPUT); 
      pinMode(PinY[i], OUTPUT);  
      pinMode(PinZ[i], OUTPUT); 
      }  
// initialize the serial communication:
  Serial.begin(9600);
  }
void shiftMotorState(int MN){
    if (Direction_of_Motor[MN]=='+'){
        switch (MotorState[MN]) {
            case 1:
                NewMotorState=3;
                break;
            case 3:
                NewMotorState=2;
                break;
            case 2:
                NewMotorState=6;
                break;    
            case 6:
                NewMotorState=4;
                break;
            case 4:
                NewMotorState=12;
                break;
            case 12:
                NewMotorState=8;
                break;
            case 8:
                NewMotorState=9;
                break;    
            default:
                NewMotorState=1;
            }
    }
     else{
        switch (MotorState[MN]) {
            case 2:
                NewMotorState=3;
                break;    
            case 6:
                NewMotorState=2;
                break;  
            case 4:
                NewMotorState=6;
                break;
            case 12:
                NewMotorState=4;
                break;
            case 8:
                NewMotorState=12; 
                break;   
            case 9:
                NewMotorState=8;
                break;
            case 1:
                NewMotorState=9;
                break;
            default:
                NewMotorState=1;
                break;
                }}
    MotorState[MN]=NewMotorState;
}
void setHardwareState()
{
  for (i = 0; i < 4; i = i + 1) 
    {
    digitalWrite(PinX[i], bitRead(MotorState[0],i));  
    digitalWrite(PinY[i], bitRead(MotorState[1],i)); 
    digitalWrite(PinZ[i], bitRead(MotorState[2],i));  
    }  
}
void disableHardware()
{
  for (i = 0; i < 4; i = i + 1) 
    {
    digitalWrite(PinX[i], LOW);  
    digitalWrite(PinY[i], LOW); 
    digitalWrite(PinZ[i], LOW);  
    }  
}

// the loop routine runs over and over again forever:
void loop() {
  disableHardware();
  if (Serial.available() > 31) {       
       for (i = 0; i < 32; i = i + 1) 
       {
       b[i] = Serial.read();
       }
       Direction_of_Motor[0]=b[8];
       Direction_of_Motor[1]=b[11];
       Direction_of_Motor[2]=b[14];
       Movement_of_Motor[0]=b[9]*256;
       Movement_of_Motor[1]=b[12]*256;
       Movement_of_Motor[2]=b[15]*256;
       Movement_of_Motor[0]=Movement_of_Motor[0]+b[10];
       Movement_of_Motor[1]=Movement_of_Motor[1]+b[13];
       Movement_of_Motor[2]=Movement_of_Motor[2]+b[16];
       period=b[30]*256;
       period=period+b[31];
       DMAX=0;
       for (MotorNumber = 0; MotorNumber < 3; MotorNumber = MotorNumber + 1)
            {
            s[MotorNumber]=0;
            if (Movement_of_Motor[MotorNumber]>DMAX) 
                {  
                DMAX=Movement_of_Motor[MotorNumber];
                }
            }
       for (stepcounter = 1; stepcounter <= DMAX; stepcounter = stepcounter + 1)
             {
             for (MotorNumber = 0; MotorNumber < 3; MotorNumber = MotorNumber + 1)
                  {                                        
                  OP1=(float)s[MotorNumber]*(float)DMAX;
                  OP2=(float)stepcounter*(float)Movement_of_Motor[MotorNumber];
                  if (OP1<=OP2 && Movement_of_Motor[MotorNumber]>0)
                     {  //если s[]*DMAX[] <= stepcounter*DX[]                   
                      s[MotorNumber]=s[MotorNumber]+1;                  
                      shiftMotorState(MotorNumber);
                      }
                  }
             setHardwareState();
             for (i = 0; i < 2; i = i + 1) 
             {
             delayMicroseconds(period);  
             delayMicroseconds(period);  
             delayMicroseconds(period);  
             delayMicroseconds(period);  
             delayMicroseconds(period);  
             delayMicroseconds(period);  
             delayMicroseconds(period);  
             delayMicroseconds(period);  
             delayMicroseconds(period);  
             delayMicroseconds(period); 
              } 
             }     
       a[0] = 'D';         
       a[1] = 'o';
       a[2] = 'n';
       a[3] = 'e';     
  
       a[17] = a[0] ^ a[1] ^ a[2] ^ a[3] ^ a[4] ^ a[5] ^ a[6] ^ a[7] ^ a[8] ^ a[9] ^ a[10] ^ a[11] ^ a[12] ^ a[13] ^ a[14] ^ a[15] ^ a[16] ;
       for (i = 0; i < 18; i = i + 1) 
       {
       Serial.write(a[i]);
       }
        }
}
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
Ocelot
@Ocelot
for (i = 0; i < 32; i = i + 1)
{
b[i] = Serial.read();
}
Direction_of_Motor[0]=b[8];
Direction_of_Motor[1]=b[11];
Direction_of_Motor[2]=b[14];
Movement_of_Motor[0]=b[9]*256;
Movement_of_Motor[1]=b[12]*256;
Movement_of_Motor[2]=b[15]*256;
Movement_of_Motor[0]=Movement_of_Motor[0]+b[10];
Movement_of_Motor[1]=Movement_of_Motor[1]+b[13];
Movement_of_Motor[2]=Movement_of_Motor[2]+b[16];
period=b[30]*256;
period=period+b[31];


Принимает 32 байта, нумерация с 0 по 31.
Байт 8 - направление оси X ('+' или '-'). Байты 9 (старшая часть) и 10 (младшая часть) - перемещение по оси X.
Байты 11, 12, 13 - то же для оси Y.
Байты 14, 15, 16 - то же для оси Z.
Байты 30 (старшая часть) и 31 (младшая часть) - период между шагами. Единица периода == 20 мкс, вроде так.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы