// Adafruit Motor shield library // copyright Adafruit Industries LLC, 2009 // this code is public domain, enjoy! // Съемка сферической панорамы камерой NEX-5 // www.rwpbb.ru, 2011 #include int pulscount=1; // Счетчик числа импульсов в пакете ИК int puls = 4; // Число пакетов ИК AF_Stepper motor1(48, 1); // Число шагов на один оборот мотора для 1 двигателя AF_Stepper motor2(200, 2); int buttonPin = 9; // Ножка перемычки. Если 5В, то съемка с насадкой в два ряда int buttonState = 0; // Состояние перемычки int wzat = 3000; // Время нажатия кнопки затвора - 3 с int wp = 4000; // Пауза перед спуском затвора - 4 с int mstepx = 280; // Число шагов двигателя при повороте на единичный угол по горизонтали (360 - 1400) int nmstepx = 4; // 5 снимков в ряду по горизонтали для съемки с насадкой int mstepy = 1700; // Число шагов двигателя при повороте на единичный угол по вертикали (180 - 5000) int nmstepy = 1; void setup() { TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // phase and frequency correct mode. NON-inverted mode TCCR1B = _BV(WGM13) | _BV(CS10); // Делитель N = 1 - (_BV(CS10)); 8 - (_BV(CS11)) OCR1B = 0; // Скважность 102 - рабочий сигнал, 0 - сигнал отсутствует ICR1 = 210; // Частота 16мГц/2*N*ICR1 = 16000кГц/(2*1*210)=38095Гц pinMode(10, OUTPUT); // К 10 ножке подключен ИК светодиод АЛ107 через сопротивление 1 кОм pinMode(buttonPin, INPUT); // Включаем ножку на прием сигналов digitalWrite(buttonPin, LOW); //включаем подтягивающие резисторы на землю buttonState = digitalRead(buttonPin); // Чтение состояния перемычки motor1.setSpeed(40); // Скорость вращения 40 оборотов в минуту motor1.release(); // Отключаем питание двигателя motor2.setSpeed(15); motor2.release(); if (buttonState == LOW) { mstepx = 140; nmstepx = 9; mstepy = 1500; nmstepy = 2; } motor2.step((mstepy*nmstepy/2), FORWARD, DOUBLE); // Поворачиваем вниз motor2.release(); for (int i=0; i <= nmstepx; i++) { IR_Sony(); // Нажимаем спусковую кнопку motor1.step(mstepx, FORWARD, DOUBLE); motor1.release(); } motor1.step((mstepx/2), FORWARD, DOUBLE); // Поворачиваем на пол угла по горизонтали motor1.release(); motor2.step(mstepy, BACKWARD, DOUBLE);// Поворачиваем камеру вверх motor2.release(); for (int i=0; i <= (nmstepx-1); i++) { IR_Sony(); // Нажимаем спусковую кнопку motor1.step(mstepx, FORWARD, DOUBLE); motor1.release(); } IR_Sony(); // Нажимаем спусковую кнопку motor1.step((mstepx/2), FORWARD, DOUBLE); // Поворачиваем на пол угла по горизонтали motor1.release(); if (buttonState == LOW) { motor2.step(mstepy, BACKWARD, DOUBLE);// Поворачиваем камеру вверх motor2.release(); for (int i=0; i <= (nmstepx); i++) { IR_Sony(); // Нажимаем спусковую кнопку motor1.step(mstepx, FORWARD, DOUBLE); motor1.release(); } } motor2.step((mstepy*nmstepy/2), FORWARD, DOUBLE); // Поворачиваем вниз в исходное состояние motor2.release(); } void loop() { } void IR_Sony() { //Подпрограмма подачи ИК сигналя для спуска зотвора камеры NEX5 digitalWrite(13, HIGH);//Индикация паузы светодиодом на плате delay(wp);// Пауза перед спуском затвора digitalWrite(13, LOW); pulscount=1; while (pulscount