Есть библиотека rc5xmit http://forum.arduino.cc/index.php?topic=7543.0 Она выдаёт сигнал на ИК светодиод. Как можно добавить туда функцию передачи просто прямоугольных импульсов, не модулированных несущей 36 кГц?
хочу собрать устройство и подключить его прямо на выход ИК приёмника управляемой платы, чтоб избавиться от передачи света.
Код:
// RC5 Infrared Transmitter for Arduino Diecimila // // Two timers are used, TIMER2 and TIMER1. TIMER1 is used as the RC5 state machine clock, // with tick length of irparams.t (e.g., 889 microseconds), the basic RC5 time unit. // The on/off state of the IR LED carrier (pulse clock) may change on any given tick of // this clock. // // TIMER2 is used to generate a square wave on OC2A (pin 11) at the frequency of the RC5 // pulse clock (e.g., 36 kHz). The pulse clock is modulated (turned on and off) by setting // or clearing the COM2A0 bit of register TCCR2A. Therefore, an IR LED connected between // pin 11 and ground is the only external circuitry needed to implement the basic IR // transmitter. // // Using a high power IR LED (Vishay TSAL6100) connected this way (without a current- // limiting resistor) results in an "on" current of about 80ma. This is within spec of // that device (100ma max). The Arduino output pins are specced at 40ma max, so the // current of 80ma exceeds the Arduino spec, but the duty cycle is low (50% max), // so it's probably OK. // // RC5 encoding: // // START + TOGGLEBIT + UNITCODE + BUTTONCODE // // where: // START is a two-bit code, always 11 // TOGGLEBIT is a one-bit code which toggles on each successive button // UNITCODE is a five-bit code specifying the unit being commanded (TV, VCR, etc.) // BUTTONCODE is a six-bit code for the button command // // Each bit, 0 or 1, is transmitted according to "Manchester" encoding: // // 0: MARK followed by SPACE, each of duration irparams.t // 1: SPACE followed by MARK // // To adapt this code to use another RC5-compatible device, minimally // the unit code needs to be set according to the device, and any // specific button encodings need to be defined in irparams.h. Note // the function brand() where the buttons and other parameters are // actually loaded into the state machine structure. // // The demo program below simply sets the brand to PHILIPSTV, // turns power on, waits 15 seconds, sets channel to 03, mutes the TV, // waits 15 seconds, and turns the TV off. // // Note that the call to button(buttonid,retransmitcount) returns // before the code is finished transmitting, so successive calls should // be separted by at least some delay, e.g., 100 msec. The retransmission // count is 2 here because that seems to be common. // // For more info on RC5, see: http://www.sbprojects.com/knowledge/ir/rc5.htm // // Joe Knapp jmknapp AT gmail DOT com 30APR08
#include "c:\2\irparams.h"
#define IROUT 11 // pin 11 is OC2A output from TIMER2 #define BLINKLED 13 // mirrors the state of IROUT
// function prototypes void button(byte buttonid, int n) ; void brand(byte brandcode) ; uint8_t timer2top(unsigned int freq) ; unsigned long buttoncode(byte buttonid) ; int tmp1=0;
// state machine variables struct rbutton { byte id ; unsigned long code ; // button codes can be up to 32 bits } ; struct { byte xmitstate ; byte returnstate ; byte timer ; byte unitlength ; byte buttonlength ; byte sendflag ; byte retransmit ; byte codelen ; byte bitcounter ; byte togbit ; byte nbuttons ; byte blinkstate ; byte irledstate ; unsigned long unit ; unsigned long button ; unsigned long code1 ; unsigned int mask16 ; unsigned int t ; unsigned int retransgap ; struct rbutton buttons[MAXBUTTONS] ; } irparams ;
//Prescale /8 (16M/8 = 0.5 microseconds per tick) // Therefore, the timer interval can range from 0.5 to 128 microseconds // depending on the reset value (255 to 0) cbi(TCCR1B,CS12) ; sbi(TCCR1B,CS11) ; cbi(TCCR1B,CS10) ;
// initialize some state machine variables irparams.sendflag = 0 ; irparams.togbit = 0 ; irparams.blinkstate = HIGH ; irparams.xmitstate = IDLE ; }
// main loop // Just for a demo, the code here the first time through just sets // the brand to PHILIPSTV, turns the TV on, sets the channel to THREE, // mutes the TV and finally turns the TV off. void loop() { static byte first = 1 ; if (first) { brand(PHILIPSTV) ; button(ONE,3) ; // hello world settings delay(600) ; Serial.println("1") ;
// send code for given buttonid, repeat n times void button(byte buttonid, int n) { irparams.button = buttoncode(buttonid) ; // get code irparams.retransmit = n - 1; irparams.sendflag = 1; // flag for the ISR to send irparams.button }
// return ir code for given buttonid unsigned long buttoncode(byte buttonid) { int i ; byte found ;
i = 0 ; found = 0 ; while (!found && (i < irparams.nbuttons)) { if (buttonid == irparams.buttons[i].id) { found = 1 ; } else i++ ; } if (found) return(irparams.buttons[i].code) ; else return(0) ; // ERROR }
// set parameters for given brand void brand(byte brandcode) { int i ; switch(brandcode) { case PHILIPSTV: OCR2A = timer2top(PHILIPSTV_PULSECLOCK) ; // sets TOP value for TIMER2 irparams.unit = PHILIPSTV_UNIT ; irparams.unitlength = PHILIPSTV_UNITLENGTH ; irparams.buttonlength = PHILIPSTV_BUTTONLENGTH ; irparams.t = PHILIPSTV_T ; irparams.retransgap = PHILIPSTV_RETRANSGAP ;
// return TIMER2 TOP value per given desired frequency (Hz) uint8_t timer2top(unsigned int freq) { return((byte)((unsigned long)SYSCLOCK/2/freq) - 1) ; }
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
В смысле зачем? Этот код ведь на светодиод подаёт 36 кгц, модулированную импульсами RC-5. Тогда после ИК приемника выделится меандр, если я правильно понимаю.
ИК приемник выделит ровно то что вы пошлете. Соедините выход пульта со входом приемника убрав ИК TSOP, естественно если питание пульта и приемника совпадает. Можно пойти по другому пути, расположить в непосредственной близости от TSOP ИК-диод пульта, тогда останется функция управления по ИК-каналу.
Dimon456, изучите принцип ИК-ДУ, чтобы впредь не говорить ерунды. AonMaster, посмотрите на мой код, передающий команды RC5. хоть это и не ардуино, но, по-моему, все абсолютно должно быть понятно. примитивнее и не придумать.
Код:
/** Передача кода. * Передает коды в стандарте RC5 * @param data передаваемый код */ static void send_code(uint16_t data){ for(uint8_t i=0; i < RC5_CODELEN; i++){ // передача старшего бита if(data & 0x2000){ // send 1 out_Lo(); _delay_us(HALF_BIT_TIME); // программная генерация сигнала 1 #if MODULATED_OUTPUT == 1 // модулированная единица modulate(); #else // немодулированная единица out_Hi(); _delay_us(HALF_BIT_TIME); #endif } else { // send 0 // программная генерация сигнала 0 #if MODULATED_OUTPUT == 1 // модулированная единица modulate(); #else // немодулированная единица out_Hi(); _delay_us(HALF_BIT_TIME); #endif // ноль out_Lo(); _delay_us(HALF_BIT_TIME); } // сдвиг кода для передачи следующего бита data <<= 1; } // в конце передачи устанавливаем на выходе 0 out_Lo(); }
как видите, я программно синтезировал модуляцию, которую можно отключать путем изменения дефайна MODULATED_OUTPUT что тут сложного?
прилагаю архив с полным исходником для моего проекта пульта управления лампы настроения: хотите - изучайте и делайте сами по образу и подобию, хотите - используйте, как есть... Проект: https://simple-devices.ru/prj/9-electr/ ... te-control
Прочитал, что вы не используете таймеры и прерывания для этого. Как-то всё просто получается, а другие зачем целые страницы кода и с таймерами в том числе пишут...
Прочитал, что вы не используете таймеры и прерывания для этого. Как-то всё просто получается, а другие зачем целые страницы кода и с таймерами в том числе пишут...
Я когда-то искал, как из бейсика управлять громкостью звуковой карты. И один буржуй мне предложил за 20 баксов dll-ку на 200кбайт, совершенно искренне думая меня осчастливить. Я, понимая что всем в компе управляют регистры, пытался обьяснить ему это. Он искренне мне обьяснял, что я ошибаюсь и всем в компе управляют именно ДЛЛ-ки. В конце - концов послал его. Нашел адрес регистра и десятью буквами кода сделал управление громкостью. Вот такие дела.
Прошу прощенья. Я не совсем понял - вы хотите отправить на фотоприемник сигнал без несущей ? Он его не примет. Он так устроен. Немодулированную несущую - на выходе выдаст ноль. Без сигнала вообще - на выходе - единица. Сигнал без несущей - очень-очень узкие импульсы нуля. А вот инвертирует или нет данные весь тракт опто-передачи, не помню.
1. Параллельно выходу - не предсказуемо. Отсоедините выход фотоприемника совсем. И я не зря упоминал об инверсии, или неинверсии всего канала передачи. Пробуйте два варианта сигнала. Например - в одном Пауза = 1, в другом Пауза = 0. 2. А проще - цешкой проверьте напряжение выхода фотоприемника (без входного сигнала) , отсюда и делайте выводы. 3. Прогресс идет и не факт, что ваш фотоприемник - просто датчик. Он вполне себе может иметь свой интерфейс обмена с процем - типа Далласовского однопроводного. А это совсем другой фаршмак. Процессор вас просто "не поймет". Там хоть название есть ?
хоть я этих приёмников и не очень много видал, но они все фильтровали сигнал от несущей и похоже, (тут на 100% утверждать не буду) что все имели выход с открытым коллектором, а это значит, что их можно параллелить. но, МК, если его параллелить с датчиком (как планирует ТС) или надо отделить диодом (катод к МК) или выход настроить как ОК - для этого в регистр ПОРТ записывается 0, а в регистр ДДР - инверсный выходной сигнал и тогда либо нога болтается в Z состоянии или притягивается к земле (питания в эту ногу МК уже не даст).
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Я решил этот вопрос отключением датчика на время управления моей схемой посредством электронного ключа, да и ранее уже написал, что всё заработало. Процессор всё понял. Спасибо за интересные сведения вам)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения