Страница 1 из 1

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

Добавлено: Вс фев 28, 2016 22:30:38
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: сколько раз переписывал код даже не припомню, этот вариант хотя бы подает признаки жизни...

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

Добавлено: Пн фев 29, 2016 15:19:14
diafour
Железо или Proteus? Что между ардуинкой и мотором стоит?

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

Добавлено: Пн фев 29, 2016 19:36:22
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) то все работает.
Но вот как писать что бы работало с использованием шима не пойму.

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

Добавлено: Чт мар 03, 2016 21:24:56
virf
Вот же я дурак, оказывается просто шим не туда подавал. В общем как всегда все проблемы из за мелкой ошибки.
Зато пока по сто раз переписывал код выучил несколько новых команд и различные нюансы в написании кода.