Робот удерживающий направление
- Войдите на сайт для отправки комментариев
Втр, 12/05/2015 - 17:37
Помогите ламеру.... Есть скетчь нужного мне робота, там используется шильд с библиотекой afmotor.h управления моторами. у меня нет шильда и покупать не хочется, но есть драйверы моторов L298N целых 2 штуки.... Так вот могу ли я как нибудь присандалить вместо шильда драйвер мотора чтобы не химичить со скетчем(а то я не силен-могу только чужое ковырять) И как грамотно заменить LSM303 на hmc5883L? Огромнейшее спасибо всем кто чем нить поможет....))))
// Compass Rider - Робот удерживающий направление // Note: робот поворачивается по кратчайшему пути! // http://blockduino.org/ // http://blockduino.blogger.com/2013/10/compass-rider.html // Vasyl Yudin // Oct 2013 #include <Wire.h> // библиотека для подключения по протоколу I2C #include <LSM303.h> // библиотека для работы с микросхемой LSM303 //#include <BDMotor.h> // для BlockDuino и BlockMotor #include <AFMotor.h> // для Arduino и MotorShield #define SPEED 255 // скорость вращения моторчиков, 255 - максимум #define LED_PIN 13 // номер порта для ножки индикаторного светодиода int sensor; // переменная для хранения показания сенсора int dir = 180; // заданное направление int tol = 20; // допустимая точность удерживания направления AF_DCMotor mL(1); // #1 моторчик левой гусеницы AF_DCMotor mR(4); // #2 моторчик правой гусеницы LSM303 compass; void setup() { Serial.begin(9600); // Создаем подключение серийного порта Wire.begin(); // Подключаем протокол I2C compass.init(); // подключаем и compass.enableDefault(); // запускаем компас // Значение калибровки. Используйте пример Calibrate для вашего компаса compass.m_min.x = -543; compass.m_min.y = -303; compass.m_min.z = -300; compass.m_max.x = +195; compass.m_max.y = +408; compass.m_max.z = 312; pinMode(LED_PIN, OUTPUT); // Объявляем порт индикаторного светодиода mL.setSpeed(SPEED); // устанавливаем скорость вращения левого моторчика mR.setSpeed(SPEED); // устанавливаем скорость вращения правого моторчика } void loop() { // ------- Основное тело программы compass.read(); // считываем показания компаса int heading = compass.heading(); // вынимаем из показаний величину направление компаса if (abs(heading - sensor)>320) sensor = heading; // отсекаем проблемный переход из 359° в 1° sensor = (int)digitalLowPass(sensor, heading, 0.7); // отфильтровываем показания компаса (сглаживаем) int dif = sensor - dir; // вычисляем разницу между реальным направлением и заданным int absdif = abs(dif); if (absdif <= tol) Stop(); // если разница меньше допустимой погрешности, то останавливаемся else if (((absdif > 180) && (dif != absdif)) || ((absdif < 180) && (dif == absdif))) TurnLeft(); // иначе определяем кратчайшее направление поворота else TurnRight(); // delay(25); } // конец основной программы, начинаем все сначала // // Подпрограммы // // Цифровой низкочастотный фильт double digitalLowPass(double last_smoothed, double new_value, double filterVal) { return (new_value * (1 - filterVal)) + (last_smoothed * filterVal); } void Stop(){ // подпрограмма Остановка mL.run(RELEASE); mR.run(RELEASE); digitalWrite(LED_PIN, HIGH); } void TurnRight(){ // подпрограмма Поворот направо mL.run(FORWARD); mR.run(BACKWARD); digitalWrite(LED_PIN, LOW); } void TurnLeft(){ // подпрограмма Поворот налево mR.run(FORWARD); mL.run(BACKWARD); digitalWrite(LED_PIN, LOW); }
Помогите плиз... очень хочу такого самокрутящегося роботика)))
данный скетч в таком случае только для примера. научись управлять сначала через драйвер моторами. примеров достаточно
потом загрузи пример для hmc и посмотри как работает. а потом объеденить не составит особого труда
спасибо будем курить бамбук)))