Pololu Robotics & Electronics
Menu
My account Comments or questions? About Pololu Contact Ordering information Distributors

Pololu Forum

You need to know the position of the linear actuator (JRK 21V3)

Hi, I don’t know Arduino, just studying. Help me please. I need to know the position of the drive in the program in order to perform actions at a certain position of the drive. data must be removed from the linear actuator sensor. installed board JRK 21V3. Need code in the program. Sorry, I’m using a translator.
There is a lot of garbage in the program, while I’m finalizing it
Sample code operation algorithm:
If the drive is in position X, then you must perform this action in the output.

Video project

 // Электронное управление селектором режимов вариатора Mitsubishi Outlander III
#include <SoftwareSerial.h>
#define rxPin 3 // pin 3 connects to SMC TX 
#define txPin 4 // pin 4 connects to SMC RX
#define resetPin 5 // pin 5 connects to SMC nRST
#define errPin 6   // pin 6 connects to SMC ERR
SoftwareSerial smcSerial = SoftwareSerial(rxPin, txPin);

// some variable IDs
#define ERROR_STATUS 0

// define our stop points (определяем точки остановки привода)
#define pos1 2500 // Move P
#define pos2 2227 // Move R
#define pos3 2116 // Move N
#define pos4 2017 // Move D
#define pos5 1942 // Move L

int currentPos = 1;
int sensor1=A10;   // переменная для хранения считываемого значения
int sensor2=A11;
int sensor3=A12;
int sensor4=A13;
int P;
int R;
int N;
int D;
int L;

int flaga=0; // Переменная для левой кнопки DS (SPORT)
int flagb=0; // Переменная для правой кнопки резервная 
int flagp=0; // Переменная для  кнопки P(Parking)

void setup() {
  Serial.begin(9600);    // for debugging (optional) Параметры порта
  smcSerial.begin(9600);
  
  //On first power move the selected value. (При первом включении переместить в  выбранное значение Parking.)
  //changePosition(currentPos);

  // clear the safe-start violation and let the motor run (очистить ошибки безопасного запуска и дать двигателю работать)
  exitSafeStart();

  pinMode(9, OUTPUT);     // реле К1 Режим Ds (SPORT)
  pinMode(10, OUTPUT);    // реле К2 РЕЗЕРВ
  pinMode(11, OUTPUT);    // реле К3 реле блокировки селектора
  pinMode(12, OUTPUT);    // реле К4 реле P(Parking)
  
  pinMode(19, INPUT);     // Сигнал нажатия педали тормоза, снятие блокировки на включение режимов,
  pinMode(20, INPUT);     // Режим Ds (SPORT)
  pinMode(22, INPUT);     // Move P(Parking)
  pinMode(23, INPUT);     //реле блокировки селектора
  pinMode(24, OUTPUT);    // Индикатор на кнопке P(Parking)
 
  pinMode(26, OUTPUT);    // Индикатор R
  pinMode(27, OUTPUT);    // Индикатор N
  pinMode(28, OUTPUT);    // Индикатор D
  pinMode(29, OUTPUT);    // Индикатор L
  
  digitalWrite(9, HIGH);   // реле К1 режим DS на релейный модуль по умолчаню подается 1 
  digitalWrite(10, HIGH);  // реле К2 РЕЗЕРВ
  digitalWrite(11, LOW);   // реле К3 реле блокировки селектора
  digitalWrite(12, HIGH);  // реле K4 P(Parking) на реле состояние положения Р реле К4 при положении Паркинг контакты разорваны
  digitalWrite(24, HIGH);  // Индикатор P(Parking), при включении зажигания индикатор горит
}

void loop() {
 // для снятия показания с джойстика, настройка Выводим результат в единицах
   //Serial.println(analogRead(A10));
   //Serial.println(analogRead(A11));
   //Serial.println(analogRead(A12));
   //Serial.println(analogRead(A13));
     
    R = analogRead(sensor1);
    N = analogRead(sensor2);
    D = analogRead(sensor3);
    L = analogRead(sensor4);

 // управление левой кнопкой селектора режим DS  
     if(digitalRead(20)==HIGH && digitalRead(23)==LOW && flaga==0)//если кнопка нажата    
     // и перемення flag равна 0 , то ... 
     { 
       digitalWrite(9,!digitalRead(9)); 
       flaga=1; 
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
        
     } 
      if(digitalRead(20)==LOW&&flaga==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
      flaga=0;//обнуляем переменную для  кнопки P(Parking) 
     } 
// управление правой кнопкой селектора резервная
     if(digitalRead(21)==HIGH&&flagb==0)
     { 
      digitalWrite(10,!digitalRead(10)); 
      flagb=1; 
     } 
      if(digitalRead(21)==LOW&&flagb==1)
     { 
      flagb=0;//обнуляем переменную для правой кнопки Резервная
     } 
 //place actuator in position 7 (установить привод в положение 7 "Move P"), нажать педаль тормоза.
        
        if(digitalRead(22)==HIGH&&flagp==0)
        
     {
      digitalWrite(9, HIGH); // выключаем режим Ds
      digitalWrite(11,!digitalRead(11)); // включаем и выключаем реле К3 реле блокировки селектора
      digitalWrite(12,!digitalRead(12)); // включаем и выключаем реле K4 P(Parking)
      digitalWrite(24,!digitalRead(24)); // включаем и выключаем индикатор на кнопке P(Parking)
                                              digitalWrite(26, LOW);  // Индикатор R
                                              digitalWrite(27, LOW);  // Индикатор N
                                              digitalWrite(28, LOW);  // Индикатор D
                                              digitalWrite(29, LOW);  // Индикатор L
       
      flagp=1; // Переменная для  кнопки P(Parking)
      flaga=0; // Переменная для левой кнопки DS (SPORT)
     } 
      if(digitalRead(22)==LOW&&flagp==1)
     { 
        flagp=0; //обнуляем переменную для  кнопки P(Parking)
         //  Serial.println("Move P");
          currentPos = 1;
          changePosition(currentPos);
          delay(500);
        }
 //place actuator in position 6 (установить привод в положение 6 "Move R")
        
        if ((digitalRead(23)==LOW && R >= 220 && R <= 280)&&(N >= 810 && N <= 890)&&(D == 1023)&&(L == 1023)) 
       { 
         // Serial.println("Move R");     //Напечатать в монитор порта("Move R")
                                              digitalWrite(26, HIGH);  // Индикатор R
                                              digitalWrite(27, LOW);   // Индикатор N
                                              digitalWrite(28, LOW);   // Индикатор D
                                              digitalWrite(29, LOW);   // Индикатор L
          currentPos = 2;               //Текущая позиция = 2
          changePosition(currentPos);   // Изменить положение(Текущая позиция)
          delay(1500);                  //Задержка(2500)
        }
        
 //place actuator in position 5 (установить привод в положение 3 "Move N")
        if ((digitalRead(23)==LOW && R >= 500 && R <= 580)&&(N >= 500 && N <= 580)&&(D == 1023)&&(L == 1023))
         {
         //  Serial.println("Move N");
                                              digitalWrite(26, LOW);   // Индикатор R
                                              digitalWrite(27, HIGH);  // Индикатор N
                                              digitalWrite(28, LOW);   // Индикатор D
                                              digitalWrite(29, LOW);   // Индикатор L         
         currentPos = 3;
         changePosition(currentPos);
         delay(100);
        }
        
 //place actuator in position 4 (установить привод в положение 4 "Drive")
 // Если на входе присутствуют эти значения, переводим селектор в положение Drive
        if ((digitalRead(23)==LOW && R >= 810 && R <= 890)&&(N >= 220 && N <= 280)&&(D == 1023)&&(L == 1023)) 
        {
          // Serial.println("Move D");
                                              digitalWrite(26, LOW);   // Индикатор R
                                              digitalWrite(27, LOW);   // Индикатор N
                                              digitalWrite(28, HIGH);  // Индикатор D
                                              digitalWrite(29, LOW);   // Индикатор L
          currentPos = 4;
          changePosition(currentPos);
          delay(1500);
        }
 //place actuator in position 3 (установить привод в положение 3 "Move L" )
        if ((digitalRead(23)==LOW && R >= 810 && R <= 890)&&(N >= 220 && N <= 280)&&(D == 0)&&(L == 0))
        {
         // Serial.println("Move L");
                                              digitalWrite(26, LOW);   // Индикатор R
                                              digitalWrite(27, LOW);   // Индикатор N
                                              digitalWrite(28, LOW);   // Индикатор D
                                              digitalWrite(29, HIGH);  // Индикатор L         
                       //  digitalWrite(12, HIGH);  // выключаем реле K4 P(Parking)для атоматического отключения СТороза
                       //  flagp=0;                 //обнуляем переменную для  кнопки P(Parking)
          currentPos = 5;
          changePosition(currentPos);
          delay(100);
          }
    
 //check for any errors on the error pin.(проверить наличие ошибок на контакте ошибки.)
  if (digitalRead(errPin) == HIGH)
  {
    Serial.print("Error Status: 0x");
    Serial.println(getVariable(ERROR_STATUS), HEX);
    // once all other errors have been fixed,
    // this lets the motors run again
    exitSafeStart();
  } 
}

//moveMotor based on number.
void changePosition(int positionNum) {
 switch (positionNum) {
   case 1:
     moveMotor(pos1);
     break;
   case 2:
     moveMotor(pos2);
     break;
   case 3:
     moveMotor(pos3);
     break;
   case 4:
     moveMotor(pos4);
     break;
   case 5:
     moveMotor(pos5);
     break;
  
  }
   
}

// returns the specified variable as an unsigned integer.
// if the requested variable is signed, the value returned by this function
// should be typecast as an int.
unsigned int getVariable(unsigned char variableID){
  smcSerial.write(0xA1);
  smcSerial.write(variableID);
  return readByte() + 256 * readByte();
}

// required to allow motors to move
// must be called when controller restarts and after any error
// требуется, чтобы двигатели двигались, должен быть вызван при 
// перезапуске контроллера и после любой ошибки
void exitSafeStart(){
  smcSerial.write(0x83);
}

// read a serial byte (returns -1 if nothing received after the timeout expires)
// читать последовательный байт (возвращает -1, если ничего не получено после истечения времени ожидания)
int readByte(){
  char c;
  if(smcSerial.readBytes(&c, 1) == 0){ return -1; }
  return (byte)c;
}

//Move the actuator to a target value (Переместить привод в положение по умолчанию) 
void moveMotor(int motorTarget) {
  word target = motorTarget;
  smcSerial.write(0xAA);
  smcSerial.write(0x0B);
  smcSerial.write(0xC0 + (target & 0x1F));
  smcSerial.write((target >> 5) & 0x7F);
  Serial.println(motorTarget);
}

Hello.

You can read several variables, including the raw and scaled feedback values, from the Jrk using the read variable serial commands explained in the “Variable Reading Commands” section of the Jrk user’s guide. We do not have any examples for the Arduino (if you do not already know), but you might find it helpful to look at the example code under the “Serial Example Code” section of the Jrk user’s guide.

By the way, I looked at your code and noticed that you are mostly using the Arduino sample code for the Simple Motor Controller (SMC) from its user’s guide under the “Arduino Examples” section. Instead of modifying the SMC example, I suggest starting a new sketch so that you can look at the SMC example code for reference without having to mix SMC commands with the Jrk commands. Also, since you are not familiar with the Arduino syntax, I strongly recommend looking at the Language Reference page on the official Arduino website to better understand the code before moving forward with your project.

- Amanda

Thanks for answering. I carefully read your message, but the fact is that I know English very poorly and basically worked with examples of other users’ programs. Could you show me a simple example of reading data and displaying them in the terminal of the Arduino program.

You can look at the SerialGetFeedback example code here in the Jrk G2 library for Arduino. Although the example was written for the Jrk G2, it uses a single command to read the variables that is compatible with the original Jrks.

- Amanda