Для разминки сделал тележку с управлением через смартфон для гоняния крышек :)
Конструкция шасси получилась забавной, попробовал найти готовое, но не нашёл. Есть желание подсократить расходы на изготовление, MT3608 заменяет-экономит один аккумулятор и стабилизатор 7805.
Для разминки сделал тележку с управлением через смартфон для гоняния крышек :)
Если гонять на крышки, а, например, шарик от пинг-понга и взять две (или любое чётное количество) тележек, то можно поставить ворота и играть в футбол.
Тогда следующий шаг - убирать ручное управление и делать футбол роботов.
Для разминки сделал тележку с управлением через смартфон для гоняния крышек :)
Если гонять на крышки, а, например, шарик от пинг-понга и взять две (или любое чётное количество) тележек, то можно поставить ворота и играть в футбол.
Тогда следующий шаг - убирать ручное управление и делать футбол роботов.
Не попробоуете?
:) Это путь к усложнению, а мне пока хотелось сделать предельно просто, примитивно даже, но чтоб со смартфоном.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 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 и управлять "вручную" приводом, то прослеживается однозначная связь между числом посылаемых управляющих импульсов и угловым перемещением колеса до остановки.
Да, строки 21-22. Разбиты на две для корректности работы "микросеконд". Но мне кажется ( на досуге проверю), что можно и погрубее, например, delay(20);
Для разминки сделал тележку с управлением через смартфон для гоняния крышек :)
Конструкция шасси получилась забавной, попробовал найти готовое, но не нашёл. Есть желание подсократить расходы на изготовление, MT3608 заменяет-экономит один аккумулятор и стабилизатор 7805.
Скетч тоже хочется ужать.
А скетч? А приложение для телефона?
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // 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); } } ///////////////////////////////////////////////////////////////////////////////////////////////////////Для разминки сделал тележку с управлением через смартфон для гоняния крышек :)
Если гонять на крышки, а, например, шарик от пинг-понга и взять две (или любое чётное количество) тележек, то можно поставить ворота и играть в футбол.
Тогда следующий шаг - убирать ручное управление и делать футбол роботов.
Не попробоуете?
Для разминки сделал тележку с управлением через смартфон для гоняния крышек :)
Если гонять на крышки, а, например, шарик от пинг-понга и взять две (или любое чётное количество) тележек, то можно поставить ворота и играть в футбол.
Тогда следующий шаг - убирать ручное управление и делать футбол роботов.
Не попробоуете?
:) Это путь к усложнению, а мне пока хотелось сделать предельно просто, примитивно даже, но чтоб со смартфоном.
:) Это путь к усложнению
Ну, тогда можно ограничиться только первой идеей. Две Ваши текущие тележки без переделок, ворота и шарик от пинг-понга - отличная игра!
весна, потеплело, тема тележек стала актуальной )))
весна, потеплело, тема тележек стала актуальной )))
Да...Обострение бурной деятельностью :)
Если взять крышки двух разных цветов и расчертить 9 клеток, то можно в крестики-нолики играть.
Не, я таки за футбол!
Ну, тогда можно ограничиться только первой идеей. Две Ваши текущие тележки без переделок, ворота и шарик от пинг-понга - отличная игра!
Еще две сервы с палками присобачить к каждой телеге и можно устраивать драку за крышку/шарик
Так ТС не хотел усложнять. А для футбола уже всё и так готово - ничего усложнять не надо.
Нет, кроме шуток - забавно было бы.
Прикольный звереныш получился.)))
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // 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 под мотор-редуктор с регулируемой скоростью и направлением вращения.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // 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 и управлять "вручную" приводом, то прослеживается однозначная связь между числом посылаемых управляющих импульсов и угловым перемещением колеса до остановки.
Только, думаю, что на разных сервах будет разный градус однократного перемещения.
Только, думаю, что на разных сервах будет разный градус однократного перемещения.
Это наверняка, но сама идея хоть худую функцию для движения с заданной скоростью на заданную дистанцию уже греет.
строки 20-21 эмулируете ШИМ 50 герц?
строки 20-21 эмулируете ШИМ 50 герц?
Да, строки 21-22. Разбиты на две для корректности работы "микросеконд". Но мне кажется ( на досуге проверю), что можно и погрубее, например, delay(20);
it's very nice robot.
it's very nice robot.
Спасибо, это просто игрушка.