Использование arduino для автоматизации тестирования устройств

от автора

Наша компания «RTL Service» занимается разработкой системы локального позиционирования, с помощью которой можно точно определить, где в помещении находится определенный человек. Помимо этого, наша система позволяет связаться с этим человеком с помощью собственных коммуникаторов (рисунок 1) по защищенному каналу связи.


Рис. 1 — коммуникатор

Я — инженер отдела тестирования, и в мои обязанности входит проверка того, чтобы прошивка и начинка наших коммуникаторов верно отрабатывали всевозможные комбинации нажатия и зажатия клавиш. Раньше это делалось вручную и занимало немало времени и сил (под конец пальцы уже не хотели слушаться). Поэтому, было принято решение заменить человеческий труд на автоматическое тестирование с помощью железяк.

В качестве тестировщика была выбрана плата Arduino UNO. Она достаточно проста и удобна в использовании, имеет встроенный микроконтроллер ATMega328, 14 цифровых входов/выходов (при чем 6 из них могут использоваться как выходы ШИМ), кварцевый генератор на 16 МГц и разъем USB.

Итак, приступим.

Плата кнопок подключается по шлейфу к плате коммуникатора. В шлейфе присутствует четыре линии, три из которых отвечают за 3 кнопки, и четвертая отвечает за землю. Для тестирования была сделана своя платка для подключения разъема кнопок коммуникатора (рис. 2) к Arduino. На ней присутствует, соответственно, шлейф для подключения к плате устройства связи, 4 провода на пины контроллера и оптопары, чтобы отвязать кнопки от земли.


Рис. 2 – плата соединения


Рис.3 – как всё это выглядит

Далее дело за программой.

У коммуникатора есть 3 кнопки: кнопка запроса среды/ответа, кнопка смены канала, на котором будет производиться связь, кнопка включения/выключения устройства. Также, например, одновременное зажатие нижней и верхней кнопок приводит к увеличению громкости коммуникатора, а зажатие нижней и средней – к уменьшению.

Чтобы нажать какую-либо кнопку, нужно послать на соответствующий пин 5 В (т.е. перевести пин в состояние HIGH). Таким образом, чтобы её отпустить, нужно перестать подавать 5 В (перевести в состояние LOW). Например, функция включения устройства:

void switching(){
Serial.println(«ON/OFF»);
delay(70);
digitalWrite(low_button, HIGH);
delay(7000);
digitalWrite(low_button, LOW);
delay(500);
};

В этой функции на пин, отвечающий за нижнюю кнопку, в течение 7 секунд (соответствует времени включения/выключения устройства связи) посылается 5 В. После этого, посылается 0 В, что означает отжатие клавиши.

Примерно таким же образом можно реализовать и процесс зажатия одной клавиши и нажатия/зажатия в этот момент другой:

void buttDelay_Press(int pin_1, int pin_2){
digitalWrite(pin_1, HIGH);
delay(100);
buttPress(1, pin_2,0,0,10);//press button
buttPress(1, pin_2,0,0,60);
digitalWrite(pin_2, HIGH); delay(10000);
digitalWrite(pin_2, LOW);
if (pin_2 == low_button )
{
switching();
}

digitalWrite(pin_2, HIGH);
tDelay(60000); //change pin status to LOW
if (pin_2 == low_button )
{
switching();
}
};

В этой функции зажимается кнопка pin_1. В этот же момент времени нажимается кнопка pin_2 10 и 60 раз подряд, после чего зажимается на 10 и 60 секунд. Помимо этого, здесь присутствует проверка на зажатие нижней кнопки. Выше было указано, что при зажатии этой кнопки более 7 секунд коммуникатор выключается/включается, следовательно, если это происходит, устройство нужно вернуть в исходное состояние.

Присутствуют и случайные нажатия и зажатия клавиш:

// Random pressing
void buttRandPress(int ncount){
for (int i = 0; i < ncount; i++) {
rbutton = buttons[random(3)];
buttPress(1, rbutton,0,0, 1);
}
};

// Random holding
void buttRandDelay(int ncount, int dtime){
for (int i = 0; i < ncount; i++) {
rbutton = buttons[random(3)];
buttDelay(1, rbutton,0,0);
tDelay(dtime);
}
};

В этих функциях случайным образом выбирается одна из трех кнопок, которая нажимается или зажимается на случайное время.

В тестах также проверяется и зажатие всех клавиш. Проверяются все комбинации с разными задержками между нажатиями, потому что и такое в жизни бывает.

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

С помощью предложенного выше способа можно тестировать и другие устройства. Например, можно сымитировать неожиданный сброс по питанию и посмотреть, как быстро устройство включится в сеть.

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

Автор: Федор Талаев

ссылка на оригинал статьи https://habrahabr.ru/post/282163/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *