| В ходе отладки программ для Lego роботов, особенно когда идет интенсивная работа с сенсорами, возникает ситуация когда сенсор вопреки ожиданиям не срабатывает на какое-то значение. В таком случае используется обычно подход "попробуй и измени" (try and fix): сначала выставляется одно значение, если оно не работает, то выставляется другое и так может продолжаться очень долго. Помимо временных затрат, данный метод не дает понимания почему одни значения не работают, а другие начинают работать. | 
В образовательной (education) версии Lego Mindstorms NXT-G 2.0 такой режим включен в программу. В коробочных (retail) версиях данного продукта, эта функциональность отсутствует. Но это не должно мешать использовать предложенный метод, поскольку организовать накопление и запись данных можно самостоятельно.
Например, следующая программа выводит данные с звукового сенсора на экран в виде гистограммы. Каждый раз на экране отображаются данные за последние 2 секунды.
Когда недалеко от сенсора звука будет происходить разговор, на экране NXT блока отобразится информация подобная той, что на картинке ниже:

Горизонтальные линии на экране обозначают различный уровень выходного сигнала: самая нижняя линия - 25%, средняя - 50%, самая верхняя линия - 75%.
Как видно из диаграммы, полученной в ходе накопления и отображения информации, редко какое слово в разговоре по громкости звучит больше, чем 50%. Поэтому, если в программе, реагирующей на звук разговора, мы хотим указать наиболее подходящие значения срабатывания, то имеет смысл рассматривать значения в 30-35%.
Аналогичная программа на языке Not Exactly C (NXC), будет выглядеть следующим образом:
task main() {
    SetSensor(IN_4, SENSOR_SOUND);
    ClearScreen();
    Wait(500);
    int data=0;
    while(1) {
        for(int i=0; i<100; i++) {
            LineOut(i, 0, i, 63, DRAW_OPT_CLEAR_PIXELS);
            PointOut(i, 15);
            PointOut(i, 31);
            PointOut(i, 47);
            Wait(20);
            data=Sensor(IN_4);
            LineOut(i, 0, i, data*0.63);
        }
    }
}В данной программе опять считываются данные с звукового сенсора и при этом записываются в файл. Обратите внимание на имя файла - с расширением ".csv" - нужно для того, чтобы потом этот файл можно было бы легко открыть в Excel. Также помимо показаний сенсора записывается время с начала запуска программы. Время и показания записываются через точку с запятой (;) - это также нужно для автоматического форматирования файла в Excel.
task main() {
    SetSensor(IN_4, SENSOR_SOUND);
    SetSensor(IN_1, SENSOR_TOUCH);
    Wait(500);
    int data=0;
    long t0, time;
    byte fh;
    short bw;
    string write, tmp;
    t0=CurrentTick();
    
    DeleteFile("data.csv");
    CreateFile("data.csv", 4096, fh);
    while(SENSOR_1 == 0) {
        data=Sensor(IN_4);
        time=CurrentTick()-t0;
        write=StrCat(NumToStr(time), ";", NumToStr(data));
        WriteLnString(fh, write, bw);
        Wait(20);
    }
    CloseFile(fh);
}Из графика видно, что начиная где-то с 3 секунды (ось X измеряется в миллисекундах) датчик начал воспринимать какие-то шумы, которые продолжались в течении 4,5 секунд. При этом шумы по своей громкости не достигали и 50%, а пики больше 40% были зафиксированы только дважды.
В NXT-G также можно записывать данные с сенсоров в файл, просто это не показывается в данном материале. Желающие могут обратиться к соответствующей статье, показывающей работу с файлами в NXT-G.
 
Комментариев нет:
Отправить комментарий