Передача данных ARDUINO -> ARDUINO -> PC

Задача:
Имеется две ардуино (нано и леонардо(тк может имитировать HID устройства)). леонардо подключена по microUSB, а нано от неё по земле и +5В. С нано передаются значения на леонардо по TX → RX , а с леонардрдо на ПК по USB (тип данных мне неважен тк всё будет преобразовываться в str (например передаётся число 10011101011, а дальше преобразовывается в str и если STR[0] == “1” {кнопка 1 нажата}, и тд)).
Если кому интересен мой НЕработающий код то вот он:
НАНО

int pin1 = 2;

void setup() {
  Serial.begin(9600);
  pinMode(pin1, INPUT);
}

void loop() {
  int parse = 0;
  if (digitalRead(pin1) == true)  {
    parse = 1;
  }

  Serial.print(parse);
}

LEONARDO

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(2);

void loop() {
  if (Serial.available()) {
    int val = Serial.parseInt();
    if (val == 1) {
    digitalWrite(13, HIGH);
    }
    else  {
      digitalWrite(13, LOW);
    }
  }
}

Вместо зажигания лампочки должна подключатся библиотека Keyboard и имитировать нажатие клавиш (или какая-нибудь др библиотека, имитирующая геймпад/джойстик). Если есть какой-нибудь модуль или библиотека могу купить (установить). если уже есть подобное обсуждение, то скиньте ссылк.
PS: делаю кабину от cirrus vision jet.

А в чем проблема - можете вербализовать?

нано непрерывно подаёт число (когда всё отпущено то 0) на леонардо.
сейчас должно работать так:
1)нажимаю на кнопку
2)загорается светодиод
3)отпускаю кнопку
4)светодиод гаснет
Но так не происходит, хотя должно

Думаете, что должно? Давайте проверим.

Выведите значение переменной val в Serial Monitor после

int val = Serial.parseInt();

в том то и дело, нужно, чтоб val было равно 1 при нажатии и 0 при ненажатии кнопки, а вместо этого он не выдаёт ничего

Значит не находит в потоке числа. Вот что про него пишут:

In particular:

  • Parsing stops when no characters have been read for a configurable time-out value, or a non-digit is read;

  • If no valid digits were read when the time-out (see Serial.setTimeout()) occurs, 0 is returned;

Как считаете - выполняется ли условие, упомянутое в первом абзаце?

1 лайк

я сейчас поставил таймаут 100 и он все равно ничего не вывел + я и до этого вводил значения в сом порт и он писал всё нормально. Думаю, что проблема не в этом
Хотя очень странно то, что val ничему не равняется, учитывая то, что при истечении таймаута он должен писать 0

https://it.wikireading.ru/h3aeYXlvE4

@in3d
А зачем вообще посылать число как строку, чтобы потом преобразовывать ее в число назад?
Не кажется, что вы сами себе жизнь портите?
Что мешает послать в Сериал число как байт и принять его как байт, оно и проще и работать будет в десятки раз быстрее

NANO

int pin1 = 2;

void setup() {
  Serial.begin(9600);
  pinMode(pin1, INPUT);
}

void loop() {
  byte parse = 0;
  if (digitalRead(pin1) == true)  {
    parse = 1;
    Serial.write(parse);
  }
}

LEO

void setup() {
  Serial.begin(9600);
 }

void loop() {
  if (Serial.available()) {
    byte val = Serial.read();
    if (val == 1) {
    digitalWrite(13, HIGH);
    }
    else  {
      digitalWrite(13, LOW);
    }
  }
}
1 лайк

Я кажется не указал проблему:
Когда НАНО подаёт число 1 на tx, то леонардо должна принимать его по rx, затем включать встроенный светодиод, но этого не происходит, почему, не знаю, но прошу помочь.

Serial1 для леонардо

1 лайк

Спасибо огромное, прям даже и не знал, что делать.