Вложений: 1
	
	
		Модуль управления двигателями Motor Shield v2
	
	
		Здравствуйте! Есть Freeduino и Motor Shield v2 
Вложение 9727
В програмировании не силен-поэтому прошу помощи у сведущих.
Подскажите, как подключить тактовую кнопку для выполнения следующего алгоритма:одно нажатие кнопки- ШД - 100 полных оборотов, остановка.Серво-поворот на 80 градусов,остановка.Отключение питания ШД. Повторное нажатие кнопки-возврат серво в положение 0 градусов.ШД-100 шагов назад.Отключение двигателей. Программа нужна для проекта выдвижного монитора.
	 
	
	
	
		Re: Модуль управления двигателями Motor Shield v2
	
	
		Вот пример работы с шаговым двигателем
	PHP код:
	
#include <Stepper.h>//подключить библиотеку
#define STEPS 100 // полное колличество шагов в одном обороте вашего ЩД
Stepper stepper(STEPS, 5, 6, 7, 8); // создать экземпляр класса , определить пины управления драйвером ШД
void setup()
{
  stepper.setSpeed(30);// скорость вращения вашего ШД, хх оборотов в минуту
}
void loop()
{
// if(ваше условие)
  stepper.step(100); // сделать один оборот 100 шагов 
} 
 
	 
	
	
	
		Re: Модуль управления двигателями Motor Shield v2
	
	
		Благодарю,Chip! Но моя проблема в том,что Motor Shield v2 использует все выводы Freeduino и я не знаю, как подключить кнопку управления и написать правильную программу.Пример управления ШД и серво есть в библиотеке производителя AFMotor, а как использовать кнопку найти не могу.
	 
	
	
		Вложений: 1
	
	
		Re: Модуль управления двигателями Motor Shield v2
	
	
		Кнопка на шилде это кнопка сброса ардуины, подсмотрел на схеме
Вложение 9728
	 
	
	
	
		Re: Модуль управления двигателями Motor Shield v2
	
	
		Вот,что нашел о Motor Shield v2. К сожалению не электронщик и разобраться проблемотично.Chip,если не затруднит, поясните куда подключить кнопку и как прописать ее в прогу.
"Смотрим по схеме http://www.compcar.ru/forum/attachme...8&d=1284480333 со странички описания MotorShield.
Для управления сдвиговым регистром используются ноги 4, 7, 8, 12.
Для реализации ШИМ используются ноги 11, 3, 6, 5  - для двигателей 1, 2, 3, 4 соответственно.
Ноги 9, 10 выведены на разъем Servo, и фактически не задействованы.
Отсюда вывод - свободными остались все аналоговые входы (их же можно использовать как цифровые), ноги 0, 1, 2, 13, ноги 9 и 10 - хочешь для Servo, хочешь под свои цели.
Ну, и если не используются какие-то из четырех каналов управления двигателями, освобождаются соответствующие им ноги из списка 11, 3, 6, 5.
...некоторое неудобство, что никак не отказаться от использования ноги 12, а она участвует в аппаратном SPI, и через нее работает в частности Ethernet Shield (нога 11 тоже SPI) - из-за этого несовместимость MotorShield и EthernetShield. Но, наверняка можно перекидать ноги, и поправить библиотеку AFMotor."
	 
	
	
	
		Re: Модуль управления двигателями Motor Shield v2
	
	
		Методом проб и ошибок написал программу для управления ШД и сервой.Планирую использовать ее для управления монитором в машине.Алгоритм таков: одно нажатие кнопки-ШД делает определенное кол-во шагов вперед и останавливается, серва поворачивается на 180 градусов и останавливается, повторное нажатие кнопки - серва отрабатывает движение на 180 градусов назад и останавливается,ШД отрабатывает определенное кол-во шагов назад и останавливается.
	PHP код:
	
#include <AFMotor.h>
#include <Servo.h>
Servo myservo;// создаём объект для контроля сервы 
int pos = 0;     // переменная для хранения позиции сервы 
int inPin = 2; // контакт, к которому подключена кнопка
int outPin = 9; // контакт, к которому подключен светодиод
AF_Stepper motor(200, 2);//Создаем объект для двигателя на 2 канале (M3 и M4)
int state = HIGH; // the current state of the output pin
int reading; // the current reading from the input pin
int previous = LOW; // the previous reading from the input pin
long time = 0; // the last time the output pin was toggled
long debounce = 200; // the debounce time, increase if the output flickers
void setup()
{
pinMode(inPin, INPUT);
pinMode(outPin, OUTPUT);
motor.setSpeed(100); // 100 оборотов в минуту
myservo.attach(10);  // серва подключена к 10-му пину
myservo.writeMicroseconds(500); // устанавливаем серву в крайнее левое положение
}
void loop()
{
reading = digitalRead(inPin);
if (reading == HIGH && previous == LOW && millis() - time > debounce) 
{
if (state == HIGH) {
 motor.step(860, FORWARD, SINGLE); // движение ШД вперед
  for(pos = 0; pos < 180; pos += 1)  // от 0 до 180 градусов
  {                                  // с шагом в 1 градус
    myservo.write(pos);              
    delay(15);    // ждём 15ms пока серва займёт новое положение
  }
 } 
else {
  for(pos = 180; pos>=1; pos-=1)     // от 180 до 0 градусов
  {
    myservo.write(pos);
    delay(15);
  }
 motor.step(860, BACKWARD, SINGLE); // движение ШД назад
 motor.release(); // отключение ШД 
}
if (state == HIGH)
state = LOW;
else
state = HIGH; 
time = millis();
}
digitalWrite(outPin, state);
previous = reading;
}