FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Пятница, 09.12.2016, 02:57
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: support, Сергей 
Форум » Основной » Спросить у знатоков » радио управление (радио управление arduino+nrf24l01+драйвер двигателей L298n)
радио управление
jet-belan
Дата: Понедельник, 13.06.2016, 08:03 | Сообщение # 1
Сержант
Группа: Проверенные
Сообщений: 46
Награды: 0
Репутация: 1
Статус: Offline
Дорогие друзья, если у кого то найдется время, не могли бы вы показать как ниже указанный код выглядит в проекте 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
 
jet-belan Дата: Вторник, 14.06.2016, 11:57 | Сообщение # 2
Сержант
Группа: Проверенные
Сообщений: 46
Награды: 0
Репутация: 1
Статус: Offline
хочу сделать такую схему

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

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

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

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

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

Добавлено (14.06.2016, 11:57)
---------------------------------------------
мне бы хотя бы на один двигатель))

Прикрепления: 5369133.jpg(178Kb)
 
Олег Дата: Вторник, 14.06.2016, 12:26 | Сообщение # 3
Гуру
Группа: Проверенные
Сообщений: 730
Награды: 20
Репутация: 15
Статус: Offline
Не много форумчан разбираются в коде, хотите получить помощь быстрее опишите подробно алгоритм работы.
 
jet-belan Дата: Вторник, 14.06.2016, 22:09 | Сообщение # 4
Сержант
Группа: Проверенные
Сообщений: 46
Награды: 0
Репутация: 1
Статус: Offline
входы драйвера мотора

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 Дата: Вторник, 14.06.2016, 23:20 | Сообщение # 5
Сержант
Группа: Проверенные
Сообщений: 46
Награды: 0
Репутация: 1
Статус: Offline
попробовал собрать без радио модуля,
получился такой код:

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

Прикрепления: 2737503.png(20Kb) · 3044902.png(11Kb) · 7519062.png(12Kb)
 
OlegAn1962 Дата: Среда, 15.06.2016, 03:22 | Сообщение # 6
Майор
Группа: Проверенные
Сообщений: 120
Награды: 0
Репутация: 0
Статус: Offline
Попробуйте на блоки Scale сигнал подать через демультиплексор. Или, еще проще, сигнал на D5 выводить через блок нелинейного масштабирования.

Прикрепления: 9025704.png(27Kb)


Сообщение отредактировал OlegAn1962 - Среда, 15.06.2016, 03:37
 
jet-belan Дата: Среда, 15.06.2016, 07:56 | Сообщение # 7
Сержант
Группа: Проверенные
Сообщений: 46
Награды: 0
Репутация: 1
Статус: Offline
спасибо! сейчас попробую
 
jet-belan Дата: Среда, 15.06.2016, 08:17 | Сообщение # 8
Сержант
Группа: Проверенные
Сообщений: 46
Награды: 0
Репутация: 1
Статус: Offline
первый вариант не пробовал, а вот второй получился в идеале!
огромная благодарность!

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

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

Код
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[i]) {
      result.minIndex = i;
    }
    if (array [result.maxIndex] < array[i]) {
      result.maxIndex = i;
    }
  }
  for ( i = 0; i < arraySize; i++)
  {if ((array  [i]>= value) && (array [result.maxIndex] > array[i])) {
      result.maxIndex = i;
    }
  }
 if (result.maxIndex==0){ result.minIndex = 0; result.maxIndex=1;} else { result.minIndex = result.maxIndex -1;}
  return result;

  return result;

}


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

Прикрепления: 2990052.png(62Kb)


Сообщение отредактировал jet-belan - Среда, 15.06.2016, 08:20
 
jet-belan Дата: Четверг, 16.06.2016, 11:19 | Сообщение # 9
Сержант
Группа: Проверенные
Сообщений: 46
Награды: 0
Репутация: 1
Статус: Offline
Появились вопросы... 

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


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


Или нужно, что то ещё делать с блоками приёма и передачи радио модулей nrf24l01.
Блоки сейчас настроены по умолчанию.
Прикрепления: 0027495.png(16Kb) · 3501396.png(26Kb)
 
Max Дата: Четверг, 16.06.2016, 11:48 | Сообщение # 10
Гуру
Группа: Проверенные
Сообщений: 484
Награды: 14
Репутация: 4
Статус: Offline
Цитата jet-belan ()
Достаточно ли такой схемы для передачи

Можно попробовать, хотя можно и блоки Scale разместить в передатчике и далее в блок... Вообще, я сторонник создания переменной.


Максим (VK - Максим Дунаевский)

Сообщение отредактировал Max - Четверг, 16.06.2016, 11:49
 
jet-belan Дата: Четверг, 16.06.2016, 20:38 | Сообщение # 11
Сержант
Группа: Проверенные
Сообщений: 46
Награды: 0
Репутация: 1
Статус: Offline
Если можно, по подробнее на счет переменных) как и где именно?
 
Max Дата: Четверг, 16.06.2016, 21:05 | Сообщение # 12
Гуру
Группа: Проверенные
Сообщений: 484
Награды: 14
Репутация: 4
Статус: Offline
Цитата jet-belan ()
Если можно, по подробнее на счет переменных) как и где именно?
С аналоговых входов А0 и А1 на блок SCALE потом создаете переменные (допустим Analog1 и Analog2) и загоняете туда, а потом переменные на вход блока передатчика NRF.
Прикрепления: 9290124.jpg(37Kb)


Максим (VK - Максим Дунаевский)
 
jet-belan Дата: Четверг, 16.06.2016, 23:07 | Сообщение # 13
Сержант
Группа: Проверенные
Сообщений: 46
Награды: 0
Репутация: 1
Статус: Offline
Понял, спасибо!

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

 
Max Дата: Пятница, 17.06.2016, 07:18 | Сообщение # 14
Гуру
Группа: Проверенные
Сообщений: 484
Награды: 14
Репутация: 4
Статус: Offline
Цитата jet-belan ()
Кстати, а в чём прелесть переменной?
Вы вообще свою тему начинали с кода. Я понимаю, что он не Ваш, но без переменных он бы просто не работал.
Переменная это некое значение (цифра, например), а вообще правильней - ячейка памяти. Заведя переменную, Вы можете её использовать в любом месте кода по своему усмотрению и согласно правил С.
Более развернуто тут и тут.


Максим (VK - Максим Дунаевский)
 
jet-belan Дата: Пятница, 17.06.2016, 18:08 | Сообщение # 15
Сержант
Группа: Проверенные
Сообщений: 46
Награды: 0
Репутация: 1
Статус: Offline
Сделал вот так:


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

Добавлено (17.06.2016, 18:08)
---------------------------------------------
Если ошибаюсь, то как глубоко? пожалуйста поправьте)
Прикрепления: 8162615.png(29Kb)


Сообщение отредактировал jet-belan - Пятница, 17.06.2016, 18:11
 
Форум » Основной » Спросить у знатоков » радио управление (радио управление arduino+nrf24l01+драйвер двигателей L298n)
Страница 1 из 212»
Поиск:

FLProg © 2016
Яндекс.Метрика