Помогите

Тема в разделе "Arduino & Shields", создана пользователем Sivtsev_i_v, 26 дек 2015.

  1. Sivtsev_i_v

    Sivtsev_i_v Нуб

    Не смогли подключить Gprs Shield на Ардуино UNO?

    #include <SoftwareSerial.h>

    //заводим Serial-соединение с GPRS-Shield на 7 и 8 цифровых входах
    SoftwareSerial gprsSerial(7, 8);

    void setup()
    {
    // GPRS Shield общается по умолчанию на скорости 19200 бод
    gprsSerial.begin(19200);
    }

    //в строке curStr будем хранить текущую строку, которую передает нам плата
    String currStr = "";
    int updateTime = 0;

    void loop()
    {
    touch();

    if (!gprsSerial.available())
    return;

    // Считываем очередной символ с платы
    char currSymb = gprsSerial.read();

    if ('\r' == currSymb) {
    // Получен символ перевода строки, это значит, что текущее
    // сообщение от платы завершено и мы можем на него отреагировать.
    // Если текущая строка - это RING, то значит, нам кто-то звонит
    if (!currStr.compareTo("RING")) {
    //кокетничаем 3 секунды, чтобы дать услышать звонящему гудок
    delay(3000);
    //посылаем команду на поднятие трубки
    gprsSerial.println("ATA");
    }
    currStr = "";
    } else if (currSymb != '\n') {
    // Дополняем текущую команду новым сиволом
    // При этом игнорируем второй символ в последовательности переноса
    // строки: \r\n
    currStr += String(currSymb);
    }
    }

    /*
    * Функция провоцирует поддержание коммуникации с платой даже если
    * та была перезагружена без перезагрузки Arduino
    */
    void touch()
    {
    if (millis() >= updateTime) {
    gprsSerial.println("AT");
    updateTime += 5000;
    }
    }

    не работает в чем может быть проблема ?
     
  2. shpock

    shpock Гик

    а что не работает? как не работает?
     
  3. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    есть хорошее решение, что-бы проверить дошло -ли до нужного куска скетча (ВЫБОРОЧНАЯ КОМПИЛЯЦИЯ)
    в начале пишете
    Код (C++):
    #define название
    и потом вставляете в коде
    Код (C++):
    #ifdef название
    то что нужно выполнить
    #endif
    если закоменитировать(//) #define , то то, что между #ifdef и #endIf не будет выполняться.
    К чему я это написал. вы можете писать в сериал или мигать, звучать чем-то и вы поймёте, где и что не работает.
     
  4. Sivtsev_i_v

    Sivtsev_i_v Нуб

    Хочу написать сккетч чтобы спомощью смс управлять серво? Gprs shield вставил в уно написал скетч но не работает
     
  5. shpock

    shpock Гик

    начать бы с малого, отправить вручную команду модулю, получить ответ. А так много неизвестного.

    Вот так например :

    Код (C++):
    #include <SoftwareSerial.h>

    SoftwareSerial mySerial(8, 9);

    void setup() {
      Serial.begin(19200);
      mySerial.begin(19200);
    }

    void loop() {
    if (Serial.available()) mySerial.write(Serial.read());
    if (mySerial.available()) Serial.write(mySerial.read());
    }
     
    прошиваем , открываем монитор порта и печатаем AT. или другие команды.
    (в мониторе скорость выставте и NL & CR.)

    На счет пинов для софтсериал, в МЕГЕ и Леонардо не все пины работают, в УНО не знаю.
     
  6. Sivtsev_i_v

    Sivtsev_i_v Нуб

    не работает что делать
     
  7. shpock

    shpock Гик

    а что не работает то? врядли вам кто то поможет. На "Врач у меня ЭТО" - тяжело и даже не хочется отвечать.
    Опишите что сделали, что пробовали, что получилось а что нет? Либо к экстрасенсам....
     
  8. Sivtsev_i_v

    Sivtsev_i_v Нуб

    тогда как узнать что GPRS shield работает? Мы подключили к Arduino uno GPRS shield и как понять что он работает?
     
  9. shpock

    shpock Гик

    какой именно GPRS shield? как он у вас подключен?
     
  10. Airbus

    Airbus Радиохулиган Модератор

    А Форум почитать не пробовали?Там уже 2001 раз об этом написано.У вас Програмный USART судя по скетчу тогда вопрос перемычки SW-HW на шилде как стоят?Нужно в положение "SW" (для Вашего случая)
    Нет их ни на Леонардо ни на УНО а только на GPRS шилде
     
  11. Airbus

    Airbus Радиохулиган Модератор

    Знакомый Скетч.Попробуйте так:Только на ГПРС шилде перемычки поставьте в положение HW
    Код (C++):

    void setup()
    {
    // GPRS Shield общается по умолчанию на скорости 9600 бод
    Serial.begin(9600);
    }

    //в строке curStr будем хранить текущую строку, которую передает нам плата
    String currStr = "";
    int updateTime = 0;

    void loop()
    {
    touch();

    if (!Serial.available())
    return;

    // Считываем очередной символ с платы
    char currSymb = Serial.read();

    if ('\r' == currSymb) {
    // Получен символ перевода строки, это значит, что текущее
    // сообщение от платы завершено и мы можем на него отреагировать.
    // Если текущая строка - это RING, то значит, нам кто-то звонит
    if (!currStr.compareTo("RING")) {
    //кокетничаем 3 секунды, чтобы дать услышать звонящему гудок
    delay(3000);
    //посылаем команду на поднятие трубки
    Serial.println("ATA");
    }
    currStr = "";
    } else if (currSymb != '\n') {
    // Дополняем текущую команду новым сиволом
    // При этом игнорируем второй символ в последовательности переноса
    // строки: \r\n
    currStr += String(currSymb);
    }
    }

    /*
    * Функция провоцирует поддержание коммуникации с платой даже если
    * та была перезагружена без перезагрузки Arduino
    */

    void touch()
    {
    if (millis() >= updateTime) {
    Serial.println("AT");
    updateTime += 5000;
    }
    }
     
  12. shpock

    shpock Гик

    я имел ввиду библиотеку SoftwareSerial, а именно такие ограничения:
    На платах Arduino Mega и Mega2560 некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. В силу этого, на данных платах в качестве вывода RX могут использоваться только следующие выводы: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
    На Arduino Leonardo некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. Поэтому, на этой плате в качестве вывода RX могут использоваться только следующие выводы: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

    Как обстоит дело на Уно не знаю.
     
  13. Airbus

    Airbus Радиохулиган Модератор

    Зачем Вам программный USART когда есть аппаратный?Нужен ещё один?Под "ещё" один можно в принципе использовать любые пины (в.т.ч и аналоговые)если подправить библиотеку SoftwareSerial,Только смысл?Усложнить код увеличить его размер и уменьшить быстродействие?
     
  14. shpock

    shpock Гик

    для отладки, очень удобно видеть что отвечает gsm модуль, послать какую-нибудь команду и т.д., а у УНО есть только один аппаратный порт.
     
  15. Onkel

    Onkel Гуру

    все верно, я когда с gps юзаю один програмный uart. На uno внешние прерывания вроде от любой ноги, но я обычно D2 или D3 , как на atmega8a привык. У них отдельные функции прерывания, от других ног прерывание вызывается сразу всеми 8 ногами (Bx, Cx, Dx), а по этим ногам есть два отдельных прерывания.
     
    shpock нравится это.
  16. Sivtsev_i_v

    Sivtsev_i_v Нуб

    не получается
     
  17. shpock

    shpock Гик

    да мы уже поняли что не получается...
     
  18. Kostantin

    Kostantin Нуб

    Кстати, "int updateTime =0;" не годится. В процедуре touch он наращивается по 5000, а предел у 16-битного int`a = 32,767. Угадайте, за сколько итераций он переполнится и условие в процедуре touch перестанет выполняться. Вместо int надо long.