помогите подклчить платы к Arduino Leonardo

Тема в разделе "Arduino & Shields", создана пользователем aysen, 4 май 2014.

  1. aysen

    aysen Нуб

    не подключаются Motor Shield 2A с Wireless Proto Shield последовательно к Arduino Leonardo
     
  2. Mitrandir

    Mitrandir Гуру

    Надо напильником доработать.

    Что не получается то?
    что вы уже сделали, дайте схему, скетч, ошибки что выдает.
     
  3. aysen

    aysen Нуб

    работают по отдельности, когда подключаю к плате, вот, а когда пытаюсь подключить все вместе мотор шилд не работает в чем может быть проблема?
     
  4. Mitrandir

    Mitrandir Гуру

    1) нехватка питания
    2) конфликт пинов

    скорее всего второе
     
  5. aysen

    aysen Нуб

    Тогда как подключить? Через провода по отдельности?
     
  6. Mitrandir

    Mitrandir Гуру

  7. geher

    geher Гуру

    Или отгибанием конфликтующих пинов на одном из шилдов и перемычками сверху для их переноса.

    Но про конфликт пинов еще вопрос на самом деле.
    У мотора (если он с магазина Амперки) вроде задействованы 4,5,6,7.
    А у Wireless Shield, если не ошибаюсь, только 0 и 1 задействованы (RX и TX).
    Мотор полностью от ардуины запитан, или со своим питанием? Если полностью от ардуины, то питания на все может элементарно не хватить.
     
  8. aysen

    aysen Нуб

    Код (Text):
    #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");        // посылаем сообщение, что данные успешно записаны
      }
    }
    Вот скетч.
    Сигнал с Bluetooth Bee есть, а на Motor Shield не идет.
    В качестве примера брал http://cxem.net/uprav/uprav46.php
    С Андроид приложение идет L, R, H, F, r , w
     
  9. aysen

    aysen Нуб

  10. artmtmnw

    artmtmnw Нуб

    Меня тоже интересует этот вопрос.
    Подскажите