Arduino + COM порт
- Войдите на сайт для отправки комментариев
Помогите разобраться в коде. Есть исходник для ардуины и прием сигнала по схеме идет с 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(){}
>Так есть если мы отправляем туда AAA то и на выходе D5 должно выдаваться AAA
Вариант 1: закоротить пины D3 и D5 (главное, при этом, нигде потом случайно не сделать pinMode(5,OUTPUT) - согжгете ногу).
Вариант 2: в loop(), сделать digitalWrite(5,digitalRead(3));
Получается так если я правильно понял.
Второй варинат я поправил. Там нужен digitalRead(3)
>Так есть если мы отправляем туда AAA то и на выходе D5 должно выдаваться AAA
Вариант 1: закоротить пины D3 и D5 (главное, при этом, нигде потом случайно не сделать pinMode(5,OUTPUT) - согжгете ногу).
3 и5 коротить нельзя так как на 3 ноге у нас прием сигнала идет а на 5 нам надо передачу организовать
> Сначало надо обьявить ножку 5 выходом так?
Конечно.
Если, же вам не критично что-бы это была именно пятая нога, то более оптимально будет в loop использовать
Serial1.write(Serial.read());
Пересылать в Serial1 сразу пачкой, по байту, а не "каждый тик". Но его наличие и какие пины ему соотвесвуют - зависит от того какая у вас плата.
Второй варинат я поправил. Там нужен digitalRead(3)
Я думаю не правьно немного вы меня поняли. На входе №3 у меня стоит приемник сигналов который срабатывает от прерывания и фильтрует нужный сигнал и выводит в терминал например этот 68D952ED68686B28. Теперь мне нужно например отправить эту посылку. я набираю в терминале 68D952ED68686B28 и жму отправить. Вот мне надо чтоб эту отправку он отправлял на выход №5.
>Так есть если мы отправляем туда AAA то и на выходе D5 должно выдаваться AAA
Вариант 1: закоротить пины D3 и D5 (главное, при этом, нигде потом случайно не сделать pinMode(5,OUTPUT) - согжгете ногу).
3 и5 коротить нельзя так как на 3 ноге у нас прием сигнала идет а на 5 нам надо передачу организовать
Можно. Эта закоротка и организует вам "передачу сигнала с 3-тьей ноги, на 5-тую". И "приему" она мешать не будет. Идеальный вариант и самый надежный, так как не зависит от того "чем-там скетч в данный момент занимается".
У него есть только два ограничения:
Правда в этом случае возникает вопрос "а нафига тогда вообще пятая нога"? Почему второй приемник не подключить сразу к 3-тей? Или к тому передатчику который "шлет на третью", паральельно с ардуиной?
второго приемника нет. и не будет он там использоваться а передатчик не обязательно будет стоять на 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(){} чтоб передача пошла через терминал?
Ага. не так.
Но это ничего не значит. Просто во всех моих сообщениях нужно пин D3, заменить на D0 (RX). Коротить D0 на D5, или digitalWrite(5,digitalRead(0));
Тогда у вас будет траняляция всего что вы отправили с компа на пин D5.
Первый вариант надежней, так как нет риска что "скетч где-то задуплит" и пропустит импульс из терминалов (особенно на больших скоростях).
P.S. На всякий случай, если использовать вариант "коротим", D5 ни в коем случае нельзя включать на выход(!). Это может произойти случайно. Например попробовали програмный способ, потом решили "закоротить" и залить новый скетч. Получите дым, так как старый скетч включает его на выход. Внучале нужно залить скетч где D5 включается на вход (или просто не трогается, он по умолчанию "вход"), а уж потом - физически коротить.
#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(){} чтоб передача пошла через терминал?
Блин извините за косяк инет тупит с флешки сижу. получается нужно прописать void loop()
{analogWrite(5,digitalRead(0));
} и все будет работать?
А вообще в функциях обработки прерывания использовать какую-то логику, отправку в Serial - крайне не хорошая идея. Они должны быть минимальны.
Только регитсрировать сам факт события, ну может еще время когда оно произошло. Сохранять это в глобальные переменные (не забыть их объявить с модификатором volatile).
А уж "обработка" этого, отправка данных в serial и т.п. - должно быть в loop()
digitalWrite(5,digitalRead(0));
включать D0 на input - не обязательно.
сейчас добавлю void loop()
{analogWrite(5,digitalRead(0));
подключу передатчик сообщу что получилось
Блин извините за косяк инет тупит с флешки сижу. получается нужно прописать void loop()
{analogWrite(5,digitalRead(0));
} и все будет работать?
Ага. только я тоже ступил. digitalWrite, а не analogWrite
Аналог на нем PWM включит. И на D5 будет "мусор"
Я толкьо не понимаю "зачем" так сложно. Куда потом подключается этот D5? Если к RX какого-то радио-передатчика, то почему его просто сразу не воткнуть в D0? Тогда все что посылается с компа будет идти и в передатчик и в ардуину.
ну так надо)) ароде как запустил )) передача подла. правдв приемника нет пока на другой стороне проверить))
Для Astronom
Почитайте пожалуйста про вставку программного кода в сообщение
leshak спасибо
Для Astronom
Почитайте пожалуйста про вставку программного кода в сообщение
понял буду знать))