Преподователь судомодельного кружка просит помощи специалистов. Решил с учениками сделать модель подводной лодки с эл. двигателем. Можно использовать таймер, но в этом случае лодка идёт постоянной скоростью увеличивая деферент на нос и утыкается в дно. Вследствии чего необходимо уменьшать обороты двигателя подобно резиномотору. С уменьшением скорости движения лодки уменьшается эффективность носовых рулей и лодка выравнивается,а после остановки мотора всплывает, во как-то так. Задача для Ардуино 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)
{
Надо использовать таймер от0 до 19 сек. и сделать условия что при времени больше 0 но меньше или равно 7 сек, мощность 100%, при условии больше 7 но меньше или равно 14 сек. мощность 50%, при условии больше 14 сек. мощность 25%. дальше таймер "закончился", стоп машина. Запуск таймера по нажатию кнопки, это понятно.
Используем "миллис", а не "дэлай"
Практически используя таймер и за одно цикл можно сделать уменьшение мощности двигателя во времени, как и резиномотор, типа уменьшая каждую секунду на какой то % мощности... если нужно (надо эксперементировать)
Как то так
Может уже лучше и датчик погружения (давления) добавить?
Тогда лодка сама будет держать заданную глубину