Залипает программа.
- Войдите на сайт для отправки комментариев
Чт, 30/01/2014 - 15:41
Здравствуйте, я пытаюсь собрать своего первого робота на arduino uno, но не могу решить одну проблему.
На передней части робота находится серва с установленным на нее сонаром. При работе программы сонар измеряет расстояние перед роботом и если оно меньше 50см. сонар "оглядывается" на 180 градусов, и заносит данные в массив, после чего он должен вернуться в исходное состояние, но этого не происходит. Программа залипает на цикле. Пробовал использовать циклы for и while, for выполнялся и программа останавливалась, а while зависал при активации...
Может кто объяснить нубу в чем косяк и как идею реальзовать?
#include <Servo.h>//Загрузка библиотеки сервы Servo servoMain; // Инициализация сервы #define D1 2 // Направление вращение двигателя 1 #define M1 3 // ШИМ вывод для управления двигателем 1 #define D2 4 // Направление вращение двигателя 2 #define M2 5 // ШИМ вывод для управления двигателем 2 int x = 0; int myArray[36]; int i = 104; //Переменная отвечающая за положение сервы boolean trig = false; //Направление вращения bool direction = 0; // Текущее направление вращения int value; // Текущее значение ШИМ const int Trig = 8; const int Echo = 9; void setup() { pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); pinMode(D1, OUTPUT); pinMode(D2, OUTPUT); servoMain.attach(10); // Сарва присоединена к 10 выводу Serial.begin(9600); } unsigned int time_us=0; unsigned int distance_sm=0; void loop() { servoMain.write(i); dist(); Serial.println(distance_sm); // Выводим на порт if (distance_sm<50) // Если расстояние менее 50 сантиметром { scan(); } servoMain.write(104); } void forward() { digitalWrite(D1, 0); // Задаем направление вращения analogWrite(M1, 200); // Задаем скорость вращения } void scan() { Serial.println(x); do { i=x*5; servoMain.write(i); dist(); myArray[x]=distance_sm; Serial.print(myArray[x]); Serial.print(" "); Serial.println(i); Serial.println(distance_sm); Serial.println(x); x=x+1; } while (x <= 36); } void dist() { digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(Trig, LOW); // Затем убираем time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=time_us/58; // Пересчитываем в сантиметры delay(150); }