Веб-тренажер arduino

alastochkin
Offline
Зарегистрирован: 08.10.2013

     Здравствуйте! Не так давно появилась идея создания он-лайн тренажера для Arduino. Я веду лабораторные занятия в универсистете по курсу "Организация обмена информацией". В этом курсе активно используется Arduino в качестве удобной платформы для разработки и тестирования алгоритмов. Хотелось бы дать возможность заочникам, вечерникам проверять свои программы без доступа к плате. Пока готов прототип программы:

Симулятор целиком написан на JavaScript на основе интерпретатора http://math.chapman.edu/~jipsen/js/ и графической библиотеки Raphael http://raphaeljs.com Алгоритм работы следующий:

1. Пользователь вводит текст программы в левую колонку

2. Нажимает кнопку Запуск. При этом текст из языка Arduino конвертируется в чистый JavaScript и интерпретируется.

3. Результаты смотрит как в консольном окне, так и на самом изображении платы.

Также существует возможность проверять результаты выполнения программы (Check-Box Проверка). После выполнения программы пользователем выдается сообщение о выполнении задачи или провале. Сейчас реализованы три задачи: управление светодиодом, устранение дребезга кнопки, считывание матричной клавиатуры. Хотелось бы узнать мнение общества на подобный проект и есть ли желающие поучаствовать в нем. 

 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Мысль хорошая, но лучше ограничить эмуляцию десятком стандартных эффектов "для начинающих". Кому будет интересно - лучше сразу переходить к железу, а чтобы понять это - достаточно того десятка эффектов.

alastochkin
Offline
Зарегистрирован: 08.10.2013

Вы правы Андрей, что нужно ограничиться базовыми функциями для начинающих, однако когда у вас в группе человек 15-20, надо всех обеспечить компьютерами, Arduino, макетными платами с датчиками, тут вопрос становиться трудно решаем. Целью тренажера должно быть освоение алгоритмов обработки данных с использованием Arduino, а потом закрепление знаний на промежуточных "сложных" лабораторных работах со всеми необходимыми датчиками. Вот пример устранения дребезка кнопки:

Пример кода взят из книги Arduino CoockBook. Вместо того, чтобы студент долго разбирался на реальном устройстве с дребезгом, можно сам алгоритм его устранения отработать автономно.

Probelzaelo
Offline
Зарегистрирован: 15.04.2011

alastochkin пишет:
    Хотелось бы дать возможность заочникам, вечерникам проверять свои программы без доступа к плате. Пока готов прототип программы:

Значит теперь студенты смогут делать лабораторные прямо из дома? отлаживать алгоритмы и все такое? здоооорово ))

К сожалению поучаствовать готов только в качестве бета-тестера ;)

alastochkin
Offline
Зарегистрирован: 08.10.2013

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

alastochkin
Offline
Зарегистрирован: 08.10.2013

Прототип выложен, конечно там много не доделано, так что не судите строго: http://kafedra11.16mb.com/ArduinoTest/

Думаю как аккуратнее добавить электрические схемы заданий. Из текущих возможностей:

1) Цифровой ввод/вывод

2) Вывод на консоль через методы класса Serial (print,println)

3) задержки, стандартные математические функции, массивы

4) пользовательские функции

alastochkin
Offline
Зарегистрирован: 08.10.2013

Ответ для задания 2:

/*
Debounce sketch
a switch connected to pin 2 lights the LED on pin 13
debounce logic prevents misreading of the switch state
*/
const int inputPin = 0; // the number of the input pin
boolean left_mode = true;
const int leftPin = 2;
const int rightPin = 1;
const int debounceDelay = 100; // milliseconds to wait until stable
boolean prev_btn_state = false;
// debounce returns true if the switch in the given pin is closed and stable
boolean debounce(int pin)
{
boolean state;
boolean previousState;
previousState = digitalRead(pin); // store switch state
for(int counter=0; counter < debounceDelay; counter++)
{
delay(1); // wait for 1 millisecond
state = digitalRead(pin); // read the pin
if( state != previousState)
{
counter = 0; // reset the counter if the state changes
previousState = state; // and save the current state
}
}
// here when the switch state has been stable longer than the debounce period
return state;
}
void setup()
{
pinMode(inputPin, INPUT);
pinMode(leftPin, OUTPUT);
pinMode(rightPin, OUTPUT);
//digitalWrite(leftPin,HIGH);
//digitalWrite(rightPin,LOW);
}
void loop()
{
  boolean btn_on = debounce(inputPin);
  
  if( btn_on && !prev_btn_state)
  {
    left_mode = !left_mode;
  }
  prev_btn_state=btn_on;
  
  if ( left_mode ) 
  {
digitalWrite(leftPin,HIGH);
digitalWrite(rightPin,LOW);
  }
  else
  {
    digitalWrite(leftPin,LOW);
digitalWrite(rightPin,HIGH);
  }
}
alastochkin
Offline
Зарегистрирован: 08.10.2013

Ответ для задания 3:

void setup()
{
for (int i=0;i<9;i++) pinMode(i,INPUT);
for (int i=9;i<13;i++) pinMode(i,OUTPUT);
}
 
void loop()
{
   if ( (digitalRead(0)==HIGH) && (digitalRead(5)==HIGH) ) digitalWrite(9,HIGH);
   if ( (digitalRead(1)==HIGH) && (digitalRead(6)==HIGH) ) digitalWrite(10,HIGH);
   if ( (digitalRead(2)==HIGH) && (digitalRead(7)==HIGH) ) digitalWrite(11,HIGH);
   if ( (digitalRead(3)==HIGH) && (digitalRead(8)==HIGH) ) digitalWrite(12,HIGH);
}
Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

alastochkin пишет:

   if ( (digitalRead(0)==HIGH) && (digitalRead(5)==HIGH) ) digitalWrite(9,HIGH);
   if ( (digitalRead(1)==HIGH) && (digitalRead(6)==HIGH) ) digitalWrite(10,HIGH);
   if ( (digitalRead(2)==HIGH) && (digitalRead(7)==HIGH) ) digitalWrite(11,HIGH);
   if ( (digitalRead(3)==HIGH) && (digitalRead(8)==HIGH) ) digitalWrite(12,HIGH);

С точки зрения логики программирования - последний if надо заменять на esle. :) Иначе какая-то мысль незаконченная получается.

alastochkin
Offline
Зарегистрирован: 08.10.2013

Все условия в примере развязаны, хотя более корректный вариант, конечно:

if ( (digitalRead(0)==HIGH) && (digitalRead(5)==HIGH) ) digitalWrite(9,HIGH);
else  if ( (digitalRead(1)==HIGH) && (digitalRead(6)==HIGH) ) digitalWrite(10,HIGH);
else  if ( (digitalRead(2)==HIGH) && (digitalRead(7)==HIGH) ) digitalWrite(11,HIGH);
else  if ( (digitalRead(3)==HIGH) && (digitalRead(8)==HIGH) ) digitalWrite(12,HIGH);
else 
{
   //Необработанная комбинация
};

Еще вариант, с массивом:

const int led_total = 4; //Размер массива
const int led_start_index = 9;
const int led_map[led_total][2] = {
{0, 5},
{1, 6},
{2, 7},
{3, 8}
};

void setup()
{
 int i;
 for (i=0;i<8;i++) pinMode(i,INPUT);
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(12,OUTPUT);
}

void loop()
{
  for (int i=0;i<led_total;i++)
  {
      if ( (digitalRead(led_map[i][0])==HIGH) &&
           (digitalRead(led_map[i][1])==HIGH) )
           {
               digitalWrite(led_start_index + i,HIGH);
           }
  }
}