Помогите подружить две arduino через XBee

rlepricon
Offline
Зарегистрирован: 31.07.2014

Привет Всем!

Пытаюсь подружить две ардуинки через XBee. 

Одна ардуинка снимает данные с двух сонаров, предобразует расстояние в значение индикатора, и передаёт значения индикатора через XBee на вторую ардуино. Для одного индикатора значения от 'A'(65) до 'H'(73), для второго от 'I'(74) до 'P'(82).

Когда подключаю принимающий XBee к компу, то через мониторинг порта вижу значения котороые приходят.

Когда  к компа отправляю данные на индикаторы, индикаторы нормально реагируют.

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

Вот исходники:

//------------------------------------- sketch_for_sonars -----------------------------------

#include "Arduino.h"

#define TRIGGER_L 7
#define ECHO_L 6

#define TRIGGER_R 5
#define ECHO_R 4
void setup() {
  pinMode(TRIGGER_L, OUTPUT);
  digitalWrite(TRIGGER_L, HIGH);
  
  pinMode(TRIGGER_R, OUTPUT);
  digitalWrite(TRIGGER_R, HIGH);
  
  pinMode(ECHO_L, INPUT);
  
  pinMode(ECHO_R, INPUT);
  
  Serial.begin(9600);
}

void loop() {
  digitalWrite(TRIGGER_L, LOW);
  delayMicroseconds(50);
  digitalWrite(TRIGGER_L, HIGH);
  delayMicroseconds(20);
  
  int distance = ConvertToIndicator(pulseIn(ECHO_L, HIGH))+65;
  
  Serial.println(distance);
  delay(100);
  
  digitalWrite(TRIGGER_R, LOW);
  delayMicroseconds(50);
  digitalWrite(TRIGGER_R, HIGH);
  delayMicroseconds(50);
  
  distance = ConvertToIndicator(pulseIn(ECHO_R, HIGH))+74;
  
  Serial.println(distance);
  delay(100);
}

int ConvertToIndicator(int input) {
  int led=0;
  if (input > 10000) led = 0;
  if ((input > 8750)&&(input < 10000)) led = 1;
  if ((input > 7500)&&(input < 8750)) led = 2;
  if ((input > 6250)&&(input < 7500)) led = 3;
  if ((input > 5000)&&(input < 6250)) led = 4;
  if ((input > 3750)&&(input < 5000)) led = 5;
  if ((input > 2500)&&(input < 3750)) led = 6;
  if ((input > 1250)&&(input < 2500)) led = 7;
  if (input < 1250) led = 8;
  return led;
}

//------------------------------------- sketch_for_indikators -----------------------------------

#include "Arduino.h"

#define R_LED_LATCH_PIN 3
#define R_LED_CLOCK_PIN 4
#define R_LED_DATA_PIN 2

#define L_LED_LATCH_PIN 6
#define L_LED_CLOCK_PIN 7
#define L_LED_DATA_PIN 5

void setup() {

  pinMode(R_LED_LATCH_PIN, OUTPUT);
  pinMode(R_LED_CLOCK_PIN, OUTPUT);
  pinMode(R_LED_DATA_PIN, OUTPUT);
  digitalWrite(R_LED_LATCH_PIN, LOW);
  shiftOut(R_LED_DATA_PIN, R_LED_CLOCK_PIN, MSBFIRST, 0);
  digitalWrite(R_LED_LATCH_PIN,HIGH);
  
  pinMode(L_LED_LATCH_PIN, OUTPUT);
  pinMode(L_LED_CLOCK_PIN, OUTPUT);
  pinMode(L_LED_DATA_PIN, OUTPUT);
  digitalWrite(L_LED_LATCH_PIN, LOW);
  shiftOut(L_LED_DATA_PIN, L_LED_CLOCK_PIN, MSBFIRST, 0);
  digitalWrite(L_LED_LATCH_PIN,HIGH);
   
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() >0 ) {
    int buff = Serial.read();
    if ((buff>=65)&&(buff<=82)) {
      //Serial.println(buff);
      switch(buff) {
        case 65: WriteRLED(0); break;
        case 66: WriteRLED(128); break;
        case 67: WriteRLED(192); break;
        case 68: WriteRLED(224); break;
        case 69: WriteRLED(240); break;
        case 70: WriteRLED(248); break;
        case 71: WriteRLED(252); break;
        case 72: WriteRLED(254); break;
        case 73: WriteRLED(255); break;
        
        case 74: WriteLLED(0); break;
        case 75: WriteLLED(128); break;
        case 76: WriteLLED(192); break;
        case 77: WriteLLED(224); break;
        case 78: WriteLLED(240); break;
        case 79: WriteLLED(248); break;
        case 80: WriteLLED(252); break;
        case 81: WriteLLED(254); break;
        case 82: WriteLLED(255); break;
      }
    }
  }
}

void WriteRLED(int led) {
  digitalWrite(R_LED_LATCH_PIN, LOW);
  shiftOut(R_LED_DATA_PIN, R_LED_CLOCK_PIN, MSBFIRST, led);
  digitalWrite(R_LED_LATCH_PIN,HIGH);
}

void WriteLLED(int led) {
  digitalWrite(L_LED_LATCH_PIN, LOW);
  shiftOut(L_LED_DATA_PIN, L_LED_CLOCK_PIN, MSBFIRST, led);
  digitalWrite(L_LED_LATCH_PIN,HIGH);
}

 

svizist1
Offline
Зарегистрирован: 28.01.2012

А где схема?

Coolerr
Offline
Зарегистрирован: 30.06.2014

укажите формат данных который принимаете Serial.println(distance,DEC); http://arduino.ru/Reference/Serial/Print

rlepricon
Offline
Зарегистрирован: 31.07.2014

Спасибо за помощь :-).

Разобрался - проблема была в типе данных (спасибо Coolerr). 

В коде передатчика необходимо объявлять переменную типа byte, а не int - строка 28 в sketch_for_sonars в первом посте,

затем в 30 строке там же необходимо писать Serial.write(distance), вместо Serial.println(distance).

Так же интересная тема, чтобы убрать задержки при передачи данных между двумя модулями xbee:  http://forum.amperka.ru/threads/xbee-%D0%B7%D0%B0%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B0-%D0%B2-%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B8-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5.3300/

(P.S. сорри, за ссылку на другой сайт).