Проблеммы с работой кода на ардуино

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
virf
Прорезались зубы
Сообщения: 225
Зарегистрирован: Пн авг 29, 2011 22:08:13
Откуда: запорожье

Проблеммы с работой кода на ардуино

Сообщение virf »

Даже не знаю в какую ветку обратиться с своим вопросом (если не туда попал перенесите пожалуйста)
Программирование начал осваивать только пару месяцев назад - по этому сильно не пинайте (до этого не где не учил и мог только чужую прошивку использовать)

В общем к сути. Проект по радиоуправляемому танку, написал код а добиться его полноценной работоспособности не могу.
Вот это у меня в передатчике
Спойлер#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
int msg[2];
const int joystick_L = A0;
const int joystick_R = A1;
const uint64_t pipe = 0xF0F1F2F3F4LL;
RF24 radio(9, 10);

void setup(){
pinMode(joystick_L, INPUT);
pinMode(joystick_R, INPUT);
Serial.begin(9600);

radio.begin();
delay(2);
radio.setChannel(9); // канал (0-127)
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_HIGH);
radio.openWritingPipe(pipe);
}
void loop(){
int L = analogRead(joystick_L);
msg[0] = map(L, 0, 1023, 0, 510);
int R = analogRead(joystick_R);
msg[1] = map(R, 0, 1023, 0, 510);

radio.write(&msg, sizeof(msg));
Serial.println(msg[1]);
Serial.print("msg[1]: ");
Serial.println(msg[0]);
Serial.print("msg[0]: ");
}
А вот это в приемнике
Спойлер#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
const uint64_t pipe = 0xF0F1F2F3F4LL;
RF24 radio(9, 10);
int msg[2];
const int Motor_R1 = 3;
const int Motor_R2 = 4;
const int Motor_L1 = 7;
const int Motor_L2 = 8;
const int ENL = 5;
const int ENR = 6;
int R;
int R1;
int L;
int L1;

void setup(){
Serial.begin(9600);
pinMode(Motor_R1, OUTPUT);
pinMode(Motor_R2, OUTPUT);
pinMode(Motor_L1, OUTPUT);
pinMode(Motor_L2, OUTPUT);
pinMode(ENR, OUTPUT);
pinMode(ENL, OUTPUT);
delay(50);
radio.begin();
radio.setChannel(9);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_HIGH);
radio.openReadingPipe(1,pipe);
radio.startListening();
}
void loop() {
if (radio.available()){
radio.read(&msg, sizeof(msg)); }

Serial.println(msg[0]);
Serial.print("msg[0]: ");
Serial.println(msg[1]);
Serial.print("msg[1]: ");

if (msg[1] < 255) {
R = map(msg[1], 254, 0, 1, 255);
digitalWrite(Motor_R1, LOW);
digitalWrite(Motor_R2, HIGH);
analogWrite(ENR, R);}
if (msg[1] > 255) {
R1 = map(msg[1], 256, 510, 1, 255);
digitalWrite(Motor_R1, HIGH);
digitalWrite(Motor_R2, LOW);
analogWrite(ENR, R1);}
if (msg[0] < 255) {
L = map(msg[0], 254, 0, 1, 255);
digitalWrite(Motor_L1, LOW);
digitalWrite(Motor_L2, HIGH);
analogWrite(ENL, L);}
if (msg[0] > 255) {
L1 = map(msg[0], 256, 510, 1, 255);
digitalWrite(Motor_L1, HIGH);
digitalWrite(Motor_L2, LOW);
analogWrite(ENL, L1);}
delay(50);
}
Это все конечно полная каша, сам понимаю. Моих знаний на данный момент хватило только на это.
Но не работает только один нюанс - реверс двигателей срабатывает только если оба значения msg[0] и msg[1] больше 255
а вот если только одно значение больше - двигатель крут вопреки команде, хотя при этом шим отрабатывает как и задумывалось.
Уже третий день пытаюсь понять где я допустил ошибку, ведь если при условии msg[0] > 255 исполняется команда подать шим то почему игнорируются команды digitalWrite.
Мозги закипели уже к середине второго дня :facepalm: сколько раз переписывал код даже не припомню, этот вариант хотя бы подает признаки жизни...
Профессиональный барабанщик легко стряхивает градусник до -12 по Цельсию.
Реклама
Аватара пользователя
diafour
Встал на лапы
Сообщения: 109
Зарегистрирован: Пн янв 26, 2015 07:48:56
Откуда: Москва, Троицк

Re: Проблеммы с работой кода на ардуино

Сообщение diafour »

Железо или Proteus? Что между ардуинкой и мотором стоит?
Реклама
Аватара пользователя
virf
Прорезались зубы
Сообщения: 225
Зарегистрирован: Пн авг 29, 2011 22:08:13
Откуда: запорожье

Re: Проблеммы с работой кода на ардуино

Сообщение virf »

Железо, драйвер l298.
Сейчас пришла идея посмотреть какие все таки команды я даю на двигатель,
вывел в монитор порта значения - Motor_R1 всегда 1 и только когда msg[1] и msg[0] меньше 255 подается 0
то есть косяк точно в программе.
СпойлерТо что красное работает только если достигаются оба условия msg[1] < 255 и msg[0] < 255
То что синее в мониторе порта непонятные глюки но на железе работает так как задумывалось
То что зеленым работает ок
if (msg[1] < 255) {
R = map(msg[1], 254, 0, 1, 255);
digitalWrite(Motor_R1, LOW);
digitalWrite(Motor_R2, HIGH);

analogWrite(ENR, R);}
if (msg[1] > 255) {
R1 = map(msg[1], 256, 510, 1, 255);
digitalWrite(Motor_R1, HIGH);
digitalWrite(Motor_R2, LOW);

analogWrite(ENR, R1);}
if (msg[0] < 255) {
L = map(msg[0], 254, 0, 1, 255);
digitalWrite(Motor_L1, LOW);
digitalWrite(Motor_L2, HIGH);

analogWrite(ENL, L);}
if (msg[0] > 255) {
L1 = map(msg[0], 256, 510, 1, 255);
digitalWrite(Motor_L1, HIGH);
digitalWrite(Motor_L2, LOW);

analogWrite(ENL, L1);}

P.S. Если убрать шим и соответственно перенос значений (то есть команду map) то все работает.
Но вот как писать что бы работало с использованием шима не пойму.
Профессиональный барабанщик легко стряхивает градусник до -12 по Цельсию.
Аватара пользователя
virf
Прорезались зубы
Сообщения: 225
Зарегистрирован: Пн авг 29, 2011 22:08:13
Откуда: запорожье

Re: Проблеммы с работой кода на ардуино

Сообщение virf »

Вот же я дурак, оказывается просто шим не туда подавал. В общем как всегда все проблемы из за мелкой ошибки.
Зато пока по сто раз переписывал код выучил несколько новых команд и различные нюансы в написании кода.
Профессиональный барабанщик легко стряхивает градусник до -12 по Цельсию.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «Разные вопросы по МК»