Leonardo и Seeedstudio Bluetooth Shield

Тема в разделе "Arduino & Shields", создана пользователем Sand, 25 мар 2013.

  1. Sand

    Sand Нерд

    delay(50);
    и результат:
    a
    b
    b
    c
    c
    ÿ

    Всем большое спасибо за участие!
    Код (Text):
    while (BTavailable && Serial1.available() > 0) {
        char inChar  = (char)Serial1.read();
        delay(50);
        char nextChar = (char)Serial1.peek();
        Serial.println(inChar);
        Serial.println(nextChar);
    Теперь можно не только управлять роботом, отдавая ему команды вида "Start\n", "Stop\n", "Backward\n" и т.д., но и управлять самим модулем блютуз, отдавая специфичные команды вида "/r/n+.../r/n"

    Serial1Event так же прекрасно работает! Но там тоже надо делать задержку, ожидая следующий байт
    Код (Text):
    void serialEvent1(){
    Serial.println((char)Serial1.read());
    }
    +
    B
    T
    S
    T
    A
    T
    E
    :
    4




    a
    b
    c
     
  2. HighDigital

    HighDigital Гик

    т.е задержка спасла? ч.т.д :)
     
  3. Sand

    Sand Нерд

    Да. Спасибо!
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Вы только учитывайте, что в течение этих миллисекунд Ваш контроллер простаивает и не может выполнять полезную работу. delay() - зло, от которого нужно избавляться любыми способами, благо делается это элементарно. И еще имейте ввиду, что рано или поздно при передаче случится искажение данных - это нужно обязательно контролировать.
     
  5. Sand

    Sand Нерд

    Да, я помню нашу беседу на тему замены delay на проверку через millis. Здесь нужно было понять, в чем затык, с портами никогда не работал, вот и грешил на все подряд. Я так понимаю, с ардуино много девайсов через последовательные порты работает, радиомодули, камеры и проч. Про искажение понял, буду реализовывать
     
  6. Sand

    Sand Нерд

    А про PIO кто что подскажет? Из даташита я понял, что это одна из ног, но куда она идет на ардуину, не совсем понятно. Скорее всего на Tx или Rx, т.к. когда первый раз после перезагрузки ардуины открываешь терминал, мигает Tx и Rx на ардуине и блютуз переходит в режим, доступный для обнаружения и соединения.


    Given a rising pulse in PIO0, device will be disconnected.
    про PIO0 ТУТ
    Даташит

    Rising pulse это установка HIGH и сразу в LOW?
    Пробовал в HIGH устанавливать и DIGITAL0 и DIGITAL1 пины, не помогло. Нужно, чтобы при перезагрузке ардуины Bluetooth терял соединение и был готов подключаться по новой.

    Все тоже самое описано и про Bluetooth Bee модули


    BT_RX подключены к TX ардуины, BT_TX подключены к RX ардуины джамперами
     
  7. Sand

    Sand Нерд

    Все, победил. в разделе setup() пишем
    Код (Text):
      int Rx1 = 0;
      // Заканчиваем существующее соединение и переводим Bluetooth в режим
      // - доступно для обнаружения.
      pinMode(Rx1,OUTPUT);
      digitalWrite(Rx1,HIGH);
      digitalWrite(Rx1,LOW);
    PIO0 это RX1 на ардуине
    Given a rising pulse in PIO0, device will be disconnected.

    Судя по даташитам, то же самое все на Bee адаптерах
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Небольшое замечание:
    Если я правильно понимаю, то здесь идет речь о rising edge, т.е. нарастающий (передний) фронт сигнала. Еще бывает falling edge - спадающий (задний) фронт.
    Формулировки именно "rising pulse" никогда встречать не доводилось.
    Если все так, то код
    Код (Text):
      pinMode(Rx1,OUTPUT);
      digitalWrite(Rx1,HIGH);
      digitalWrite(Rx1,LOW);
    сначала устанавливает высокий уровень, а затем его сбрасывает, но модуль реагирует только на передний фронт. Если не сложно, попробуйте убрать последнюю строку и расскажите, изменилось ли поведение модуля.
     
  9. Sand

    Sand Нерд

    Странно, но все заработало как то само, убрал и последнюю строку и потом вообще все 3 строки. Все работает как и ожидалось. Единственное, что еще изменил это:
    Было
    Код (Text):

      Serial.begin(9600);
      while (!Serial)
        ; // wait for serial port to connect. Needed for Leonardo only
      if (BTavailable)
        setupBlueToothConnection();
     
     
    Стало
    Код (Text):
    if (BTavailable)
        setupBlueToothConnection();
     
      Serial.begin(9600);
      while (!Serial)
        ; // wait for serial port to connect. Needed for Leonardo only
      if (BTavailable)
        Serial.println("The slave bluetooth is inquirable!");
    Т.е. Сначала инициализируется блютуз отправлением команд на Serial1, затем инит Serial, а было наоборот и Serial.println("The slave bluetooth is inquirable!"); находилась в коде инициализации BT в конце...
    Код (Text):
    void setupBlueToothConnection()
    {
      Serial1.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
      Serial1.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
      Serial1.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
      Serial1.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
      Serial1.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
      delay(2000); // This delay is required.
      Serial1.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable
      delay(2000); // This delay is required.
      Serial1.flush();
    }
     
  10. Sand

    Sand Нерд

    Да, местами меняешь обе команды и сразу перестает сбрасывать подключение при рестарте ардуины.
    Код (Text):
    if (BTavailable) setupBlueToothConnection();
     
    Serial.begin(9600);
    Такое ощущение, что если сначала проинитить Serial1 а затем сделать Serial.begin, то этот begin дрыгает 0 или 1 ногой, что вызывает disconnect и вход в режим обнаружения(мигает красный и зеленый диод)

    а вот скетч от производителя блютуз модуля, на который я опирался при написании своей программы(У меня, правда, без SoftwareSerial, на Serial1 повесил)
    Код (Text):
    /*
    BluetoothShield Demo Code Slave.pde. This sketch could be used with
    Master.pde to establish connection between two Arduino. It can also
    be used for one slave bluetooth connected by the device(PC/Smart Phone)
    with bluetooth function.
    2011 Copyright (c) Seeed Technology Inc.  All right reserved.
     
    Author: Steve Chang
     
    This demo code is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.
     
    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
     
    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     
    For more details about the product please check http://www.seeedstudio.com/depot/
     
    */
     
     
    /* Upload this sketch into Seeeduino and press reset*/
     
    #include <NewSoftSerial.h>  //Software Serial Port
    #define RxD 6
    #define TxD 7
     
    #define DEBUG_ENABLED  1
     
    NewSoftSerial blueToothSerial(RxD,TxD);
     
    void setup()
    {
      Serial.begin(9600);
      pinMode(RxD, INPUT);
      pinMode(TxD, OUTPUT);
      setupBlueToothConnection();
     
    }
     
    void loop()
    {
      char recvChar;
      while(1){
        if(blueToothSerial.available()){//check if there's any data sent from the remote bluetooth shield
          recvChar = blueToothSerial.read();
          Serial.print(recvChar);
        }
        if(Serial.available()){//check if there's any data sent from the local serial terminal, you can add the other applications here
          recvChar  = Serial.read();
          blueToothSerial.print(recvChar);
        }
      }
    }
     
    void setupBlueToothConnection()
    {
      blueToothSerial.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
      blueToothSerial.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
      blueToothSerial.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
      blueToothSerial.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
      blueToothSerial.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
      delay(2000); // This delay is required.
      blueToothSerial.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable
      Serial.println("The slave bluetooth is inquirable!");
      delay(2000); // This delay is required.
      blueToothSerial.flush();
    }
     
     
  11. Sand

    Sand Нерд

    Я так представляю rising pulse- 0v 5v 0v, те совокупность нарастающего и спадающего фронтов, как ШИМ, импульсы. Еще может быть 5v 0v 5v. Вероятно об этом идет речь в описании к модулю. Поиск на оф сайте, их форуме и вообще в нете на тему pio0 в этих модулях ничего не дал.

    Ну да ладно, теперь главное понятно, как управлять девайсом
     
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    Ваше ощущение Вас не обманывает.
    Вот так выглядит передача данных по последовательному порту:

    [​IMG]

    Нетрудно заметить, что линия по-умолчанию постоянно находится в состоянии логической единицы (высокий уровень), затем поступает стартовый бит (низким уровнем), по которому принимающая сторона понимает, что началась передача очередного байта. После стартового бита идут биты данных, а затем стоповый бит (в случае простейшего формата передачи).
    Таким образом, при инициализации порта первым делом на передающей линии устанавливается высокий уровень (а мы помним, что изначально на всех ножках низкий уровень) , что Вы и наблюдаете :)
     
  13. Megakoteyka

    Megakoteyka Оракул Модератор

    Точно не так. Такое поведение сигнала (низкий-высокий-низкий или высокий-низкий-высокий) называется "строб". Rising переводится как "нарастающий", из чего можно сделать вывод о том, что речь все же шла о переднем фронте сигнала. Да и Ваши эксперименты с модулем, как я понял, это подтверждают.
     
  14. Sand

    Sand Нерд

    Попробую завтра попередовать в порт что нибудь с компа, будет ли рваться соединение... Ноги же будут дрыгаться. До того, как местами иниты поменял, не рвалось. И с ардуины идет Serial.print и с компа в терминал писал текст. Все нормально. Переход в режим обнаружения был только в том случае, если ардуину перезагрузить и просто открыть окно терминала...
     
  15. Sand

    Sand Нерд

    Вообщем все нормально, шилд переходит в режим, доступный для обнаружения, только после перезагрузки ардуины, дальнейшая передача и прием данных через Serial и Serial1 никак на шилд не влияют. Все работает стабильно. Так, как и ожидалось. В итоге: в начале инициализируем шилд, затем Serial
    PS: только что мысль появилась, а что если в проекте Serial не используется? Видимо придется написать скетч с нуля под данный вариант и таки докопаться до истины, все равно новая партия деталей для танка пока не приехала