Восстание сервопривода - Как угомонить?

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

Есть проблема с SG90 - стандартный китайский серво, угол перадаём через nrf24. И думал дело в плохом контакте (всё на джамперах) но контакт вряд ли наладится от того, что коснуться любого контакта на любой из плат. Стоит коснуться любого контакта, да хоть железки на потенциометре - все мотылянии серво тут же прекращает, при чём не важно на какой из плат, на приёмнике или передатчике. Складывается ощущение, что я когда касаюсь, то ли заземлением становлюсь, то ли антенной, и из за лучшего приёма серво перестаёт дёргаться. И ещё, если поднести руку к макетке на которой передатчик, амплитуда отклонений туда-сюда увеличивается раз в два...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ХЗ.

nik182
Offline
Зарегистрирован: 04.05.2015

А если землю передатчика заземлить на батарею?

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

Даже если поможет - не вариант, и приёмник и передатчик не будут находится на одном месте. Пробовал запитать серву отдельно, от айфоновской зарядки, так она вообще взбесилась, и на команды отвечать перестала. Отдельное питание ардуины-передатчика - так же ничего не дело, вернее теперь что бы серва перестала дёргаться, нужно коснуться обоих плат (видимо наводки усилились)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Звиздец, мистика...Пристрели ее. 

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

Вторая такая же) Даже запитал одну от приёника, другую от передатчика, разницы нет

inspiritus
Offline
Зарегистрирован: 17.12.2012

Значит проблема не в серве а в передатчике

rkit
Offline
Зарегистрирован: 23.11.2016

Дело в монтаже соплями.  Сделай качественные короткие шлейфы.

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

Хорошо, если поможет. А как палец влияет?

rkit
Offline
Зарегистрирован: 23.11.2016

И школьный учебник по физике прочитай.

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

За какой класс?

sadman41
Offline
Зарегистрирован: 19.10.2016

А в каком классе пальцы начинают изучать?

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

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

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

Что сделал? Секрет?

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

в 13 вестимо, не знаю, я после 9 го ушёл, сейчас в шараге, пту заканчиваю

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

Добавил на плату один потенциометр, что б отдельно двумя сервами крутить, и всё теперь нормально работает. Я реально больше ничего не менял

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

Понятно, ни схемы, ни скетча - посидели, потрындели, разошлись. И, вроде, у Вас уже не в первый раз так.

Давайте Вы впредь будете добавлять потенциометры без того, чтобы постить сюда пустой вопрос и выносить всем мозг?!

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

b707
Offline
Зарегистрирован: 26.05.2017

Евгений, сносите, можно вместе с автором:)

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

Решилось тем, что у меня в скетче собираются данные с трёх потенциометров, а подключен был только один, а серв было две, включая ту, у которой потенциометра не было. Но я как думал, если ничего не подключено, то и снимать будет нечего, ну или какое-то одно число будет стабильно. Но как выяснилось, подключенный потен. в зависимости от своего положения, меня входящие данные не только на пине к которому подключен (логика) но и на все остальные пины которые заданы в скетче, не не подключены физически. Понял это выводом принимаемых данных через сериал.

А скетч от Гайвера, на NRF24 "трёхканальное управление", ток я его допилил чутка под себя

TX

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

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

byte potent1 = 14;  // A0
byte potent2 = 15; // A1
byte potent3 = 16; // A2

byte data[3]; // массив, хранящий передаваемые данные
byte latest_data[3]; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных

void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
}

void loop() {

  data[0] = map(analogRead(potent1), 0, 1023, 0, 180); // 
  data[1] = map(analogRead(potent2), 0, 1023, 0, 180); // 
  // в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
  data[2] = map(analogRead(potent3), 0, 1023, 0, 255);

  for (int i = 0; i < 3; i++) { // в цикле от 0 до числа каналов
    if (data[i] != latest_data[i]) { // если есть изменения в transmit_data
      flag = 1; // поднять флаг отправки по радио
      latest_data[i] = data[i]; // запомнить последнее изменение
    }
  }

  if (flag == 1) {
    radio.powerUp(); // включить передатчик
    radio.write(&data, sizeof(data)); // отправить по радио
    flag = 0; //опустить флаг
    radio.powerDown();
    Serial.print(data[2]); Serial.print(" "); Serial.print(data[1]); Serial.print(" "); Serial.println(data[0]);
  }
  
}

RX

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

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги

byte data[3]; // массив принятых данных
byte servo1 = 2; // реле на 2 цифровом
byte servo2 = 3; // сервопривод на 3 цифровом
byte mosfet = 5; // мосфет на 5 цифровом (ТУТ ЕСТЬ ШИМ!!!)

Servo myservo1;
Servo myservo2;

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК
  pinMode(mosfet, OUTPUT); // настроить пин мосфета как выход

  myservo1.attach(servo1);
  myservo2.attach(servo2);

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop() {
  byte pipeNo;
  while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
    radio.read( &data, sizeof(data) );         // чиатем входящий сигнал
    myservo1.write(data[0]);
    myservo2.write(data[1]);
    analogWrite(mosfet, data[2]); // подать на мосфет ШИМ сигнал
    // в соответствии с принятыми данными со 2 места массива, диапазон 0...255
    Serial.print(data[0]); Serial.print(" "); Serial.print(data[1]); Serial.print(" "); Serial.println(data[2]); 
  }
}

 

 

Хотя непонятки всё равно остались, т.к. сначала была мысль что я просто подключил серву не к тому порту, на который дурь всякая выводилась, но нет, ведь сервой можно было управлять, при чём когда меняешь положение, она работает ровно, но стоит перестать и оставить её в покое, как с полусекундной задержкой она опять начинала дрыгаться, но подключив её один потенц. к прописанному в скетче порту дрызг прекращается, и стоит его опять отключить он опять начинается. Казалось бы всё, но в обоих случаях остаётся ещё один потен. который я в обоих случаях не подключал, и на его порт и с его порта тожеть дичь всякая плавающая выходит, но при этом он (неподключённый порт) уже на два других никак не влияет

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

чуть выше

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

Ааа, понял, дело в Servo. Тот оставшийся потен, управлял мосфетом, без участия Servo.h, и корявые данные с него никому вреда не несут, а вот те, что привязаны к servo начинают глючить всю плату, если им выдавать некоректные значения, а не только тот пин, на который назначена "неподключённая серва"

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

И ещё наблюдение - если слишком быстро изменить значение управляющего потенциометра - nrf24 отвалиться на секунду и потом переместит рывком серву в заданное потеном положение. Догадка - слишком резкое изменение требует большого тока для мотора сервы, от чего в питании возникает просадка - а как знаем, nrf-ки крайне к ним чувствительны, и при скачках теряют связь, но секунду спустя видимо востанавливает (погасший led rx на дуине вновь загорается) поворачивает серву в нужное положение. При чём если оставшийся после отвала угол на который нужно сместить серву ещё большой, то серва немного резко сместиться и опять отвалиться, и так до тех пор пока не встанет на угол который в данный момент её передаёт потенциометр на другой плате.

В общем, нужно плавно сервами двигать, или программно как-то задать максимальною скорость поворота сервы, что б та резкими движениями просадок сильных в питании не создавала

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ну вот и я понял в чем дело.
Все дело в гивере.
Приобщает к теме дебилов и не следит за ними.

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

Оригинально

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
Ну вот и я понял в чем дело. Все дело в гивере. Приобщает к теме дебилов и не следит за ними.

Ты не прав, из тех, кто хочет приобщиться еще может что-то выйти, а вот из пропущенных через школу ЕГЭ наврядли...
 

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Ну вот и я понял в чем дело.
Все дело в гивере.
Приобщает к теме дебилов и не следит за ними.

да при чем тут гивер, разве за каждым д... уследишь? Это разве гайвер сказал ТС подключить на вход сервы неиспользуемые пины?

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

b707 пишет:
Это разве гайвер сказал ТС подключить на вход сервы неиспользуемые пины?
Ну, прямо, наверное не говорил, но, видимо, ТС явилась тень отца Гамлета ... тьфу ... гивера и что-то сказала.

lluceu, запомните народную примету, если устройство подключить ХЗ куда, то оно будет вести себя ХЗ как, что Вы и наблюдаете. Если бы Вы сразу выложили схему и фото, вопрос бы решился сразу же за минуту, но Вы ... похоже, горбатого могила исправит.

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

Хорошо, учту. Во схема, код с включением ШИМ на 3-м пине думаю кидать не стоит, главное что всё работает.

Скорость плавно регулируется, но.. до определённого предела, при чём можно подать хоть простой high базу мосфета, скорость вращение будет всё равно такая же, очень низкая, хотя если включить мотор в обход транзистора напрямую к батарее (батарея 3.7v li-ion, мотор f130 - маркировки нет) моторчик прям хоть взлетит сейчас. Так и должно быть?

sadman41
Offline
Зарегистрирован: 19.10.2016

Оба контакта мотора на минус? Оригинально. Перпетуум мобиле ещё не изобретали в этом месяце?

lluceu
lluceu аватар
Offline
Зарегистрирован: 21.07.2020

Уфф а, это левая пикча, сказано же, работает. А по делу -  видимо мосфет с большим падением на переходе.

У меня IRF, попробую IRL поставить.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Уфф, а это левая программо. Не мудрено, что не работает, аха?

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

lluceu,

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

lluceu пишет:

это левая пикча

знаете как вы все за@бали левыми пикчами! Значит, sadman41 смотрел, разбирался, старался Вам - дураку помочь, но все его старания и потерянное время спущены в унитаз просто потому, что мудак lluceu вместо схемы привёл левую пикчу! Идите Вы нах ... прямо и налево со своими пикчами!

По-русски Ваш пост звучит так: "Мужики, у меня тут проблема нарисовалась. Мне-то самому решать её не нужно, так что напрягаться, схему там рисовать ... мне есть чем заняться и кроме этого. А вот вам, если не с чем(кем) потрахаться в этот воскресный вечер, то вот вам левое картинко - трахайтесь на здоровье, мне не жалко".

Кстати,

lluceu пишет:

по делу

могу Вам помочь! Полное и подробное решение Вашей проблемы описано вот здесь.

Правда, это левая ссылка и там ни хрена нет, но проблема всё равно решается, ибо

lluceu пишет:

сказано же, работает. 

Вот, как-то так.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Петрович, красава.  Пост-огонь, не удаляй. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Петрович, красава.  Пост-огонь, не удаляй. 

а почему сразу блондинка )))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ua6em пишет:

а почему сразу блондинка )))

Ну, так типа "Кто про что, а вшивый ...", "У кого что болит, ...", тут много народной мудрости есть :-)