Робот и ардуино
- Войдите на сайт для отправки комментариев
Вс, 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);"
>Всем привет. У меня собран робот на основе таких компонентов.
002
003
1. 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 (Китай)
007
008
Помогите поправить код, а то серва двигает из стороны в сторону как бешеная. И чем можно улучшить сцепление колесиков с полом?
009
Код брал по этой ссылке и немного изменил под себя </span><a
class
=
"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-вов.
Тогда и другим будет легче понять что ваш код делает, и поправить его после обнаружения причины - легче будет, да возможно станет настолько простым что причина будет видна невооруженным глазом и сами ее увидите.