Здравствуйте. совсем новичок. поморгал лампой, покрутил шаговый мотор энкодером.
Теперь хочу заставить крутится шаговый мотор в зависимости от курса, выдаваемого приемником GPS.
написал два код: На милис, и на задержке.
там где Delay мотор не захотел вращаться вообще
наверное и слава богу.
миллис интересней. моторчик сначала подергивался, но потом поигравшись со верменем, я настроил его вращение, цикл вращение-остановка равняется таймеру tmr1 (но в определенных пределах на таймере в 10000 мс -- цикл становится 30 сек).
мотор крутится и вроде даже на заданный GPS угол.
Но по сути работает неправильно.
1. постоянно крутится , хотя я надеялся на то что мотор повернется от начального положения и в следующий раз будет поворачиваться только по сле смены курса.
хотя сейчас написав это. понял что для этого необходимо сравнивать предыдущее показание курса с новым. как это сделать не знаю.
2. мне кажется я что то не так с милис делаю.
Теперь хочу заставить крутится шаговый мотор в зависимости от курса, выдаваемого приемником GPS.
написал два код: На милис, и на задержке.
там где Delay мотор не захотел вращаться вообще
gps-stepper delay:
void setup() {
stepper.setRunMode(FOLLOW_POS); // режим следования к целевй позиции
stepper.setMaxSpeed(400); // установка макс. скорости в шагах/сек
stepper.setAcceleration(400); // установка ускорения в шагах/сек/сек
// enc.setStepTimeout(500);
// пусть драйвер выключается при достижении позиции
stepper.autoPower(true);
// Инициируем последовательный порт
Serial.begin(9600);
// Инициируем работу с модулем GPS
SettingsGPS.begin(SerialGPS); // Инициируем работу с GPS модулем по указанной шине UART. Функция сама определит текущую скорость GPS модуля ATGM336 (вместо программной шины, можно указывать аппаратные: Serial, Serial1, Serial2, Serial3).
// Инициируем интерпретацию строк NMEA
gps.begin(SerialGPS);
// Устанавливаем часовой пояс
gps.timeZone(3);
// Устанавливаем скорость передачи данных модулем
SettingsGPS.baudrate(9600);
// Указываем, что данные можно получать от спутников GPS и GLONASS
SettingsGPS.system(GPS_GP, GPS_GL);
// Указываем, что нам необходимы только строки с текущей скоростью и временем
SettingsGPS.composition(NMEA_VTG, NMEA_ZDA, NMEA_GLL);
// Устанавливаем режим "Транспортное средство"
SettingsGPS.model(GPS_VEHICLE);
// Указываем частоту обновления
SettingsGPS.updaterate(1);
}
void loop() {
// Считываем данные из модуля
gps.read(i,true);
// Если курс ошибочен
if (gps.errCrs) {
val +=180;
Serial.print("Скорость и курс недостоверны. ");
}
// Иначе
else {
/* Координаты (широта, долгота, высота): */ Serial.print("Ш: "); Serial.print(gps.latitude,5); Serial.print("°, Д: "); Serial.print(gps.longitude,5); Serial.print("°, В: "); Serial.print(gps.altitude,1); Serial.print("м. ");
Serial.print("Скорость: "); Serial.print(gps.speed); Serial.print("км/ч, "); Serial.print(gps.course); Serial.print("°. ");
// Выводим курс
val += gps.course; }
delay (5000);
}
void yeld(){
stepper.tick();
stepper.setTargetDeg(val, ABSOLUTE); // ставим новую позицию
}
миллис интересней. моторчик сначала подергивался, но потом поигравшись со верменем, я настроил его вращение, цикл вращение-остановка равняется таймеру tmr1 (но в определенных пределах на таймере в 10000 мс -- цикл становится 30 сек).
gps-stepper millis:
const uint8_t pinRX = 3; // Определяем вывод RX (программного UART) на плате Arduino к которому подключён вывод TX модуля. Номер вывода можно изменить.
const uint8_t pinTX = 4; // Определяем вывод TX (программного UART) на плате Arduino к которому подключён вывод RX модуля. Номер вывода можно изменить.
#include <FIFO.h>
#include <GStypes.h>
#include <GyverPlanner.h>
#include <GyverPlanner2.h>
#include <GyverStepper.h>
#include <GyverStepper2.h>
#include <StepperCore.h>
#include <iarduino_GPS_NMEA.h> // Подключаем библиотеку для расшифровки строк протокола NMEA получаемых по UART.
#include <iarduino_GPS_ATGM336.h> // Подключаем библиотеку для настройки параметров работы GPS модуля ATGM336.
#include <SoftwareSerial.h> // Подключаем библиотеку для работы с программным UART.
// Инстанцируем объекты библиотек
iarduino_GPS_NMEA gps; // Объявляем объект gps для работы с функциями и методами библиотеки iarduino_GPS_NMEA.
iarduino_GPS_ATGM336 SettingsGPS; // Объявляем объект SettingsGPS для работы с функциями и методами библиотеки iarduino_GPS_ATGM336.
SoftwareSerial SerialGPS(pinRX, pinTX); // Объявляем объект SerialGPS для работы с функциями и методами библиотеки SoftwareSerial, указав выводы RX и TX Arduino.
uint8_t i[30][6]; // Объявляем массив для получения данных о 30 спутниках в формате: {ID спутника (1...255), Отношение сигнал/шум (SNR) в дБ, тип навигационной системы (1-GPS/2-Глонасс/3-Galileo/4-Beidou/5-QZSS), Флаг участия спутника в позиционировании (1/0), Азимут положения спутника (0°...360°), Угол возвышения спутника (0°-горизонт ... 90°-зенит) }.
char* sa[]={"NoName ","GPS ","Глонасс"}; // Определяем массив строк содержащих названия навигационных систем спутников.
char* wd[]={"Вс","Пн","Вт","Ср","Чт","Пт","Сб"}; // Определяем массив строк содержащих по две первых буквы из названий дня недели.
uint32_t myTimer1, myTimer2;
// Обьявляем настойки мотора
#define EB_DEB 50
#define EB_FAST 30
GStepper<STEPPER4WIRE> stepper(2048,9, 7, 8, 6);
//EncButton2<EB_ENCBTN> enc(INPUT, 2, 3, 4); // энкодер с кнопкой
//Обьявляем переменные курса
static float val;
float course; //?? оно надо??
void setup() {
stepper.setRunMode(FOLLOW_POS); // режим следования к целевй позиции
stepper.setMaxSpeed(400); // установка макс. скорости в шагах/сек
stepper.setAcceleration(100); // установка ускорения в шагах/сек/сек
// пусть драйвер выключается при достижении позиции
stepper.autoPower(true);
// Инициируем последовательный порт
Serial.begin(9600);
// Инициируем работу с модулем GPS
SettingsGPS.begin(SerialGPS); // Инициируем работу с GPS модулем по указанной шине UART. Функция сама определит текущую скорость GPS модуля ATGM336 (вместо программной шины, можно указывать аппаратные: Serial, Serial1, Serial2, Serial3).
// Инициируем интерпретацию строк NMEA
gps.begin(SerialGPS);
// Устанавливаем часовой пояс
gps.timeZone(3);
// Устанавливаем скорость передачи данных модулем
SettingsGPS.baudrate(9600);
// Указываем, что данные можно получать от спутников GPS и GLONASS
SettingsGPS.system(GPS_GP, GPS_GL);
// Указываем, что нам необходимы только строки с текущей скоростью и временем
SettingsGPS.composition(NMEA_VTG, NMEA_ZDA, NMEA_GLL);
// Устанавливаем режим "Транспортное средство"
SettingsGPS.model(GPS_VEHICLE);
// Указываем частоту обновления
SettingsGPS.updaterate(1);
}
void loop() {
if (millis() - myTimer1 >= 3000) { // таймер на 2000 мс (1 раз в 2 сек)
myTimer1 = millis(); // сброс таймера
// выполнить действие 1
// Считываем данные из модуля
gps.read(i,true);
// Если курс ошибочен
if (gps.errCrs) {
val +=180;
Serial.print("Скорость и курс недостоверны. ");
}
// Иначе
else {
/* Координаты (широта, долгота, высота): */ Serial.print("Ш: "); Serial.print(gps.latitude,5); Serial.print("°, Д: "); Serial.print(gps.longitude,5); Serial.print("°, В: "); Serial.print(gps.altitude,1); Serial.print("м. ");
Serial.print("Скорость: "); Serial.print(gps.speed); Serial.print("км/ч, "); Serial.print(gps.course); Serial.print("°. ");
// Выводим курс
val += gps.course; }
}
if (millis() - myTimer2 >= 5) { // таймер на 333 мс (3 раза в сек)
myTimer2 = millis(); // сброс таймера
// выполнить действие 2
stepper.tick();
stepper.setTargetDeg(val, ABSOLUTE); // ставим новую позицию
}
}
Но по сути работает неправильно.
1. постоянно крутится , хотя я надеялся на то что мотор повернется от начального положения и в следующий раз будет поворачиваться только по сле смены курса.
хотя сейчас написав это. понял что для этого необходимо сравнивать предыдущее показание курса с новым. как это сделать не знаю.
2. мне кажется я что то не так с милис делаю.