Страница 1 из 2
радио управление
Добавлено: 13.06.2016{, 08:03}
jet-belan
Дорогие друзья, если у кого то найдется время, не могли бы вы показать как ниже указанный код выглядит в проекте 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)
---------------------------------------------
просто хочу переделать скетч под моторную лодку с двумя моторами. при остановке или реверсе одного мотора лодка поворачивает в его сторону
радио управление
Добавлено: 14.06.2016{, 11:57}
jet-belan
хочу сделать такую схему
распиновка такова
первый мотор:
en1 ШИМ -управляет скоростью
in1 1 или 0
in2 1 или 0 -управляют направлением. если на обоих 0 то двигатель стоит
второй мотор:
en2 ШИМ -управляет скоростью
in3 1 или 0
in4 1 или 0 -управляют направлением. если на обоих 0 то двигатель стоит
Добавлено (14.06.2016, 11:57)
---------------------------------------------
мне бы хотя бы на один двигатель))
радио управление
Добавлено: 14.06.2016{, 12:26}
Олег
Не много форумчан разбираются в коде, хотите получить помощь быстрее опишите подробно алгоритм работы.
радио управление
Добавлено: 14.06.2016{, 22:09}
jet-belan
входы драйвера мотора
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 и от этого двигатель вращается против часовой стрелки
радио управление
Добавлено: 14.06.2016{, 23:20}
jet-belan
попробовал собрать без радио модуля,
получился такой код:
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
радио управление
Добавлено: 15.06.2016{, 03:22}
OlegAn1962
Попробуйте на блоки Scale сигнал подать через демультиплексор. Или, еще проще, сигнал на D5 выводить через блок нелинейного масштабирования.
радио управление
Добавлено: 15.06.2016{, 07:56}
jet-belan
спасибо! сейчас попробую
радио управление
Добавлено: 15.06.2016{, 08:17}
jet-belan
первый вариант не пробовал, а вот второй получился в идеале!
огромная благодарность!
код получился всего лишь чуть больше:
вперёд, назад с ускорением
Код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;
}
а вот и блоки для тех кому может быть интересно:
радио управление
Добавлено: 16.06.2016{, 11:19}
jet-belan
Появились вопросы...
Достаточно ли такой схемы для передачи:
и такой для приёма:
Или нужно, что то ещё делать с блоками приёма и передачи радио модулей nrf24l01.
Блоки сейчас настроены по умолчанию.
радио управление
Добавлено: 16.06.2016{, 11:48}
Max
jet-belan писал(а):Достаточно ли такой схемы для передачи
Можно попробовать, хотя можно и блоки Scale разместить в передатчике и далее в блок... Вообще, я сторонник создания переменной.
радио управление
Добавлено: 16.06.2016{, 20:38}
jet-belan
Если можно, по подробнее на счет переменных) как и где именно?
радио управление
Добавлено: 16.06.2016{, 21:05}
Max
Цитата jet-belan ()200?'200px':''+(this.scrollHeight+5)+'px');">Если можно, по подробнее на счет переменных) как и где именно?С аналоговых входов А0 и А1 на блок SCALE потом создаете переменные (допустим Analog1 и Analog2) и загоняете туда, а потом переменные на вход блока передатчика NRF.
радио управление
Добавлено: 16.06.2016{, 23:07}
jet-belan
Понял, спасибо!
Добавлено (16.06.2016, 23:07)
---------------------------------------------
Кстати, а в чём прелесть переменной? Если из блока SCALE уже выходит 255 единиц в зависимости от положения джойстика. Я просто ещё мало в чем разбираюсь))
радио управление
Добавлено: 17.06.2016{, 07:18}
Max
jet-belan писал(а):Кстати, а в чём прелесть переменной?
Вы вообще свою тему начинали с кода. Я понимаю, что он не Ваш, но без переменных он бы просто не работал.
Переменная это некое значение (цифра, например), а вообще правильней - ячейка памяти. Заведя переменную, Вы можете её использовать в любом месте кода по своему усмотрению и согласно правил С.
Более развернуто
тут и
тут.
радио управление
Добавлено: 17.06.2016{, 18:08}
jet-belan
Сделал вот так:
Как я понял, один из плюсов в моём случае тот, что переменная даст возможность при включении иметь данные по умолчанию. Например Byte 127, чтоб движки стояли при включении модели, передатчика или при отсутствии сигнала... я не ошибаюсь?
Добавлено (17.06.2016, 18:08)
---------------------------------------------
Если ошибаюсь, то как глубоко? пожалуйста поправьте)
радио управление
Добавлено: 17.06.2016{, 18:47}
Max
jet-belan писал(а):Например Byte 127, чтоб движки стояли при включении модели,
В принципе - да. В этих переменных будет значение входного сигнала, т.е. с потенциометров.
радио управление
Добавлено: 17.06.2016{, 21:15}
jet-belan
А если их поставить и в приёмник со значением в 127 Byte? Тогда можно избежать случайного вращения двигателей при включении.
Добавлено (17.06.2016, 21:15)
---------------------------------------------
Именно при включении модели без пульта (передатчика).
Так сказать:
Безопасность пользователя превыше всего!
Всё-таки гребные винты - предметы опасные
радио управление
Добавлено: 17.06.2016{, 21:23}
Max
jet-belan писал(а):Именно при включении модели без пульта (передатчика).Так сказать:
Безопасность пользователя превыше всего!
Всё-таки гребные винты - предметы опасные
Я так понимаю, при потере сигнала надо останавливать вращение? Ну тут мне видится так: вариант с переменной в приемнике связанной с приемом сигнала, так сказать, синхронизации с пульта и в случае потери сигнала переменная в приемнике выключает винты.
Я вообще сторонник макетирования. Надо строить макет на столе и пробовать. Чисто теоретически трудно будет сразу попасть в точку и получить все, что хочется. Так что стройте макет и пробуйте нужный алгоритм.
радио управление
Добавлено: 20.06.2016{, 22:00}
jet-belan
Да, должна быть остановка при потере сигнала. А то на речке потом не угонишься за лодкой))
На счёт макетирования вы правы! Завтра вечером попробую.
Заказал с дуру с Китая 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
радио управление
Добавлено: 01.07.2016{, 22:19}
jet-belan
Всё ли правильно сделал с ПБ радио модулей? Поправьте пожалуйста, кто разбирается))