Передача значений по serial. Что я делаю не так?

wenom86
Offline
Зарегистрирован: 04.11.2012

Здравствуйте. Необходимо передать с 1-й ардуины по сериал-порту на 2-ю несколько значений.

Написал код передатчика, где при вращении ручки переменника его значение отправляется в порт.

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

Но когда все соединил воедино. на 2-й ардуине не загорается и не регулируется светодиод.

(rx 1-й соединил с tx второй, и наоборот) (это моя первая программа на ардуино)

Код передатчика:



// Передатчик команд управления v0.2
// Органы управления - 2 переменника, 2 кнопки.
// Исполнительные механизмы - 1 сервомашинка, 2 светодиода.

//Цель: (уже неактуальна!!!)
// а)при нажатии кнопки1 отправить в сериал-порт информацию о текущем значении. (кнопка с фиксацмей значения)
// б)при нажатии кнопки2 отправить в сериал-порт информацию о текущем значении. (кнопка без фиксации значения
// в)при вращении ручки потенциометра1 отправить в сериал-порт информацию о текущем значении.
// г)при вращении ручки потенциометра2 отправить в сериал-порт информацию о текущем значении.
// д)вывести информацию о состоянии всех органов управления в мониторе порта.

int pot1x = 0; //Обьявляем А0 аналоговый пин считывания показаний потенциометра1 (ось x) (погружение-всплытие)
int pot1y = 1; //Обьявляем А1 аналоговый пин считывания показаний потенциометра1 (ось y) (неиспользуется)
int pot2x = 2; //Обьявляем А0 аналоговый пин считывания показаний потенциометра2 (ось x) (влево-вправо)
int pot2y = 3; //Обьявляем А1 аналоговый пин считывания показаний потенциометра2 (ось y) (вперед-назад)
int knopka1 = 3; //кнопка1 подключена к 3 цифровому контакту (фиксируемая) (освещение 1)
int knopka2 = 4; //кнопка2 подключена к 4 цифровому контакту (фиксируемая) (освещение 2)
int knopka3 = 5; //кнопка3 подключена к 5 цифровому контакту (фиксируемая) (освещение 3)
int knopka4 = 6; //кнопка4 подключена к 6 цифровому контакту (фиксируемая) (освещение 4)
int knopka7 = 7; //кнопка7 подключена к 7 цифровому контакту (манипулятор - расжать)
int knopka8 = 8; //кнопка8 подключена к 8 цифровому контакту (манипулятор - сжать)
int knopka9 = 9; //кнопка9 подключена к 9 цифровому контакту (камера - вверх)
int knopka11 = 10; //кнопка11 подключена к 10 цифровому контакту (камера - вниз)
int knopka12 = 11; //кнопка12 подключена к 11 цифровому контакту (резервная)

int motorPin = 12; //моторы в пульте управления подключены к 12 цифровому контакту
int ledPin = 13; //светодиод в пульте управления подключен к 13 цифровому контакту


void setup()
{
analogReference(DEFAULT);       //Объявляем диапазон чтения с аналогового порта. Значение DEFAULT оставляем, если используем переменные резистры (в моем случае 10ком) (считывание от 0 до 5вольт)
Serial.begin(9600);             //Включаем сериал-порт
pinMode(ledPin, OUTPUT);        // Инициализируем 13 выход под светодиод.
  
pinMode(knopka1, INPUT);        //отмечаем контакт кнопки 1 - как вход
digitalWrite(knopka1, HIGH);    // включить подтягивающий резистор к питанию.
pinMode(knopka2, INPUT);        //отмечаем контакт кнопки 2 - как вход
digitalWrite(knopka2, HIGH);    // включить подтягивающий резистор к питанию.
pinMode(knopka3, INPUT);        //...
digitalWrite(knopka3, HIGH);
pinMode(knopka4, INPUT);       
digitalWrite(knopka4, HIGH);
pinMode(knopka7, INPUT);      
digitalWrite(knopka7, HIGH);
pinMode(knopka8, INPUT);       
digitalWrite(knopka8, HIGH);
pinMode(knopka9, INPUT);       
digitalWrite(knopka9, HIGH);
pinMode(knopka11, INPUT);      
digitalWrite(knopka11, HIGH);
pinMode(knopka12, INPUT);       
digitalWrite(knopka12, HIGH);
}

 
 
 
void loop()
{
  
  
// Печатаем в сериал-порт данные, как Анси текст.
  Serial.println(analogRead(pot1x)); //потенциометр 1x
  Serial.println(analogRead(pot1y)); //потенциометр 1y
  Serial.println(analogRead(pot2x)); //...
  Serial.println(analogRead(pot2y)); 
  Serial.println(digitalRead(knopka1)); //кнопка 1
  Serial.println(digitalRead(knopka2)); //кнопка 2
  Serial.println(digitalRead(knopka3)); //...
  Serial.println(digitalRead(knopka4)); 
  Serial.println(digitalRead(knopka7));
  Serial.println(digitalRead(knopka8));
  Serial.println(digitalRead(knopka9));
  Serial.println(digitalRead(knopka11));
  Serial.println(digitalRead(knopka12));
  
// Отправляем в сериал-порт данные в двоичном виде.
   Serial.write('a');   //метка начала передачи последовательности команд
   Serial.write(pot1x); //потенциометр 1x
   Serial.write(pot1y); //потенциометр 1y
   Serial.write(pot2x); //...
   Serial.write(pot2y);
   Serial.write(knopka1); //кнопка 1
   Serial.write(knopka2); //кнопка 2
   Serial.write(knopka3); //...
   Serial.write(knopka4); 
   Serial.write(knopka7); 
   Serial.write(knopka8); 
   Serial.write(knopka9); 
   Serial.write(knopka11); 
   Serial.write(knopka12); 
   
   
   delay(50);
 }
 

 

 

wenom86
Offline
Зарегистрирован: 04.11.2012

А вот код приемника:

int pot1x=0;
int pot1y=0;
  
 void setup()
 {
   pinMode(10,OUTPUT);
   pinMode(9,OUTPUT);
   Serial.begin(9600);
 }
  
 void loop()
 {
   if(Serial.available() && Serial.read() == 'a')
   {
     pot1x=Serial.read()-'0';
     pot1y=Serial.read()-'0';
     Serial.flush();
     pot1x=map(pot1x, 0, 1023, 0, 255);
     pot1y=map(pot1y, 0, 1023, 0, 255);
     analogWrite(9,pot1x);
     analogWrite(10,pot1y);
   }

   delay(50);
 }

 

Geronimo
Offline
Зарегистрирован: 06.05.2013
Serial.write('a');   //метка начала передачи последовательности команд
Serial.write(pot1x); //потенциометр 1x
Serial.write(pot1y); //потенциометр 1y

тут вы отправляете всегда номера пинов, analogRead() не забыли?

wenom86
Offline
Зарегистрирован: 04.11.2012

Спасибо за ответ. Исправил. Но продолжаю ломать голову:

Вроде весь код приемника и передатчика прошерстил - но не работает как надо. То светодиоды беспорядочно мигают, то одновременно регулируются. Еще заметил, что светодиод tx моргает на передающей ардуине секунд 5-10, а затем горит постоянно. (а после отсоединения питания и повторного подключения он вообще не моргает. Не могу понять - может с кодом приемника или передатчика что-то не так?

Вот последний код передатчика:







// Передатчик команд управления v0.2
// Органы управления - 2 переменника, 2 кнопки.
// Исполнительные механизмы - 1 сервомашинка, 2 светодиода.

//Цель: (уже неактуальна!!!)
// а)при нажатии кнопки1 отправить в сериал-порт информацию о текущем значении. (кнопка с фиксацмей значения)
// б)при нажатии кнопки2 отправить в сериал-порт информацию о текущем значении. (кнопка без фиксации значения
// в)при вращении ручки потенциометра1 отправить в сериал-порт информацию о текущем значении.
// г)при вращении ручки потенциометра2 отправить в сериал-порт информацию о текущем значении.
// д)вывести информацию о состоянии всех органов управления в мониторе порта.

int pot1x = 0; //Обьявляем А0 аналоговый пин считывания показаний потенциометра1 (ось x) (погружение-всплытие)
int pot1y = 1; //Обьявляем А1 аналоговый пин считывания показаний потенциометра1 (ось y) (неиспользуется)
int pot2x = 2; //Обьявляем А0 аналоговый пин считывания показаний потенциометра2 (ось x) (влево-вправо)
int pot2y = 3; //Обьявляем А1 аналоговый пин считывания показаний потенциометра2 (ось y) (вперед-назад)
int knopka1 = 3; //кнопка1 подключена к 3 цифровому контакту (фиксируемая) (освещение 1)
int knopka2 = 4; //кнопка2 подключена к 4 цифровому контакту (фиксируемая) (освещение 2)
int knopka3 = 5; //кнопка3 подключена к 5 цифровому контакту (фиксируемая) (освещение 3)
int knopka4 = 6; //кнопка4 подключена к 6 цифровому контакту (фиксируемая) (освещение 4)
int knopka7 = 7; //кнопка7 подключена к 7 цифровому контакту (манипулятор - расжать)
int knopka8 = 8; //кнопка8 подключена к 8 цифровому контакту (манипулятор - сжать)
int knopka9 = 9; //кнопка9 подключена к 9 цифровому контакту (камера - вверх)
int knopka11 = 10; //кнопка11 подключена к 10 цифровому контакту (камера - вниз)
int knopka12 = 11; //кнопка12 подключена к 11 цифровому контакту (резервная)

int motorPin = 12; //моторы в пульте управления подключены к 12 цифровому контакту
int ledPin = 13; //светодиод в пульте управления подключен к 13 цифровому контакту


void setup()
{
analogReference(DEFAULT);       //Объявляем диапазон чтения с аналогового порта. Значение DEFAULT оставляем, если используем переменные резистры (в моем случае 10ком) (считывание от 0 до 5вольт)
Serial.begin(9600);             //Включаем сериал-порт
pinMode(ledPin, OUTPUT);        // Инициализируем 13 выход под светодиод.
  
pinMode(knopka1, INPUT);        //отмечаем контакт кнопки 1 - как вход
digitalWrite(knopka1, HIGH);    // включить подтягивающий резистор к питанию.
pinMode(knopka2, INPUT);        //отмечаем контакт кнопки 2 - как вход
digitalWrite(knopka2, HIGH);    // включить подтягивающий резистор к питанию.
pinMode(knopka3, INPUT);        //...
digitalWrite(knopka3, HIGH);
pinMode(knopka4, INPUT);       
digitalWrite(knopka4, HIGH);
pinMode(knopka7, INPUT);      
digitalWrite(knopka7, HIGH);
pinMode(knopka8, INPUT);       
digitalWrite(knopka8, HIGH);
pinMode(knopka9, INPUT);       
digitalWrite(knopka9, HIGH);
pinMode(knopka11, INPUT);      
digitalWrite(knopka11, HIGH);
pinMode(knopka12, INPUT);       
digitalWrite(knopka12, HIGH);
}

 
 
 
void loop()
{
  

// Отправляем в сериал-порт данные в двоичном виде.
   Serial.write('a');   //метка начала передачи последовательности команд
   Serial.write(analogRead(pot1x)); //потенциометр 1x
   Serial.write(analogRead(pot1y)); //потенциометр 1y
   Serial.write(analogRead(pot2x)); //...
   Serial.write(analogRead(pot2y));
   Serial.write(digitalRead(knopka1)); //кнопка 1
   Serial.write(digitalRead(knopka2)); //кнопка 2
   Serial.write(digitalRead(knopka3)); //...
   Serial.write(digitalRead(knopka4)); 
   Serial.write(digitalRead(knopka7)); 
   Serial.write(digitalRead(knopka8)); 
   Serial.write(digitalRead(knopka9)); 
   Serial.write(digitalRead(knopka11)); 
   Serial.write(digitalRead(knopka12)); 
   
   
   delay(50);
 }



 

 

wenom86
Offline
Зарегистрирован: 04.11.2012

И вот приемника:

int pot1x=0;
int pot1y=0;
  
 void setup()
 {
   pinMode(10,OUTPUT);
   pinMode(9,OUTPUT);
   Serial.begin(9600);
 }
  
 void loop()
 {
   if(Serial.available() && Serial.read() == 'a')
   {
     pot1x=Serial.read()-'0';
     pot1y=Serial.read()-'0';
     Serial.flush();
     pot1x=map(pot1x, 0, 1023, 0, 255);
     pot1y=map(pot1y, 0, 1023, 0, 255);
     analogWrite(9,pot1x);
     analogWrite(10,pot1y);
   }

   delay(50);
 }