Image 01

Image 01 Image 01

A&A-Scheduler

Приложение A&A-Scheduler предназначена для работы с микроконтроллерами. Планировщик задач, предназначенный для управления Arduino и другими платформами микроконтроллеров с помощью устройств Android. Связь с микроконтроллером осуществляется с помощью USB UART переходника. A&A-Scheduler автоматически распознает драйвера USB UART переходников и пытается отправить запрос микроконтроллеру с ожиданием ответа готовности. После получения сигнала готовности A&A-Scheduler согласно запланированному графику будет отправлять соответствующие команды микроконтроллеру. A&A-Scheduler работает в фоновом режиме.

Image 01

Image 02

Image 03

Image 04

Чтобы разобраться как приложение работает с микроконтроллером рассмотрим простой пример. Суть примера продемонстрировать распознавание приложением подключение микроконтроллера и обработка микроконтроллером команд поступающих из приложения. Для этого воспользуемся платформу ардуино NANO, пьезо динамик, 5(шт.) светодиодов, 6(шт.) резисторов. Платформа ардуино NANO уже интегрирована с USB UART контролером и имеет USB разъем. Первым делом подключим NANO с помощью USB кабеля к нашему андроид устройству. При запуске приложения или если оно запущено система андроид у нас запросит разрешение для работы приложения с USB UART. На данном этапе не важно подтвердите или откажете этот запрос. Далее перейдите на экран управления и нажмите на пункт “Список USB устройств”. В открывшемся окне вы увидите строку с именем USB UART контролера (см. рис.). Следующим шагом необходимо собрать схему показанную на рисунке и подключить к соответствующим выводам ардуино NANO. Необходимо загрузить программу в микроконтроллер. Для этого воспользуемся “Arduino IDE”.

Ознакомится с скетчем можно ниже. После загрузки скетча в ардуино NANO его можно подключить к нашему андроид устройству. Питание для ардуино NANO будет поступать с андроид устройства. Теперь необходимо утвердить запрос системы о разрешении приложению работать с USB UART. После этого значок нот-сообщения сменится на “v”, а пьезо динамик подключенный к ардуино NANO выдаст звуковой сигнал. Как видно из скетча работа приложения с микроконтроллером осуществляется на скорости 115200 bit. При обнаружении USB UART контролера приложение отправляет запрос – stmA и ожидает ответ в виде - rtmA. После получения ответа приложение считает соединение с микроконтроллером установленным и готова отправлять запланированные команды. Прежде, чем запланировать задачу можно проверить как микроконтроллер реагирует на команды. После установления соединеня с микроконтроллером на экране управления выбираем пункт “Тестирование команд”. В открывшемся списке выбираем необходимую команду. Она сразу будет передана микроконтроллеру. Например “Commanda2 = 000011A” означает что будет передано - 000011A. В нашем примере это означает, что загорятся два светодиода и через 2 секунды погаснут.

Скетч для загрузки (здесь):

const int piezo_pin = 4;
const String inOtklik = "stmA";
const String outOtklik = "rtmA";
String command = "";
boolean statusCommand = false;
String inputString = "";
const String ledcomand[31] {"000001A","000010A","000011A",
            "000100A","000101A","000110A","000111A","001000A",
            "001001A","001010A","001011A","001100A","001101A",
            "001110A","001111A","010000A","010001A","010010A",
            "010011A","010100A","010101A","010110A","010111A",
            "011000A","011001A","011010A","011011A","011100A",
            "011101A","011110A","011111A"};
int ledState1 = LOW;
int ledState2 = LOW;
int ledState3 = LOW;
int ledState4 = LOW;
int ledState5 = LOW;
int led1 = 6;
int led2 = 7;
int led3 = 8;
int led4 = 9;
int led5 = 10;
unsigned long startTime = 0;
unsigned long curTime = 0;
long delta = 2000;
//
void toLedOn (String str){
  if (str.length()>5){
    char *chars = str.c_str();
    if(chars[1]=='1')ledState1 = HIGH;
    if(chars[2]=='1')ledState2 = HIGH;
    if(chars[3]=='1')ledState3 = HIGH;
    if(chars[4]=='1')ledState4 = HIGH;
    if(chars[5]=='1')ledState5 = HIGH;
    //digitalWrite(led0, ledState0);
    digitalWrite(led1, ledState1);
    digitalWrite(led2, ledState2);
    digitalWrite(led3, ledState3);
    digitalWrite(led4, ledState4);
    digitalWrite(led5, ledState5);  
  }
  return;
}
void toLedOff (){
  ledState1 = LOW;
  ledState2 = LOW;
  ledState3 = LOW;
  ledState4 = LOW;
  ledState5 = LOW;
  digitalWrite(led1, ledState1);
  digitalWrite(led2, ledState2);
  digitalWrite(led3, ledState3);
  digitalWrite(led4, ledState4);
  digitalWrite(led5, ledState5);    
  return;
}
boolean onCommand (String str){
  boolean ret=false;
  for(int i=0; i<31; ++i){
    if(ledcomand[i]==str){
      ret=true;
      break;
    }
  }
  return ret;
}
void sound1(int l) {
  tone(piezo_pin,600);
  delay(500);
  if (l==2){  
    tone(piezo_pin,900);
    delay(500);
  }  
  noTone(piezo_pin);
  return ;
}
//
void setup() {  
  Serial.begin(115200);
  inputString.reserve(200);
  pinMode(piezo_pin, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  sound1(1);
   
}

void loop() {
  if(statusCommand){
    statusCommand=false;
    if(command == inOtklik){    
      delay(2200);    
      Serial.print(outOtklik);
      sound1(2);      
    }else{
      if(onCommand(command)){
        toLedOn (command);
        startTime = millis();      
      }
    }
  }
  if(startTime != 0){
    curTime = millis();
    if(curTime > startTime+delta){
      startTime=0;
      toLedOff ();
    }
  }
}
void serialEvent() {
  while (Serial.available()) {    
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == 'A') {
      command = inputString;
      statusCommand = true;
      inputString="";
    }
  }
}