Skocz do zawartości

Wyjaśnienie kodu


komo23

Pomocna odpowiedź

Witam,

buduję swojego jeżdżącego robota sterowanego z aplikacji na telefon. 

Znalazłem w internecie poniższy kod:

#include <math.h>

/*BTS7960 Motor Driver Carrier*/
const int MotorRight_R_EN = 4; // Pin to control the clockwise direction of Right Motor
const int MotorRight_L_EN = 5; // Pin to control the counterclockwise direction of Right Motor 
const int MotorLeft_R_EN = 8; // Pin to control the clockwise direction of Left Motor
const int MotorLeft_L_EN = 9; // Pin to control the counterclockwise direction of Left Motor
const int Rpwm1 = 6; // pwm output - motor A
const int Lpwm1 = 7; // pwm output - motor B
const int Rpwm2 = 2; // pwm output - motor A
const int Lpwm2 = 3; // pwm output - motor B
long pwmLvalue = 255;
long pwmRvalue = 255;
byte pwmChannel;

const char startOfNumberDelimiter = '<';
const char endOfNumberDelimiter = '>';
int robotControlState;
int last_mspeed;

void setup(){
  /*
  For Arduino Mega 2560
  Serial1 RX - pin 19
  Serial1 TX - pin 18
  */
  Serial1.begin(9600);//Default Bluetooth Baudrate for HC-05

  //Setup Right Motors
  pinMode(MotorRight_R_EN, OUTPUT); //Initiates Motor Channel A1 pin
  pinMode(MotorRight_L_EN, OUTPUT); //Initiates Motor Channel A2 pin

  //Setup Left Motors
  pinMode(MotorLeft_R_EN, OUTPUT); //Initiates Motor Channel B1 pin
  pinMode(MotorLeft_L_EN, OUTPUT); //Initiates Motor Channel B2 pin
  
  //Setup PWM pins as Outputs
  pinMode(Rpwm1, OUTPUT);
  pinMode(Lpwm1, OUTPUT);
  pinMode(Rpwm2, OUTPUT);
  pinMode(Lpwm2, OUTPUT);
  
  stop_Robot();
}// void setup()

void loop(){
  //int i = 0;  
  if (Serial1.available()) {
    processInput();
  }
}// void loop()

void processInput (){
  static long receivedNumber = 0;
  static boolean negative = false;
  byte c = Serial1.read ();

  switch (c){
  case endOfNumberDelimiter:
    if (negative)
      SetPWM(- receivedNumber, pwmChannel);
    else
      SetPWM(receivedNumber, pwmChannel);

    // fall through to start a new number
  case startOfNumberDelimiter:
    receivedNumber = 0;
    negative = false;
    pwmChannel = 0;
    break;

  case 'f': // Go FORWARD
    go_Forward(255);
    //Serial.println("forward");
    break;

  case 'b': // Go BACK
    go_Backwad(255);
    break;

  case 'r':
    turn_Right(255);
    break;

  case 'l':
    turn_Left(255);
    break;

  case 'c': // Top Right
    move_RightForward(255);
    break; 

  case 'd': // Top Left
    move_LeftForward(255);
    break;  

  case 'e': // Bottom Right
    move_RightBackward(255);
    break; 

  case 'h': // Bottom Left
    move_LeftBackward(255);
    break;  

  case 's':
    stop_Robot();
    break;

  case 'x':
    pwmChannel = 1; // Rpwm1
    break;
  case 'y': // Lpwm1
    pwmChannel = 2;
    break;

  case '0' ... '9':
    receivedNumber *= 10;
    receivedNumber += c - '0';
    break;

  case '-':
    negative = true;
    break;
  } // end of switch
} // void processInput ()

void stop_Robot(){ // robotControlState = 0
  if(robotControlState!=0){
    //SetMotors(2); 
    analogWrite(Rpwm1, 0);
    analogWrite(Lpwm1, 0);
    analogWrite(Rpwm2, 0);
    analogWrite(Lpwm2, 0);
    robotControlState = 0;
  }
}// void stopRobot()

void turn_Right(int mspeed){ // robotControlState = 1
  if(robotControlState!=1 || last_mspeed!=mspeed){
    SetMotors(1);
    analogWrite(Rpwm1, 0);
    analogWrite(Lpwm1, mspeed);
    analogWrite(Rpwm2, mspeed);
    analogWrite(Lpwm2, 0);
    robotControlState=1;
    last_mspeed=mspeed;
  }
}// void turn_Right(int mspeed)

void turn_Left(int mspeed){ // robotControlState = 2
  if(robotControlState!=2 || last_mspeed!=mspeed){
    SetMotors(1);
    analogWrite(Rpwm1, mspeed);
    analogWrite(Lpwm1, 0);
    analogWrite(Rpwm2, 0);
    analogWrite(Lpwm2, mspeed);
    robotControlState=2;
    last_mspeed=mspeed;
  }
}// void turn_Left(int mspeed)

void go_Forward(int mspeed){ // robotControlState = 3
  if(robotControlState!=3 || last_mspeed!=mspeed){
    SetMotors(1);
    analogWrite(Rpwm1, mspeed);
    analogWrite(Lpwm1, 0);
    analogWrite(Rpwm2, mspeed);
    analogWrite(Lpwm2, 0);
    robotControlState=3;
    last_mspeed=mspeed;
  }
}// void goForward(int mspeed)

void go_Backwad(int mspeed){ // robotControlState = 4
  if(robotControlState!=4 || last_mspeed!=mspeed){
    SetMotors(1);
    analogWrite(Rpwm1, 0);
    analogWrite(Lpwm1, mspeed);
    analogWrite(Rpwm2, 0);
    analogWrite(Lpwm2, mspeed);
    robotControlState=4;
    last_mspeed=mspeed;
  }
}// void goBackwad(int mspeed)

void move_RightForward(int mspeed){ // robotControlState = 5
  if(robotControlState!=5 || last_mspeed!=mspeed){
    SetMotors(1);
    analogWrite(Rpwm1, mspeed*0.4);
    analogWrite(Lpwm1, 0);
    analogWrite(Rpwm2, mspeed);
    analogWrite(Lpwm2, 0);
    robotControlState=5;
    last_mspeed=mspeed;
  }
}// void move_RightForward(int mspeed)

void move_LeftForward(int mspeed){ // robotControlState = 6
  if(robotControlState!=6 || last_mspeed!=mspeed){
    SetMotors(1);
    analogWrite(Rpwm1, mspeed);
    analogWrite(Lpwm1, 0);
    analogWrite(Rpwm2, mspeed*0.4);
    analogWrite(Lpwm2, 0);
    robotControlState=6;
    last_mspeed=mspeed;  
  }
}// move_LeftForward(int mspeed)

void move_RightBackward(int mspeed){ // robotControlState = 7
  if(robotControlState!=7 || last_mspeed!=mspeed){
    SetMotors(1);
    analogWrite(Rpwm1, 0);
    analogWrite(Lpwm1, mspeed*0.4);
    analogWrite(Rpwm2, 0);
    analogWrite(Lpwm2, mspeed);
    robotControlState=7;
    last_mspeed=mspeed;  
  }
}// void move_RightBackward(int mspeed)

void move_LeftBackward(int mspeed){ // robotControlState = 8
  if(robotControlState!=8 || last_mspeed!=mspeed){
    SetMotors(1);
    analogWrite(Rpwm1, 0);
    analogWrite(Lpwm1, mspeed);
    analogWrite(Rpwm2, 0);
    analogWrite(Lpwm2, mspeed*0.4);
    robotControlState=8; 
    last_mspeed=mspeed; 
  }
}// void move_LeftBackward(int mspeed)

void stopRobot(int delay_ms){
  SetMotors(2);
  analogWrite(Rpwm1, 0);
  analogWrite(Lpwm1, 0);
  analogWrite(Rpwm2, 0);
  analogWrite(Lpwm2, 0);
  delay(delay_ms);
}// void stopRobot(int delay_ms)

void SetPWM(const long pwm_num, byte pwm_channel){
  if(pwm_channel==1){ // DRIVE MOTOR
    analogWrite(Rpwm1, 0);
    analogWrite(Rpwm2, 0);
    analogWrite(Lpwm1, pwm_num);
    analogWrite(Lpwm2, pwm_num);
    pwmRvalue = pwm_num;
  }
  else if(pwm_channel==2){ // STEERING MOTOR
    analogWrite(Lpwm1, 0);
    analogWrite(Lpwm2, 0);
    analogWrite(Rpwm1, pwm_num);
    analogWrite(Rpwm2, pwm_num);
    pwmLvalue = pwm_num;
  }
}// void SetPWM (const long pwm_num, byte pwm_channel)  

void SetMotors(int controlCase){
  switch(controlCase){
    case 1:
      digitalWrite(MotorRight_R_EN, HIGH);  
      digitalWrite(MotorRight_L_EN, HIGH); 
      digitalWrite(MotorLeft_R_EN, HIGH);  
      digitalWrite(MotorLeft_L_EN, HIGH); 
    break;
    case 2:
      digitalWrite(MotorRight_R_EN, LOW);  
      digitalWrite(MotorRight_L_EN, LOW); 
      digitalWrite(MotorLeft_R_EN, LOW);  
      digitalWrite(MotorLeft_L_EN, LOW); 
    break;
  } 
}// void SetMotors(int controlCase)

I nie mogę zrozumieć jakie zdanie mają zmienne startOfNumberDelimiter oraz endOfNumberDelimiter ? Co one w tym programie robią ? 

Link do komentarza
Share on other sites

(edytowany)

Nie wiem ja się nie znam ale chyba służą do sprawdzenia PWMa

 

Nie lepiej napisać swój program

Edytowano przez aerograf7
  • Lubię! 1
  • Nie zgadzam się! 1
Link do komentarza
Share on other sites

Gość

Zmienna char oznacza znak, w tym przypadku jest to znak < albo > można go używać w warunkach do Sprawdzania:

Np.

if(analogRead(A0) < 10) {
 // tutaj program
  }

 

Link do komentarza
Share on other sites

(edytowany)
const char startOfNumberDelimiter = '<';    // przypisanie stałego znaku '<' na nazwkę -> startOfNumberDelimiter
const char endOfNumberDelimiter = '>';		// przypisanie stałego znaku '>' na nazwkę -> endOfNumberDelimiter

// od teraz wprowadzając znak z kalwiatury '<' lub '>' w programie ten znak będzie miał nazwę , którą sobie programista wykorzystuje w kodzie. Nazwał sobię je jako początek ogranicznika liczby oraz koniec ogranicznika.

i to nie są w tym przypadku zmienne tylko stałe .

Edytowano przez daniel89
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

O rety... Czy ktoś z przedmówców w ogóle poszukał gdzie są te stałe wykorzystane? 

void processInput (){ // funkcja przetwarzajaca komeny odbierane przez serial
  static long receivedNumber = 0;
  static boolean negative = false;
  byte c = Serial1.read ();

  switch (c){
  case endOfNumberDelimiter: // odebrano '>' - koniec parasowania liczby, ustawiamy PWM na tą liczbę (receivedNumber)
    if (negative)
      SetPWM(- receivedNumber, pwmChannel);
    else
      SetPWM(receivedNumber, pwmChannel);

    // fall through to start a new number  - nie było instrukcji break; więc poniższy case też sie wykona dla '>'
  case startOfNumberDelimiter: // odebrano '<' rozpocznij parsowanie liczby
    receivedNumber = 0;
    negative = false;
    pwmChannel = 0;
    break;
      
  case '0' ... '9': // przetwarzanie nadchodzących cyfr
    receivedNumber *= 10;
    receivedNumber += c - '0';
    break;

  case '-': // i dla liczb ujemnych
    negative = true;
    break;

Zamysłem autora było ustawianie PWM z pomocą komend w stylu x<123>, y<-45>. gdzie x i y zmieniają sterowany silnik. Czy można to zrobić prościej? Pewnie tak i zachęcam autora aby sam spróbował dostosować protokól komunikacji do swoich potrzeb.

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

5 godzin temu, matiut2 napisał:

Nie chcę, żeby to wyglądało na jakieś mądrzenie się, atak na was, czy coś, ale nie mogę po przeczytaniu takich odpowiedzi nie zostawić komentarza. Bo przecież człowiek przyszedł po pomoc, a wy wprowadzacie go w jeszcze większe niezrozumienie, albo piszecie odpowiedzi, które nie mają nic wspólnego z pytaniem. Trzeba by się trochę zastanowić zanim coś się napisze w internecie.

To chyba nie jest celowe wprowadzanie kogoś w błąd - raczej chęć pomocy, gdy samemu nie jest się pewnym rozwiązania. Przynajmniej taką mam nadzieję, bo chyba nikt celowo nie udzielałby złej odpowiedzi. Dlatego zachęcam do korzystania z odpowiednich reakcji (również tych negatywnych) - w końcu służą one do oceniania poszczególnych wiadomości.

Link do komentarza
Share on other sites

Gość

Sorry za te stałe czy zmienne.

21 godzin temu, daniel89 napisał:

const char startOfNumberDelimiter = '<';    // przypisanie stałego znaku '<' na nazwkę -> startOfNumberDelimiter
const char endOfNumberDelimiter = '>';		// przypisanie stałego znaku '>' na nazwkę -> endOfNumberDelimiter

// od teraz wprowadzając znak z kalwiatury '<' lub '>' w programie ten znak będzie miał nazwę , którą sobie programista wykorzystuje w kodzie. Nazwał sobię je jako początek ogranicznika liczby oraz koniec ogranicznika.

i to nie są w tym przypadku zmienne tylko stałe .

Chodziło mi o to samo, tylko @daniel89 lepiej to ujął.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.