Как победить ШИМ на 9 и10 пинах с nrf24l01 в nano?

android.mk
Offline
Зарегистрирован: 16.01.2017

Всем привет! К китайской nano подключен nrf24l01 ,  серва и двигатели. Пины 9 и 10 для nrf24l01 можно вроде как свободно менять - и модуль нормально работает, но при этом на 9 и 10 не работает ШИМ...  мне нужно 4 пина с ШИМом для двигателей и один для сервы...

На оставшихся 3, 5 и 6 пинах шим прекрасно работает, а на 9-10 пинах плавной регулировки оборотов нет.
 

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>

RF24 radio(7, 8);

int recieved_data[4];
byte relay = 2;
int servo = 4;

//двигатель 1
int IN1 = 5;
int IN2 = 6;
 
//двигатель 2
int IN3 = 9;
int IN4 = 10;

.....

Насколько понял проблема в библиотеках nrf или сервы, но где именно не нашел..

Мегу не хотелось бы ставить, великовата она ну и цена. Может кто сталкивался, как это победить в nano?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Полный код секретен? Ну, ладно. Сконфигурируйте 10-ый пин как OUTPUT в самом начале функции  setup, если это не сделано. Иначе у Вас не будет работать SPI. На ШИМ это по идее никак повлиять не должно.

Кстати, что Вам мешает использовать для ШИМ пин 11? Чего привязались к 10-му?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

ЕвгенийП пишет:

Кстати, что Вам мешает использовать для ШИМ пин 11? Чего привязались к 10-му?

11pin - MISO, а spi как будет работать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Valera19701 пишет:

11pin - MISO, а spi как будет работать?

Точно. Это я ступил.

Ну, ТС пусть всё же SS то в OUTPUT скофигурит. А то по-любому никак не будет :)

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

TLC5940

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Зачем? Хватает же пинов-то.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

Кстати, что Вам мешает использовать для ШИМ пин 11? Чего привязались к 10-му?

MOSI, однако.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, мне уже сказали выше.

android.mk
Offline
Зарегистрирован: 16.01.2017

Нет, код не секретный конечно, стандартный так сказать:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>

RF24 radio(7, 8);

byte recieved_data[5]; // массив принятых данных
byte relay = 2;
byte servo = 4;

//двигатель 1
byte IN1 = 5;
byte IN2 = 6;

//двигатель 2
byte IN3 = 9;
byte IN4 = 10;

Servo myservo;

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};

void setup() {
  //Serial.begin(9600);
  pinMode(relay, OUTPUT);

  //двигатель 1
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);

  //двигатель 2
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);


  myservo.attach(servo);

  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);

  radio.openReadingPipe(1, address[0]);
  radio.setChannel(0x60);

  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);

  radio.powerUp();
  radio.startListening();
}

void loop() {

  byte pipeNo;
  while ( radio.available(&pipeNo)) {
    radio.read( &recieved_data, sizeof(recieved_data) );
    digitalWrite(relay, recieved_data[0]);
    myservo.write(recieved_data[1]); // значение с 1 элемента массива

    if (recieved_data[5] == 0) {

      analogWrite(IN2, LOW);
      analogWrite(IN1, recieved_data[2]);

      analogWrite(IN4, LOW);
      analogWrite(IN3, recieved_data[3]);

    } else {

      analogWrite(IN1, LOW);
      analogWrite(IN2, recieved_data[2]);

      analogWrite(IN3, LOW);
      analogWrite(IN4, recieved_data[3]);
    }
  }
}

Мне 2 пина на каждый двигатель нужно чтобы направление менять. Пишут что здесь

RF24 radio(9, 10);

в "стандартном скетче" 9 и 10 можно менять на все что понравится, так и есть - радиомодуль при этом нормально работает, но ШИМ на освободившихся 9 и 10 от этого не появляется...

Некоторые советуют попробовать программный SPI для nRF24, под это дело вроде как отдельная библиотека есть, не разобрался еще что это такое, но ожидаю что может работать глючно и наверняка медленнее чем аппратный (видел пример работы с прорисовкой экрана - разница в скорости очень заметна). Ну и будет ли при этом работать ШИМ на 9 и 10 тоже вопрос.

Доп. девайсы для ШИМ вешать как-то мне не очень, если уж никак, то лучше МЕГУ, смотрел сегодня на алике - уже у китайцев есть компактный размер 38x52 мм, но цена пока печальна, хотелось бы всё-таки НАНУ победить - пинов то много ещё свободных. Все подозрения на библиотеку для nRF24..

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Давайте сделаем так.

1. Строку продублируйте ещё раз после строки 52. Чем чёрт не шутит, может он там при инициализации SPI зафигачил его в INPUT - продублируйте, хуже точно не будет.

2. Из loop пока уберём всё (или просто поставим первой строчкой "return;"

3. В setup, в самый конец перед закрывающей скобкой поставим analogWrite на все какие Вас интересуют пины.

Теперь мы можем проверить осциллографом, есть там ШИМ или нет (нет осциллографа - проверяйте мультиметром, да хоть светодиодом).

Проверьте, может он там и есть. Если его и впрямь нет, будем бороться и в loop ничего не будем ставить пока не добьмся, чтобы был. А вот если он там есть, то наоборот, начнём разбираться что там в loop. В общем начнём делить проблему на части, отсекая всё лишнее, чтобы её вычленить -  и решать задачу  методом ловли льва в пустыне.

staba
Offline
Зарегистрирован: 21.01.2018

Возможно дело в неверно выставленных фьюзах. У меня было то же самое и с таким же модулем. Использовал не ардуино плату, а просто контроллер в дипе и нарвался на эту же засаду.

 

android.mk
Offline
Зарегистрирован: 16.01.2017

Спасибо за советы. Пробовал по всякому, тут обнаружилась такая штука - к пину 9 (на котором у меня не хочет работать регулировка оборотов мотора) подключаю серво - она работает, вешаю светодиод - он тоже плавно меняется, меряю мультиметром - напряжение тоже плавно меняется.  Т.е. какой-то шим там таки есть, чем он отличается от шима на других пинах  - как понять без осцилографа?

А когда подключаю этот модуль https://ru.aliexpress.com/item/Free-Shipping-1PCS-New-Dual-H-Bridge-DC-S... для мотора - он на 8 пине не работает - двиг дергается если до упора поднимать напряжение, причем на максимуме не равномерно крутится а именно дергается беспорядочно рывками, на низах вообще молчит.

(nrf при этом меняю на 8 пин)

Грешил на глючный L298N (я порядком как-то поиздевался над ним), ждал пока приедет еще такой же, с новой платой сейчас проверил - точно то же самое.

На других пинах где есть шим - прекрасно работает, на 9 и 10 - нет.

Может с analogWrite что-то не так?

 

 

android.mk
Offline
Зарегистрирован: 16.01.2017

Попробовал заменить analogWrite на digitalWrite - ожидаемо двигатель включается сразу при подаче на пин чего угодно и крутится с постоянной скоростью..

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы сделаи то, что я просил в посте #9? Если да, то сделайте код и расскажите, что получили.

android.mk
Offline
Зарегистрирован: 16.01.2017

Евгений, настолько радикально я всё пока не снес, выходит, что то что бы я мог увидеть мультиметром или светодиодом - я и так вижу на 9м пине - меняется плавно..

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, ну надо выяснять кто виноват, где конфликт, а для этого надо всё сносить и вносить обратно по-одному. Одно заработало, добавляем второе - оопс! Вот тут конфликт и ищем. А когда всего много - запаришься искать, не зная за какой конец хвататься.

android.mk
Offline
Зарегистрирован: 16.01.2017

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

Только что попробвал для регулировки мотора шим подавать не на IN1/IN2, а на ENA (до этого он был закорочен перевычкой на 5в) - тот же эффект, плавно не меняет скорость

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

android.mk пишет:

 так можно и без библиотеки для nrf проверить.

Вы на правильно пути. Исключаем всё! Что-то само по себе работает, добавляем фичи по чуть-чуть и следим когда загнётся.