Робот удерживающий направление

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Помогите ламеру.... Есть скетчь нужного мне робота, там используется шильд с библиотекой 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);
}

 

 

Помогите плиз... очень хочу такого самокрутящегося роботика)))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

данный скетч в таком случае только для примера. научись управлять сначала через драйвер моторами. примеров достаточно

потом загрузи пример для hmc и посмотри как работает. а потом объеденить не составит особого труда

ToxaRU
Offline
Зарегистрирован: 03.04.2015

спасибо будем курить бамбук)))