Робот и ардуино
- Войдите на сайт для отправки комментариев
Вс, 15/09/2013 - 20:25
Всем привет. У меня собран робот на основе таких компонентов.
- Arduino uno v3
- Motor Shield (F815A) основанный на контроллере L298
- Servo Shield
- Платформа на подобие turtle (Китай)
Помогите поправить код, а то серва двигает из стороны в сторону как бешеная. И чем можно улучшить сцепление колесиков с полом? Код брал по этой ссылке и немного изменил под себя
http://habrahabr.ru/post/142156/
#include <Servo.h>
const int motor1APin = 2; // H-bridge leg 1
const int motor2APin = 3; // H-bridge leg 2
const int motor3APin = 4; // H-bridge leg 1
const int motor4APin = 5; // H-bridge leg 2
const int enablePin = 12; // H-bridge enable pin
const int Trig = A0; //Ultrasonic
const int Echo = A1;
Servo myservo;
void setup()
{
// set all the other pins you're using as outputs:
pinMode( enablePin, OUTPUT);
pinMode( motor1APin, OUTPUT);
pinMode( motor2APin, OUTPUT);
pinMode( motor3APin, OUTPUT);
pinMode( motor4APin, OUTPUT);
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
// set enablePin high so that motor can turn on:
digitalWrite(enablePin, HIGH);
myservo.attach(12);
}
unsigned int time_us=0;
unsigned int distance_sm=0;
unsigned int circle=0;
unsigned int dist_f=0;
unsigned int dist_l=0;
unsigned int dist_r=0;
unsigned int dist_45=0;
unsigned int dist_135=0;
unsigned int t=15;
void loop()
{
if (circle==0)
{
myservo.write(0); //initial parameters
dist_r=sonar();
motion('w',0,45,t);
dist_45=sonar();
motion('w',45,90,t);
dist_f=sonar();
motion('w',90,135,t);
dist_135=sonar();
motion('w',135,180,t);
dist_l=sonar();
}
circle++;
if(dist_f>=25)
{
a:
motion('f',180,135,t);
dist_135=sonar();
front_motion(t);
motion('f',135,90,t);
dist_f=sonar();
front_motion(t);
motion('f',90,45,t);
dist_45=sonar();
front_motion(t);
motion('f',45,0,t);
dist_r=sonar();
front_motion(t);
motion('f',0,45,t);
dist_45=sonar();
front_motion(t);
motion('f',45,90,t);
dist_f=sonar();
front_motion(t);
motion('f',90,135,t);
dist_135=sonar();
front_motion(t);
motion('f',135,180,t);
dist_l=sonar();
front_motion(t);
if (dist_f>=25)
goto a;
}
else
{
if(dist_f<5)
{
motion_back(t);
dist_f=sonar();
}
if(dist_l>=dist_r || dist_135>dist_r)
{
motion('l',180,90,t);
dist_f=sonar();
}
if(dist_l<dist_r)
{
motion('r',180,90,t);
dist_f=sonar();
}
}
}
int sonar()
{
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
time_us=pulseIn(Echo, HIGH);
distance_sm=time_us/58;
return distance_sm;
}
void back ()
{
digitalWrite(motor1APin, HIGH);
digitalWrite(motor2APin, LOW);
digitalWrite(motor3APin, HIGH);
digitalWrite(motor4APin, LOW);
}
void forward ()
{
digitalWrite(motor1APin, LOW);
digitalWrite(motor2APin, HIGH);
digitalWrite(motor3APin, LOW);
digitalWrite(motor4APin, HIGH);
}
void right ()
{
digitalWrite(motor1APin, LOW);
digitalWrite(motor2APin, HIGH);
digitalWrite(motor3APin, HIGH);
digitalWrite(motor4APin, LOW);
}
void left ()
{
digitalWrite(motor1APin, HIGH);
digitalWrite(motor2APin, LOW);
digitalWrite(motor3APin, LOW);
digitalWrite(motor4APin, HIGH);
}
void wait()
{
digitalWrite(motor1APin, LOW);
digitalWrite(motor2APin, LOW);
digitalWrite(motor3APin, LOW);
digitalWrite(motor4APin, LOW);
}
void motion (char dimention, int prev_angle, int next_angle, int time)
{
int a;
if(next_angle>=prev_angle)
a=15;
else
a=-15;
if (dimention=='f')
{
int i=prev_angle;
while( i!=next_angle)
{
i+=a;
myservo.write(i);
forward();
delay(time);
}
}
if (dimention=='l')
{
int i=prev_angle;
while( i!=next_angle)
{
i+=a;
myservo.write(i);
left();
delay(time);
}
}
if (dimention=='r')
{
int i=prev_angle;
while( i!=next_angle )
{
i+=a;
myservo.write(i);
right();
delay(time);
}
}
if (dimention=='b')
{
int i=prev_angle;
while( i!=next_angle )
{
i+=a;
myservo.write(i);
back();
delay(time);
}
}
if (dimention=='w')
{
int i=prev_angle;
while( i!=next_angle )
{
i+=a;
myservo.write(i);
wait();
delay(time);
}
}
}
void front_motion( int time )
{
if(dist_45<=9)
{
left();
delay(3*time);
}
if(dist_135<=9)
{
right();
delay(3*time);
}
}
void motion_back( int time )
{
motion('b',180,90,2*time);
/*if(dist_l>=dist_r)
{
do
{
left();
delay(time);
dist_f=sonar();
}while(dist_f<=20);
}
if(dist_l<dist_r)
{
do
{
right();
delay(time);
dist_f=sonar();
}while(dist_f<=20);
} */
}
Мне не совсем понятно, как работает этот кусок кода
001<span style="color:rgb(20,20,20);font-family:Georgia, 'Times New Roman', Times, serif;font-size:15px;line-height:20px;background-color:rgb(252,252,255);">Всем привет. У меня собран робот на основе таких компонентов.0020031. Arduino uno v3</span>004<span style="color:rgb(20,20,20);font-family:Georgia, 'Times New Roman', Times, serif;font-size:15px;line-height:20px;background-color:rgb(252,252,255);">2. Motor Shield (F815A) основанный на контроллере L298</span>005<span style="color:rgb(20,20,20);font-family:Georgia, 'Times New Roman', Times, serif;font-size:15px;line-height:20px;background-color:rgb(252,252,255);">3. Servo Shield</span>006<span style="color:rgb(20,20,20);font-family:Georgia, 'Times New Roman', Times, serif;font-size:15px;line-height:20px;background-color:rgb(252,252,255);">4. Платформа на подобие turtle (Китай)007008Помогите поправить код, а то серва двигает из стороны в сторону как бешеная. И чем можно улучшить сцепление колесиков с полом?009Код брал по этой ссылке и немного изменил под себя </span><aclass="externalLink"href="http://habrahabr.ru/post/142156/"style="color:rgb(23,96,147);padding:0px 3px;margin:0px -3px;font-family:Georgia, 'Times New Roman', Times, serif;font-size:15px;line-height:20px;background-color:rgb(252,252,255);"rel="nofollow">http://habrahabr.ru/post/142156/010</a>Этот код просто неправильно сюда вставился. А как отредактировать сообщение не нашел ((((
Этот код просто неправильно сюда вставился. А как отредактировать сообщение не нашел ((((
Рекомендую активней пользоваться кнопкой "Предпросмотр". Особено при заведении новой темы. Так как редактирование первого сообщения - не доступно даже автору.
А раз переспросили - можно было и отдельно описание вставить еще раз. Следующим сообщением.
Кстати еще рекомендую, если вы действительно хотите каких-то внятных ответов, как-то более формально-строже описать что означает "а то серва двигает из стороны в сторону как бешеная". Вам то, глядя на нее очевидно что происходит, а другим?
Что означает "бешенная серва"? Слишком большая амплитуда, слишком быстро двигается, двигается когда не требуется..... и еще пяток поведений попадающие под "бешенная серва" можно придумать.
Вообщем привыкайте мыслить формально-однозначно. Тогда и на форуме легче будет и .... код будет более безошибочным. Контроллер он, в отличае от людей, догадки о том "что вы хотели" - строить не умеет. Так что "бешенная серва" это скорее всего результат не доконца продуманости "что нужно" в голове.
По коду: трудно-читаемый. Попробуйте переписать его так что-бы:
1.ВООБЩЕ небыло никаких goto
2. Было поменьше идентичных кусков кода. Поменьше копипаста. Вот скажем функция motion() - громаданя. При этом фактически содержит пять одинаковых кусков
3. Там где возможно - лучше используйте switch case вместо грозди if-вов.
Тогда и другим будет легче понять что ваш код делает, и поправить его после обнаружения причины - легче будет, да возможно станет настолько простым что причина будет видна невооруженным глазом и сами ее увидите.