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

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
  }

 

  • Nie zgadzam się! 1
  • Pomogłeś! 1
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

2 godziny temu, aerograf7 napisał:

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

 

Nie lepiej napisać swój program

Jak się nie znasz to po co takie głupoty pisać ? Gdzie w tym kodzie widzisz sprawdzanie jakiegoś PWMa ? Ale z pisaniem własnego programu masz 100% racje !

2 godziny temu, macizet napisał:

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
  }

 

Powiedziałbym, że przechowuje znak ale mniejsza o to. Co ma wspólnego znak w zmiennej ze znakiem-operatorem porównania ? Co ma to wspólnego z problemem kolegi. I dla czego ta odpowiedź ma w ogóle reakcje pozytywną ? 

 

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.

  • Lubię! 2
Link do komentarza
Share on other sites

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

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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.