Танк

Aleksandr.1981

✩✩✩✩✩✩✩
14 Мар 2020
3
0
Здравствуйте хочу собрать танк на ардуино нужен скейтч

Управление по радио модулю любой подходящей к ардуино,Передвижение вперед назад,повороты в право в лево,ультра звуковой датчик препятствия,башня на сервоприводе с поворотом на 180 градусов ,дуло тоже на сервоприводе,полнастью автономный
 

Aleksandr.1981

✩✩✩✩✩✩✩
14 Мар 2020
3
0
Радио модуль nRF24L01,драйвер двигателя
L298N

датчик растояния HC SR04

и два серво привода
 

РыкаВладимир

✩✩✩✩✩✩✩
20 Мар 2020
25
3
@Aleksandr.1981, Привет!
Пару лет назад начал с нуля. через пол года примерно танк поехал. Правда это бывшая радиоуправляемая игрушка. В место родной электроники тот набор что и у вас, плюс адаптеры питания для nrf, ардуиновские джостики, потенциометры, минус сервы (башней не крутил). К сожалению скетчи не сохранились. Я это к чему?
Если цель покатушки надо купить готовый танк.
Если цель покатушки на уникальном танке и желательно не через "пол года" то надо платить тем кто може сделать этот уникальный танк.
Если цель пообщаться работая над совместным проектом то это не подходящая ветка форума.
Если цель учебная то можете для начала залить любой скетч например: https://github.com/AlexGyver/nRF24L01 . Получите массу удовольствий когда это у вас заработает))). Цели разделены для наглядности, а в жизни все переплетено.
 
  • Лойс +1
Реакции: Arhat109

kapral220

✩✩✩✩✩✩✩
12 Фев 2019
22
3

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,662
409
Москва
Интересно.. все думал (не активно, т.к. танка нет) как сделать управление двух моторов одним джойстиком . Что бы без отдельной скорости.
К примеру имея 2 движковых потенциометра можно в среднем положении сделать 0 моторов и далее правый /левый вперед - соотв 100:% вперед для своего двигателя и то же назад.
А вот с джойстиком так и не доформировал в голове. Вот что получалось:
1) Вперед/назад - правый, левый 100% вперед/назад
2) Влево/вправо - правый /левый 100% вперед, левый /правый 100% нащад разворот на месте
далее отдельно
3) Вперед/вправо - по идее левый 100% вперед. правый вроде бы 0 должен быть.
по другим диагоналям аналогично. Промежуточные значения вычисляются по четвертям . Да еще и пропорционально надо от максимума высчитывать.. Я не пробовал, т.к. нет 2-х движковой платформы, а пока только делаю универсальный (для себя универсальный) пульт. Тут вполне может подойти полярная система координат.
 

РыкаВладимир

✩✩✩✩✩✩✩
20 Мар 2020
25
3
@Старик Похабыч,
Это просто. Преобразуем данные джостика(стик или крестовина с направлением вверх-низ, право-лево) Д1 и Д2 в данные для моторов М1 и М2 .
М1=Д1+Д2
М2=Д1-Д2(строки "45,46")
C++:
/*

  Управление двумя коллекторными двигателями постоянного тока через MOSFET, Arduino Nano и FLYSKY приемник.
  использую левый стик пульта -это каналы 3 и 4 приемника.
*/
byte m1p1t1V7 = 7; // мотор 1, пин мотора 1, транзистор 1, питание плюс, пин ардуино 7 соответственно.m1p1t1Vpvm10
byte m1p2t2Gpvm3 = 3;//Мотор1, пин мотора2, транзистор2, питание минус, шим, пин ардуино 3.
byte m1p2t3V8 = 8;
byte m1p1t4Gpvm9 = 9;
byte m2p1t5V12 = 12;
byte m2p2t6Gpvm10 = 10;
byte m2p2t7V13 = 13;
byte m2p1t8Gpvm11 = 11;
byte channelFS_3 = A1; //третий канал приемника FS и пин A1(15) ардуино.
byte channelFS_4 = A2;


void setup() {
  TCCR1A = 0b00000001;  // 8bit Пины D9 и D10 - 31.4 кГц
  TCCR1B = 0b00000001;  // x1 phase correct
  TCCR2B = 0b00000001;  // Пины D3 и D11 - 31.4 кГц
  TCCR2A = 0b00000001;  // x1 phase correct
  pinMode(m1p1t1V7, OUTPUT);//по умолчанию (..., OUTPUT) это(...,LOW).
  pinMode(m1p2t2Gpvm3, OUTPUT);//Первый мотор(m1),второй пин мотора (p2), второй транзистор(t2), питание зимля(G),шим(pvm), третий пин ардуино(3).
  pinMode(m1p2t3V8, OUTPUT);//Первый мотор(m1),второй пин мотора (p2), третий транзистор(t3), питание плюс(V),  восьмой пина ардуино (8).
  pinMode(m1p1t4Gpvm9, OUTPUT);
  pinMode(m2p1t5V12, OUTPUT);
  pinMode(m2p2t6Gpvm10, OUTPUT);
  pinMode(m2p2t7V13, OUTPUT);
  pinMode(m2p1t8Gpvm11, OUTPUT);

  //  Serial.begin(9600);//последовательный порт
}

void loop() {
  /*****************************************Приемная часть кода***********************************/
  int pwm1 = 0;
  int pwm2 = 0;
  int FS_3 = pulseIn(channelFS_3, HIGH);
  int FS_4 = pulseIn(channelFS_4, HIGH);
  if (FS_3 != 0 || FS_4 != 0) {
    FS_3 = FS_3 - 1480;//диапазон приемника примерно 900-1970(микросекунды).
    FS_4 = FS_4 - 1480;//приводим значение среднего положениея стиков к нолю.
  }
  int v1 = FS_3 + FS_4;//преобразуем данные приемника с двух стиков(3,4) пульта в данные (v) для двигателя (1).
  int v2 = FS_3 - FS_4;

  //Serial.print("FS_3 ");
  //Serial.print(FS_3);
  //Serial.print(" FS_4 ");
  //Serial.print(FS_4);

  //Serial.print(" v1 ");
  //Serial.print(v1);
  //Serial.print(" v2 ");
  //Serial.print(v2);
  /****************************Драйверная часть кода**********************************************/

  if (v1 >= 20) { //На первый пин (p1) первого дигателя (м1) подаем плюс(V).
    pwm1 = map(v1, 20, 500, 150, 255);//маштабируем диапазон датчиков в диапазон шим. ((НАСТРОИТЬ ПОРОГИ ШИМ ПУСКА И МАКСИМАЛЬНЫЙ ТОК НА ВЫХОДЕ !!!!))
    digitalWrite(m1p2t3V8, LOW);//Первым закрываем t3 он  же плюс питания V.
    digitalWrite(m1p1t4Gpvm9, LOW);//Вторым закрываем четвертый транзистор GND(t4). Первый пин первого двигателя.
    delay(1);//время на закрытие мосфетов при смене полярности.
    analogWrite(m1p2t2Gpvm3, pwm1);//Подаем шим на второй транзистор(t2), включенный параллельно третьему транзистору (t3). Второй пин (p2) первого двигателя(m1).  Шим открывает GND.
    digitalWrite(m1p1t1V7, HIGH);//Открываем первый пин первого двигателя через первый транзистор. плюс питания (V).
  }
  if (v1 <= -20) { //На второй пин (p2) первого дигателя (м1) подаем плюс(V).
    pwm1 = map(v1, -20, -500, 150, 255);
    digitalWrite(m1p1t1V7, LOW); //закрываем первый транзистор (t1) включенный параллельно четвертому транзистору (t4). Первый пин первого двигателя.
    digitalWrite(m1p2t2Gpvm3, LOW); //Отключаем землю от второго пина первого двигателя.
    delay(1);
    analogWrite(m1p1t4Gpvm9, pwm1); //открываем "-" шим для второго пина двигателя.
    digitalWrite(m1p2t3V8, HIGH); //Открываем "+" на первом пине двигателя.
  }
  if (v1 > -20 && v1 < 20) {   //Двигатель 1 на месте.
    digitalWrite(m1p1t1V7, LOW);
    digitalWrite(m1p2t2Gpvm3, LOW);
    digitalWrite(m1p2t3V8, LOW);
    digitalWrite(m1p1t4Gpvm9, LOW);
  }
  if (v2 >= 20) { //На первый пин (p1) второго дигателя (м2) подаем плюс(V).
    pwm2 = map(v2, 20, 500, 150, 255);
    digitalWrite(m2p2t7V13, LOW);
    digitalWrite(m2p1t8Gpvm11, LOW);
    delay(1);
    analogWrite(m2p2t6Gpvm10, pwm2);
    digitalWrite(m2p1t5V12, HIGH);
  }
  if (v2 <= -20) { //На второй пин (p2) второго дигателя (м2) подаем плюс(V).
    pwm2 = map(v2, -20, -500, 150, 255);
    digitalWrite(m2p1t5V12, LOW);
    digitalWrite(m2p2t6Gpvm10, LOW);
    delay(1);
    analogWrite(m2p1t8Gpvm11, pwm2);
    digitalWrite(m2p2t7V13, HIGH);
  }
  if (v2 > -20 && v2 < 20) {   //Двигатель 2 на месте.
    digitalWrite(m2p1t5V12, LOW);
    digitalWrite(m2p2t6Gpvm10, LOW);
    digitalWrite(m2p2t7V13, LOW);
    digitalWrite(m2p1t8Gpvm11, LOW);
  }
  //Serial.print(" pwm1 ");
  //Serial.print(pwm1);
  //Serial.print(" pwm2 ");
  //Serial.println(pwm2);

}
 
Последнее редактирование:

Старик Похабыч

★★★★★✩✩
14 Авг 2019
1,662
409
Москва
@РыкаВладимир,
Спасибо, при случае проверю. Я пока об этом думал примерно так " а как бы я сделал ? а вот так . " и все это мысли перед сном. Т.е. не в плотную. Если решение действительно такое простое, то вообще хорошо.