Управление бесколлекторным двигателем через модули HC-12
- Войдите на сайт для отправки комментариев
Ср, 24/10/2018 - 00:54
Нужно сделать управление 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);
}
}
Буду рад любой помощи
Конечно пропустил.
К каким пинам подключены HC-12 в передатчике и приемнике? Где эти пины заданы в скетчах?
В скетче приемника не вижу Serial.begin. Если HC-12 подключены к Serial, то приемник ниччаго не будет принимать, поскольку UART не настроен. Вернее, принимать-то он будет, вот только дуня ничего не примет с него.
И подключать SoftwareSerial.h - необязательно, раз используются аппаратные UART.
#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?
Исправил скетч приемника но всё равно не работет
надо так же и передатчик исправить
попробовал другие скетчи, тоже не работают, но может быть они более правильнее
приемник
#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); }мартышка и очки? Тогда можно еще десяток перепробовать, канеш, но не лучше ли разабраца, как вот это вот всё работает?
Нет, лучше объявить конкурс на самый правильный неработающий скетч!
Прошу прощения, что влажу не в своё, читанул такую статью. Сейчас тренируюсь с блютуз модулем hc05 на разных поделках управлять через смартфон. Возникла необходимость увеличения дистанции с 20 метров до более... В статье пишут, что это аналог 05 только с большей дистанцией. Так ли это?, для управления со смартфона или его возможности тоже ограничены 10-20 метрами по каналу "блютуз"?
http://cxem.net/review/review26.php
Как их можно вообще сравнивать HC-12 и HC-05 частоты же разные ?
//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); }приёмник
Нашёл такие скетчи для проекта
В комментариях к посту с этими скетчами были замечания что скетчи не работают, ещё покопавшись в интернете, выяснилось что некоторые платы arduino могут некорректно работать с HC-12 . Так ли это?
Просто в статье было показанно как это нормально фунционирует, но у меня на 2 платах nano это почему-то не работает.
Может имеет место неправильное подключение? подключаю на ардуино передатчике 2 пин с tx на модуле hc12 и 3 пин с rx. на приемнике 4 пин с tx, 5 пин с rx
https://rootsaid.com/4-channel-rc-plane-2/
вы бы для начала убедились, что у вас 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()); } }Да, вы правы, скорее всего проблема в Hc12, так как с вашим скетчем значения не выводяться в монитор порта.
Возможно модули надо перенастроить, но какой режим лучше выбрать? Хотелось бы использовать на максимальной дальности. И есть ли замена Hc12 на аналогичные модули по далности примерно километр
После настройки модулей через АТ команды и танцев с бубнами (поэтапный разбор что работает, а что нет через СОМ порты), удалось запустить скетчи.
И так, рабочие скетчи, вдруг кому-то понадобиться
Спасибо за бесценную помощь!
//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,180); 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); } }Ссылка на документ по настройке реверса и других параметров ESC http://relasko.ru/LOGO/1/XERUN.pdf
И скетчи для 2 регуляторов
//MEGA 2560 TRANSMITER #include <Servo.h> #include <SoftwareSerial.h> SoftwareSerial hc12(10,11);//rx,tx Servo escl; Servo escr; int left; int right; void setup() { escl.attach(10); escr.attach(11); pinMode(A6,INPUT); pinMode(A7,INPUT); Serial.begin(9600); hc12.begin(9600); } void loop() { left=map(analogRead(A6) ,0,1023,0,180); right=map(analogRead(A7) ,0,1023,0,180); hc12.print(left); hc12.print(","); hc12.print(right); hc12.print(","); hc12.println(""); Serial.print(left); Serial.print(","); Serial.print(right); Serial.println(""); delay(100); }//NANO328P RECIVIED #include <Servo.h> #include <SoftwareSerial.h> Servo servo1; Servo servo2; String input; SoftwareSerial hc12(8,9); //TX,RX int x; int y; const char coma=','; void setup() { // put your setup code here, to run once: servo1.attach(10); servo2.attach(4); pinMode(10,OUTPUT); pinMode(4,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(); y=input.indexOf(coma,x+1); int ruddernew=input.substring(x+1,y).toInt(); servo1.write(elevatornew); servo2.write(ruddernew); } delay(10); } }