муниципальное бюджетное учреждение дополнительного образования Ворошиловского района города Ростова-на-Дону
«Центр детского творчества»
Технический проект
Робот-игрушка «ОТТО»
Internet of Things, IoT
Автор работы:
Тимошенко Марина
9 кл. МБУ ДО ЦДТ
Ворошиловского района
Г. Ростова-на-Дону
Руководитель:
Филатова Наталья Михайлова
Педагог дополнительного образования
МБУ ДО ЦДТ Ворошиловского района
г. Ростов-на-Дону
2019 год
Содержание:
1. Введение
Цель проекта
Задачи
Реализация поставленной цели
Область применения
Решаемая проблема
Новизна
2. Основная часть
Материалы и инструменты
Технологическая карта
Поэтапное выполнение
Экономическая оценка изделия
3. Выводы.
4. Литература.
Введение
Робот — автоматическое устройство, созданное по принципу живого организма, предназначенное для осуществления производственных и других операций, которое действует по заранее заложенной программе и получает информацию о внешнем мире от датчиков (аналогов органов чувств живых организмов), робот самостоятельно осуществляет производственные и иные операции. При этом робот может как иметь связь с оператором (получать от него команды), так и действовать автономно.
Внешний вид и конструкция современных роботов могут быть весьма разнообразными.
Было решено создать простейшего робота с функцией передвижения без колёс и функцией преодоления препятствий.
Тема представляемой работы – «Изготовление устройства робота с функцией передвижения без колёс и функцией преодоления препятствий»
Цель исследования: изучение механизмов движения с помощью ног. Изучение работы ультразвуковых датчиков. Программирование движения и реакций на состояние датчиков.
Объект исследования: механическое устройство с множеством моторов, датчиком и микроконтроллером для автономной работы.
Актуальность: Робототехника – современное направление с повсеместным изучением и применением в жизни.
Практическая значимость: веселье и удовольствие, а в перспективе усложнение возможностей (транспортировка, звуковое сопровождение, помощь в бытовых работах).
Цель проекта: освоение таких современных направлений, как программирование, конструирование, основы инженерии, 3D печать.
Задачи:
1. Определить какими средствами для реализации поставленных проблем мы располагаем.
2. Создать список предстоящих работ и продумать технологии их осуществления.
3. Познакомиться с основами программирования, с архитектурой микроконтроллеров, приобрести навыки программирования простейших вычислительных платформ ARDUINO, разработку программ для решения задач по взаимодействию с цифровыми выходами.
Микроконтроллеры применяются для создания электронных устройств с возможностью приема сигналов от различных цифровых и аналоговых датчиков, которые могут быть подключены к нему, и управления различными исполнительными устройствами.
Программирование – область деятельности, направленная на разработку программного обеспечения, которое в свою очередь, направлено на улучшение и облегчение человеческого быта («умный дом»), промышленной деятельности, среды услуг и технологического прогресса.
Проекты устройств, основанные на микроконтроллерах, могут работать самостоятельно или взаимодействовать с программным обеспечением на компьютере.
II. Основная часть
Материалы и инструменты
Материалы: филамент (катушки с пластиком для принтера), резисторы, кнопки, тумблер, проводники, микроконтроллеры Arduino, регуляторы напряжения, сервоприводы, ультразвуковой датчик расстояния.
Инструменты: 3D принтер, наждачная бумага, натфили, паяльник, сверла, программатор, клеящий пистолет, компьютер с необходимым программным обеспечением.
Комплектующие:
Сервоприводы (4шт). Ультразвуковой датчик расстояния. Buzzer. Тумблер. Микроконтроллер Ардуино. Плата распределения питания. Провода.
Сервоприводы осуществляют поворот на 180 градусов в одной координатной плоскости. В совокупности позволяют несколько степеней свободы для перемещения детали.
Ультразвуковой датчик отправляет и принимает звуковые импульсы и определяет расстояние до препятствия измеряя временную задержку между импульсами. Программа использует эти данные для решения по развороту от препятствия.
Ардуино управляет моторами, принимает сигналы с датчиков, выполняет программу.
Плата распределения питания понижает входящее напряжение до 5 вольт и питает все электронные компоненты.
Источником питания могут служить любые батарейки/аккумуляторы от 5 до 12В с высокой токоотдачей. (мы используем LiPo аккумулятор на 7.4В).
Детали на 3D печать:
Подготовка головы робота к печати:


Подготовка ног к печати:

Сборка:




#include
#include
#include
#define N_SERVOS 4
#define EEPROM_TRIM false
// Activate to take callibration data from internal memory
#define TRIM_RR 7
#define TRIM_RL 4
#define TRIM_YR 4
#define TRIM_YL -7
//OTTO.setTrims(-7,-4,-4,7);
#define PIN_RR 5
#define PIN_RL 4
#define PIN_YR 3
#define PIN_YL 2
#define INTERVALTIME 10.0
Oscillator servo[N_SERVOS];
void goingUp(int tempo);
void drunk (int tempo);
void noGravity(int tempo);
void kickLeft(int tempo);
void kickRight(int tempo);
void run(int steps, int T=500);
void walk(int steps, int T=1000);
void backyard(int steps, int T=3000);
void backyardSlow(int steps, int T=5000);
void turnLeft(int steps, int T=3000);
void turnRight(int steps, int T=3000);
void moonWalkLeft(int steps, int T=1000);
void moonWalkRight(int steps, int T=1000);
void crusaito(int steps, int T=1000);
void swing(int steps, int T=1000);
void upDown(int steps, int T=1000);
void flapping(int steps, int T=1000);
void setup()
{
Serial.begin(19200);
servo[0].attach(PIN_RR);
servo[1].attach(PIN_RL);
servo[2].attach(PIN_YR);
servo[3].attach(PIN_YL);
//EEPROM.write(0,TRIM_RR);
//EEPROM.write(1,TRIM_RL);
//EEPROM.write(2,TRIM_YR);
//EEPROM.write(3,TRIM_YL);
int trim;
if(EEPROM_TRIM){
for(int x=0;x
trim=EEPROM.read(x);
if(trim128)trim=trim-256;
Serial.print("TRIM ");
Serial.print(x);
Serial.print(" en ");
Serial.println(trim);
servo[x].SetTrim(trim);
}
}
else{
servo[0].SetTrim(TRIM_RR);
servo[1].SetTrim(TRIM_RL);
servo[2].SetTrim(TRIM_YR);
servo[3].SetTrim(TRIM_YL);
}
for(int i=0;i
}
// TEMPO: 121 BPM
int t=495;
double pause=0;
void loop()
{
// if(Serial.available()){
// char init = Serial.read();
// if (init=='X'){
// delay(4000); //3000 - 4500
dance();
//for(int i=0;i
for(int i=0;i
// }
// }
}
void dance(){
primera_parte();
segunda_parte();
moonWalkLeft(4,t*2);
moonWalkRight(4,t*2);
moonWalkLeft(4,t*2);
moonWalkRight(4,t*2);
primera_parte();
crusaito(1,t*8);
crusaito(1,t*7);
for (int i=0; i
flapping(1,t/4);
delay(3*t/4);
}
moonWalkRight(4,t*2);
moonWalkLeft(4,t*2);
moonWalkRight(4,t*2);
moonWalkLeft(4,t*2);
drunk(t*4);
drunk(t*4);
drunk(t*4);
drunk(t*4);
kickLeft(t);
kickRight(t);
drunk(t*8);
drunk(t*4);
drunk(t/2);
delay(t*4);
drunk(t/2);
delay(t*4);
walk(2,t*2);
backyard(2,t*2);
goingUp(t*2);
goingUp(t*1);
noGravity(t*2);
crusaito(1,t*2);
crusaito(1,t*8);
crusaito(1,t*2);
crusaito(1,t*8);
crusaito(1,t*2);
crusaito(1,t*3);
delay(t);
primera_parte();
for (int i=0; i
flapping(1,t/2);
delay(t/2);
}
for(int i=0;i
}
void oscillate(int A[N_SERVOS], int O[N_SERVOS], int T, double phase_diff[N_SERVOS]){
for (int i=0; i
servo[i].SetO(O[i]);
servo[i].SetA(A[i]);
servo[i].SetT(T);
servo[i].SetPh(phase_diff[i]);
}
double ref=millis();
for (double x=ref; x
for (int i=0; i
servo[i].refresh();
}
}
}
unsigned long final_time;
unsigned long interval_time;
int oneTime;
int iteration;
float increment[N_SERVOS];
int oldPosition[]={90,90,90,90};
void moveNServos(int time, int newPosition[]){
for(int i=0;i
final_time = millis() + time;
iteration = 1;
while(millis()
interval_time = millis()+INTERVALTIME;
oneTime=0;
while(millis()
if(oneTime
for(int i=0;i
servo[i].SetPosition(oldPosition[i] + (iteration * increment[i]));
}
iteration++;
oneTime++;
}
}
}
for(int i=0;i
oldPosition[i] = newPosition[i];
}
}
void goingUp(int tempo){
pause=millis();
for(int i=0;i
delay(tempo);
servo[0].SetPosition(80);
servo[1].SetPosition(100);
delay(tempo);
servo[0].SetPosition(70);
servo[1].SetPosition(110);
delay(tempo);
servo[0].SetPosition(60);
servo[1].SetPosition(120);
delay(tempo);
servo[0].SetPosition(50);
servo[1].SetPosition(130);
delay(tempo);
servo[0].SetPosition(40);
servo[1].SetPosition(140);
delay(tempo);
servo[0].SetPosition(30);
servo[1].SetPosition(150);
delay(tempo);
servo[0].SetPosition(20);
servo[1].SetPosition(160);
delay(tempo);
while(millis()
}
void primera_parte(){
int move1[4] = {60,120,90,90};
int move2[4] = {90,90,90,90};
int move3[4] = {40,140,90,90};
for(int x=0; x
for(int i=0; i
lateral_fuerte(1,t/2);
lateral_fuerte(0,t/4);
lateral_fuerte(1,t/4);
delay(t);
}
pause=millis();
for(int i=0;i
moveNServos(t*0.4,move1);
moveNServos(t*0.4,move2);
while(millis()
}
for(int i=0; i
lateral_fuerte(1,t/2);
lateral_fuerte(0,t/4);
lateral_fuerte(1,t/4);
delay(t);
}
pause=millis();
for(int i=0;i
crusaito(1,t*1.4);
moveNServos(t*1,move3);
for(int i=0;i
while(millis()
}
void segunda_parte(){
int move1[4] = {90,90,80,100};
int move2[4] = {90,90,100,80};
int move3[4] = {90,90,80,100};
int move4[4] = {90,90,100,80};
int move5[4] = {40,140,80,100};
int move6[4] = {40,140,100,80};
int move7[4] = {90,90,80,100};
int move8[4] = {90,90,100,80};
int move9[4] = {40,140,80,100};
int move10[4] = {40,140,100,80};
int move11[4] = {90,90,80,100};
int move12[4] = {90,90,100,80};
for(int x=0; x
for(int i=0; i
pause=millis();
moveNServos(t*0.15,move1);
moveNServos(t*0.15,move2);
moveNServos(t*0.15,move3);
moveNServos(t*0.15,move4);
while(millis()
}
pause=millis();
moveNServos(t*0.15,move5);
moveNServos(t*0.15,move6);
moveNServos(t*0.15,move7);
moveNServos(t*0.15,move8);
while(millis()
}
for(int i=0; i
pause=millis();
moveNServos(t*0.15,move9);
moveNServos(t*0.15,move10);
moveNServos(t*0.15,move11);
moveNServos(t*0.15,move12);
while(millis()
}
}
void lateral_fuerte(boolean side, int tempo){
for(int i=0;i
if (side) servo[0].SetPosition(40);
else servo[1].SetPosition(140);
delay(tempo/2);
servo[0].SetPosition(90);
servo[1].SetPosition(90);
delay(tempo/2);
}
void drunk (int tempo){
pause=millis();
int move1[] = {60,70,90,90};
int move2[] = {110,120,90,90};
int move3[] = {60,70,90,90};
int move4[] = {110,120,90,90};
moveNServos(tempo*0.235,move1);
moveNServos(tempo*0.235,move2);
moveNServos(tempo*0.235,move3);
moveNServos(tempo*0.235,move4);
while(millis()
}
void noGravity(int tempo){
int move1[4] = {120,140,90,90};
int move2[4] = {140,140,90,90};
int move3[4] = {120,140,90,90};
int move4[4] = {90,90,90,90};
for(int i=0;i
for(int i=0;i
moveNServos(tempo*2,move1);
moveNServos(tempo*2,move2);
delay(tempo*2);
moveNServos(tempo*2,move3);
moveNServos(tempo*2,move4);
}
void kickLeft(int tempo){
for(int i=0;i
delay(tempo);
servo[0].SetPosition(50); //pie derecho
servo[1].SetPosition(70); //pie izquiero
delay(tempo);
servo[0].SetPosition(80); //pie derecho
servo[1].SetPosition(70); //pie izquiero
delay(tempo/4);
servo[0].SetPosition(30); //pie derecho
servo[1].SetPosition(70); //pie izquiero
delay(tempo/4);
servo[0].SetPosition(80); //pie derecho
servo[1].SetPosition(70); //pie izquiero
delay(tempo/4);
servo[0].SetPosition(30); //pie derecho
servo[1].SetPosition(70); //pie izquiero
delay(tempo/4);
servo[0].SetPosition(80); //pie derecho
servo[1].SetPosition(70); //pie izquiero
delay(tempo);
}
void kickRight(int tempo){
for(int i=0;i
delay(tempo);
servo[0].SetPosition(110); //pie derecho
servo[1].SetPosition(130); //pie izquiero
delay(tempo);
servo[0].SetPosition(110); //pie derecho
servo[1].SetPosition(100); //pie izquiero
delay(tempo/4);
servo[0].SetPosition(110); //pie derecho
servo[1].SetPosition(150); //pie izquiero
delay(tempo/4);
servo[0].SetPosition(110); //pie derecho
servo[1].SetPosition(80); //pie izquiero
delay(tempo/4);
servo[0].SetPosition(110); //pie derecho
servo[1].SetPosition(150); //pie izquiero
delay(tempo/4);
servo[0].SetPosition(110); //pie derecho
servo[1].SetPosition(100); //pie izquiero
delay(tempo);
}
void walk(int steps, int T){
int A[4]= {15, 15, 30, 30};
int O[4] = {0, 0, 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(90), DEG2RAD(90)};
for(int i=0;i
}
void run(int steps, int T){
int A[4]= {10, 10, 10, 10};
int O[4] = {0, 0, 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(90), DEG2RAD(90)};
for(int i=0;i
}
void backyard(int steps, int T){
int A[4]= {15, 15, 30, 30};
int O[4] = {0, 0, 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(-90), DEG2RAD(-90)};
for(int i=0;i
}
void backyardSlow(int steps, int T){
int A[4]= {15, 15, 30, 30};
int O[4] = {0, 0, 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(-90), DEG2RAD(-90)};
for(int i=0;i
}
void turnLeft(int steps, int T){
int A[4]= {20, 20, 10, 30};
int O[4] = {0, 0, 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(90), DEG2RAD(90)};
for(int i=0;i
}
void turnRight(int steps, int T){
int A[4]= {20, 20, 30, 10};
int O[4] = {0, 0, 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(90), DEG2RAD(90)};
for(int i=0;i
}
void moonWalkRight(int steps, int T){
int A[4]= {25, 25, 0, 0};
int O[4] = {-15 ,15, 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(180 + 120), DEG2RAD(90), DEG2RAD(90)};
for(int i=0;i
}
void moonWalkLeft(int steps, int T){
int A[4]= {25, 25, 0, 0};
int O[4] = {-15, 15, 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(180 - 120), DEG2RAD(90), DEG2RAD(90)};
for(int i=0;i
}
void crusaito(int steps, int T){
int A[4]= {25, 25, 30, 30};
int O[4] = {- 15, 15, 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(180 + 120), DEG2RAD(90), DEG2RAD(90)};
for(int i=0;i
}
void swing(int steps, int T){
int A[4]= {25, 25, 0, 0};
int O[4] = {-15, 15, 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(0), DEG2RAD(90), DEG2RAD(90)};
for(int i=0;i
}
void upDown(int steps, int T){
int A[4]= {25, 25, 0, 0};
int O[4] = {-15, 15, 0, 0};
double phase_diff[4] = {DEG2RAD(180), DEG2RAD(0), DEG2RAD(270), DEG2RAD(270)};
for(int i=0;i
}
void flapping(int steps, int T){
int A[4]= {15, 15, 8, 8};
int O[4] = {-A[0], A[1], 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(180), DEG2RAD(90), DEG2RAD(-90)};
for(int i=0;i
}
void test(int steps, int T){
int A[4]= {15, 15, 8, 8};
int O[4] = {-A[0] + 10, A[1] - 10, 0, 0};
double phase_diff[4] = {DEG2RAD(0), DEG2RAD(180), DEG2RAD(90), DEG2RAD(-90)};
for(int i=0;i
}