Вчера вчерне завершил работу над Амфибией. Сегодня провел водные испытания. Протечка за 5 минут составила несколько капель, придется подконопатить. Ватерлиния проходит чуть ниже половины корпуса.
на мой взгляд стоит сделать другой угол наклона ленты гусеницы от верхнего до нижнего внутреннего катка, при проезде выступающих препятствий например ветки она окажется между гусеницами и робот потеряет связь с поверхностью, при поворатах происходит зацепление гусениц тележек, видимо стоит сделать более протяжённый центральный шарнир, на плоской гладкой поверхности поворачивать легко, на местности будут проблемы, тем более вес тележек увеличится и жёсткости шарнира будет не хватать.
Вы правы, нужно будет уменьшить количество траков у гусениц и "спрятать" их за корпуса, тогда они (гусеницы) не будут цеплять друг друга при поворотах. И не надо будет ставить ограничители как я собирался.
Прикольно,но мне нравится больше колесный вариант даже ваша предыдущая версия предпочтительней гусеничной,приведенный же здесь многоколесный вариант вообще вне конкуренции.
Собираюсь начать колесную Амфибию. Собираю детали. Приобрел мотор-редукторы 77 об/мин. Я их называю элитнными. Почти не оказывают влияния на радиоуправление, стальной корпус. Колеса сниму со старых роботов, 125 мм в диаметре. Проклею силиконовым герметиком, чтобы в шины не набиралась вода. Достал сальники. Опять применю ЦПУ, мне он нравится. Заменяет все рессоры, и работает нормально. Остается решить вопрос - сколько делать осей. Склоняюсь к трех корпусной конструкции, с двумя ЦПУ. Хочу попробовать сделать предельно легкой переднюю часть, чтобы ее, когда нужно будет, поднимать.
Нашел вот скетч для нашего Разведчика (однодвижительного с УЗ сенсором) Скетч 01 От Михаила Шевченко #include <AFMotor.h>
#include <Servo.h>
AF_DCMotor motor(1);
Servo servo1;
int inputPin=13; // Echo
int outputPin=7; // Trig
int count = 0;
void setup()
{
Serial.begin(9600);
Serial.println("Motor test!");
pinMode(inputPin, INPUT);
pinMode(outputPin, OUTPUT);
servo1.attach(9);
motor.setSpeed(255);
servo1.write(90);
motor.run(RELEASE);
delay(2000);
}
void loop()
{
digitalWrite(outputPin, LOW);
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);
delayMicroseconds(10);
digitalWrite(outputPin, LOW);
int distance = pulseIn(inputPin, HIGH);
distance = distance / 58;
Serial.println(distance);
if (distance == 0 || distance > 50)
{
int e = servo1.read();
if (e < 90) servo1.write(e+10);
if (e > 90) servo1.write(e-10);
}
else // препятствие
{
if ( count == 2 ) servo1.write(170); // вправо
else servo1.write(10); // влево
count += 1;
if ( count == 3 ) count = 0;
}
motor.run(FORWARD);
delay(100);
}
Добавлено спустя 3 минуты 8 секунд: Попробую найти скетч для двухплатного на Pro mini. Писать сейчас просто лень.
Добавлено спустя 3 минуты 31 секунду: Мои студенты пишут что-то вроде таких: Скетч движения робота до мины и возвращение на «Старт»
int IN1 = 2; int IN2 = 3; int IN3 = 4; int IN4 = 5; void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(3000); // Это условие выполняется 3 секунд. } void loop()
{
digitalWrite(IN1,HIGH); // Двигатель А вперед ДА - HIGH digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,HIGH); // Двигатель Б вперед ДА - HIGH digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(2000); // 2 секунд движения вперед.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(1000); // Остановка на 1 секунду.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,HIGH); // Двигатель А назад ДА - HIGH digitalWrite(IN3,HIGH); // Двигатель Б вперед ДА - HIGH digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(100); // Поворот влево 0,1 секунды.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(200); // Остановка на 0.2 секунду.
digitalWrite(IN1,HIGH); // Двигатель А вперед ДА - HIGH digitalWrite(IN2,LOW); // Двигатель А назад НЕТ – LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,HIGH); // Двигатель Б назад ДА - HIGH delay(200); // Поворот вправо 0.2 секунда.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(1000); // Остановка на 1 секунду.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,HIGH); // Двигатель А назад ДА - HIGH digitalWrite(IN3,HIGH); // Двигатель Б вперед ДА - HIGH digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(100); // Поворот влево 0,1 секунды.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(1000); // Остановка на 1 секунду.
digitalWrite(IN1,HIGH); // Двигатель А вперед ДА - HIGH digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,HIGH); // Двигатель Б вперед ДА - HIGH digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(2000); // 2 секунд движения вперед.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(1000); // Остановка на 1 секунду.
digitalWrite(IN1,HIGH); // Двигатель А вперед ДА - HIGH digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,HIGH); // Двигатель Б назад ДА - HIGH delay(200); // Поворот влево 0.2 секунду.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(1000); // Остановка на 1 секунду.
digitalWrite(IN1,HIGH); // Двигатель А вперед ДА - HIGH digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,HIGH); // Двигатель Б вперед ДА - HIGH digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(2000); // 2 секунд движения вперед.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(2000); // Остановка на 2 секунды.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,HIGH); // Двигатель А назад ДА - HIGH digitalWrite(IN3,HIGH); // Двигатель Б вперед ДА - HIGH digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(500); // Поворот вправо 0.5 секунды (разворот).
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(1000); // Остановка на 1 секунду.
digitalWrite(IN1,HIGH); // Двигатель А вперед ДА - HIGH digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,HIGH); // Двигатель Б вперед ДА - HIGH digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(2000); // 2 секунд движения вперед.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ – LOW digitalWrite(IN3,HIGH); // Двигатель Б вперед ДА - HIGH digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - HIGH delay(200); // Поворот вправо 0.2 секунда.
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(1000); // Остановка на 1 секунду, после чего идет следующее условие ниже.
digitalWrite(IN1,HIGH); // Двигатель А вперед ДА - HIGH digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,HIGH); // Двигатель Б вперед ДА - HIGH digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(3000); // 3 секунд движения вперед (возвращение на исходную позицию).
digitalWrite(IN1,LOW); // Двигатель А вперед НЕТ - LOW digitalWrite(IN2,LOW); // Двигатель А назад НЕТ - LOW digitalWrite(IN3,LOW); // Двигатель Б вперед НЕТ - LOW digitalWrite(IN4,LOW); // Двигатель Б назад НЕТ - LOW delay(2000); // Остановка на 20 секунд. }
Добавлено спустя 14 минут 44 секунды: Нашел что-то похожее. Скетчи для прохождения маршрута "Квадрат" при управлении бортами. Для левого борта:
#include <Stepper.h>
const int stepsPerRevolution = 300; // change this to fit the number of steps per revolution // for your motor
// initialize the stepper library on pins 2 through 5: Stepper myStepper(stepsPerRevolution, 2,3,4,5);
void setup() { // set the speed at60 rpm: myStepper.setSpeed(60); // initialize the serial port: Serial.begin(9600); }
void loop() {
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(3500); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(350); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(4000); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(350); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(4000); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(350); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(4000); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(350); delay(500);
// step one revolution in the other direction: Serial.println("counterclockwise"); myStepper.step(0); delay(5000); }
А это для правого:
Добавлено спустя 1 минуту 2 секунды: #include <Stepper.h>
const int stepsPerRevolution = 300; // change this to fit the number of steps per revolution // for your motor
// initialize the stepper library on pins 2 through 5: Stepper myStepper(stepsPerRevolution, 2,3,4,5);
void setup() { // set the speed at60 rpm: myStepper.setSpeed(60); // initialize the serial port: Serial.begin(9600); }
void loop() {
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(3500); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(0); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(3000); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(0); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(3000); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(0); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(3000); delay(500);
// step one revolution in one direction: Serial.println("clockwise"); myStepper.step(-350); delay(500);
// step one revolution in the other direction: Serial.println("counterclockwise"); myStepper.step(0); delay(5000); }
В ближайшем будущем собираюсь по верхней кромке закрепить штапики ниже верха на 5 мм. Это будут буртики для крышек. Так называемая, верхняя герметизация. Ну а затем, размещение Ардуины UNO, Драйверов 2А и аккумуляторов. Пока не решил, как делать повороты. Танковая система вряд ли подойдет! Соотношение длина/ширина не в пользу ширины. А сила трения у таких колес - приличная! Наверно придется ставить систему поворота по принципу возжжей. Чувствую, смотреться будет архаично. Недеюсь, что кто-нибудь какую-либо ценную идею подкинет! Может быть попробовать применить ШИМ по бортам, тем самым значительно уменьшив силлу трения, тормозящего борта? Что скажете, творческий народ!?
думается мне, что танковая пойдет лучше чем в танке, но радиус поворота будет определяться макс углом загиба конструкцими и разворот на месте будет недоступен
под танковым разворотом вы подразумеваете вариант, когда одна гусеница неподвижна, а другая вращается? так у вас же есть возможность вращать в разные стороны. те же бтр на месте вполне нормально поворачивают