передать последовательность бит с помощью Arduino Uno
Как написать код для передачи последовательности битов с помощью Arduino Uno? Мой проект включает передатчик и приёмник. Arduino выступает в роли передатчика, а приложение — приёмника. Датчик освещённости обнаружит отправленные биты. Как отправить последовательность битов, например, 00101010? Какую функцию мне использовать? Я новичок в Arduino. Спасибо.
@Nyssa, 👍-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
- Последовательная связь ESP8266 с ATMega328P
- ATmega328P-PU: программатор не отвечает
- 16-герцовая плата Uno R3 против платы Arduino Uno R3
- SoftwareSerial не будет читать всю напечатанную строку при вызове readString()
- Arduino UARTS Автоматическая адресация ведомых устройств
- Вывести 2 числа, хранящиеся в 24-битном формате, в десятичном формате.
- Последовательная связь Arduino и AVR через USB
- Любопытное столкновение между OneWire и RadioHead
Как передать? Используя азбуку Морзе со светодиодом?, @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