Arduino + COM порт

Astronom
Offline
Зарегистрирован: 22.11.2011

Помогите разобраться в коде. Есть исходник для ардуины и прием сигнала по схеме идет с D3 и выводится в программку терминал. Помогите отредактировать исходник чтоб можно было с терминала отправлять например на D5. Так есть если мы отправляем туда AAA то и на выходе D5 должно выдаваться AAA

#define rxd 3 // rx data pin
#define rxe 4 // rx enable pin
#define delta 100 // max time delta
#define mintime 100 // min time pulse
unsigned int time,oldtime,count,log0,log1;
byte data[8];
void setup(){
pinMode(rxd,INPUT);
pinMode(rxe,OUTPUT);
digitalWrite(rxe,LOW);
attachInterrupt(1,pinint,CHANGE);
Serial.begin(115200);
Serial.println("Star 64 bit receiver started");
interrupts();
}
void pinint(){
if(digitalRead(rxd)==HIGH)oldtime=micros();
else{
time=micros()-oldtime;
if(time<mintime)return;
if(constrain(time,log0-delta,log0+delta)==time)savebit(false);
else if(constrain(time,log1-delta,log1+delta)==time)savebit(true);
else{
log0=time/2;
log1=time/4;
if(count==64){
Serial.print("STAR ");
for(int i=1;i<=8;i++)printhex(data[i]);
Serial.println("");
}
count=0;
}
}
}
void savebit(boolean val){
for(int i=1;i<=8;i++){
data[i]=data[i]<<1;
if(i<8)if(bitRead(data[i+1],7))bitSet(data[i],0);
}
if(val)bitSet(data[8],0);
count++;
}
void printhex(byte val){
if(val<=0x0F)Serial.print("0");
Serial.print(val,HEX);
}
void loop(){}

 

leshak
Offline
Зарегистрирован: 29.09.2011

 >Так есть если мы отправляем туда AAA то и на выходе D5 должно выдаваться AAA

Вариант 1: закоротить пины D3 и D5 (главное, при этом, нигде потом случайно не сделать pinMode(5,OUTPUT) - согжгете ногу).

Вариант 2: в loop(), сделать digitalWrite(5,digitalRead(3));

 

Astronom
Offline
Зарегистрирован: 22.11.2011

 

Получается так если я правильно понял.

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Второй варинат я поправил. Там нужен digitalRead(3)

Astronom
Offline
Зарегистрирован: 22.11.2011

leshak пишет:

 >Так есть если мы отправляем туда AAA то и на выходе D5 должно выдаваться AAA

Вариант 1: закоротить пины D3 и D5 (главное, при этом, нигде потом случайно не сделать pinMode(5,OUTPUT) - согжгете ногу).

 

 

3 и5 коротить нельзя так как на 3 ноге у нас прием сигнала идет а на 5 нам надо передачу организовать 

leshak
Offline
Зарегистрирован: 29.09.2011

> Сначало надо обьявить ножку 5 выходом так?

Конечно.

Если, же вам не критично что-бы это была именно пятая нога, то более оптимально будет в loop использовать

Serial1.write(Serial.read());

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

Astronom
Offline
Зарегистрирован: 22.11.2011

leshak пишет:

 Второй варинат я поправил. Там нужен digitalRead(3)

 

Я думаю не правьно немного вы меня поняли. На входе №3 у меня стоит приемник сигналов который срабатывает от прерывания и фильтрует нужный сигнал и выводит в терминал например этот 68D952ED68686B28. Теперь мне нужно например отправить эту посылку. я набираю в терминале 68D952ED68686B28 и жму отправить. Вот мне надо чтоб эту отправку он отправлял на выход №5. 

leshak
Offline
Зарегистрирован: 29.09.2011

Astronom пишет:

leshak пишет:

 >Так есть если мы отправляем туда AAA то и на выходе D5 должно выдаваться AAA

Вариант 1: закоротить пины D3 и D5 (главное, при этом, нигде потом случайно не сделать pinMode(5,OUTPUT) - согжгете ногу).

 

 

3 и5 коротить нельзя так как на 3 ноге у нас прием сигнала идет а на 5 нам надо передачу организовать 

Можно. Эта закоротка и организует вам "передачу сигнала с 3-тьей ноги, на 5-тую". И "приему" она мешать не будет. Идеальный вариант и самый надежный, так как не зависит от того "чем-там скетч в данный момент занимается". 

У него есть только два ограничения:

  1. Закоротка физически не возможна (нет места, мешает воткнуть пин в разъем и т.п.)
  2. Вы планируете, из скетча, сами что-то слать на 5-тую ногу. Помимо "трансляции с третьей ноги".

 

Правда в этом случае возникает вопрос "а нафига тогда вообще пятая нога"? Почему второй приемник не подключить сразу к 3-тей? Или к тому передатчику который "шлет на третью", паральельно с ардуиной?

 

 

Astronom
Offline
Зарегистрирован: 22.11.2011

 второго приемника нет. и не будет он там использоваться а  передатчик не обязательно будет стоять на 5 ноге можно и на 2 перенесть но не хотелось бы чтоб они на ондном выводе сидели. так как если их закоротить то сигнал сразу с приемника уйдет на передачу. А мне передача нужна только когда я отправляю с терминала

 

#define rxd 3 // rx data pin
#define rxe 4 // rx enable pin
#define txd 5 // tx data pin
#define delta 100 // max time delta
#define mintime 100 // min time pulse
unsigned int time,oldtime,count,log0,log1;
byte data[8];
void setup(){
pinMode(rxd,INPUT);
pinMode(rxe,OUTPUT);
pinMode(txd,OUTPUT);

 

шапку исправил. Что теперь дописать в void loop(){} чтоб передача пошла через терминал?

leshak
Offline
Зарегистрирован: 29.09.2011

Ага. не так.

Но это ничего не значит. Просто во всех моих сообщениях нужно пин D3, заменить на D0 (RX). Коротить D0 на D5, или digitalWrite(5,digitalRead(0));

Тогда у вас будет траняляция всего что вы отправили с компа на пин D5.

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

P.S. На всякий случай, если использовать вариант "коротим", D5 ни в коем случае нельзя включать на выход(!). Это может произойти случайно. Например попробовали програмный способ, потом решили "закоротить" и залить новый скетч. Получите дым, так как старый скетч включает его на выход. Внучале нужно залить скетч где D5 включается на вход (или просто не трогается, он по умолчанию "вход"), а уж потом - физически коротить.

 

Astronom
Offline
Зарегистрирован: 22.11.2011

#define rxd 3 // rx data pin
#define rxe 4 // rx enable pin
#define txd 5 // tx data pin
#define delta 100 // max time delta
#define mintime 100 // min time pulse
unsigned int time,oldtime,count,log0,log1;
byte data[8];
void setup(){
pinMode(rxd,INPUT);
pinMode(rxe,OUTPUT);
pinMode(txd,OUTPUT);

шапку исправил. Что теперь дописать в void loop(){} чтоб передача пошла через терминал?

Astronom
Offline
Зарегистрирован: 22.11.2011

Блин извините за косяк инет тупит с флешки сижу. получается нужно прописать void loop()
{analogWrite(5,digitalRead(0));
} и все будет работать? 

leshak
Offline
Зарегистрирован: 29.09.2011

  А вообще в функциях обработки прерывания использовать какую-то логику, отправку в Serial - крайне не хорошая идея. Они должны быть минимальны.
Только регитсрировать сам факт события, ну может еще время когда оно произошло. Сохранять это в глобальные переменные (не забыть их объявить с модификатором volatile).
А уж "обработка" этого, отправка данных в serial и т.п. - должно быть в loop()

leshak
Offline
Зарегистрирован: 29.09.2011

Astronom пишет:
#define rxd 3 // rx data pin #define rxe 4 // rx enable pin #define txd 5 // tx data pin #define delta 100 // max time delta #define mintime 100 // min time pulse unsigned int time,oldtime,count,log0,log1; byte data[8]; void setup(){ pinMode(rxd,INPUT); pinMode(rxe,OUTPUT); pinMode(txd,OUTPUT); шапку исправил. Что теперь дописать в void loop(){} чтоб передача пошла через терминал?

digitalWrite(5,digitalRead(0));

включать D0  на input - не обязательно.

Astronom
Offline
Зарегистрирован: 22.11.2011

 сейчас добавлю void loop()
{analogWrite(5,digitalRead(0)); 

подключу передатчик сообщу что получилось

leshak
Offline
Зарегистрирован: 29.09.2011

Astronom пишет:

Блин извините за косяк инет тупит с флешки сижу. получается нужно прописать void loop()
{analogWrite(5,digitalRead(0));
} и все будет работать? 

Ага. только я тоже ступил. digitalWrite, а не analogWrite

Аналог на нем PWM включит. И на D5  будет "мусор"

leshak
Offline
Зарегистрирован: 29.09.2011

 Я толкьо не понимаю "зачем" так сложно. Куда потом подключается этот D5? Если к RX какого-то радио-передатчика, то почему его просто сразу не воткнуть в D0? Тогда все что посылается с компа будет идти и в передатчик и в ардуину.

Astronom
Offline
Зарегистрирован: 22.11.2011

 ну так надо)) ароде как запустил )) передача подла. правдв приемника нет пока на другой стороне проверить))  

Alexander
Offline
Зарегистрирован: 25.04.2010

Для Astronom

Почитайте пожалуйста про вставку программного кода в сообщение

Astronom
Offline
Зарегистрирован: 22.11.2011

 leshak  спасибо

Astronom
Offline
Зарегистрирован: 22.11.2011

Alexander пишет:

Для Astronom

Почитайте пожалуйста про вставку программного кода в сообщение

 

понял буду знать))