Тележка с одним поворотным-ведущим колесом

leks
Offline
Зарегистрирован: 22.10.2017

leks
Offline
Зарегистрирован: 22.10.2017

Для разминки сделал тележку с управлением через смартфон для гоняния крышек :)

Конструкция шасси получилась забавной, попробовал найти готовое, но не нашёл. Есть желание подсократить расходы на изготовление, MT3608 заменяет-экономит один аккумулятор и стабилизатор 7805.

Скетч тоже хочется ужать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А скетч? А приложение для телефона?

leks
Offline
Зарегистрирован: 22.10.2017
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
// ТЕЛЕЖКА НА ОДНОМ ВЕДУЩЕМ ПОВОРОТНОМ КОЛЕСЕ
//
#include <Servo.h>
#define V1  5
#define V2  6
#define V3  7
byte k = 180; //переменнная ШИМ
byte a; byte a0 = 130; //переменная текущего угла поворота и переменная начального угла поворота сервы
int n = 100; //переменная длительности между переключениями
long Y = 0; //переменная для хранения текущего времени
String inputString;// строки данных

////////////////////////////
Servo servo1;
void setup()
{
  Serial.begin(9600);
  pinMode(V1, OUTPUT);//выводы управления драйвером мотора
  digitalWrite(V1, LOW);
  pinMode(V2, OUTPUT);
  digitalWrite(V2, LOW);
  servo1.attach(V3);//вывод управления сервоприводом
  servo1.write(a0);// начальный поворот сервы
  a = a0;
}

void loop()
{
  CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ
}

/////////////////////////////////////////////////////////////////////////////////////////////////
//ФУНКЦИИ ПРИЁМА И ОБРАБОТКИ ДАННЫХ
void CheckSerial()
{
  //////////////////////////////////////////////////////////////////////////////
  while (Serial.available())//считываем строку данных пока они поступают
  {
    char inChar = (char)Serial.read();
    if (inChar == '\n')     //если окончание строки
    {
      MakeCmd();//обрабатываем её данной функцией
      break;
    }
    else inputString += inChar;// иначе удлиняем строку на один символ
  }
}
/////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void MakeCmd()
{
  int y = inputString.length(); // присваиваем переменной у число символов в строке
  if (y < 1 || y > 1)return; //если их меньше 1 или больше, выходим из функции
  String cmd = inputString; // передаём строку другой переменной
  inputString = "";//"обнуляем переменную"

  if (cmd == "1") {
    analogWrite(V1, k);  //едем вперёд
    digitalWrite(V2, LOW);
  }
  if (cmd == "2") {
    analogWrite(V2, k);  //едем назад
    digitalWrite(V1, LOW);
  }
  if (cmd == "3") {
    SerPovorot();  //поворачиваем вправо
    analogWrite(V1, k);
    digitalWrite(V2, LOW);
    delay(100);
  }
  if (cmd == "4") {
    SerPovorot();  //поворачиваем влево
    analogWrite(V2, k);
    digitalWrite(V1, LOW);
    delay(100);
  }
  if (cmd == "A") {
    digitalWrite(V1, LOW);  // исходное состояние
    digitalWrite(V2, LOW);
    SerVozvrat();
  }

}

///////////////////////////////////////////////////////////////////////////////////////////////////////
void SerPovorot ()
{
  while (a > a0 - 100)
  {
    a--; servo1.write(a); delay(7);
  }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
void SerVozvrat ()
{
  while (a < a0)
  {
    a++; servo1.write(a); delay(10);
  }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

leks пишет:

Для разминки сделал тележку с управлением через смартфон для гоняния крышек :)

Если гонять на крышки, а, например, шарик от пинг-понга и взять две (или любое чётное количество) тележек, то можно поставить ворота и играть в футбол.

Тогда следующий шаг - убирать ручное управление и делать футбол роботов. 

Не попробоуете?

leks
Offline
Зарегистрирован: 22.10.2017

ЕвгенийП пишет:

leks пишет:

Для разминки сделал тележку с управлением через смартфон для гоняния крышек :)

Если гонять на крышки, а, например, шарик от пинг-понга и взять две (или любое чётное количество) тележек, то можно поставить ворота и играть в футбол.

Тогда следующий шаг - убирать ручное управление и делать футбол роботов. 

Не попробоуете?

:) Это путь к усложнению, а мне пока хотелось сделать предельно просто, примитивно даже, но чтоб со смартфоном.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

leks пишет:

:) Это путь к усложнению

Ну, тогда можно ограничиться только первой идеей. Две Ваши текущие тележки без переделок, ворота и шарик от пинг-понга - отличная игра!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

весна, потеплело, тема тележек стала актуальной )))

leks
Offline
Зарегистрирован: 22.10.2017

ua6em пишет:

весна, потеплело, тема тележек стала актуальной )))

Да...Обострение бурной деятельностью :)

Если взять крышки двух разных цветов и расчертить 9 клеток, то можно в крестики-нолики играть.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не, я таки за футбол!

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

Ну, тогда можно ограничиться только первой идеей. Две Ваши текущие тележки без переделок, ворота и шарик от пинг-понга - отличная игра!

Еще две сервы с палками присобачить к каждой телеге и можно устраивать драку за крышку/шарик

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так ТС не хотел усложнять. А для футбола уже всё и так готово - ничего усложнять не надо.

Нет, кроме шуток - забавно было бы.

bwn
Offline
Зарегистрирован: 25.08.2014

Прикольный звереныш получился.)))

leks
Offline
Зарегистрирован: 22.10.2017

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
// ТЕЛЕЖКА НА ОДНОМ ВЕДУЩЕМ ПОВОРОТНОМ КОЛЕСЕ
//
#include <Servo.h>
#define V3  7
#define V4  8

byte a; byte a0 = 120; //переменная текущего угла поворота и переменная начального угла поворота сервы
byte b0 = 78;//начальная скорость 0
String inputString;// строки данных

////////////////////////////
Servo servo1;
Servo servo4;
void setup()
{
  Serial.begin(9600);
  servo1.attach(V3);//вывод управления сервоприводом
  servo1.write(a0);// начальный поворот сервы
  servo4.attach(V4);//вывод управления сервоприводом-мотор-редуктором
  servo4.write(b0);// начальная скорость b0
  a = a0;
}

void loop()
{
  CheckSerial();//ЖДЁМ ПОСТУПЛЕНИЯ КОМАНДЫ
}

/////////////////////////////////////////////////////////////////////////////////////////////////
//ФУНКЦИИ ПРИЁМА И ОБРАБОТКИ ДАННЫХ
void CheckSerial()
{
  //////////////////////////////////////////////////////////////////////////////
  while (Serial.available())//считываем строку данных пока они поступают
  {
    char inChar = (char)Serial.read();
    if (inChar == '\n')     //если окончание строки
    {
      MakeCmd();//обрабатываем её данной функцией
      break;
    }
    else inputString += inChar;// иначе удлиняем строку на один символ
  }
}
/////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void MakeCmd()
{
  int y = inputString.length(); // присваиваем переменной у число символов в строке
  if (y < 1 || y > 1)return; //если их меньше 1 или больше, выходим из функции
  String cmd = inputString; // передаём строку другой переменной
  inputString = "";//"обнуляем переменную"

  if (cmd == "1") {
      
  servo4.write(b0-30);//едем вперёд 
  }
  if (cmd == "2") {
    
    servo4.write(b0+10); //едем назад с плавным троганьем
    delay(750);
    servo4.write(b0+20); 
    
  }
  if (cmd == "3") {
    SerPovorot();  //поворачиваем вправо
    servo4.write(b0-10); 
    delay(200);
  }
  if (cmd == "4") {
    SerPovorot();  //поворачиваем влево
    servo4.write(b0+10); 
    delay(200);
  }
  if (cmd == "A") {
    
    servo4.write(b0); // исходное состояние
    SerVozvrat();
  }

}

///////////////////////////////////////////////////////////////////////////////////////////////////////
void SerPovorot ()
{
  while (a > a0 - 100)
  {
    a--; servo1.write(a); delay(7);
  }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
void SerVozvrat ()
{
  while (a < a0)
  {
    a++; servo1.write(a); delay(10);
  }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

Не удержался, давно хотел переделать SG90 под мотор-редуктор с регулируемой скоростью и направлением вращения.

leks
Offline
Зарегистрирован: 22.10.2017
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
//
//программа для управления серво-мотор-редуктором //

int i=0;//счётчик,max значение определяет дальность движения колеса
void setup()
{
  pinMode(7,OUTPUT);//управляющий канал сервопривода
  digitalWrite(7,LOW);
///////////////////////////////////////////////////
  delay(3000);
  for (i=0;i<=10;i=i+1)
       {
        digitalWrite(7, HIGH);
        delayMicroseconds(1500);//длительность импульса
        digitalWrite(7, LOW);
        delayMicroseconds(10000-1500);//длительность паузы
        delayMicroseconds(10000);
       }
    
    
}
/////////////////////////////////////////////////////
void loop() 
{
}
//
// Конец /
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Оказывается, кто бы мог подумать :), что если отказаться от использования библиотеки Servo и управлять "вручную" приводом, то прослеживается однозначная связь между числом посылаемых управляющих импульсов и угловым перемещением колеса до остановки.

sadman41
Offline
Зарегистрирован: 19.10.2016

Только, думаю, что на разных сервах будет разный градус однократного перемещения.

leks
Offline
Зарегистрирован: 22.10.2017

sadman41 пишет:

Только, думаю, что на разных сервах будет разный градус однократного перемещения.

Это наверняка, но сама идея хоть худую функцию для движения с заданной скоростью на заданную дистанцию уже греет.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

строки 20-21 эмулируете ШИМ 50 герц?

leks
Offline
Зарегистрирован: 22.10.2017

ua6em пишет:

строки 20-21 эмулируете ШИМ 50 герц?

Да, строки 21-22. Разбиты на две для корректности работы "микросеконд". Но мне кажется ( на досуге проверю), что можно и погрубее, например, delay(20);

strarbit
Offline
Зарегистрирован: 12.06.2016

it's very nice robot.

leks
Offline
Зарегистрирован: 22.10.2017

strarbit пишет:

it's very nice robot.

Спасибо, это просто игрушка.