Судомоделизм. Замена резиномотора на эл. двигатель с упр. ардуино.

BaltikRoy
Offline
Зарегистрирован: 15.03.2017

Преподователь судомодельного кружка просит помощи специалистов. Решил с учениками сделать модель подводной лодки с эл. двигателем. Можно использовать таймер, но в этом случае лодка идёт постоянной скоростью увеличивая деферент на нос и утыкается в дно. Вследствии чего необходимо уменьшать обороты двигателя подобно резиномотору. С уменьшением скорости движения лодки уменьшается эффективность носовых рулей и лодка выравнивается,а после остановки мотора всплывает, во как-то так. Задача для Ардуино NanoV3 1. включение программы- замкнуть контакы герконового реле с помощью магнита (подобие кнопки без фиксации ) 2. защита от дребезга. 3. быстрый набор оборотов до max 4. рабботаем на max 7 сек. 5. снижаем обороты на 50%. 6. работаем 7 сек. 7. снижаем обороты до 25% от max (примерно) 8. работаем5 сек 9. стоп мотор, ждём команды (замыкания кнтктов геркона). Я принял попытку но она не работает. К сожалению не смог скинуть схему. Тразистор Mofset IRL 2505 , мотор 6v/ 3A, геркон и резисторы на 200 Ом перед затвором и на 10 Ком подтяжка.

int     switchPin     = 5;//контакт к которому подключена кнопка
int     ledPin        = 9;//контакт к которому подключён затвор транзистора
boolean currentButton = LOW;
boolean lastButton    = LOW;//введём переменную для запоминания положения кнопки
boolean ledOn         = false;//запомнить состояние затвора транзистора,чтобы переключать его
int     speedWer      = 0;//теперь эта переменная отвечает за скорость вращения
int     stepSpeed     = 1;//шаг изменения скорости
int     stepSpeedCurrent = 1;//шаг изменения скорости текущий
boolean InMotion         = LOW;// Состояние движения
 
void setup()
{
  pinMode(switchPin, INPUT); // определяем switchPin как вход
  pinMode(ledPin, OUTPUT);   // определяем ledPin как выход
}
 
// функция устранения дребезга
boolean debouce_ZERO(boolean curr_state)
{
  boolean state = LOW;
  if ((curr_state != lastButton) && (curr_state == LOW) ) 
  {
    state = HIGH;
  }
  else                                                  
  {
    state = LOW;
  }
 
  // Запоминаем состояние кнопки
  lastButton = curr_state;
 
  return state;
};
 
 
void loop()
{
 
  boolean current = true;
 
  current = digitalRead(switchPin);
 
  delay(3);
 
  boolean button_0 = debouce_ZERO(current);
 
  if ( button_0 ) // в момент отпускания кнопки
  {
    if (InMotion == LOW) 
    {
      InMotion = HIGH;
    }
    ledOn = !ledOn;  // Состояние светодиода инвертируется
    speedWer = 255;  // Максимальная скорость
  }
 
 
  // digitalWrite(ledPin, ledOn); // Управление светодиодом
 
  // ??? ledPin - порт управления светодиодом, а не мотором
  analogWrite(ledPin, speedWer);   //устанавливаем скорость вращения мотора
 
  if (speedWer == 255) // Если скорость равна равна 255
  {
    delay(7000);
    stepSpeedCurrent = -stepSpeed;
  }
 
  if (speedWer == 177)
  {
    delay(7000);
  }
 
  if (speedWer == 100)
  {
    delay(5000);
  }
 
  if (speedWer == 0)
  {
    stepSpeedCurrent = stepSpeed;
    InMotion = LOW;   // Переход в состояние ОСТАНОВ
    delay(30);
  }
 
  speedWer = speedWer + stepSpeedCurrent; //изменяем текущее значение скорости вращения
 
  if (InMotion == LOW)  
  {
 
pev0270
Offline
Зарегистрирован: 02.11.2015

Надо использовать таймер от0 до 19 сек. и сделать условия что при времени больше 0 но меньше или равно 7 сек, мощность 100%, при условии больше 7 но меньше или равно 14 сек. мощность 50%, при условии больше 14 сек. мощность 25%. дальше таймер "закончился", стоп машина. Запуск таймера по нажатию кнопки, это понятно.

Используем "миллис", а не "дэлай"

Практически используя таймер и за одно цикл можно сделать уменьшение мощности двигателя во времени, как и резиномотор, типа уменьшая каждую секунду на какой то % мощности... если нужно (надо эксперементировать)

Как то так

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
// to_BaltikRoy.ino 
const byte Motor_pin = 9; //контакт к которому подключён затвор транзистора
#include "Cl_do_time.h"
uint32_t time_7sec = 7000;
uint32_t time_5sec = 5000;
void do_time1() {
  analogWrite(Motor_pin, 255);   //устанавливаем скорость вращения мотора
}
void do_time2() {
  analogWrite(Motor_pin, 122);   //устанавливаем скорость вращения мотора
}
void do_time3() {
  analogWrite(Motor_pin, 60);   //устанавливаем скорость вращения мотора
}
void do_time4() {
  analogWrite(Motor_pin, 0);   //устанавливаем скорость вращения мотора
}
Cl_do_time  Timer(time_7sec, do_time1, // 7 сек мах
                  time_7sec, do_time2, // 7 сек 50%
                  time_5sec, do_time3, // 5 сек 25%
                  do_time4); // стоп

#include "Cl_do_btn.h"
void do_btn1() {
  Timer.Start();
}
Cl_do_btn btn1(5, 0, do_btn1); //пин 5, 0 уров наж.кнопки , выполнить функцию do_btn1()

void setup() {
  do_time4();
  Timer.setup();
  Cl_do_btn1.setup();
}
void loop() {
  Timer.loop();
  Cl_do_btn1.loop();
}

 

FAI4
Offline
Зарегистрирован: 23.09.2016

Может уже лучше и датчик погружения (давления) добавить?

Тогда лодка сама будет держать заданную глубину