передать последовательность бит с помощью Arduino Uno

Как написать код для передачи последовательности битов с помощью Arduino Uno? Мой проект включает передатчик и приёмник. Arduino выступает в роли передатчика, а приложение — приёмника. Датчик освещённости обнаружит отправленные биты. Как отправить последовательность битов, например, 00101010? Какую функцию мне использовать? Я новичок в Arduino. Спасибо.

, 👍-1

Обсуждение

Как передать? Используя азбуку Морзе со светодиодом?, @Gerben

Оптическая передача данных — довольно обширная область применения. Каковы ваши требования к скорости и коррекции ошибок? Как вы планируете получать и декодировать данные? Возможно, лучше использовать ИК-библиотеку или другой носитель (Wi-Fi, Bluetooth и т. д.)., @Maximilian Gerhardt

Передача данных осуществляется с помощью азбуки Морзе, но в двоичном формате. Это означает передачу единиц и нулей, что составляет 8 бит. Arduino Uno выступает в роли передатчика, а приложение — приёмника и принимает последовательность битов., @Nyssa

«Передавать азбукой Морзе, но передавать в двоичном формате» — повторите ещё раз. Если у вас «А», хотите ли вы, чтобы это передавалось как «короткий-длинный» или «01000001» (код ASCII)?, @Maximilian Gerhardt

Serial.print("hello"); — это двоичный код (ASCII). Ваш скетч уже это делает., @Mikael Patel

Ого, я просто знал много из этого. Я просто хочу отправить простое двоичное значение. Последовательность 8-битных символов непрерывно. К какой библиотеке или примеру мне обратиться, чтобы изучить и закодировать? Большое спасибо., @Nyssa

Я имею в виду следующее: я хочу отправить двоичный передатчик. Простой. Не использующий азбуку Морзе., @Nyssa

Люди обычно используют кодировку Manchester. Но мой приемник — это датчик освещенности от Android., @Nyssa

Куда отправить? По какой цене?, @Chad G

38400rate. Отправьте его через светодиод, @Nyssa

считайте светодиод Serial TX или создайте SoftwareSerial с TX на выводе 13, @Juraj

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

Также спрашивали здесь: https://arduinoprosto.ru/q/52837/sending-a-character-a-through-blinking-led, @Nick Gammon


1 ответ


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

1

Побитовая отправка фрагмента данных на самом деле выглядит так:

  • пройти по каждому байту данных
  • для каждого байта (= 8 бит) поместите каждый бит на светодиод и ждите

Это также имеет некоторые существенные недостатки:

  • Отсутствие обнаружения и исправления ошибок. Если на датчике освещенности/камере возникнут помехи из-за окружающей среды, данные будут считаны неверно. Для этого потребуется закодировать данные с помощью какой-либо схемы кодирования или добавить контрольную сумму.
  • Вывод сигнала на встроенный светодиод Arduino Uno / Nano — плохая идея, так как он находится прямо рядом со светодиодами питания, RX и TX
  • Передача сигнала в видимом спектре создаёт помехи. Именно поэтому мы используем инфракрасные передачи.
  • Приёмник и передатчик могут быть рассинхронизированы. Это означает, что приёмник не производит выборку выходного сигнала передатчика в нужное время. Для решения этой проблемы следует использовать преамбулу, избыточную выборку и усреднение на приёмнике.

Тем не менее, на мой взгляд, лучше использовать другие проверенные методы, такие как ИК-порт, приёмопередатчики 2,4 ГГц и т. д. Другие микроконтроллеры (пример) даже имеют встроенные периферийные устройства для передачи ИК-сигналов по определённому протоколу.

На Arduino Uno/Nano вы также можете использовать библиотеку IRemote для отправки и получения данных с помощью недорогого ИК-светодиода и ИК-приемника, многие из которых входят в стартовые наборы (и в остальном тоже недорогие).

Приведённый ниже код просто принимает поток байтов и выводит их побитово на светодиод. Больше ничего не происходит. Кроме того, метод digitalWrite медленный и его следует заменить на более быстрый вариант.

#include <Arduino.h>

/* LED to output from */
const int LEDTrans = 13;
/* Length of a symbol */
const int timeWait = 500;

const char dataToSend[] = "Hello World";

/* Transmits data bitwise */
void transmitData(const char* data, size_t length) {
    //go through each byte of the data
    for(size_t i = 0; i < length; i++) {
        uint8_t currentByte = (uint8_t) data[i];

        //Go through each of the 8 bits in the byte
        //Goes from LSB to MSB (right-to-left)
        for(int j = 0; j < 8; j++) {
            //uses Arduino.h macro "bitRead"
            bool currentBit = bitRead(currentByte, j);

            //Set the LED on/off
            digitalWrite(LEDTrans, currentBit);
            //Wait for the symbol time
            delay(timeWait);
        }
    }
}

void setup() {
    pinMode(LEDTrans, OUTPUT);
}

void loop() {
    transmitData(dataToSend, strlen(dataToSend));
    //turn LED OFF again
    digitalWrite(LEDTrans, 0);
    delay(2000);
}
,

>Передавайте азбукой Морзе, но передайте двоичный код, повторите ещё раз. Если у вас есть "А", как передать "короткий-длинный" или "01000001" (код ASCII)? Извините, я не заметил вашего вопроса, Максимилиан. Я хочу передать в формате 01000001., @Nyssa

Могу ли я получить ваш адрес электронной почты? Мне нужно многое спросить., @Nyssa