Подскажите по портам rx и tx на китайской Меге

Skunss
Offline
Зарегистрирован: 29.11.2018

Приветствую всех!
Третий день бьюсь безрезультатно над одной проблемой. В инэте по ней пустота.... толи я тупой то ли руки кривые. В чем суть. Есть проект типа управляемого робота. Его реши перевести с nrf... на HC-12 SI4463. Если у nrf'ок свой тип подключения, то hc-12 общаются тупо по uart. Модули заказывались парой, настроены через at команды. Пишу простенький скетч чтобы буква писалась и отлетала в сириал (в качестве пульта nano). И приходила в сириал mega. Так вот ничего не приходит! Точнее после плясок с бубном получиль следующее. Буквы приходят если задействовать софтвер сириал (52 и 53 разъёмы меги) но заканчивается все тем что они учитываются монитором порта и самой ардуиной игнорятся. Либо, что самое интересное, это указать в скетче сириал 1 а воткнуть в порты 0. Тогда монитор считывает, но мега использовать для исполнения их не может.
Пробовал уже на двух разных мегах китайский - результат один. Если использовать в качестве приёмника нану (поменять их местами) в сириал приходит какая то абракадабра из цифр. Другие сириал на меге молчат. Не понимаю что делаю не так. ... пробовал на боютузных уарт модулях истрия та же, то есть проблема либо в мегах либо скетче. Я склоняюсь к первому, ибо скетч самый примитивный.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы очень мудро поступили, что задали вопрос без скетча, без фото Вашей меги и вообще ... в расчёте на хрустальный шар.

Ну, давайте гадать ... не вот это?

Skunss
Offline
Зарегистрирован: 29.11.2018

ОК. Спасибо за ссылку, я ту тему тоже читал. Но там проблемка в другом)))) 

Фото моей меги [url=https://radikal.ru][img]https://d.radikal.ru/d23/2102/5b/4bf454d6050a.jpg[/img][/url] В ней нет (вроде бы) ошибки в маске печати)

#include <Servo.h>
#include <SPI.h>



int state;
const byte w1p = 12;
const byte w1n = 11;
const byte r1p = 24;
const byte r2p = 22;
const byte r1b = 26;
const byte r2b = 28;
const byte l1p = 30;
const byte l2p = 32;
const byte l1b = 34;
const byte l2b = 36;

Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;

void setup() {


 
 Serial1.begin(9600);




  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(22, OUTPUT);
  pinMode(24, OUTPUT);
  pinMode(26, OUTPUT);
  pinMode(28, OUTPUT);
  pinMode(30, OUTPUT);
  pinMode(32, OUTPUT);
  pinMode(34, OUTPUT);
  pinMode(36, OUTPUT);
  myservo1.attach(3);
  myservo2.attach(5);
  myservo3.attach(6);
  myservo4.attach(8);
  myservo5.attach(10);

}

void loop() {
  delay(5);

 if(Serial1.available() > 0){
state = Serial1.read();
}
  
  if (state == "j")
  {
    myservo1.write(30);
  }
  if (state == "g")
  {
    myservo1.write(120);
  }
  if (state == "w")
  {
    myservo2.write(100);
    myservo3.write(100);;
  }

  if (state == "e")
  {
    myservo2.write(140);
    myservo3.write(140);
  }

Skunss
Offline
Зарегистрирован: 29.11.2018

Это кусочек кода. Он очень простой. Я не понимаю почему когда я указываю Serial1 - Ок. С пульта приходят значения и отражаются в мониторе порта - НО ! не исполняются state которые к ним привязаны. При этом это работает только если указать Serial1  НО воткнуть его в 0 и 1 порты Меги. По другому вообще глухо. Вариант в Софтсириал (52 и 53 пины) не проходит также - данные в монитор порта но не исполняются state. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Читайте внимательно про софт сериал, там в качестве RX может быть только нога с прерываниями.

Кроме того вот вы чего с чем сравниваете ?  Число со строкой !?!?!?!?!? Так оно никогда равно не будет.

Опять не понимаю, вы по вашему уровню должны были этот вопрос задавать в песочнице. Почему вы тут ?

Skunss
Offline
Зарегистрирован: 29.11.2018

Спасибо за направление в песочницу))) там нет ответа на мой вопрос, я искал. Вопрос именно про железо, по этому я тут. Про прерывание я в курсе по этому и 52 и 53 порт меги.
Вопрос по сути простой, я не спорю, но на просторах интернета я ответа не нашел. Скетч будет самым простым. Может кто то сталкивался - я грешу именно на мегу и китайцев, проверить орегинальной меге у меня возможности нет.

sadman41
Offline
Зарегистрирован: 19.10.2016

Skunss пишет:
я грешу именно на мегу и китайцев, проверить орегинальной меге у меня возможности нет.

И что же китайцы в Вашей Меге испортили - можете предположить? 

Skunss пишет:
Я не понимаю почему когда я указываю Serial1 - Ок. С пульта приходят значения и отражаются в мониторе порта

Без схемы нет ответа.

Skunss пишет:
не исполняются state которые к ним привязаны.

Потому что conditions всегда возвращают ложь.

Skunss пишет:
По другому вообще глухо. Вариант в Софтсириал (52 и 53 пины) не проходит также - данные в монитор порта но не исполняются state.

Это ваще непонятно. В приведенном фрагменте скетча софтсириала нет.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Skunss пишет:
Спасибо за направление в песочницу))) там нет ответа на мой вопрос, я искал.

Вы всегда читая видите только то что хотите  ? Вам нужно в песочницу потому что state соответственно вашему же коду это цифра со знаком, а сравниваете вы ее с массивом char. 

Если сравнить три рубля с яблоком то к какому выводу можно прийти ? Правильно, ОНИ НИКОГДА НЕ РАВНЫ, даже если это яблоко стоит три рубля, это его цена а не само яблоко.

По тому что вы ваяете видно, что вы не знакомы с языком на котором пытаетесь писать. И ваш вопрос он настолько абсурден, что становится смешно. А выводы которые вы делаете на основании неудач, еще более смешные.

6 строка должна быть: char state;

и везде где вы сравниваете state с чем то замените двойные кавычки на одинарные.

Skunss
Offline
Зарегистрирован: 29.11.2018

"почесывая репу"...

я точнг такой же код (скетч) )использовал с hc-05 и 06. Все работало! 

сейчас попробовал подключил Hc-06 (приемник, прошит через АТ на автоконнект с передатчиком на нс-05). на одной дуне мега заработал сьполпинка набдругой какя то фигня идет. в обоих случаях подключены на RX0  и TX0. Не понимаю.... 

нс-12 я проверял на двух Нано, гоняя туда сюда значения. Опять таки все работало

Skunss
Offline
Зарегистрирован: 29.11.2018

Про кавычки и char state спасибо, сейчас попробую

Skunss
Offline
Зарегистрирован: 29.11.2018

Попробовал все упростить до неприличия))) 

int LED = 13;
void setup()  
{
  // Инициализируем последовательный интерфейс и ждем открытия порта:
  
 
  // устанавливаем скорость передачи данных для последовательного порта, созданного 
  // библиотекой SoftwareSerial
  Serial3.begin(9600);
  pinMode(LED, OUTPUT);
}
 
void loop() // выполняется циклически
{
  if (Serial3.available()){

// Читаем один символ из буфера программного последовательного порта и сохраняем его переменную com

int com = Serial3.read();

// Действуем соответственно полученному символу

if (com ==  "x"){

// Выключение светодиода

digitalWrite(LED, LOW);

}

else if (com == "s"){

// Включение светодиода

digitalWrite(LED, HIGH);
}
}
}

Вот такой скетчик. Фишка в чем. В монитор все четко падает с передающей ардуины - 100% НОООО!!! Физически задействованы порты  0 и 1 , а должно быть 14 и 15. Пробовал менять на Sirial1, Serial 2 и Serial 0. Работает только в 0 и 1, остальные - пусто. Также фигня если указать просто Serial 0 и воткнуть в 0 и 1 связи нет. 

Как я и сказал значения (буквы) приходят исправно НО в вкл/выклу светодиода это не относится никак.

Skunss
Offline
Зарегистрирован: 29.11.2018

UPD. Связь падает как только я запускаю Serial.begin (9600)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Skunss, в строках 23 и 31 скетча из сообщения №10 Вы сравниваете целое число со строкой. Чтобы сравнение проходило корректно, рекомендуется, чтобы с обеих сторон были данные одного и того же типа. В данном случае лучше всего будет char.

 

PS. Собственно, об этом Вам уже brokly писал.

sadman41
Offline
Зарегистрирован: 19.10.2016

andriano, ему уже писали об этом - не доходит.

К слову - он даже сравнивает байт с указателем - я правильно понимаю?

Skunss
Offline
Зарегистрирован: 29.11.2018

Пробовал сhar - результат одинаковый. Выше написал об этом. Фикус еще в том, что при воткнутых ногах 0 и 1 Мега прекрасно прошивается)))

Skunss
Offline
Зарегистрирован: 29.11.2018

Уважаемые, я очень прошу обратить внимание на 11 сообщение - это наверное основа загадки. Если бы адекватно задействовался бы serial0 я думаю проблема не возникла. И как я писал выше - если воткнуть блютузный нс-06 все работает с serial0.

MaksVV
Offline
Зарегистрирован: 06.08.2015



#define BUF_SIZE 30       // размер буфера парсилки
char currStr[BUF_SIZE+3]; // буфер парсилки  

#define UART Serial3      // тут выбираем UART, на который приходят команды
#define LED 13            // LED

#define COMMAND_SIZE 6    // максимальное число символов в команде

                             enum {  OFF,   ON, COMMAND_QUANTITY};   // список команд
const char comm[][COMMAND_SIZE] = { "OFF", "ON", };                  // массив строк команд

char *sTr; // для парсинга

//------------------------------функция исполнения команды
void runCommand(byte command)
{
 Serial.println (comm[command]); 
 Serial.println();
      if (command == ON ) digitalWrite (LED, HIGH);
 else if (command == OFF) digitalWrite (LED,  LOW);
}

//------------------------функция чтения информации из UART
void UART_read()
{
  if (!UART.available()) return; // если данных нет игнорируем эту функцию
  char currSymb[2] = {0};          // символьный кэш
  currSymb[0] = UART.read();     // читаем очередной символ
  static bool stringEnd = 0;       // флаг переполнения буфера

 if (currSymb[0] == '\r' || stringEnd == 1)   // если полностью получили строку - парсим:
 {
  bool commCorrect = 0;   // флаг найдена ли нужная команда
  
  // парсим все команды:
  for (int i=0; i<COMMAND_QUANTITY; i++) {if ((sTr =strstr(currStr, comm[i]))>0) {runCommand (i); commCorrect = 1; break;}}
  
  if (!commCorrect)Serial.println ("Command is not correct!"); // поругаемся, если нет такой команды

  currStr[0] = 0; stringEnd = 0; // в конце парсинга нулим буфер
 } 

// если не конец строки, то прибавляем очередной байт к буферу : 
else if ( currSymb[0] != '\n')  strcat (currStr,currSymb); 
// если буфер закончился , то режем строку на этом месте: 
     if (strlen(currStr)>=BUF_SIZE) {stringEnd = 1;}

}

//--------------------------------

void setup() 
{
 Serial.begin(9600);
 UART.begin(9600);
 pinMode (LED, OUTPUT);
}

void loop() 
{
UART_read(); // функция чтения из UART
// тут остальной код
}

 

И ещё GND соединять некоторые забывают, вот и не работает нишиша. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

sadman41 пишет:
andriano, ему уже писали об этом - не доходит. К слову - он даже сравнивает байт с указателем - я правильно понимаю?

Ты понимаешь совершенно правильно, что не удивительно. А вот он какой то странный :(

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:
andriano, ему уже писали об этом - не доходит. К слову - он даже сравнивает байт с указателем - я правильно понимаю?
Правда, не байт, а двухбайтовое целое. С двухбайтовым же указателем. Так что в его действиях при желании можно даже отыскать логику))).

b707
Offline
Зарегистрирован: 26.05.2017

Skunss пишет:
Уважаемые, я очень прошу обратить внимание на 11 сообщение - это наверное основа загадки

уважаемый, очень советую обратить внимание на сообщения #7 и  #12. Пока вы эти ошибки не исправите - обсуждать ничего другого просто не имеет смысла и никто на ваши сообщения обращать внимания не станет

Skunss
Offline
Зарегистрирован: 29.11.2018

Я уже выше писал, что менял на char - результата это не принесло. И кавычки, и много чего еще. Сюда подцеплять мвои изыскания не стал.

Опять таки если вместо хардововых сириалов использовать софтовый - то хоть и с "дребезгом" но работает. Скетч стандартный для 52 и 53 портов Меги

Буквально по первой ссылке нашел скетч для проверки hc-12. https://3d-diy.ru/wiki/arduino-moduli/radiomodul-hc-12/ Залил его на Уну (у нее один Сириал). Скетч завелся с учетом того что я значения на свои поменял. Светодиод на Уну включается и выключается пусть и не совсем как надо. Но это уже лучше чем ничего. Далее залил тот же скетч в Мегу - нифига. Поменял туда сюда номера Сириалов - нифига.

Есть кто-нибудь кто реально сдруживал Нс-12 и мегу?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

уважаемый, очень советую обратить внимание на сообщения #7 и  #12. 

Ну, так он же уже

Skunss пишет:
Пробовал - результат одинаковый.

Помните деятеля, который, когда ему сказали, что датчик не к тому пину подключён, ответил: "А я пробовал к разным - не помогает, вернул как было". Вот и здесь так же :-)

b707
Offline
Зарегистрирован: 26.05.2017

Skunss пишет:
Есть кто-нибудь кто реально сдруживал Нс-12 и мегу?

"Я не пробовал, но думаю что умею" (с) из анекдота :)

У меня как-то нет никаких сомнений, что у меня HC-12 заведется на меге.

Валяются в коробке Мега и HC-12. Сколько платите, чтобы я вам продемонстрировал на любом Сериале (да хоть на всех поочередно) работу этого модуля ?

Skunss
Offline
Зарегистрирован: 29.11.2018

Ни сколько. А смысл? То что Вы на своей Меге и своих HC-12 что то прогоните, это не значит,что заработает именно на моих. Верно? Я по этому и разместил в Железной ветке а не в софтовой. Но тем не менее  проблемму я решил. Не знаю почему и как но завелось. Залил в пульт и робота, скетчи соответственно от другого робота который под HC-05 и 06 делался. Тестил на 11 пине сервы - все четко без глюков работает.

 

Робот на Мега

  #include <Servo.h>
const int motorA1 = 5; 
const int motorA2 = 6; 
const int motorB1 = 10; 
const int motorB2 = 9; 
const int motorC1 = 7; 
const int motorC2 = 8; 
Servo myservo1; 
Servo myservo2; 
 
int i=0; 
int j=0; 
int state; 
int vSpeed=255; 
boolean horn = false;
 
void setup() {
  Serial3.begin(9600);






pinMode(motorA1, OUTPUT);
pinMode(motorA2, OUTPUT);
pinMode(motorB1, OUTPUT);
pinMode(motorB2, OUTPUT);
pinMode(motorC1, OUTPUT);
pinMode(motorC2, OUTPUT);
myservo1.attach(3);
myservo2.attach(11);


}


void loop() {


if(Serial3.available() > 0){
state = Serial3.read();
}
 

if (state == '0'){
vSpeed=255;}
else if (state == '1'){
vSpeed=255;}

 
 



 
if (state == 'X') {
analogWrite(motorC1, vSpeed); analogWrite(motorC2, 0);

}

if (state == 'x') {
analogWrite(motorC1, 0); analogWrite(motorC2, vSpeed);

}


if (state == 'W') {
myservo2.write(25);
myservo1.write(25);
}
 

if (state == 'w') {
myservo2.write(90);
myservo1.write(115);
}


if (state == 'F') {
analogWrite(motorA1, vSpeed); analogWrite(motorA2, 0);
analogWrite(motorB1, vSpeed); analogWrite(motorB2, 0);
}
 

 

 

else if (state == 'B') {
analogWrite(motorA1, 0); analogWrite(motorA2, vSpeed);
analogWrite(motorB1, 0); analogWrite(motorB2, vSpeed);
}
 

 

 

 

else if (state == 'R') {
analogWrite(motorA1, vSpeed); analogWrite(motorA2, 0);
analogWrite(motorB1, 0); analogWrite(motorB2,  vSpeed);
}
 else if (state == 'L') {
analogWrite(motorA1, 0); analogWrite(motorA2, vSpeed);
analogWrite(motorB1, vSpeed); analogWrite(motorB2,  0);
}
 
 

else if (state == 'S'){
analogWrite(motorA1, 0); analogWrite(motorA2, 0);
analogWrite(motorB1, 0); analogWrite(motorB2, 0);
analogWrite(motorC1, 0); analogWrite(motorC2, 0);
}

 

}


Пульт на Нано

int button1 = 2;
int button2 = 3;
int button3 = 4;
int button4 = 5;
int button5 = 8;
int button6 = 6;
int button7 = 7;
int button8 = A0;

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

  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(button4, INPUT);
  pinMode(button5, INPUT);
  pinMode(button6, INPUT);
   pinMode(button7, INPUT);
   pinMode(button8,INPUT);
delay (2000);

}
void loop() 

{
   if (digitalRead(button1) == HIGH) {

Serial.print ("L");

}

  if (digitalRead(button3) == HIGH) {

Serial.print ("B");

}



   if (digitalRead(button2) == HIGH) {

Serial.print ("F");

}



   if (digitalRead(button4) == HIGH) {

Serial.print ("R");
}



  if (digitalRead(button5) == HIGH) {

Serial.print ("X");
  }
  if (analogRead(button8) > 500) {

Serial.print ("x");
}

  if (digitalRead(button6) == HIGH) {

Serial.print ("W");
  }
   if (digitalRead(button7) == HIGH) {

Serial.print ("w");
}




 if ((digitalRead(button1) == LOW)&& (digitalRead(button2) == LOW)&&(digitalRead(button3) == LOW)&&(digitalRead(button4) == LOW)&&(digitalRead(button5) == LOW)&&(analogRead(button8) < 500)){

Serial.print ("S");
delay(100);
  }
}

 

 

Skunss
Offline
Зарегистрирован: 29.11.2018

Всем спасибо! Тему можно закрывать.

sadman41
Offline
Зарегистрирован: 19.10.2016
if (com ==  "x")

   --- AND --

if (state == 'x')



Ардуина неисправная, китайцы виноваты, провода херовые... что ещё забыл?

 

b707
Offline
Зарегистрирован: 26.05.2017

Skunss пишет:

Ни сколько. А смысл? То что Вы на своей Меге и своих HC-12 что то прогоните, это не значит,что заработает именно на моих. Верно?

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

 

Цитата:
Но тем не менее  проблемму я решил. Не знаю почему и как но завелось.

Вот именно - "не знаю почему". Судя по всему - Вы так ничего и не поняли. А это значит, что понадобится что-то поменять - и опять нифига работать не будет.

вы бы внимательно прочитали ветку еще раз - правильный ответ там есть. Хотя возможно, стоит сначала проштудировать учебник по языку.

 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:
Ардуина неисправная, китайцы виноваты, провода херовые... что ещё забыл?

 

забавно, что ТС "увелается ардуиной" уже три года, а времени почитать методичку по программированию, судя по всему. так и не нашлось

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:
времени почитать методичку по программированию, судя по всему. так и не нашлось

Это же не наш метод!