ARDUINO Управление моделью с помощью HC-12

cherkas

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

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

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

134 285 374 418 596 ...

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

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

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

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

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

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

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

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

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

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Первое что надо сделать так это убедиться, что сервопривод заведомо рабочий. из десятка серв, что у меня есть один работает примерно так же, второй никак не может достигнуть крайней позиции. остальные хорошие
Не думаю что таймер мешает. Можно попробовать подключив другой модуль серв. На самом деле управление сервой очень протое и делается через tone на частоте 50герц , длительность сигнала и есть угол на какую надо повернуть. Точнее надо рыть инет, не запоминал.

Ну и конечно же вверух все верно сказали, подключить все к одному компу, открыть 2 монитора и смотреть отправление, передачу, потери


для подключения нескольких серв лучше всего подходят платы мултиприводов типа шилд.
 

cherkas

✩✩✩✩✩✩✩
25 Авг 2019
4
0
Здравствуйте, был небольшой перерыв )) в год.

прошу помочь с решением той же проблемы

прикладываю код приемника и передатчика

сервопривод рабочий 100%, если подключать его к ардуино без приемника и управлять потенциометром, он отлично работает
передатчик:
#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;


    Speed = ((razchet % 100)-10)*2.86; // получаем скорость в формате 0-255
    razchet = razchet / 100;
    J_X = razchet % 100; // получаем джойстик Х
    razchet = razchet / 100;
    J_Y = razchet % 100; // получаем джойстик У
    razchet = razchet / 100;
    knopka = razchet % 100; // получаем положение кнопки

    analogWrite(shim, Speed);   // шим скорости двигателя
   
     razchet2 = (J_X - 10) * (180 / 89); // получаем поворот серво от 0 до 180
  
     servo.write(razchet2);
    

   mySerial.flush();
 
 
}


_____________________________________________

результат всего этого следующий

серво поворачивается правильно, но сильно дергается, примерно +-20 град. в обе стороны от стабильного состояния

чем меньше delay() у передатчика, тем чаще дергается, если совсем убрать delay() тоже дергается. амплитуда дерганья меньше но чаще

при delay(1000) дерганья нет, но такая задержка мне не подходит

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


Помогите люди добрые ))

нашел в гуголе, что библиотеки
#include <SoftwareSerial.h>
#include <Servo.h>
не совместимы (

может кто знает альтернативную библиотеку для HC-12?
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
может кто знает альтернативную библиотеку для HC-12?
для HC-12 вообще не нужна библиотека, оно работает через обычный Сериал.
А проблема у вас совсем не в этом - вы неправильно передаете и принимаете данные. Подробнее отписал на другом форуме.
 

cherkas

✩✩✩✩✩✩✩
25 Авг 2019
4
0
дайте пример кода без библиотеки пожалуйста
 

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
дайте пример кода без библиотеки пожалуйста
Еще раз, читайте внимательнее - для НС-12 нет своей библиотеки, используется Сериал. ровно тот же, что и для вывода в Монитор порта

Однако повторяю, у вас проблема не в библиотеке.

Вы разместили этот вопрос минимум на трех форумах. Я ответил вам в другом месте. ССылки на другие форумы не приветсвуются. поэтому просто пробегитесь по своим веткам на других форумах
 

cherkas

✩✩✩✩✩✩✩
25 Авг 2019
4
0
да пишу на 2 форума, так как из опыта знаю не везде и не всегда отвечают.

Вам отдельное спасибо за такое активное участие! Очень прошу донести до меня решение
 
Изменено: