Требуется помощь в написании программы

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 Здравствуйте!

За помощь готов проставиться (Питер/Москва) или заказать в подарок книжку с озона или кинуть денег на телефон и послать лучиков добра. На выбор. 

Есть ардуино+мотор шилд, 2 сервы, 2 dc мотора, 4 кнопки. Языками программирования совершенно не владею, объясняю как могу:

Включение

Серво 1 положение1, Серво 2 положение 1

Проверка кнопки 1. Если нажата, то ничего. Если нет, то мотор 1 вперед, пока не нажмется.

Проверка кнопки 2. Если нажата, то ничего. Если нет, то мотор 2 вперед, пока не нажмется.

Ожидание кнопки 3. Если произошло событие нажатия кнопки, то

Мотор 2 назад, пока не нажмется кнопка 4

Серво 1 положение 2 и сразу положение 3

Серво 2 положение 2

В начало

Это для модели рекламного аппарата раздачи всякой подарочной фигни

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

А кнопки как подключаете? 

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 Через сопротивление 10кОм. Как здесь написано http://freeduino.ru/arduino/sample_Buttons.html

past0r
Offline
Зарегистрирован: 29.03.2012

Вы посмотрите остальные примеры! Может и самостоятельно сделаете =) т.к. ничего сложного нет.. Могу порекомендовать видео уроки

maksim
Offline
Зарегистрирован: 12.02.2012

morskoiboy пишет:

 Через сопротивление 10кОм. Как здесь написано http://freeduino.ru/arduino/sample_Buttons.html

Там совершенно два противоположных способа подключения, какой из них?

maksim
Offline
Зарегистрирован: 12.02.2012

Лучше использовать первый способ, тогда резисторы можно вообще убрать. И "подтяжку" к +5в сделать програмно.

 

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 Я с удовольствием потом все посмотрю и научусь. Сейчас просто форс-мажор. Завтра уже надо показывать, а у меня еще механика не доделана

morskoiboy
Offline
Зарегистрирован: 07.04.2012

Могу любой какой скажете. Говорят первый предпочтительнее

maksim
Offline
Зарегистрирован: 12.02.2012

maksim пишет:

Лучше использовать первый способ, тогда резисторы можно вообще убрать. И "подтяжку" к +5в сделать програмно.

 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 А по мне то второй логично. Хотя всё равно лишь бы работало в вашем случае.
В помощь:
Кнопки
Сервы
 

maksim
Offline
Зарегистрирован: 12.02.2012

И так. Так как моторшилд занимает практически все цифровые выводы (пины) будем подключать кнопки к аналоговым входам (ANALOG IN)  0, 1, 2, 3 кнопки 1, 2, 3, 4 соответственно, резисторы можно убрать(т.е. один конец кнопки к выводу, а другой к GND и всё). Двигатили подключаем к М1 и М2. Вот протестируйте  код, включение и первые две кнопки должны работать.

#include <AFMotor.h>
#include <Servo.h>

#define BUTTON1 14 // ANALOG IN 0
#define BUTTON2 15 // ANALOG IN 1
#define BUTTON3 16 // ANALOG IN 2
#define BUTTON4 17 // ANALOG IN 3

#define POS1 25
#define POS2 160
#define POS2 100

AF_DCMotor MOTOR1(1);
AF_DCMotor MOTOR2(2);

Servo SERVO1;
Servo SERVO2;

void setup() {
  SERVO1.attach(9);
  SERVO2.attach(10);

  MOTOR1.setSpeed(255);
  MOTOR2.setSpeed(255);
  MOTOR1.run(RELEASE);
  MOTOR2.run(RELEASE);

  SERVO1.write(POS1);
  SERVO2.write(POS1);

  digitalWrite(BUTTON1, HIGH); 
  digitalWrite(BUTTON2, HIGH); 
  digitalWrite(BUTTON3, HIGH); 
  digitalWrite(BUTTON4, HIGH); 
}


void loop() {
  if(digitalRead(BUTTON1)){
    MOTOR1.run(FORWARD);
  }
  else{
    MOTOR1.run(RELEASE);
  }
  if(digitalRead(BUTTON2)){
    MOTOR2.run(FORWARD);
  }
  else{
    MOTOR2.run(RELEASE);
  }
  //MOTOR1.run(FORWARD);
  //MOTOR2.run(BACKWARD);
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

LEVV2006 пишет:

 А по мне то второй логично. Хотя всё равно лишь бы работало в вашем случае.
   

Просто в первом случае можно отказаться от подтягивающих резисторов. 

 

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 Сейчас попробую, через полчаса отпишусь

maksim
Offline
Зарегистрирован: 12.02.2012

С 3 кнопки можно поподробнее? 

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 При включении аппарата происходит приведение в боевую готовность (сервы в положения 1, моторы вперед пока не нажмутся кнопки 1 и 2). Кнопка 3 (кратковременное нажатие) запускает выдачу товара, т.е. нажал -  машина выдала тебе товар (Мотор 2 назад, пока не нажмется кнопка 4, серво 1 положение 2 и сразу положение 3, серво 2 положение 2)  и опять привелась в боевую готовность (сервы в положения 1, моторы вперед пока не нажмутся кнопки 1 и 2) . 

maksim
Offline
Зарегистрирован: 12.02.2012

Еще раз. Нажали кнопку 3, что происходит? Только 2 дв. назад? Подробнее! А не тоже самое!

maksim
Offline
Зарегистрирован: 12.02.2012

И как 2 двигатель будет крутиться назад если кнопка 2 отпущена?(по вашему же условию: Если нажата, то ничего. Если нет, то мотор 2 вперед, пока не нажмется.)

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 Получается, что после нажатия кнопки 3 устройство должно перестать реагировать на кнопку 2 и реагировать на кнопку 4 пока цикл не завершится. И наоборот,  при старте/начале цикла не реагировать на кнопку 4, а реагировать на кнопку 2. Спасибо за наводящие вопросы, я сразу об этом не подумал. Сейчас проверяю ваш код, через пару минут отпишусь.

maksim
Offline
Зарегистрирован: 12.02.2012

Сервы в какой момент, должны начинать работать?

 

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 Кнопки 2 и 4 это крайние положения штока толкателя. Когда он едет от 2 к 4 происходит выдача, а когда наоборот взвод в боевое положение.

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 Сервы начинают работать после нажатия кнопки 4

maksim
Offline
Зарегистрирован: 12.02.2012

Опишите подробно алгоритм работы серв с временными интервалами.
 

morskoiboy
Offline
Зарегистрирован: 07.04.2012

После старта сначала сервы (можно оновременно), сразу за ними моторы 1 и 2. После нажатия кнопки 3 сначала мотор 2 до нажатия кнопки 4, после сразу серво 1 в положение 2, пауза полсекунды, и в положение 3. Сразу после серво 2 в положение 2. 

 

Странно, я распаковал библиотеку AFMotor в libraries, а все равно пишет C:\arduino-1.0\libraries\AFMotor\AFMotor.cpp:7:22: error: WProgram.h: No such file or directory

 

maksim
Offline
Зарегистрирован: 12.02.2012

Закройте и снова запустите IDE

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 Да нет, библиотека старая оказалась. Ваш код работает отлично. Кнопки нажаты - моторы стоят, отжаты - крутятся.

maksim
Offline
Зарегистрирован: 12.02.2012

Так а первый двигатель зачем? 

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 Первый крутит барабанный магазин с товаром. Если в ячейке есть товар, то нажимается кнопка 1.

maksim
Offline
Зарегистрирован: 12.02.2012

Сейчас проверить не на чем, так что если что-то не так пишите подробно, параметры для настройки в начале кода.

#include <AFMotor.h>
#include <Servo.h>

#define BUTTON1 14 // ANALOG IN 0 Кнопка 1
#define BUTTON2 15 // ANALOG IN 1 Кнопка 2
#define BUTTON3 16 // ANALOG IN 2 Кнопка 3
#define BUTTON4 17 // ANALOG IN 3 Кнопка 4

#define POS1SERVO1 10   // Положение 1 Серва 1 в градусах
#define POS2SERVO1 100  // Положение 2 Серва 1 в градусах
#define TIME2SERVO1 800  // Время поворота сервы и задержка в миллисекундах
#define POS3SERVO1 165  // Положение 3 Серва 1 в градусах
#define TIME3SERVO2 300  // Время поворота сервы в миллисекундах

#define POS1SERVO2 15   // Положение 1 Серва 2 в градусах
#define POS2SERVO2 180  // Положение 2 Серва 2 в градусах
#define TIME2SERVO2 500  // Время поворота сервы в миллисекундах

AF_DCMotor MOTOR1(1);
AF_DCMotor MOTOR2(2);

Servo SERVO1;
Servo SERVO2;

void setup() {

  digitalWrite(BUTTON1, HIGH); 
  digitalWrite(BUTTON2, HIGH); 
  digitalWrite(BUTTON3, HIGH); 
  digitalWrite(BUTTON4, HIGH); 

  SERVO1.attach(9);
  SERVO2.attach(10);
  SERVO1.write(POS1SERVO1);
  SERVO2.write(POS1SERVO2);

  MOTOR1.setSpeed(255);
  MOTOR2.setSpeed(255);  
  MOTOR1.run(FORWARD);
  MOTOR2.run(FORWARD);
}

boolean motor2state, button2state, button3state, button4state = 0;

void loop() {
  if(digitalRead(BUTTON1)){
    delay(300);
    MOTOR1.run(FORWARD);
  }
  else{
    MOTOR1.run(RELEASE);
  }

  if(!digitalRead(BUTTON2) && !button2state){
    MOTOR2.run(RELEASE);
    button2state = 1;
    delay(50);
  }
  if(digitalRead(BUTTON2)){
    button2state = 0;
    delay(50);
  }

  if(!digitalRead(BUTTON3) && !button3state){
    MOTOR2.run(BACKWARD);
    button3state = 1;
    delay(50);
  }
  if(digitalRead(BUTTON2)){
    button3state = 0;
    delay(50);
  }

  if(!digitalRead(BUTTON4) && !button4state){
    MOTOR2.run(RELEASE);
    button4state = 1;
    delay(50);
    SERVO1.write(POS2SERVO1);
    delay(TIME2SERVO1);
    SERVO1.write(POS3SERVO1);
    delay(TIME3SERVO2);

    SERVO2.write(POS2SERVO2);  
    delay(TIME2SERVO2); 
    
    SERVO1.write(POS1SERVO1);
    SERVO2.write(POS1SERVO2);
    MOTOR2.run(FORWARD);
  }
  if(digitalRead(BUTTON4)){
    button4state = 0;
    delay(50);
  }
}

 

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 На макете все вроде работает, иногда почему-то на кнопки не реагирует, но в целом все OK. Сейчас попробую собрать все на устройстве

morskoiboy
Offline
Зарегистрирован: 07.04.2012

Кнопка 1 и кнопка 4 все ОК. Кнопки 2 и 3 случайным образом иногда реагируют, а иногда нет. Чаще не реагируют. 

Если убрать из кода строки 69-70-71, то с кнопкой 2 все становится ОК, но кнопка 3 реагирует только в первом после включения цикле, а дальше не реагирует.

maksim
Offline
Зарегистрирован: 12.02.2012

Вот ошибка, в 69 строке поменяйте BUTTON2 на BUTTON3, проглядел.

morskoiboy
Offline
Зарегистрирован: 07.04.2012

 maksim, вы мне очень помогли, все работает отлично! Как я могу вас отблагодарить?

maksim
Offline
Зарегистрирован: 12.02.2012