НС-12 + сервопривод

cherkas
Offline
Зарегистрирован: 27.08.2019

Здравствуйте, я делаю радиоуправляемую игрушку, в ней есть несколько сервоприводов и мотор, управление пытаюсь осуществлять с помощью двух модулей HC-12 



в процессе я столкнулся с проблемой



данные передаю в следующем формате



134 285 374 418 596 ...



где в разряде сотен номер управляемого прибора а десятки и единицы это самоуправление от 00 до 99



+ в конце передачи контрольный подсчет общей суммы чисел команд, для непринятия команд если в передаче ошибка



суть проблемы в следующем



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



а вот при управлении сервоприводом - беда



он работает как угодно но не так как нужно, крутится, дергается когда захочет



я подозреваю, что при передечи данных от HC-12 к ардуино как то задействован таймер, и при управлении сервоприводом задействован таймер. Получается какой то конфликт.



Это всё с одним сервоприводом.

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

Если кто то может помочь, буду очень благодарен.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Схему подключения и скетч в студию!

 

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

Servo.h вроде как конфликтует с SoftwareSerial.

cherkas
Offline
Зарегистрирован: 27.08.2019

Здравствуйте, немного отвлекся

схема думаю не понадобится, там всё просто и понятно
а код вот

передатчик

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); //RX, TX

long int Speed;
long int J_X;
long int J_Y;
long int knopka;

int pin_Speed = A3;
int pin_J_X = A1;
int pin_J_Y = A2;
int pin_knopka = 12;

long int out;

void setup() {
  mySerial.begin(9600);
  Serial.begin(9600);
  pinMode(pin_knopka, INPUT);
  
}
void loop() {
 
 
  Speed = analogRead(pin_Speed);
  Speed = map(Speed, 0, 1023, 10, 99);
  Speed = constrain(Speed, 10, 99);
  
  J_X = analogRead(pin_J_X);
  J_X = map(J_X, 0, 1023, 10, 99);
  J_X = constrain(J_X, 10, 99);
  
  
  J_Y = analogRead(pin_J_Y);
  J_Y = map(J_Y, 0, 1023, 10, 99);
  J_Y = constrain(J_Y, 10, 99);

 
  if(digitalRead(pin_knopka) == 0){
    knopka = 99;}
    else{
      knopka = 10;
      }
  J_X = J_X * 100;
  J_Y = J_Y * 10000;
  knopka = knopka * 1000000;
  out = knopka + J_X + J_Y + Speed;
  
  mySerial.println(out);

  Serial.println(out);
 
  delay(100);

} 

приемник

#include <SoftwareSerial.h>
#include <Servo.h>

SoftwareSerial mySerial(2, 3); // RX, TX

long int Speed;
long int J_X;
long int J_Y;
long int knopka;
int shim = 9;
long int razchet;
int razchet2;

Servo servo;
int servo_pin = 5;

long int in;
void setup() {
  pinMode(shim, OUTPUT);
  mySerial.begin(9600);
  servo.attach(servo_pin);
  Serial.begin(9600);
}

void loop() {
   
  if(mySerial.parseInt() > 10000000 && mySerial.parseInt() < 100000000)    
    in = mySerial.parseInt();
    razchet = in;
    
   //Serial.println(in);

    Speed = ((razchet % 100)-10)*2.86;
    razchet = razchet / 100;
    J_X = razchet % 100;
    razchet = razchet / 100;
    J_Y = razchet % 100;
    razchet = razchet / 100;
    knopka = razchet % 100;

    analogWrite(shim, Speed);    
    //Serial.println(Speed);
    
     razchet2 = (J_X - 10) * (180 / 89);
   
     servo.write(razchet2);
    
    Serial.println(razchet2);
    
  
   mySerial.flush();
  
  //delay(20);//delay little for better serial communication
}

 

 

у меня тоже есть подозрение, что происходит конфликт библиотек

подскажите есть решение которое не будет конфликтовать?

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

конфликт библиотек тут не причем, способ передачи данных кривой... но еще куда ни шло... А вот способ приема абсолютно нерабочий.

В строчке 27 вы дважды вызываете mySerial.parseInt(), явно не подозревая, что эта функция при чтении очищает Сериал. То есть до строчки 28 (где вы эту функцию вызываете в третий раз, хотя никаких данных в порту давно нет) - никакие числа, принятые в строке 27 -  дойти не могут В ПРИНЦИПЕ.

Вместо этого при каждом обращении mySerial.parseInt() вы читаете новую посылку от передачика - с соответвующей задержкей. И при этом ваши проверки на диапазон в строке 27 оказываются абсолютно бесполезны. потому что в строке 28 вы читаете в переменную out совершенно новые данные, которые вполне могут не соответвовать условиям проверки в строке выше.

 

cherkas
Offline
Зарегистрирован: 27.08.2019

согласен, не корректно написал

 

поправил так

void loop() {
data = mySerial.parseInt();
if(data > 10000000 && data < 100000000)
in = data;
razchet = in;

но это не решило главную проблему, серво дергается

подключена библиотека SoftwareSerial

вот, что про нее пишут

 SoftwareSerial при приеме/отправке байта глобально запрещает прерывания, чтобы гарантировать корректные тайминги. Но это так же и замораживает все таймеры, на которых базируется библиотека Servo. 

Вы писали, что можно подключить HC-12 без этой библиотеки, можете дать пример кода и схему куда подключать ноги

 

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

У вас на приемнике (там где сервы) на аппаратный Сериал что-нибудь подключено?

cherkas
Offline
Зарегистрирован: 27.08.2019

всё!! получилось!

подключил без библиотеки. 

 

b707 - большое Спасибо!

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

cherkas пишет:

всё!! получилось!

подключил без библиотеки.

ну и отлично :)

не прошло и года :)

Fara11
Offline
Зарегистрирован: 19.08.2020

У меня такой же вопрос но я в этом не разбираюсь, скажите кто может помочь ?

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

Fara11 пишет:
У меня такой же вопрос но я в этом не разбираюсь, скажите кто может помочь ?

Изложите вопрос, иначе ответов не дождетесь.

А если  вопрос - "такой же", то воспользуйтесь "таким же ответом" :)

Fara11
Offline
Зарегистрирован: 19.08.2020

Задача с помощью hc 12 подключить серво привод

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

Fara11 пишет:
Задача с помощью hc 12 подключить серво привод

Простите, так дело не пойдет. Я из вас подробности вытягивать не собираюсь.

Если хотите разобраться сами - в сообщении #3 этой ветки есть почти готовый код, чуть ниже написано, как его исправить, чтоб заработало. У автора исходного сообщения все получилось.

А если надо, чтобы все сделали за вас - я вам отписал в платном разделе.

Fara11
Offline
Зарегистрирован: 19.08.2020

Подскажите как перейти в платный раздел ?

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

Fara11 пишет:
Подскажите как перейти в платный раздел ?

да вы уже там были, даже тему свою создали :)

http://arduino.ru/forum/ishchu-ispolnitelya/pomogite-modul-hc-12-podklyuchit-k-servoprivodu