Управление бесколлекторным двигателем через модули HC-12

lesnik600
Offline
Зарегистрирован: 24.10.2018

Нужно сделать управление 2 бесколлекторными двигателями ччерез модули HC-12.
Пособирал с интернета всего по чуть-чуть, но видимо где-то что-то пропустил в скетчах,
первый скетч который работает на arduino без связи, на прямую к регулятору

#include <Servo.h>
Servo motor;
void setup() {
    pinMode(3, OUTPUT);
  digitalWrite(3,HIGH); 
  motor.attach(2);
}
void loop() {
int val =map(analogRead(0), 0,  1023, 800, 2300);
motor.writeMicroseconds(val);
}

Теперь  скетчи которые предназначаються для передатчика и приемника, HC-12 подключены к arduino через TX-RX
1 скетч передатчика
 

#include <SoftwareSerial.h>
int val = A0;
void setup () { 
   pinMode(3, OUTPUT);
  digitalWrite(3,HIGH); 
Serial.begin(9600);// Инициализация последовательного порта 
} 

void loop () { 
 int val =map(analogRead(0), 0,  1023, 800, 2300);
Serial.println(val);;

}

2 скетч приёмника
 

#include <SoftwareSerial.h>
#include <Servo.h>
Servo motor;
void setup() {
    motor.attach(2);
}
void loop() {
  while (Serial.available() > 0) {
  int val = Serial.parseInt();
motor.writeMicroseconds(val);
}
}

Буду рад любой помощи

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

Конечно пропустил.

К каким пинам подключены HC-12 в передатчике и приемнике?   Где эти пины заданы в скетчах?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

В скетче приемника не вижу Serial.begin. Если HC-12 подключены к Serial, то приемник ниччаго не будет принимать, поскольку UART не настроен. Вернее, принимать-то он будет, вот только дуня ничего не примет с него.

И подключать SoftwareSerial.h - необязательно, раз используются аппаратные UART.

lesnik600
Offline
Зарегистрирован: 24.10.2018
#include <SoftwareSerial.h>
#include <Servo.h>
Servo motor;
SoftwareSerial mySerial(2, 3);
void setup() {
  Serial.begin(9600);
    motor.attach(4);
}
void loop() {
  
  int val = Serial.parseInt();
motor.writeMicroseconds(val);

}

Исправил скетч приемника но всё равно не работет
Не подскажите, как настроить UART?

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

lesnik600 пишет:

Исправил скетч приемника но всё равно не работет

надо так же и передатчик исправить

lesnik600
Offline
Зарегистрирован: 24.10.2018

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

приемник
 

#include <Servo.h>
Servo motor1;
Servo motor2;
#include <SoftwareSerial.h>
int bashnyal = 3; 
int basnyar = 4;
int b;
int c;
void setup()
{
  Serial.begin(9600);        
   pinMode(bashnyal, OUTPUT);
  digitalWrite(bashnyal, LOW);
  pinMode(basnyar, OUTPUT);
  digitalWrite(basnyar, LOW);  
  motor1.attach(2);
   motor2.attach(3);
}
void loop()
{ 
  if(Serial.available() && Serial.read() == 'b')
  {
      b = Serial.read();
    motor1.writeMicroseconds(b);
  }
  if(Serial.available() && Serial.read() == 'c')
  {
     c = Serial.read();
     motor2.writeMicroseconds(c);
}  
  if(Serial.available() && Serial.read() == 'd')
  {
    int d = Serial.read();
    digitalWrite(bashnyal,d);
  }
  if(Serial.available() && Serial.read() == 'e')
  {
    int e = Serial.read();
    digitalWrite(basnyar,e);
  }
  delay(50);  
}

передатчик
 

#include <SoftwareSerial.h>
;
int pot1x =  A0; 
int pot1y = A1;
int knopka1 = 6; 
int knopka2 = 7;
void setup()
{
analogReference(DEFAULT); 
Serial.begin(9600); 
  
pinMode(knopka1, INPUT);  
digitalWrite(knopka1, HIGH);  
pinMode(knopka2, INPUT); 
digitalWrite(knopka2, HIGH); 
}
void loop()
{
Serial.write('b');  
   Serial.write(map(analogRead(pot1x), 0,  1023, 800, 2300));
   Serial.write('c');
   Serial.write(map(analogRead(pot1y), 0,  1023, 800, 2300)); 
 Serial.write('d');
   Serial.write(digitalRead(knopka1)); //кнопка 1
   Serial.write('e');
   Serial.write(digitalRead(knopka2)); //кнопка 2
     delay(50);
 }

 

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

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

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

Нет, лучше объявить конкурс на самый правильный неработающий скетч!

leks
Offline
Зарегистрирован: 22.10.2017

Прошу прощения, что влажу не в своё, читанул такую статью. Сейчас тренируюсь с блютуз модулем hc05 на разных поделках управлять через смартфон. Возникла необходимость увеличения дистанции с 20 метров до более... В статье пишут, что это аналог 05 только с большей дистанцией. Так ли это?, для управления со смартфона или его возможности тоже ограничены 10-20 метрами по каналу "блютуз"?

http://cxem.net/review/review26.php

 

leks
Offline
Зарегистрирован: 22.10.2017

Как их можно вообще сравнивать HC-12 и HC-05 частоты же разные ?

lesnik600
Offline
Зарегистрирован: 24.10.2018

//Transmitter


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

Servo esc; 
SoftwareSerial hc12(2, 3); //RX, TX

int thr, ail, ele, rud;

void setup()
{
esc.attach(10);
pinMode (A0, INPUT);
pinMode (A1, INPUT);
pinMode (A6, INPUT);
pinMode (A7, INPUT);
pinMode (A2, INPUT);
pinMode (13, OUTPUT);
 
Serial.begin(9600);
hc12.begin(9600);
}

void loop()
{
  ele=map(analogRead(A0), 0, 1023, 0, 180);
  rud=map(analogRead(A1), 0, 1023, 0, 180);
  thr=map(analogRead(A7), 0, 1023, 0, 180);
  ail=map(analogRead(A5), 0, 1023, 0, 180);

  hc12.print(thr);
  hc12.print(",");
  hc12.print(ail);
  hc12.print(",");
  hc12.print(ele);
  hc12.print(",");
  hc12.print(rud);
  hc12.println("");
 
  Serial.print(thr);
  Serial.print(",");
  Serial.print(ail);
  Serial.print(",");
  Serial.print(ele);
  Serial.print(",");
  Serial.print(rud);
  Serial.println("");


delay(100);  
}

приёмник 

//Receiver
//Visit www.rootsaid.com for full tutorial
//For Video Demo and tutorials Visit www.youtube.com/c/rootsaid

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

Servo esc; 

Servo ele;
Servo ruddr;

String input;
int throttle, th;
int aileron, ail;
int elevator, el;
int rudder, rud;

int boundLow;
int boundHigh;
const char delimiter = ',';

SoftwareSerial hc12(4,5);

void setup()
{
ele.attach(9);
ruddr.attach(11);


}

void loop()
{
    

if(Serial.available())
  {
  input = Serial.readStringUntil('\n');
  if (input.length() > 0)
      {
       Serial.println(input);
       
        boundLow = input.indexOf(delimiter);
        throttle = input.substring(0, boundLow).toInt();
    
        boundHigh = input.indexOf(delimiter, boundLow+1);
        aileron = input.substring(boundLow+1, boundHigh).toInt();
    
        boundLow = input.indexOf(delimiter, boundHigh+1);
        elevator = input.substring(boundHigh+1, boundLow).toInt();
    
        rudder = input.substring(boundLow+1).toInt();

       esc.write(throttle);
       ele.write(elevator);
       ruddr.write(rudder);
       delay(10);      }
    
  }

}

Нашёл такие скетчи для проекта

В комментариях к посту с этими скетчами были замечания что скетчи не работают, ещё покопавшись в интернете, выяснилось что некоторые платы arduino могут некорректно работать с HC-12 . Так ли это?
Просто в статье было показанно как это нормально фунционирует, но у меня на 2 платах nano это почему-то не работает.
Может имеет место неправильное подключение? подключаю на ардуино передатчике 2 пин с tx на модуле hc12 и 3 пин с rx. на приемнике 4 пин с tx, 5 пин с rx
https://rootsaid.com/4-channel-rc-plane-2/

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

вы бы для начала убедились, что у вас HC-12 работают.

Залейте в две ардуины вот такой код, присоедините к каждой по HC-12, подключите к каждой Сериал монитор и добейтесь, чтобы введенное в input в одном мониторе выходило как output на другом

/*
 Serial Debug 

*/
#include <SoftwareSerial.h>

const int pin_tx = 7;
const int pin_rx = 8;

SoftwareSerial HC12(pin_tx,pin_rx);//TX,RX

void setup(){
  Serial.begin(9600);
  HC12.begin(9600);
}

void loop(){
  if(HC12.available()){
    Serial.write(HC12.read());
  }
  if(Serial.available()){     
    HC12.write(Serial.read()); 
  }
}

 

lesnik600
Offline
Зарегистрирован: 24.10.2018

Да, вы правы, скорее всего проблема в Hc12, так как с вашим скетчем значения не выводяться в монитор порта.
Возможно модули надо перенастроить, но какой режим лучше выбрать? Хотелось бы использовать на максимальной дальности. И есть ли замена Hc12 на аналогичные модули по далности примерно километр

lesnik600
Offline
Зарегистрирован: 24.10.2018

После настройки модулей через АТ команды и танцев с бубнами (поэтапный разбор что работает, а что нет через СОМ порты), удалось запустить скетчи.
И так, рабочие скетчи, вдруг кому-то понадобиться
Спасибо за бесценную помощь!
 
 

//MEGA 2560 TRANSMITER
#include <Servo.h>
#include <SoftwareSerial.h>
SoftwareSerial hc12(10,11);//rx,tx
Servo esc;
int thr;
void setup() 
{
  esc.attach(10);
  pinMode(A0,INPUT);
  Serial.begin(9600);
  hc12.begin(9600);
}
  void loop()
{
thr=map(analogRead(A0) ,0,1023,0,2200);
  hc12.print(thr);
  Serial.print(thr);
  delay(20);
}  
//NANO328P RECIVIED
#include <Servo.h>
#include <SoftwareSerial.h>
Servo  servo1;
String input;
SoftwareSerial hc12(8,9); //TX,RX

int elevatorold;

int x;
const char coma=',';

void setup() {
  // put your setup code here, to run once:
servo1.attach(10);
pinMode(9,OUTPUT);
Serial.begin(9600);
hc12.begin(9600);
}

void loop() {
while (hc12.available()){
  input=hc12.readStringUntil('\n');
   if (input.length()>0){
     //Serial.println(input);
     x=input.indexOf(coma);
    int elevatornew=input.substring(0,x).toInt();
    servo1.write(elevatornew);
    Serial.println(elevatornew);
    }
delay(10);
    }
}