СпойлерПоказать
/*Пример скетча для управления катером через компас
*/
#include <PWMServo.h> // библиотека безконфликтной работы https://yadi.sk/d/Oa5qEXXv3Xvfjk
#include <Wire.h> // библиотека I2C (стандартная)
#include <MechaQMC5883.h> // библиотека компаса https://yadi.sk/d/RF0VF6tA3Xvfjb
#define pwmA 3 // ШИМ правый двигатель
#define Ain2 4 // правый двигатель -
#define Ain1 5 // правый двигатель +
#define Bin1 6 // левый двигатель +
#define Bin2 7 // левый двигатель -
#define pwmB 9 // ШИМ левый двигатель
byte PWM = 255; // устанавливаем значение ШИМ для моторов (регулировка напряжения питания двигателей)
byte angle = 97; // устанавливаем начальный угол сервы, при котором перо руля будет параллельно движению
int vector = 0; // устанавливаем начальный курс для старта, если поставить 0 платформа не тронется до нажатия кнопки D2
MechaQMC5883 qmc; // The CompassLib object
PWMServo servo1;
/* блок функций управления моторами*/
void motor_off() //---Выключить моторы
{
digitalWrite(Ain1, LOW); // выключены ДВА двигателя
digitalWrite(Ain2, LOW); // выключены ДВА двигателя
digitalWrite(Bin1, LOW); // выключены ДВА двигателя
digitalWrite(Bin2, LOW); // выключены ДВА двигателя
analogWrite(pwmA, 0); // на 0% мощности
analogWrite(pwmB, 0); // на 0% мощности
}
void set_forward() //---Полный вперед
{
digitalWrite(Ain1, HIGH); // работают ДВА двигателя
digitalWrite(Ain2, LOW); // работают ДВА двигателя
digitalWrite(Bin1, HIGH); // работают ДВА двигателя
digitalWrite(Bin2, LOW); // работают ДВА двигателя
analogWrite(pwmA, PWM); // на 100% мощности
analogWrite(pwmB, PWM); // на 100% мощности
}
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(pwmA, OUTPUT); // инициализируем пины для управления двигателями
pinMode(pwmB, OUTPUT); // инициализируем пины для управления двигателями
pinMode(Ain1, OUTPUT); // инициализируем пины для управления двигателями
pinMode(Ain2, OUTPUT); // инициализируем пины для управления двигателями
pinMode(Bin1, OUTPUT); // инициализируем пины для управления двигателями
pinMode(Bin2, OUTPUT); // инициализируем пины для управления двигателями
pinMode(2, INPUT); // назначаем пин кнопки D2
pinMode(13, OUTPUT); // подключаем встроенный светодиод
servo1.attach(SERVO_PIN_B); // назначаем пин D10 сервоприводу
qmc.init(); // инициируем компас
qmc.setMode(Mode_Continuous, ODR_10Hz, RNG_8G, OSR_512); // устанавливаем параметры работы компаса
}
void loop() {
/* блок работы компаса*/
int x, y, z;
qmc.read(&x, &y, &z);
float heading = atan2(y, x);
float declinationAngle = 6.7;// значение магнитного склонения, искать в справочнике для своей местности
heading += declinationAngle;
if (heading < 0)
heading += 2 * PI;
if (heading > 2 * PI)
heading -= 2 * PI;
int azimuth = heading * 180 / M_PI;
/* блок работы кнопки: при нажатии запоминает текущий курс*/
if (vector == 0) { // ждем нажатия кнопки (задаем курс)
motor_off();
}
if (digitalRead(2) == HIGH) {
vector = azimuth;
digitalWrite(13, HIGH);
}
else {
digitalWrite(13, LOW);
}
/*создание переменной для управления моторами */
int g = azimuth - vector; // измеряем величину и направление отклонения от курса
while (g >= 180)
g -= 360;
while (g < -180)
g += 360;
int s = fabs (g) * 2 ; // переменная угла поворота сервы от G
s = constrain(s, 1, 49); // ограничиваем значения S диапазоном поворота руля (49* определен экспериментально)
/* блок управления моторами*/
if (g == 0) {
servo1.write(angle); //---Полный вперед
}
if (g < 0) {
servo1.write(angle + s); //---Установка влево
}
if (g > 0) {
servo1.write(angle - s); //---Установка вправо
}
// блок диагностики работы программы
Serial.print("AZ: ");
Serial.print(azimuth);
Serial.print(" ");
Serial.print("vect: ");
Serial.print(vector);
Serial.print(" ");
Serial.print("G: ");
Serial.print(g);
Serial.print(" ");
Serial.print("S: ");
Serial.print(s);
Serial.print(" ");
Serial.print("angle: ");
Serial.print(servo1.read());
Serial.print(" ");
Serial.println();
delay (500); // задержка цикла
}
*/
#include <PWMServo.h> // библиотека безконфликтной работы https://yadi.sk/d/Oa5qEXXv3Xvfjk
#include <Wire.h> // библиотека I2C (стандартная)
#include <MechaQMC5883.h> // библиотека компаса https://yadi.sk/d/RF0VF6tA3Xvfjb
#define pwmA 3 // ШИМ правый двигатель
#define Ain2 4 // правый двигатель -
#define Ain1 5 // правый двигатель +
#define Bin1 6 // левый двигатель +
#define Bin2 7 // левый двигатель -
#define pwmB 9 // ШИМ левый двигатель
byte PWM = 255; // устанавливаем значение ШИМ для моторов (регулировка напряжения питания двигателей)
byte angle = 97; // устанавливаем начальный угол сервы, при котором перо руля будет параллельно движению
int vector = 0; // устанавливаем начальный курс для старта, если поставить 0 платформа не тронется до нажатия кнопки D2
MechaQMC5883 qmc; // The CompassLib object
PWMServo servo1;
/* блок функций управления моторами*/
void motor_off() //---Выключить моторы
{
digitalWrite(Ain1, LOW); // выключены ДВА двигателя
digitalWrite(Ain2, LOW); // выключены ДВА двигателя
digitalWrite(Bin1, LOW); // выключены ДВА двигателя
digitalWrite(Bin2, LOW); // выключены ДВА двигателя
analogWrite(pwmA, 0); // на 0% мощности
analogWrite(pwmB, 0); // на 0% мощности
}
void set_forward() //---Полный вперед
{
digitalWrite(Ain1, HIGH); // работают ДВА двигателя
digitalWrite(Ain2, LOW); // работают ДВА двигателя
digitalWrite(Bin1, HIGH); // работают ДВА двигателя
digitalWrite(Bin2, LOW); // работают ДВА двигателя
analogWrite(pwmA, PWM); // на 100% мощности
analogWrite(pwmB, PWM); // на 100% мощности
}
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(pwmA, OUTPUT); // инициализируем пины для управления двигателями
pinMode(pwmB, OUTPUT); // инициализируем пины для управления двигателями
pinMode(Ain1, OUTPUT); // инициализируем пины для управления двигателями
pinMode(Ain2, OUTPUT); // инициализируем пины для управления двигателями
pinMode(Bin1, OUTPUT); // инициализируем пины для управления двигателями
pinMode(Bin2, OUTPUT); // инициализируем пины для управления двигателями
pinMode(2, INPUT); // назначаем пин кнопки D2
pinMode(13, OUTPUT); // подключаем встроенный светодиод
servo1.attach(SERVO_PIN_B); // назначаем пин D10 сервоприводу
qmc.init(); // инициируем компас
qmc.setMode(Mode_Continuous, ODR_10Hz, RNG_8G, OSR_512); // устанавливаем параметры работы компаса
}
void loop() {
/* блок работы компаса*/
int x, y, z;
qmc.read(&x, &y, &z);
float heading = atan2(y, x);
float declinationAngle = 6.7;// значение магнитного склонения, искать в справочнике для своей местности
heading += declinationAngle;
if (heading < 0)
heading += 2 * PI;
if (heading > 2 * PI)
heading -= 2 * PI;
int azimuth = heading * 180 / M_PI;
/* блок работы кнопки: при нажатии запоминает текущий курс*/
if (vector == 0) { // ждем нажатия кнопки (задаем курс)
motor_off();
}
if (digitalRead(2) == HIGH) {
vector = azimuth;
digitalWrite(13, HIGH);
}
else {
digitalWrite(13, LOW);
}
/*создание переменной для управления моторами */
int g = azimuth - vector; // измеряем величину и направление отклонения от курса
while (g >= 180)
g -= 360;
while (g < -180)
g += 360;
int s = fabs (g) * 2 ; // переменная угла поворота сервы от G
s = constrain(s, 1, 49); // ограничиваем значения S диапазоном поворота руля (49* определен экспериментально)
/* блок управления моторами*/
if (g == 0) {
servo1.write(angle); //---Полный вперед
}
if (g < 0) {
servo1.write(angle + s); //---Установка влево
}
if (g > 0) {
servo1.write(angle - s); //---Установка вправо
}
// блок диагностики работы программы
Serial.print("AZ: ");
Serial.print(azimuth);
Serial.print(" ");
Serial.print("vect: ");
Serial.print(vector);
Serial.print(" ");
Serial.print("G: ");
Serial.print(g);
Serial.print(" ");
Serial.print("S: ");
Serial.print(s);
Serial.print(" ");
Serial.print("angle: ");
Serial.print(servo1.read());
Serial.print(" ");
Serial.println();
delay (500); // задержка цикла
}