В чем ошибка

Russk1j
Offline
Зарегистрирован: 03.05.2012

Здравствуйте! Помогите пожалуйста разобраться. Совместил 2 программы, но не работает. 
Суть в том, что машинка едет вперед и датчик ультрозвуковой считывает значения до препятствия, как значение меньше указанного, разворачивается, т.е. из движков на секунду меняет свое направление.
Ошибка

my_robot:74: error: a function-definition is not allowed here before '{' token

ругается на эту строчку

back1(); //первый движок назад

Вся программа вот, потом хочу конечно задействовать сервомашинку, чтобы вращать датчик и можно было определять сбоку препятствия

 

struct MOTOR // структура для хранения номеров pin-ов, к которым подключены моторчики
{
int in1; // INPUT1
int in2; // INPUT2
int enable; // ENABLE1
};
const int Trig = 2; 
const int Echo = 4; 
// определяем порты, к которым подключены моторчики
MOTOR MOTOR1 = { 13, 12, 11 };
MOTOR MOTOR2 = { 7, 8, 9 };

void setup()
{
pinMode(Trig, OUTPUT); 
pinMode(Echo, INPUT); 
pinMode(MOTOR1.in1, OUTPUT); // настраиваем выводы
pinMode(MOTOR1.in2, OUTPUT); // на ВЫВОД
pinMode(MOTOR2.in1, OUTPUT);
pinMode(MOTOR2.in2, OUTPUT);
Serial.begin(9600); 
}

unsigned int time_us=0;
unsigned int distance_sm=0;

void loop()
{
digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера 
delayMicroseconds(10); // Удерживаем 10 микросекунд 
digitalWrite(Trig, LOW); // Затем убираем 
time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса 
distance_sm=time_us/58; // Пересчитываем в сантиметры 
Serial.println(distance_sm); // Выводим на порт

if (distance_sm<15) // Если расстояние менее 15 сантиметром 
{ 
back1(); //первый движок назад
forward2(); //второй движок вперед
delay(1000); //в течении 1 секунды
} 
else 
{ 
forward1(); // вращаем оба моторчика вперёд
forward2();
}

void forward1() // первый вперёд
{
digitalWrite(MOTOR1.in1, HIGH);
digitalWrite(MOTOR1.in2, LOW);
analogWrite(MOTOR1.enable, 254);
}

void forward2() // второй вперёд
{
digitalWrite(MOTOR2.in1, HIGH);
digitalWrite(MOTOR2.in2, LOW);
analogWrite(MOTOR2.enable, 254);
}

void back1() // первый назад
{
digitalWrite(MOTOR1.in1, LOW);
digitalWrite(MOTOR1.in2, HIGH);
analogWrite(MOTOR1.enable, 254);
}

void back2() // второй назад
{
digitalWrite(MOTOR2.in1, LOW);
digitalWrite(MOTOR2.in2, HIGH);
analogWrite(MOTOR2.enable, 254);
}
}

 

Russk1j
Offline
Зарегистрирован: 03.05.2012

 И вот еще тоже не совсем понимаю, у меня датчик считает что растояние в какой-то момент будет меньше 15, а в остальных все нормально, нужно сделать задержку или как чтоб он развернулся? Или все нормально? Просто я хочу как только одно из значений будет меньше 15, все значит разворот.

leshak
Offline
Зарегистрирован: 29.09.2011

 Будте добры прочитайте прекрепленную тему Вставка программного кода в тему/комментарий

В стартовом посте я поправил, но в дальнейшем лучше вставлять код так.

И, на будущие, постарайтесь давать более говорящие имена темам. Очень трудно ориентироваться среди тем с общими названиями типа "помогите нубу", "вопросы новичка", "в чем ошибка", "проблеммы" и т.п.

leshak
Offline
Зарегистрирован: 29.09.2011

Russk1j пишет:

my_robot:74: error: a function-definition is not allowed here before '{' token

ругается на эту строчку

back1(); //первый движок назад

forward1(); // вращаем оба моторчика вперёд

Это происходит потому что вы пренебрегаете использованием отступов при оформлении кода. 

Если бы вы "отбили" отступами все вложенные блоки кода, то сразу "на глаз" увидели что у вас определения всех фунции backN, forwardN попали в тело функции loop()

Вот отформатированная и компилирующаяся версия вашего скетча

struct MOTOR // структура для хранения номеров pin-ов, к которым подключены моторчики
{
int in1; // INPUT1
int in2; // INPUT2
int enable; // ENABLE1
};
const int Trig = 2; 
const int Echo = 4; 
// определяем порты, к которым подключены моторчики
MOTOR MOTOR1 = { 13, 12, 11 };
MOTOR MOTOR2 = { 7, 8, 9 };

void setup()
{
  pinMode(Trig, OUTPUT); 
  pinMode(Echo, INPUT); 
  pinMode(MOTOR1.in1, OUTPUT); // настраиваем выводы
  pinMode(MOTOR1.in2, OUTPUT); // на ВЫВОД
  pinMode(MOTOR2.in1, OUTPUT);
  pinMode(MOTOR2.in2, OUTPUT);
  Serial.begin(9600); 
}

unsigned int time_us=0;
unsigned int distance_sm=0;

void loop()
{
    digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера 
    delayMicroseconds(10); // Удерживаем 10 микросекунд 
    digitalWrite(Trig, LOW); // Затем убираем 
    time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса 
    distance_sm=time_us/58; // Пересчитываем в сантиметры 
    Serial.println(distance_sm); // Выводим на порт
    
    if (distance_sm<15) // Если расстояние менее 15 сантиметром 
    { 
      back1(); //первый движок назад
      forward2(); //второй движок вперед
      delay(1000); //в течении 1 секунды
    } 
    else 
    { 
      forward1(); // вращаем оба моторчика вперёд
      forward2();
    }

}

void forward1() // первый вперёд
{
  digitalWrite(MOTOR1.in1, HIGH);
  digitalWrite(MOTOR1.in2, LOW);
  analogWrite(MOTOR1.enable, 254);
}

void forward2() // второй вперёд
{
  digitalWrite(MOTOR2.in1, HIGH);
  digitalWrite(MOTOR2.in2, LOW);
  analogWrite(MOTOR2.enable, 254);
}

void back1() // первый назад
{
  digitalWrite(MOTOR1.in1, LOW);
  digitalWrite(MOTOR1.in2, HIGH);
  analogWrite(MOTOR1.enable, 254);
}

void back2() // второй назад
{
  digitalWrite(MOTOR2.in1, LOW);
  digitalWrite(MOTOR2.in2, HIGH);
  analogWrite(MOTOR2.enable, 254);
}

"Отформатировать" его заняло примерно 10-сек. Зато и другим сразу его легче читать.

Маленькая "хитрость" (вдруг не знаете) котороя поможет в работе с уже написанным кодом в IDE. Что-бы не "набивать пробелы перед каждой строчкой, можно выделить несколько строчек и нажать TAB сразу весь выделенный блок сместиться на несколько позиций вправо, а Shift-TAB - влево."

Russk1j
Offline
Зарегистрирован: 03.05.2012

 Спасибо за развернутый ответ)
Все замечания и советы учту по оформленю и программе

maksim
Offline
Зарегистрирован: 12.02.2012

Для справки - если в Arduino IDE нажать Ctrl + T, то код форматируется автоматически.

Russk1j
Offline
Зарегистрирован: 03.05.2012

 Еще вопрос такой, может знает кто, как только не подключал сервомашинку 9г, она дергается и не хочет нормально вращаться. И через стабилизатор делал, не выходит, подавал и 4,5 и 7,2 вольта от батареек, ну всеравно стабилизатор стоит

leshak
Offline
Зарегистрирован: 29.09.2011
  1. Не нужно все мешать "в одну тему". Лучше завести новую.
  2. Но перед этим стоит воспрользоватся поиском, или просто просмотреть темы относящиеся к сервам (вот тут вы и поймете почему важно толковое название темы). Их обсасывали уже с разных сторон. И многие "обычные вещи", типа "питание, тайминги, тип сервы и т.п." - уже лень повторять.
  3. Не предполагайте в форумчанах телепатов: что за серва (ссылки на описание, даташит и т.п. если есть, если нет - попробуйте найти, вам тоже пригодитсся), схему подключения, используемый скетч и т.п. Этот подход относится к любым проблемам. Чем более вразумительное описание проблемы вы дадите, чем больше предоставити инфы (не будете других заставлять мучать гугл или задавать вам кучу уточняющих вопросов) - тем больше шансов что кто-то ответит.
  4. Ну и прежде чем переходить к следующей проблеме, было-бы неплохо сказать решилась ли задача из стартового поста или нет. А то, в таких случаях, у меня складывается впечателние что "не больно-то оно и нужно было".
Russk1j
Offline
Зарегистрирован: 03.05.2012

 Все хорошо и работает) спасибо еще раз) про сервы я много читал и подключение и устройство. А серва самая простая 9g как я и написал синенькая такая.