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.
// Электронное управление селектором режимов вариатора 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);
}