радио управление

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#1

Сообщение jet-belan » 13.06.2016{, 08:03}

Дорогие друзья, если у кого то найдется время, не могли бы вы показать как ниже указанный код выглядит в проекте flprog. Я просто не могу понять и реализовать последовательность действий..

передатчик

#include <SPI.h>
#include "RF24.h"
RF24 radio(2,3);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int msg[1];
int potpin_1 = A0;
int val_1;
int potpin_2 = A1;
int val_2;

void setup(void){
radio.begin();
radio.openWritingPipe(pipe);

}
void loop() {
val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[0] = val_1,radio.write(msg, 1);
val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 255),msg[0] = val_2,radio.write(msg, 1);

}

Добавлено (13.06.2016, 07:47)
---------------------------------------------
приёмник

// Необходимо установить библиотеку для радиомодуля nRF24
#include <Servo.h>
#include <SPI.h>
#include "RF24.h"
Servo servo1;

RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int msg[1];
int data;
int pos;
int fspeed; // forward speed
int bspeed; // backward speed
const int in1 = 2; // direction pin 1
const int in2 = 4; // direction pin 2
const int ena = 5; // PWM pin to change speed

void setup()
{

pinMode(in1, OUTPUT); // connection to L298n
pinMode(in2, OUTPUT); // connection to L298n
pinMode(ena, OUTPUT); // connection to L298n
servo1.attach(3);
delay(50);
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
}

void loop()
{
if (radio.available())radio.read(msg, 1);
if (msg[0] <127 && msg[0] >-1)data = msg[0], pos = map(data, 0, 126, 7, 55),servo1.write(pos);

if (msg[0] >=128 && msg[0] <=189)data = msg[0], bspeed = map(data, 255, 201, 0, 255), backward(bspeed);
if (msg[0] >=201 && msg[0] <=255)data = msg[0], fspeed = map(data, 189, 128, 0, 255),
forward(fspeed);
if (msg[0] >190 && msg[0] <200)data = msg[0], stop();
}

void stop()
{

analogWrite(ena, 0);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}

void forward(int fspeed)
{

digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(ena, fspeed);
}

void backward(int bspeed)
{

digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(ena, bspeed);
}

Добавлено (13.06.2016, 08:00)
---------------------------------------------
в общем это машинка на радио управлении. с передатчиком всё более менее ясно, а вот с приёмником не очень. Не могу сообразить как сваять логику приёмника так чтоб в зависимости от положения аналогово джойстика двигатель крутился вперёд или назад с ускорением от точки покоя

Добавлено (13.06.2016, 08:03)
---------------------------------------------
просто хочу переделать скетч под моторную лодку с двумя моторами. при остановке или реверсе одного мотора лодка поворачивает в его сторону
Последний раз редактировалось jet-belan 13.06.2016{, 07:52}, всего редактировалось 1 раз.

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#2

Сообщение jet-belan » 14.06.2016{, 11:57}

хочу сделать такую схему

распиновка такова

первый мотор:

en1        ШИМ     -управляет скоростью
in1        1 или 0 
in2        1 или 0  -управляют направлением. если на обоих 0 то двигатель стоит

второй мотор:

en2        ШИМ     -управляет скоростью
in3        1 или 0
in4        1 или 0  -управляют направлением. если на обоих 0 то двигатель стоит

Добавлено (14.06.2016, 11:57)
---------------------------------------------
мне бы хотя бы на один двигатель))
Для скачивания вложений Вы должны быть зарегистрированы.

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 62
Контактная информация:

радио управление

#3

Сообщение Олег » 14.06.2016{, 12:26}

Не много форумчан разбираются в коде, хотите получить помощь быстрее опишите подробно алгоритм работы.

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#4

Сообщение jet-belan » 14.06.2016{, 22:09}

входы драйвера мотора

EN          ШИМ     -управляет скоростью
IN 1        1 или 0 
IN 2        1 или 0  -управляют направлением. если на обоих 0 то двигатель стоит

итак:
с пульта передается аналоговый сигнал
джойстика
от 0 до 255

приёмник принимает сигнал и дальше идет такая тема:

джойстик в состоянии покоя выдает 
число примерно в 127-129 единиц
в это время мотор должен "стоять"
и чтоб состояние покоя мотора было стабильным, (я думаю) нужно диапазон этого покоя увеличить
примерно вот так:
123-132
в это время на входах драйвера
EN   - ноль
IN 1 - ноль
IN 2 - ноль

когда джойстик сдвигаешь вверх, то при выдачи сигнала от 133 до 255 на EN подается
"сигнал" от 0 до 255, тем самым регулируя скорость

в это время на IN 1 подается 1, а на IN 2 подается 0 от этого двигатель вращается условно по часовой стрелке

когда джойстик сдвигаешь вниз, то при выдачи сигнала от 122 до 0 на EN подается
"сигнал" от 0 до 255, тем самым регулируя скорость

в это время на IN 1 подается 0, а на IN 2 подается 1 и от этого двигатель вращается против часовой стрелки

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#5

Сообщение jet-belan » 14.06.2016{, 23:20}

попробовал собрать без радио модуля,
получился такой код:

void setup()
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);

}
void loop()
{

analogWrite(5, (map(((map(( (analogRead (0))), (0), (1023), (0), (255)))), (136), (255), (0), (255))));
analogWrite(5, (map(((map(( (analogRead (0))), (0), (1023), (0), (255)))), (120), (0), (0), (255))));
digitalWrite(2, (135) <= ((map(( (analogRead (0))), (0), (1023), (0), (255)))));
digitalWrite(3, (120) >= ((map(( (analogRead (0))), (0), (1023), (0), (255)))));

}

вперед крутит отлично, плавно разгоняется скорость с нуля, вот скриншот масштабирования
скорости вперёд:



а назад есть проблемка... Когда джойстик тянешь вниз, мотор начинает крутиться на средних оборотах, плавно снижает скорость, а ближе к концу выходит на максимум.
вот скриншот масштабирования скорости назад:



подскажите пожалуйста, что может быть у меня не так? что то я явно не учёл..

Добавлено (14.06.2016, 23:20)
---------------------------------------------
D5 это ШИМ на EN
D2 это цифровые IN 1
D3 это цифровые IN 2
Для скачивания вложений Вы должны быть зарегистрированы.

OlegAn1962
Лейтенант
Сообщения: 361
Зарегистрирован: 07.09.2015{, 23:53}
Репутация: 0

радио управление

#6

Сообщение OlegAn1962 » 15.06.2016{, 03:22}

Попробуйте на блоки Scale сигнал подать через демультиплексор. Или, еще проще, сигнал на D5 выводить через блок нелинейного масштабирования.

Для скачивания вложений Вы должны быть зарегистрированы.
Последний раз редактировалось OlegAn1962 15.06.2016{, 03:37}, всего редактировалось 1 раз.

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#7

Сообщение jet-belan » 15.06.2016{, 07:56}

спасибо! сейчас попробую

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#8

Сообщение jet-belan » 15.06.2016{, 08:17}

первый вариант не пробовал, а вот второй получился в идеале!
огромная благодарность!

код получился всего лишь чуть больше:

вперёд, назад с ускорением

Код200?'200px':''+(this.scrollHeight+5)+'px');">struct _poligonInexes
{
  int minIndex;
  int maxIndex;
}; 
int _Poligon_InArray_1[4] = {0, 120, 136, 255};
int _Poligon_OutArray_1[4] = {255, 0, 0, 255};
void setup()
{
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);

}
void loop()
{

analogWrite(5, (_poligon(((map(( (analogRead (0))), (0), (1023), (0), (255)))), _Poligon_InArray_1, _Poligon_OutArray_1, 4)));
digitalWrite(2, (135) <= ((map(( (analogRead (0))), (0), (1023), (0), (255)))));
digitalWrite(3, (120) >= ((map(( (analogRead (0))), (0), (1023), (0), (255)))));

}
int _poligon(int value, int intArray[], int outArray[], int arraySize)
{
  struct  _poligonInexes indexes;
  indexes = _getPoligonIndexes(value, intArray, arraySize);
  return map(value, intArray[indexes.minIndex], intArray[indexes.maxIndex], outArray[indexes.minIndex], outArray[indexes.maxIndex]);
}
struct  _poligonInexes _getPoligonIndexes(int value, int array[], int arraySize)
{
  struct  _poligonInexes result;
  int i;
  result.minIndex = 0;
  result.maxIndex = 0;
  for ( i = 0; i < arraySize; i++) {
    if (array [result.minIndex] > array) {
      result.minIndex = i;
    }
    if (array [result.maxIndex] < array) {
      result.maxIndex = i;
    }
  }
  for ( i = 0; i < arraySize; i++)
  {if ((array  >= value) && (array [result.maxIndex] > array)) {
      result.maxIndex = i;
    }
  }
 if (result.maxIndex==0){ result.minIndex = 0; result.maxIndex=1;} else { result.minIndex = result.maxIndex -1;}
  return result;

  return result;

}

а вот и блоки для тех кому может быть интересно:

Для скачивания вложений Вы должны быть зарегистрированы.
Последний раз редактировалось jet-belan 15.06.2016{, 08:20}, всего редактировалось 1 раз.

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#9

Сообщение jet-belan » 16.06.2016{, 11:19}

Появились вопросы... 

Достаточно ли такой схемы для передачи:


и такой для приёма:


Или нужно, что то ещё делать с блоками приёма и передачи радио модулей nrf24l01.
Блоки сейчас настроены по умолчанию.
Для скачивания вложений Вы должны быть зарегистрированы.

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

радио управление

#10

Сообщение Max » 16.06.2016{, 11:48}

jet-belan писал(а):Достаточно ли такой схемы для передачи
Можно попробовать, хотя можно и блоки Scale разместить в передатчике и далее в блок... Вообще, я сторонник создания переменной.
Последний раз редактировалось Max 16.06.2016{, 11:49}, всего редактировалось 1 раз.

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#11

Сообщение jet-belan » 16.06.2016{, 20:38}

Если можно, по подробнее на счет переменных) как и где именно?

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

радио управление

#12

Сообщение Max » 16.06.2016{, 21:05}

Цитата jet-belan ()200?'200px':''+(this.scrollHeight+5)+'px');">Если можно, по подробнее на счет переменных) как и где именно?С аналоговых входов А0 и А1 на блок SCALE потом создаете переменные (допустим Analog1 и Analog2) и загоняете туда, а потом переменные на вход блока передатчика NRF.
Для скачивания вложений Вы должны быть зарегистрированы.

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#13

Сообщение jet-belan » 16.06.2016{, 23:07}

Понял, спасибо!

Добавлено (16.06.2016, 23:07)
---------------------------------------------
Кстати, а в чём прелесть переменной? Если из блока SCALE уже выходит 255 единиц в зависимости от положения джойстика. Я просто ещё мало в чем разбираюсь))

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

радио управление

#14

Сообщение Max » 17.06.2016{, 07:18}

jet-belan писал(а):Кстати, а в чём прелесть переменной?
Вы вообще свою тему начинали с кода. Я понимаю, что он не Ваш, но без переменных он бы просто не работал.
Переменная это некое значение (цифра, например), а вообще правильней - ячейка памяти. Заведя переменную, Вы можете её использовать в любом месте кода по своему усмотрению и согласно правил С.
Более развернуто тут и тут.

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#15

Сообщение jet-belan » 17.06.2016{, 18:08}

Сделал вот так:


Как я понял, один из плюсов в моём случае тот, что переменная даст возможность при включении иметь данные по умолчанию. Например Byte 127, чтоб движки стояли при включении модели, передатчика или при отсутствии сигнала... я не ошибаюсь?

Добавлено (17.06.2016, 18:08)
---------------------------------------------
Если ошибаюсь, то как глубоко? пожалуйста поправьте)
Для скачивания вложений Вы должны быть зарегистрированы.
Последний раз редактировалось jet-belan 17.06.2016{, 18:11}, всего редактировалось 1 раз.

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

радио управление

#16

Сообщение Max » 17.06.2016{, 18:47}

jet-belan писал(а):Например Byte 127, чтоб движки стояли при включении модели,
В принципе - да. В этих переменных будет значение входного сигнала, т.е. с потенциометров.

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#17

Сообщение jet-belan » 17.06.2016{, 21:15}

А если их поставить и в приёмник со значением в 127 Byte? Тогда можно избежать случайного вращения двигателей при включении.

Добавлено (17.06.2016, 21:15)
---------------------------------------------
Именно при включении модели без пульта (передатчика).
Так сказать:
Безопасность пользователя превыше всего!
Всё-таки гребные винты - предметы опасные

Аватара пользователя
Max
Лейтенант
Сообщения: 691
Зарегистрирован: 06.09.2015{, 13:12}
Репутация: 5
Откуда: Тюмень-Баку
Имя: Максим

радио управление

#18

Сообщение Max » 17.06.2016{, 21:23}

jet-belan писал(а):Именно при включении модели без пульта (передатчика).Так сказать:
Безопасность пользователя превыше всего!
Всё-таки гребные винты - предметы опасные
Я так понимаю, при потере сигнала надо останавливать вращение? Ну тут мне видится так: вариант с переменной в приемнике связанной с приемом сигнала, так сказать, синхронизации с пульта и в случае потери сигнала переменная в приемнике выключает винты.
Я вообще сторонник макетирования. Надо строить макет на столе и пробовать. Чисто теоретически трудно будет сразу попасть в точку и получить все, что хочется. Так что стройте макет и пробуйте нужный алгоритм.

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#19

Сообщение jet-belan » 20.06.2016{, 22:00}

Да, должна быть остановка при потере сигнала. А то на речке потом не угонишься за лодкой))
На счёт макетирования вы правы! Завтра вечером попробую.
Заказал с дуру с Китая nrf24l01 с микросхемой "каплей", 10 штук. Благо стоили 260 рублей всего. КТО ПРОЧИТАЛ, РЕКОМЕНДУЮ ЗАЛИТУЮ КОМПАУНДОМ МИКРОСХЕМУ НЕ ПОКУПАТЬ. Из них рабочих было штук 6. Остальные просто молчат как партизаны. Ну два я потом сжёг, как водится самолично, вот этими вот руками)) в общем, кто будет брать, берите с корпусными микросхемами

Добавлено (20.06.2016, 21:53)
---------------------------------------------
Ничего не получается с этим блоком под nrf24l01....
Видимо для радио управления он должен быть немного другой...

Добавлено (20.06.2016, 21:57)
---------------------------------------------
Может у кого нибудь получится запустить этот модуль именно в радио управлении

Добавлено (20.06.2016, 21:59)
---------------------------------------------
Без модуля nrf24l01 всё работает... А с ним движки с ходу начинают крутиться и ни на что не реагируют)))

Добавлено (20.06.2016, 22:00)
---------------------------------------------
Именно без блока nrf24

jet-belan
Рядовой
Сообщения: 75
Зарегистрирован: 17.04.2016{, 10:09}
Репутация: 0

радио управление

#20

Сообщение jet-belan » 01.07.2016{, 22:19}

Всё ли правильно сделал с ПБ радио модулей? Поправьте пожалуйста, кто разбирается))
Для скачивания вложений Вы должны быть зарегистрированы.

Ответить

Вернуться в «WiFi»