Массовое тестирование Arduino
Я использую Arduino для класса IoT (40 студентов). Я настроил тестовую программу, чтобы проверить все датчики и приводы, используемые в классе (нам нужно переработать для следующего семестра). Однако я также хотел бы проверить сами Arduino (а также NodeMCUs) на случай, если некоторые из блоков были сломаны. У меня есть идея тестирования ввода/вывода каждого контакта, чтобы убедиться, что он работает с помощью светодиодов и кнопок, но если у кого - то есть идеи по улучшению тестирования, было бы здорово услышать от вас. Я думаю, что я не единственный, кто повторно использует компоненты IoT из одного семестра в другой. Было бы здорово услышать от других инструкторов в области IoT.
С наилучшими пожеланиями,
Lasse Berntzen,
Университет Юго-Восточной Норвегии,
[email protected]
@Lasse Berntzen, 👍4
Обсуждение5 ответов
Тестирование микрокомпьютеров-очень сложная задача. В вашем случае я бы предложил написать некоторые программы, чтобы сделать именно то, что вы говорите. Затем пусть студенты проведут тестирование. Когда начнется урок, вы должны научить их основам, Это проверит компьютеры и т. Д., А Также тестовое оборудование на скамейках. В конце тестирования у них будут знания основ, которые им понадобятся для продолжения занятия. Вы также можете попросить студентов сделать это в конце семестра, чтобы получить фору в решении любых проблем.
Я бы добавил второй Arduino для подачи ВЫСОКОГО и НИЗКОГО сигнала на тестируемый Arduino (для проверки ВХОДНОГО СИГНАЛА) и для проверки того, что тестируемый Arduino может выводить ВЫСОКИЙ и НИЗКИЙ уровень. Тестирование входов, выходов и возможность загрузить тестовый скетч позволят выявить наиболее распространенные проблемы.
Тестирование регулятора было бы моим следующим шагом, но это также зависит от того, использовали ли вы предыдущий курс регулятора.
Когда я делаю новую (Uno-подобную) плату, я тестирую на замыкание и открываю скетч, который последовательно мигает каждым контактом. Предложение @Gerben также протестировать входные данные имеет большой смысл для вашего приложения. Плюс базовая способность к включению питания (рабочий вход разъема и регулятор напряжения, рабочий USB-разъем и USB-связь) была бы еще одним тестом, который я бы сделал. Я бы, вероятно, выбрал платы с встроенным чипом для будущих покупок (если вы еще этого не сделали).
Существует ряд открытых вопросов, которые необходимо решить, чтобы сузить рамки этого проекта до управляемых и разумных усилий. Например:
- Какой Arduino (плата и процессор) вы используете? Отключает ли плата питание от регулируемого источника USB 5 вольт? Или он использует регулятор, который нуждается в тестировании?
- Сколько существует контактов GPIO? Будут ли они использоваться для вождения, смысла или и того, и другого?
- Есть ли аналоговые контакты? Нужно ли их тестировать в определенном диапазоне или просто выбрать напряжение?
- Существуют ли какие-либо ШИМ-выходы, которые необходимо протестировать?
Чтобы упростить тестирование, мы можем сделать некоторые предположения. Например:
- Если аспект GPIO контакт работает, то любая функция ШИМ для этого контакта может считаться функциональной.
- Если заданное напряжение на выводе аналогового входа приводит к разумному аналого-цифровому преобразованию, то все остальные разумные напряжения приведут к ожидаемому аналого-цифровому преобразованию.
Для тестирования многих UUT (тестируемых блоков) почти всегда лучше построить приспособление. Это могут быть простые кабели, подключенные к другому (тщательно контролируемому) Arduino вплоть до ложа гвоздей В тестере цепей (ICT).
Проект "Make a Pogo Pin Test Jig" в Adafruit решает многие из этих проблем на уровне, который может быть пригоден для реализации на уровне колледжа.
Полный тест, очевидно, будет чем-то довольно сложным и , вероятно, потребует создания какой-то установки. Однако вы можете выполнить минимальный тест, который проверяет наличие распространенных режимов сбоя, не подключая никакого дополнительного оборудования.
Я предполагаю, что этапы ввода-вывода pin легче всего сломать. Затем вы можете
проверить, что при чтении pin , настроенного на ВЫВОД
, вы получаете
значение, которое должен выводить pin. Вы можете использовать
случайные емкости плавающих выводов для проверки их в качестве входных данных:
емкость должна заставить вывод “запомнить” свое предыдущее выходное значение в течение
некоторого времени, и это время должно быть очень коротким, если включено внутреннее подтягивание
.
Следующая программа тестирует контакты 2-13 и A0–A5 Uno. Он проверяет , что:
- контакт, установленный на
OUPUT
LOW
, считываетLOW
- pin, установленный на
выход
HIGH
, считываетHIGH
- контакт переключенный от
ВЫХОДА
ВЫСОКОГО
кВХОДНОМУ
ВХОДУ читаетHIGH
- контакт переключенный от
ВЫХОДА
НИЗКОГО
кВХОДНОМУ
ВХОДУ читаетLOW
- pin , переключенный с
OUPUT
LOW
наINPUT_PULLUP
, считываетLOW
, а затем переключается наHIGH
менее чем через микросекунду
Контакты 0 и 1 не тестируются, так как они подключены к последовательному порту. С другой стороны, если вы можете загрузить скетч, вы знаете, что эти контакты работают по крайней мере как RX/TX.
Обратите внимание, что программа использует прямой доступ к порту, так как функции Arduino для доступа к контактам слишком медленные для такого рода тестов. Если все работает, программа печатает “Все тесты прошли”. В противном случае печатаются конкретные сообщения об ошибках, а затем “Некоторые тесты не удалось".
#include <avr/cpufunc.h>
#include <util/delay.h>
int failures = 0;
static void log_failure(char port_name, const char * reason)
{
failures++;
Serial.print("FAIL: Port ");
Serial.print(port_name);
Serial.print(", read ");
Serial.println(reason);
}
static inline __attribute__((always_inline))
void test_port(const char port_name, uint8_t mask,
volatile uint8_t *pin, volatile uint8_t *ddr, volatile uint8_t *port)
{
*port = 0;
*ddr = mask; // OUTPUT LOW
_NOP();
if ((*pin & mask) != 0)
log_failure(port_name, "OUTPUT LOW");
*port = mask; // OUTPUT HIGH
_NOP();
if ((*pin & mask) != mask)
log_failure(port_name, "OUTPUT HIGH");
*ddr = 0; // INPUT_PULLUP
*port = 0; // INPUT -> HIGH
_NOP();
if ((*pin & mask) != mask)
log_failure(port_name, "INPUT HIGH");
*ddr = mask; // OUTPUT LOW
*ddr = 0; // INPUT -> LOW
_NOP();
if ((*pin & mask) != 0)
log_failure(port_name, "INPUT LOW");
*port = mask; // INPUT_PULLUP
_NOP();
uint8_t r1 = *pin;
_delay_us(1);
uint8_t r2 = *pin;
if ((r1 & mask) != 0 || (r2 & mask) != mask)
log_failure(port_name, "INPUT_PULLUP");
}
void setup()
{
Serial.begin(9600);
TIMSK0 &= ~_BV(TOIE0); // disable timer interrupt
test_port('B', 0x3f, &PINB, &DDRB, &PORTB); // PB0..PB5
test_port('C', 0x3f, &PINC, &DDRC, &PORTC); // PC0..PC5
test_port('D', 0xfc, &PIND, &DDRD, &PORTD); // PD2..PD7
if (failures == 0)
Serial.println("All tests passed.");
else
Serial.println("Some tests failed.");
}
void loop(){}
В качестве расширения аналоговые входы можно было бы протестировать аналогично тесту 5: если аналоговая выборка выполняется в нужное время, то можно получить показания где-то в среднем диапазоне.
- Ardutester Millenium I2c Lcd ничего не показывает!
- Можно ли программировать для Ардуино без реальной платы?
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
Спасибо вам всем за ваш ценный вклад. К сожалению, я должен сделать тестирование сам, так как студенты работают из дома (Covid-19). Таким образом, каждый студент получает пакет со всеми компонентами и делает лабораторные работы под онлайн-наблюдением. Вот почему тестирование так важно. У меня был такой же класс прошлым летом с хорошими результатами, но с совершенно новыми компонентами., @Lasse Berntzen