roboforum.ru

Технический форум по робототехнике.


Проблема в написании кода

Как собрать и запрограммировать робота на Arduino(Freeduino, Roboduino, Seeduino ...). Используем Wiring и Processing.

Проблема в написании кода

Сообщение aysen » 07 июн 2014, 11:17

Здравствуйте дорогие форумчане! Я делаю машинку управляемую через телефон (android).

Arduino Leonardo + Motor Shield 2A + Wireless Proto Shield + Bluetooth Bee.

Проблема в том что, когда загружаю код на Motor Shield он не отвечает на приложение.

Сигнал с Bluetooth Bee есть, а на Motor Shield не идет.

В качестве примера брал http://cxem.net/uprav/uprav46.php

С Андроид приложение идет L, R, H, F, r , w

Код: Выделить всёРазвернуть
#include "EEPROM.h"
int E1 = 5;
int M1 = 4;
int E2 = 6;                   
int M2 = 7;
int HORN = 13;      // доп. канал 1 подключен к 13 пину
//#define autoOFF 2500  // кол-во миллисекунд через которое робот останавливается при потери связи
#define cmdL 'L'      // команда UART для левого двигателя
#define cmdR 'R'      // команда UART для правого двигателя
#define cmdH 'H'      // команда UART для доп. канала 1 (к примеру сигнал Horn)
#define cmdF 'F'      // команда UART для работы с EEPROM памятью МК для хранения настроек
#define cmdr 'r'      // команда UART для работы с EEPROM памятью МК для хранения настроек (чтение)
#define cmdw 'w'      // команда UART для работы с EEPROM памятью МК для хранения настроек (запись)
char incomingByte;    // входящие данные
char L_Data[4];      // строковый массив для данных левого мотора L
byte L_index = 0;    // индекс массива
char R_Data[4];      // строковый массив для данных правого мотора R
byte R_index = 0;    // индекс массива
char H_Data[1];      // строковый массив для доп. канала
byte H_index = 0;    // индекс массива H
char F_Data[8];      // строковый массив данных для работы с EEPROM
byte F_index = 0;    // индекс массива F
char command;        // команда: передача координат R, L или конец строки
unsigned long currentTime, lastTimeCommand, autoOFF;
void setup() {
  Serial.begin(9600);      // инициализация порта
  pinMode(HORN, OUTPUT);    // дополнительный канал
  pinMode(E1, OUTPUT);      // выход для задания направления вращения двигателя
  pinMode(E2, OUTPUT);      // выход для задания направления вращения двигателя
  /*EEPROM.write(0,255);
  EEPROM.write(1,255);
  EEPROM.write(2,255);
  EEPROM.write(3,255);*/
  timer_init();            // инициализируем программный таймер
}
void timer_init() {
  uint8_t sw_autoOFF = EEPROM.read(0);  // считываем с EEPROM параметр "включена ли ф-ия остановки машинки при потере связи"
  if(sw_autoOFF == '1'){                // если таймер останова включен
    char var_Data[3];
    var_Data[0] = EEPROM.read(1);
    var_Data[1] = EEPROM.read(2);
    var_Data[2] = EEPROM.read(3);
    autoOFF = atoi(var_Data)*100;        // переменная автовыкл. для хранения кол-ва мс
  }
  else if(sw_autoOFF == '0'){     
    autoOFF = 999999;
  }
  else if(sw_autoOFF == 255){
    autoOFF = 2500;                      // если в EEPROM ничего не записано, то по умолчанию 2.5 сек
  }
  currentTime = millis();                // считываем время, прошедшее с момента запуска программы
}

void loop() {
  if (Serial.available() > 0) {          // если пришли UART данные
    incomingByte = Serial.read();        // считываем байт
    if(incomingByte == cmdL) {          // если пришли данные для мотора L
      command = cmdL;                    // текущая команда
      memset(L_Data,0,sizeof(L_Data));  // очистка массива
      L_index = 0;                      // сброс индекса массива
    }
    else if(incomingByte == cmdR) {      // если пришли данные для мотора R
      command = cmdR;
      memset(R_Data,0,sizeof(R_Data));
      R_index = 0;
    }
    else if(incomingByte == cmdH) {      // если пришли данные для доп. канала 1
      command = cmdH;
      memset(H_Data,0,sizeof(H_Data));
      H_index = 0;
    }
    else if(incomingByte == cmdF) {      // если пришли данные для работы с памятью
      command = cmdF;
      memset(F_Data,0,sizeof(F_Data));
      F_index = 0;
    }
    else if(incomingByte == '\r') command = 'e';  // конец строки
    else if(incomingByte == '\t') command = 't';  // конец строки для команд работы с памятью

    if(command == cmdL && incomingByte != cmdL){
      L_Data[L_index] = incomingByte;              // сохраняем каждый принятый байт в массив
      L_index++;                                  // увеличиваем текущий индекс массива
    }
    else if(command == cmdR && incomingByte != cmdR){
      R_Data[R_index] = incomingByte;
      R_index++;
    }
    else if(command == cmdH && incomingByte != cmdH){
      H_Data[H_index] = incomingByte;
      H_index++;
    }
    else if(command == cmdF && incomingByte != cmdF){
      F_Data[F_index] = incomingByte;
      F_index++;
    }
    else if(command == 'e'){                      // если приняли конец строки
      Control4WD(atoi(L_Data),atoi(R_Data),atoi(H_Data));
      delay(10);
    }
    else if(command == 't'){                      // если приняли конец строки для работы с памятью
      Flash_Op(F_Data[0],F_Data[1],F_Data[2],F_Data[3],F_Data[4]);
    }
    lastTimeCommand = millis();                    // считываем текущее время, прошедшее с момента запуска программы
  }
  if(millis() >= (lastTimeCommand + autoOFF)){    // сравниваем текущий таймер с переменной lastTimeCommand + autoOFF
    Control4WD(0,0,0);                            // останавливаем машинку
  }
}
void Control4WD(int mLeft, int mRight, uint8_t Horn){
  bool directionL, directionR;      // направление вращение для L298N
  byte valueL, valueR;              // значение ШИМ M1, M2 (0-255)

  if(mLeft > 0){
    valueL = mLeft;
    directionL = 0;
  }
  else if(mLeft < 0){
    valueL = 255 - abs(mLeft);
    directionL = 1;
  }
  else {
    directionL = 0;
    valueL = 0;
  }

  if(mRight > 0){
    valueR = mRight;
    directionR = 0;
  }
  else if(mRight < 0){
    valueR = 255 - abs(mRight);
    directionR = 1;
  }
  else {
    directionR = 0;
    valueR = 0;
  }

  analogWrite(M1, valueL);            // задаем скорость вращения для L
  analogWrite(M2, valueR);            // задаем скорость вращения для R
  digitalWrite(E1, directionL);      // задаем направление вращения для L
  digitalWrite(E2, directionR);      // задаем направление вращения для R

  digitalWrite(HORN, Horn);          // дополнительный канал
}
void Flash_Op(char FCMD, uint8_t z1, uint8_t z2, uint8_t z3, uint8_t z4){
  if(FCMD == cmdr){          // если команда чтения EEPROM данных
    Serial.print("FData:");      // посылаем данные с EEPROM
    Serial.write(EEPROM.read(0));    // считываем значение ячейки памяти с 0 адресом и выводим в UART
    Serial.write(EEPROM.read(1));
    Serial.write(EEPROM.read(2));
    Serial.write(EEPROM.read(3));
    Serial.print("\r\n");        // маркер конца передачи EEPROM данных
  }
  else if(FCMD == cmdw){          // если команда записи EEPROM данных
    EEPROM.write(0,z1);              // запись z1 в ячейку памяти с адресом 0
    EEPROM.write(1,z2);
    EEPROM.write(2,z3);
    EEPROM.write(3,z4);
    timer_init();            // переинициализируем таймер
    Serial.print("FWOK\r\n");        // посылаем сообщение, что данные успешно записаны
  }
}
aysen
 
Сообщения: 1
Зарегистрирован: 07 июн 2014, 11:10

Re: Проблема в написании кода

Сообщение Jedi Kriks » 17 июн 2014, 17:04

А ты уверен, что правильно MotorShield подключил. У меня например похожая проблема была неделю назад (я тоже новичок), в итоге часа два разбирался - оказалось, что пины по которым скорость регулируешь были повешаны не на шим пины, а на обычные. Но я полный нуб, по-моему тут большой спектр проблем и решений может быть. Посмотри еще раз, правильно ли все подключил. Советую изначально через симулятор пронать на компе, а если лень то просто для себя построить схему на Frietzig например и по схеме перепроверить правилдьно ли все подключил.
Jedi Kriks
 
Сообщения: 11
Зарегистрирован: 15 май 2014, 16:25


Вернуться в Arduino и другие Xduino

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6