Вопрос по программе(Оператор If)
- Войдите на сайт для отправки комментариев
Сб, 07/12/2013 - 13:40
#include <Servo.h>
#include <Ultrasonic.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(10, 9, 3, 2, 1, 0);
const int motor1APin = 7; // H-bridge leg 1
const int motor2APin = 6; // H-bridge leg 2
const int motor3APin = 5; // H-bridge leg 1
const int motor4APin = 4; // H-bridge leg 2
const int enablePin = 8; // H-bridge enable pin
const int Trig = 12; //Ultrasonic
const int Echo = 13;
Servo myservo;
int knopka1 = A2;
int val=0;
void setup()
{
pinMode(knopka1, INPUT);
pinMode( enablePin, OUTPUT);
pinMode( motor1APin, OUTPUT);
pinMode( motor2APin, OUTPUT);
pinMode( motor3APin, OUTPUT);
pinMode( motor4APin, OUTPUT);
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
digitalWrite(enablePin, HIGH);
myservo.attach(11);
lcd.begin(16, 2);
lcd.print("Robot v.2.0");
}
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()
{
lcd.setCursor(0, 1);
lcd.print("Programma 1");
if (circle==0)
{
myservo.write(0);
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 forward ()
{
digitalWrite(motor1APin, HIGH);
digitalWrite(motor2APin, LOW);
digitalWrite(motor3APin, HIGH);
digitalWrite(motor4APin, LOW);
}
void back ()
{
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);
}
}
Вот имеется программа. Написана для робота, все отлично работает и функционирует. Мне надо все что находитcя в цикле VOID LOOP() выполнялось при нажатии кнопки. Я заключаю все это в оператор IF и ничего не работает. Программа перестает понимать что такое sonar, front motion и все такие же функции. Помогите разобраться. Заранее спасибо!
1. http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
2.
#define button 2 int inputMode = 1; void setup() { pinMode(button, INPUT); } void loop() { if(inputMode) { ваш код } if(digitalRead(button)==HIGH) inputMode=0; if(digitalRead(button)==LOW) inputMode=1; }Спасибо за быстрый ответ!
Я попробовал вашу структуру программы, все равно вылетают те же самые ошибки. Есть еще какие нибудь предложения?
Вот какие ошибки выскакивают.
гдето } не поставили - вот все и съехало. Используйте редактор который подсвечивает скобки например Notepad++
Посмотрел - куча пробелов в именах функций.... вот вроде исправил
#include <Servo.h> #include <Ultrasonic.h> #include <LiquidCrystal.h> LiquidCrystal lcd(10, 9, 3, 2, 1, 0); const int motor1APin = 7; // H-bridge leg 1 const int motor2APin = 6; // H-bridge leg 2 const int motor3APin = 5; // H-bridge leg 1 const int motor4APin = 4; // H-bridge leg 2 const int enablePin = 8; // H-bridge enable pin const int Trig = 12; //Ultrasonic const int Echo = 13; Servo myservo; int knopka1 = A2; int val=0; 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 setup(){ pinMode(knopka1, INPUT); pinMode( enablePin, OUTPUT); pinMode( motor1APin, OUTPUT); pinMode( motor2APin, OUTPUT); pinMode( motor3APin, OUTPUT); pinMode( motor4APin, OUTPUT); pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); digitalWrite(enablePin, HIGH); myservo.attach(11); lcd.begin(16, 2); lcd.print("Robot v.2.0"); } void loop(){ lcd.setCursor(0, 1); lcd.print("Programma 1"); if (circle==0){ myservo.write(0); 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 forward(){ digitalWrite(motor1APin, HIGH); digitalWrite(motor2APin, LOW); digitalWrite(motor3APin, HIGH); digitalWrite(motor4APin, LOW); } void back(){ 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); } }Ну я же не корректировал вашу программу, я просто идею озвучил.
Ну я же не корректировал вашу программу, я просто идею озвучил.
а вы коварный... немогли переработать его программу? как же так? что за люди нынче пошли.. ты им вопрос, а они тебе только намеки и идеи в ответ, заместо того что бы написать для тебя уже рабочий код..
сволочи какие, а не люди.. гы гы
я бы просто тумблер на питание халабуды поставил - зачем такие косяки с ифами из-за одной кнопки?
я бы просто тумблер на питание халабуды поставил - зачем такие косяки с ифами из-за одной кнопки?
и полчаса ждать пока оно загрузится? это не наш вариант :)
и полчаса ждать пока оно загрузится? это не наш вариант :)
ускорь свою дуино - сотри загрузчик!
ускорь свою дуино - сотри загрузчик!
в моей версии это технически не возможно.. оно там живет на уровне изготовления чипа :)
в моей версии это технически не возможно.. оно там живет на уровне изготовления чипа :)
это в какой это из атмел нельзя отключить загрузочную область?
это в какой это из атмел нельзя отключить загрузочную область?
из которой делают DUE
Нет, я не хотел чтобы вы мне код редактировали, хотел просто помощи, хотяя.... если вы не против то тогда можно))
Проверил все скобки - все правильно. Я не спец в программировании, но мне кажется что проблемма не в правильности написании программы а просто в неполадках с самими функциями и операторами. Пните в ту сторону, где можно почитать про другие алгоритмы опроса кнопок, может это можно как-нибудь сделать в void setup() а все основные алгоритмы будут в loop(). Вообщем гуру ардуины, помощь все еще требуется)
Нет, я не хотел чтобы вы мне код редактировали, хотел просто помощи, хотяя.... если вы не против то тогда можно))
Проверил все скобки - все правильно. Я не спец в программировании, но мне кажется что проблемма не в правильности написании программы а просто в неполадках с самими функциями и операторами. Пните в ту сторону, где можно почитать про другие алгоритмы опроса кнопок, может это можно как-нибудь сделать в void setup() а все основные алгоритмы будут в loop(). Вообщем гуру ардуины, помощь все еще требуется)
void setup() - выполняется один раз и переходит в цикл void loop()
алгоритм опроса кнопок - digitalRead()
вывод - для постоянного опроса кнопок нужно пользовать void loop()
*исходя из выше сказанного думаем над алгоритмом работы девайса - просто словами опишите, что должно происходить, не ломая логику причинноследсвенных связей.
Проверил все скобки - все правильно. Я не спец в программировании, но мне кажется что проблемма не в правильности написании программы а просто в неполадках с самими функциями и операторами.
Во во, я согласен про неполадки с оператором.. только это неполадки с оператором который в кресле сидит :)
со скобками все правильно а глупый интерпретатор все равно на них ругается? вот же ж котина.
Во во, я согласен про неполадки с оператором.. только это неполадки с оператором который в кресле сидит :)
со скобками все правильно а глупый интерпретатор все равно на них ругается? вот же ж котина.
я щитаю, что энто происки путинской гэбни - долгоиграющий проект, вышедший на финишную прямую, по облваниванию населения.
*почему вся водка названиями на *ff?
*почему вся водка названиями на *ff?
гыыы напомнил один анекдот, переводить лень. в принципе и так понятно
И без вас разабрался господа умники. Всем спасибо за помощ!
И без вас разабрался господа умники. Всем спасибо за помощ!
печалька - без нас разобрались, и чего нам теперь делать?