Массовое тестирование Arduino

arduino-uno testing

Я использую Arduino для класса IoT (40 студентов). Я настроил тестовую программу, чтобы проверить все датчики и приводы, используемые в классе (нам нужно переработать для следующего семестра). Однако я также хотел бы проверить сами Arduino (а также NodeMCUs) на случай, если некоторые из блоков были сломаны. У меня есть идея тестирования ввода/вывода каждого контакта, чтобы убедиться, что он работает с помощью светодиодов и кнопок, но если у кого - то есть идеи по улучшению тестирования, было бы здорово услышать от вас. Я думаю, что я не единственный, кто повторно использует компоненты IoT из одного семестра в другой. Было бы здорово услышать от других инструкторов в области IoT.
С наилучшими пожеланиями,
Lasse Berntzen,
Университет Юго-Восточной Норвегии,
[email protected]

, 👍4

Обсуждение

Спасибо вам всем за ваш ценный вклад. К сожалению, я должен сделать тестирование сам, так как студенты работают из дома (Covid-19). Таким образом, каждый студент получает пакет со всеми компонентами и делает лабораторные работы под онлайн-наблюдением. Вот почему тестирование так важно. У меня был такой же класс прошлым летом с хорошими результатами, но с совершенно новыми компонентами., @Lasse Berntzen


5 ответов


1

Тестирование микрокомпьютеров-очень сложная задача. В вашем случае я бы предложил написать некоторые программы, чтобы сделать именно то, что вы говорите. Затем пусть студенты проведут тестирование. Когда начнется урок, вы должны научить их основам, Это проверит компьютеры и т. Д., А Также тестовое оборудование на скамейках. В конце тестирования у них будут знания основ, которые им понадобятся для продолжения занятия. Вы также можете попросить студентов сделать это в конце семестра, чтобы получить фору в решении любых проблем.

,

0

Я бы добавил второй Arduino для подачи ВЫСОКОГО и НИЗКОГО сигнала на тестируемый Arduino (для проверки ВХОДНОГО СИГНАЛА) и для проверки того, что тестируемый Arduino может выводить ВЫСОКИЙ и НИЗКИЙ уровень. Тестирование входов, выходов и возможность загрузить тестовый скетч позволят выявить наиболее распространенные проблемы.

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

,

0

Когда я делаю новую (Uno-подобную) плату, я тестирую на замыкание и открываю скетч, который последовательно мигает каждым контактом. Предложение @Gerben также протестировать входные данные имеет большой смысл для вашего приложения. Плюс базовая способность к включению питания (рабочий вход разъема и регулятор напряжения, рабочий USB-разъем и USB-связь) была бы еще одним тестом, который я бы сделал. Я бы, вероятно, выбрал платы с встроенным чипом для будущих покупок (если вы еще этого не сделали).

,

0

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

  1. Какой Arduino (плата и процессор) вы используете? Отключает ли плата питание от регулируемого источника USB 5 вольт? Или он использует регулятор, который нуждается в тестировании?
  2. Сколько существует контактов GPIO? Будут ли они использоваться для вождения, смысла или и того, и другого?
  3. Есть ли аналоговые контакты? Нужно ли их тестировать в определенном диапазоне или просто выбрать напряжение?
  4. Существуют ли какие-либо ШИМ-выходы, которые необходимо протестировать?

Чтобы упростить тестирование, мы можем сделать некоторые предположения. Например:

  1. Если аспект GPIO контакт работает, то любая функция ШИМ для этого контакта может считаться функциональной.
  2. Если заданное напряжение на выводе аналогового входа приводит к разумному аналого-цифровому преобразованию, то все остальные разумные напряжения приведут к ожидаемому аналого-цифровому преобразованию.

Для тестирования многих UUT (тестируемых блоков) почти всегда лучше построить приспособление. Это могут быть простые кабели, подключенные к другому (тщательно контролируемому) Arduino вплоть до ложа гвоздей В тестере цепей (ICT).

Проект "Make a Pogo Pin Test Jig" в Adafruit решает многие из этих проблем на уровне, который может быть пригоден для реализации на уровне колледжа.

,

1

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

Я предполагаю, что этапы ввода-вывода pin легче всего сломать. Затем вы можете проверить, что при чтении pin , настроенного на ВЫВОД, вы получаете значение, которое должен выводить pin. Вы можете использовать случайные емкости плавающих выводов для проверки их в качестве входных данных: емкость должна заставить вывод “запомнить” свое предыдущее выходное значение в течение некоторого времени, и это время должно быть очень коротким, если включено внутреннее подтягивание .

Следующая программа тестирует контакты 2-13 и A0–A5 Uno. Он проверяет , что:

  1. контакт, установленный на OUPUT LOW, считывает LOW
  2. pin, установленный на выход HIGH, считывает HIGH
  3. контакт переключенный от ВЫХОДА ВЫСОКОГО к ВХОДНОМУ ВХОДУ читает HIGH
  4. контакт переключенный от ВЫХОДА НИЗКОГО к ВХОДНОМУ ВХОДУ читает LOW
  5. 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: если аналоговая выборка выполняется в нужное время, то можно получить показания где-то в среднем диапазоне.

,