Помогите ламеру.... Есть скетчь нужного мне робота, там используется шильд с библиотекой afmotor.h управления моторами. у меня нет шильда и покупать не хочется, но есть драйверы моторов L298N целых 2 штуки.... Так вот могу ли я как нибудь присандалить вместо шильда драйвер мотора чтобы не химичить со скетчем(а то я не силен-могу только чужое ковырять) И как грамотно заменить LSM303 на hmc5883L? Огромнейшее спасибо всем кто чем нить поможет....)))) Скетчь ниже в сообщении))))
Код нужно вставлять в специальное окно а не в текст сообщения, так он отображается неправильно и читать неудобно. Кнопка возле кавычек, попробуйте.
Код (Text): // 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); } Спасибо за подсказку поправил))) ПоМогИтЕ кТо чем можеТ!!!))) Очень хочу такую игрушку))
1. Какой шилд в оригинале? 2. Компас заменяется легко, т.к. по коду от него сразу получают азимут и дальше работают с ним, а не некими абстрактными величинами.
а вот видео этого самокатика а вот статья про него http://blockduino.blogspot.ru/2013/10/compass-rider.html а какой там шильд незнаю... просто ребенку хотел что то простенькое собрать.... первый опыт... понравилась фигулька... собрать то соберу а как в скетче шильд на драйвер поменять и магнитометр не вкурю никак))) второй день капашусь пытаюсь что нить изменить-сплошная ошибка(((
Люди ну помогите пожалуйста.... Может еще кому захочется собрать потом.... Хочу такую штуку... железо есть-мозгов нет((((
В оригинале такой: http://blockduino.org/mediawiki/index.php?title=BlockMotor Как опция, предлагается такой: http://robotosha.ru/arduino/motor-shield.html Это если судить по библиотекам в коде. В обоих случаях используется L293D Тут есть схема шилда на L298: http://amperka.ru/product/arduino-motor-shield и библиотека для работы с ним. Исходный скретч нужно будет немного переделать. Но тут выбор или купть шилд или напрячь голову
Да конкретней некуда))))))) Arduinка Nano+HMC5883L+драйвер мотора L298N- тем более как я понял(возможно неправильно) в скетче основное прописано, просто надо поменять датчик магнитометр(библиотеки и переменные) и вместо шильда(библиотека <AFMotor.h>) ввести драйвер мотора.... А как сделать не соображу.... Хотя если по правде чтобы сообразить конкретно знаний не хватает... пытался сравнить примеры и поменять библиотеки и переменные но ничего не вышло... Если кто возьмется в свободное время поковыряться рублей 500 на тел закину по результату не в качестве оплаты проекта, а скажем за интерес))) хотелось бы к этой крутилки еще пультик присандалить)) А может кто видел подобные проекты? скинте что есть почитать
А Вы про библиотеку StepperAmperka говорите она вроде для шаговых двигателей а у меня обычный колекторный? А она для драйвера подойдет L298N, а то как я понял драйвер и шильд немного разные вещи и вроде как драйвер без библиотек управляется, сразу с пинов ардуинки......
Установил библиотеку, загрузил пример и как понял там с шаговиком работа.... у меня колекторные моторы и драйвер для них L298N помоему это не совсем то Или я как всегда что то не понял?
Посидел посмотрел примеры работы с драйвером L298N и родил вот это: Код (Text): // 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 #define LED_PIN 13 // номер порта для ножки индикаторного светодиода int IN3 = 5; int IN4 = 4; int ENB = 3; int sensor; // переменная для хранения показания сенсора int dir = 180; // заданное направление int tol = 20; // допустимая точность удерживания направления LSM303 compass; void setup() { pinMode (ENB, OUTPUT); pinMode (IN3, OUTPUT); pinMode (IN4, OUTPUT); 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); // Объявляем порт индикаторного светодиода } 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(){ // подпрограмма Остановка digitalWrite (IN3, LOW); digitalWrite (IN4, LOW); analogWrite(ENB,0); delay(200); } void TurnRight(){ // подпрограмма Поворот направо digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); analogWrite(ENB,255); delay(200); } void TurnLeft(){ // подпрограмма Поворот налево digitalWrite (IN3, LOW); digitalWrite (IN4, HIGH); analogWrite(ENB,255); delay(200); } Тут есть хоть чуть чуть правды?.......... Или опять мимо....? И направте пожалуйста в нужное русло как магнитометр поменять на hmc5883L.... ?))) сие творение не проверял так как магнитометр как в скетче отсутствует а есть только 5883L...
Ковыряюсь пол дня-подскажите безграмотному где капать........ Код (Text): // Compass Rider - Робот удерживающий направление // Note: робот поворачивается по кратчайшему пути! // http://blockduino.org/ // http://blockduino.blogger.com/2013/10/compass-rider.html // Vasyl Yudin // Oct 2013 #include "Wire.h" // библиотека для подключения по протоколу I2C #include "I2Cdev.h" #include "HMC5883L.h" #define LED_PIN 13 // номер порта для ножки индикаторного светодиода int IN3 = 5; int IN4 = 4; int ENB = 3; int sensor; // переменная для хранения показания сенсора int dir = 180; // заданное направление int tol = 20; // допустимая точность удерживания направления HMC5883L compass; void setup() { pinMode (ENB, OUTPUT); pinMode (IN3, OUTPUT); pinMode (IN4, OUTPUT); Serial.begin(9600); // Создаем подключение серийного порта Wire.begin(); // Подключаем протокол I2C compass = HMC5883L(); // создаем экземпляр HMC5883L библиотеки setupHMC5883L(); // инициализация HMC5883L // Значение калибровки. Используйте пример 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); // Объявляем порт индикаторного светодиода } 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(){ // подпрограмма Остановка digitalWrite (IN3, LOW); digitalWrite (IN4, LOW); analogWrite(ENB,0); delay(200); } void TurnRight(){ // подпрограмма Поворот направо digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); analogWrite(ENB,255); delay(200); } void TurnLeft(){ // подпрограмма Поворот налево digitalWrite (IN3, LOW); digitalWrite (IN4, HIGH); analogWrite(ENB,255); delay(200); } Постоянно ошибки и подсвечивается желтым setupHMC5883L(); // инициализация HMC5883L библиотеки все стоят..... возможно глупость наисправлял-ну хоть глянте где пожалуйста
Пытаюсь поменять в скетче магнитометр на HMC5883L....полная засада-помогите плиз кто чем может: Вот исходный вариант Код (Text): // Compass Rider - Робот удерживающий направление // Note: робот поворачивается по кратчайшему пути! // http://blockduino.org/ // http://blockduino.blogger.com/2013/10/compass-rider.html // Vasyl Yudin // Oct 2013 int IN3 = 5; int IN4 = 4; int ENB = 3; #include <Wire.h> // библиотека для подключения по протоколу I2C #include <LSM303.h> // библиотека для работы с микросхемой LSM303 #define LED_PIN 13 // номер порта для ножки индикаторного светодиода int sensor; // переменная для хранения показания сенсора int dir = 180; // заданное направление int tol = 20; // допустимая точность удерживания направления LSM303 compass; void setup() { pinMode (ENB, OUTPUT); pinMode (IN3, OUTPUT); pinMode (IN4, OUTPUT); 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(){ // подпрограмма Остановка digitalWrite (IN3, LOW); digitalWrite (IN4, LOW); analogWrite(ENB,0); delay(200); } void TurnRight(){ // подпрограмма Поворот направо digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); analogWrite(ENB,255); delay(200); } void TurnLeft(){ // подпрограмма Поворот налево digitalWrite (IN3, LOW); digitalWrite (IN4, HIGH); analogWrite(ENB,255); delay(200); } А вот мои безграмотные мытарства Код (Text): // Compass Rider - Робот удерживающий направление // Note: робот поворачивается по кратчайшему пути! // http://blockduino.org/ // http://blockduino.blogger.com/2013/10/compass-rider.html // Vasyl Yudin // Oct 2013 #include "Wire.h" // библиотека для подключения по протоколу I2C #include "I2Cdev.h" #include "HMC5883L.h" #define LED_PIN 13 // номер порта для ножки индикаторного светодиода int IN3 = 5; int IN4 = 4; int ENB = 3; int sensor; // переменная для хранения показания сенсора int dir = 180; // заданное направление int tol = 20; // допустимая точность удерживания направления HMC5883L compass; void setup() { pinMode (ENB, OUTPUT); pinMode (IN3, OUTPUT); pinMode (IN4, OUTPUT); Serial.begin(9600); // Создаем подключение серийного порта Wire.begin(); // Подключаем протокол I2C compass = HMC5883L(); // создаем экземпляр HMC5883L библиотеки setupHMC5883L(); // инициализация HMC5883L // Значение калибровки. Используйте пример 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); // Объявляем порт индикаторного светодиода } 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 setupHMC5883L(){ // инициализация HMC5883L, и проверка наличия ошибок int error; error = compass.SetScale(0.88); // чувствительность датчика из диапазона: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1 if(error != 0) Serial.println(compass.GetErrorText(error)); // если ошибка, то выводим ее error = compass.SetMeasurementMode(Measurement_Continuous); // установка режима измерений как Continuous (продолжительный) if(error != 0) Serial.println(compass.GetErrorText(error)); // если ошибка, то выводим ее } float getHeading(){ // считываем данные с HMC5883L и рассчитываем направление MagnetometerScaled scaled = compass.ReadScaledAxis(); // получаем масштабированные элементы с датчика float heading = atan2(scaled.YAxis, scaled.XAxis); // высчитываем направление // корректируем значения с учетом знаков if(heading < 0) heading += 2*PI; if(heading > 2*PI) heading -= 2*PI; return heading * RAD_TO_DEG; // переводим радианы в градусы } void Stop(){ // подпрограмма Остановка digitalWrite (IN3, LOW); digitalWrite (IN4, LOW); analogWrite(ENB,0); delay(200); } void TurnRight(){ // подпрограмма Поворот направо digitalWrite (IN3, HIGH); digitalWrite (IN4, LOW); analogWrite(ENB,255); delay(200); } void TurnLeft(){ // подпрограмма Поворот налево digitalWrite (IN3, LOW); digitalWrite (IN4, HIGH); analogWrite(ENB,255); delay(200); } Помогите плиз кто чем может