Понятненько ))) Так как у меня есть только Motor Shield и нет таких микросхем и моторов, то получился "сферический конь в вакууме" ))
// Надо подцепить подтягивающие резисторы внешние между gnd и 14 и 15 пинами (это 0 и 1 analog in)
// кнопки включаем между 5+ и 14 и 15 пинами, кнопки нормально разомкнуты
// this code is public domain, enjoy!
#include <AFMotor.h>
// Connect a stepper motor with 48 steps per revolution (7.5 degree)
// to motor port #2 (M3 and M4)
AF_Stepper motor2(48, 1);
AF_Stepper motor3(48, 2);
int kon2 = 14; // на какой пин концевик горизонтали (это 0 аналоговый пин)
int kon3 = 15; // на какой пин концевик вертикали (1 аналоговый пин)
int b_power = 16; //пин сигнал включения фотоаппарата (2 аналоговый пин)
int b_start = 17; // пин сигнал съемки (3 аналоговый пин)
int state2 = 0; //начальное положение
int state3 = 0; // то же самое
void setup() {
pinMode(kon2, INPUT); //концевик горизонтали
pinMode(kon3, INPUT); // концевик вертикали
pinMode(b_power, OUTPUT); // говорим ардуине, что этим пином включаем фотик
pinMode(b_start, OUTPUT); // этим пином будем фотографировать
digitalWrite(b_power, LOW); //на выходе для включения фотика 0
digitalWrite(b_start, LOW); //на выходе для кнопки спуска 0
motor2.setSpeed(10); // 10 rpm скорость вращения ротора задаем
motor3.setSpeed(10);
}
void loop() {
start();
digitalWrite(b_power, HIGH); //включаем фотик. Считаем, что + должен быть всегда, пока фотик включен
//delay(300); //если нужен только импульс, то расскоментируем строки. Задержка в миллисекундах
// digitalWrite(b_power, LOW); //и эту тоже
foto(); // делаем снимок
// поворачиваем и фотаем 12 раз по 30 градусов
overshtag();
vozvrat();// возвращаем по горизонту в начальное положение
motor3.step(6, FORWARD, SINGLE); //задираем фотик на 45 градусов или на 6 шагов
foto();
overshtag();
vozvrat();
motor3.step(6, FORWARD, SINGLE); //задираем фотик на 45 градусов или на 6 шагов
foto();
overshtag();
vozvrat();
motor3.step(6, FORWARD, SINGLE); //задираем фотик на 45 градусов или на 6 шагов
foto();
start(); //возврат в исходное положение
}
void start() {
// считываем положения концевиков, сначала горизонт
state2 = digitalRead(kon2);
while(state2 == LOW) {
//концевик не нажат, крутим мотор против часовой стрелки
motor2.step(1, BACKWARD, SINGLE);
state2 = digitalRead(kon2);
}
//теперь вертикаль
state3 = digitalRead(kon3);
while(state3 == LOW) {
motor3.step(1, BACKWARD, SINGLE);
state3 = digitalRead(kon3);
}
}
void foto() {
digitalWrite(b_start, HIGH); // делаем импульс 300 миллисекунд, имитируем нажатие кнопки
delay(300);
digitalWrite(b_start, LOW);
delay(3000); // три секунды фотику на настройку резкости и собственно снимок
}
void overshtag(){
// крутим по горизонтали на 4 шага и делаем фото(48 шагов на оборот делим на 4), если есть редуктор, корректируем
for (int i=0; i <= 11; i++){
motor2.step(4, FORWARD, SINGLE); // подпрограмма поворота по горизонтали на 30 градусов
digitalWrite(b_start, HIGH); // делаем импульс 300 миллисекунд, имитируем нажатие кнопки
delay(300);
digitalWrite(b_start, LOW);
delay(3000); // три секунды фотику на настройку резкости и собственно снимок
}
}
void vozvrat(){
state2 = digitalRead(kon2);
while(state2 == LOW) {
//концевик не нажат, крутим мотор против часовой стрелки
motor2.step(1, BACKWARD, SINGLE);
state2 = digitalRead(kon2);
}
}