Сетевое Множество ардуино - Это "Ракетная наука?"

Есть набор ардуино, которые должны обмениваться данными-для модели контроллера запуска ракеты!

Как отправить 24 бита информации (команды запуска) с "master" Arduino, по 12 бит каждый на два "slave" Arduino, которые находятся на расстоянии от 15' до 150' от "master".

Каждый "раб" должен отправить 12 бит информации (непрерывность статии)"хозяину".

"Master" < - - - 15' to 115' ---> "Slave 1" <--- 15' to 115' ---><--- 10' до 35' --> "Раб 2"<--- 10' до 35' -->

Кажется, слишком долго для I2C?

, 👍1

Обсуждение

Это можно улучшить, избавившись от "TiA...", я не знаю, что такое "Коробки RSO" и "Коробки Pad". Я подозреваю, что, если бы описывалось по-другому, вы бы получали ответы от большой(r) группы людей. Если вопрос сводится к передаче 16-битной информации между двумя Ардуино на низкой частоте на расстоянии 100 футов, вероятно, многие люди здесь смогут ответить на этот вопрос., @timemage

проведите небольшое исследование о системах управления огнем фейерверков .... возможно, вам следует подумать об использовании нескольких контактов для выдачи команды запуска на одну стартовую платформу, @jsotola

Это похоже на работу для [DMX512](https://en.wikipedia.org/wiki/DMX512)..., @Majenko

Хммм. Думал об использовании кабелей DMX. Но да, если нужно добавить подпечать, сигнализация DMX может быть такой же действительной, но проще, чем 802.{что угодно} сеть. Кто-нибудь связывал DMX - сигналы с Arduino?, @LydaRA

Проверьте эту ссылку о DMX512 на Arduino: https://playground.arduino.cc/Learning/DMX/, @Fahad


2 ответа


Лучший ответ:

1

Лучшим решением было бы использовать адаптер RS485, подключенный к каждому Arduino через последовательный порт. Это проверенное и верное решение, которое идеально подходит для такой установки и стоит всего несколько долларов дополнительного оборудования на узел.

Если вы не можете использовать дополнительное оборудование, вы также можете создать систему токовой петли бедного человека, такую как RS485, используя обычные выводы Arduino, поскольку они способны искать и топить 20 мА.

С любым из этих решений вы можете отправлять столько данных, сколько хотите, пока у вас есть какой-то минимальный протокол для сериализации его в последовательность битов на проводе. Чтобы отправить 12 битов, вы можете просто определить условие запуска как простаивающий "0" на проводе в течение определенного периода времени, за которым следует "1" стартовый бит, за которым следует 12 битов данных, за которым, возможно, следует бит четности или контрольная сумма, и завершается "1" стоп-бит.

Проверьте, как, скажем, RS232 или RS485 сериализуют биты, чтобы получить представление о том, как это работает. Если вы в конечном итоге используете оборудование, которое поддерживает отправку данных только в 8-битных блоках, то вы можете, скажем, отправить два байта на "пакет" данных, где каждый байт имеет 6 бит ваших данных, плюс один бит, который указывает, является ли этот байт первой группой из 6 бит или второй группой, а затем один бит четности для проверки ошибок.

,

1

У меня есть I2C для работы между ардуино с различными размерами байтов. Я скопировал тестовый код ниже. Обратите внимание, что существует отдельный код для отправки и получения. Он может быть изменен, но содержит основную идею.

Один (или несколько) ардуино отправляет на главный контроллер I2C:

Код отправителя:

//sender test

#include <Wire.h>


#include <Wire.h>
#define NUMDATA 4 

byte byteData[2 * NUMDATA]; //= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

//test

void setup()
{
  Wire.begin(3);                // join i2c bus with address #3
  Wire.onRequest(requestEvent); // register event
}

void loop()
{
int aData;  
  for(int i = 0; i < NUMDATA; i++){
    aData = analogRead(i);
    
    byteData[i*2 + 1] = ((aData >> 8)  & 0xFF);
    byteData[i*2] = (aData & 0xFF);
    
   // memcpy((void *)byteData[i*2], (void *) analogRead(i), sizeof(int));
  }
  
}

void requestEvent()
{
  Wire.write(byteData, 2 * NUMDATA);
}

Получение кода:

#include <Wire.h>

void setup()
{
  Wire.begin();        // join i2c bus (address optional for main controller)
  Serial.begin(9600);  // start Serial for output
}

void loop()
{


  getSenderData();
  
  Serial.println("Hello");
  delay(500);
}

void getSenderData() {
//Gets sensor data for one grid

    //Byte Array to get raw bytes
    byte ICdataAsBytes[8];
    int i = 0;
  
    Wire.requestFrom(3,8);    // request 6 bytes from sending device #2
    
    while(Wire.available())    // sender may send less than requested
        ICdataAsBytes[i++] = Wire.read();

    int *tempData =(int*)&ICdataAsBytes;
    
    for( i = 0; i < 4; i++)
        Serial.println(tempData[i]);
    
}

,

I2C на расстояниях до 115 футов (≈ 35 м) ? Действительно?, @Edgar Bonet

Ах, я пропустил эту важную заметку, спасибо. Да, расстояние, кажется, выходит за рамки спецификации., @pete_a_dunham