Podczerwień - jaki nadajnik i odbiornik?

Dyskusje ogólne na temat "cyfrówki" czyli wszystko o TTL/CMOS, językach VHDL i VERILOG, bramkach, rejestrach, przerzutnikach... Dobre miejsce na pytania odnośnie uniwersalnych programatorów (np. Willem) a także podłączania własnych peryferiów do komputera PC.
maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Post autor: maxxxior » 23 paź 2012, 12:10

czyli jak wcisnę na nadajniku przycisk podpięty pod D8 to na wyjściu HT12D D8 pojawi się sygnał wysoki, czyli 5V?

Awatar użytkownika
kayron
Użytkownik
Posty: 2073
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 23 paź 2012, 14:09

TAk, dokładnie tak.

maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Post autor: maxxxior » 23 paź 2012, 15:24

ok, dzięki kayron, bardzo mi pomogłeś.

A, jeszcze wpadł mi jeden pomysł na sterowanie tym samochodzikiem... na przyklad wysyłamy ciągle sygnał na odbiornik podczerwieni aby jechal do przodu, tzn wciskamy raz przycisk i samochod jedzie, i jeżeli chcemy aby samochod skrecił, to wciskamy przez chwile przycisk na pilocie W_LEWO(który tak naprawde bedzie odpowiadal za jazde do przodu i w lewo) i procek wysyla sygnał na serwo aby skrecilo o na przyklad 20stopni w lewo, a później dalej aby jechał tak jak wczesniej...

nie wiem czy mnie zrozumiałeś, tzn omawiam teraz przypadek bez żadnych dekoderów i enkoderów...

tylko myślę że z dekoderami i enkoderami będzie chyba to lepiej zrealizowane... czyż nie?

maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Post autor: maxxxior » 28 paź 2012, 18:27

Panowie, a czy są jakieś zamienniki zamiast tych HT12x?? bo to tylko na AVT widzę, a na przykład jakiś enkoder-dekoder który działa tak samo/podobnie do tych HT12x? na przykład którę kupię w zwykłym elektroniku lub allegro?

Awatar użytkownika
kayron
Użytkownik
Posty: 2073
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 28 paź 2012, 20:33

Nie tylko AVT, są w TME, Farnell.
Bardzo podobnymi układami są MC14026 i MC14028, ale trzeba uważać bo pod identycznym oznaczeniem są także sprzedawane odpowiedniki zwykłych CMOSów serii 4000 czyli układów 4026 i 4028.
Ale układy HT12 są w TME w całkiem atrakcyjnej cenie, więc nie rozumiem problemu kolegi.
PS. Tych układów raczej nie kupisz w żadnym elektroniku od reki, bo to układy specjalizowane i nikt ich nie trzyma na zapleczu sklepu, bo a nóż ktoś będzie ich szukał.
Ostatecznie jak nie chcesz ich specjalne szukać, czy zamawiać, to dokumentacja HT12 do reki, i zaprogramować odpowiednie algorytmy w ATTINY2313(nadajnik) i ATMEGA32 (odbiornik). nawet w BASCOM powinno się dać napisać, protokoły kodowania i dekodowania dla HT12E/D.
Ostatecznie wykorzystaj sobie kod RC5, i instrukcje RC5SEND (nadaj kod) i GETRC5(obież kod) z Bascoma. Chyba najprostsze rozwiązanie.

maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Post autor: maxxxior » 29 paź 2012, 12:11

Hmm, ok, ale ja potrzebuję do podczerwieni układ ht12a, a jego nie mogę nigdzie znaleźć. A czy mogę pod ten ht12e podpiąć nadajnik podczerwieni? czym się różnia te dwa uklady ?
i czy z ytej seri MC są jakieś układy dedykowane dla podczerwieni?

Awatar użytkownika
kayron
Użytkownik
Posty: 2073
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 29 paź 2012, 12:26

Przecież masz już podane praktycznie gotowe rozwiązanie w tym temacie nad czym kombinujesz ?
Co do pytania. TAK wszystkie układy na podczerwień są dedykowane.
Podpowiedz !
Daj sobie spokój z układami dedykowanymi, weź sobie ATTINY2313, przejrzyj HELP BASCOMa i zbudujesz pilot RC5, za pomocą instrukcji RC5Send, wystarczy dosłownie przerobić sobie przykłady z HELPA, do własnych potrzeb i tyle.

maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Post autor: maxxxior » 29 paź 2012, 12:50

ok, ale wtedy będę mógł jednocześnie wysyłać i odbierać sygnał z przycisku "WPRZÓD" i na przykład "WLEWO" ??

Awatar użytkownika
kayron
Użytkownik
Posty: 2073
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 29 paź 2012, 13:04

Tak. Bo wtedy sam będziesz sobie decydował, jaki kod wysłać dla jakich klawiszy i zniknie problem jeden klawisz jeden kod, czyli wada pilota RTV.

maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Post autor: maxxxior » 29 paź 2012, 13:13

aha, no to w takim razie ok, zabieram się powoli do pracy...

maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Post autor: maxxxior » 06 gru 2012, 16:11

Witam, no więc zbudowałem pilot RC-5, i działa. Tylko nie mogę obsłużyć dwóch klawiszy na raz. Chodzi mi o to aby jeśli wcisnę dwa przyciski to wysłało mi na przykład komendę "6" Poniżej zamieszczam kod programu:

Kod: Zaznacz cały

/*
 * main.c
 *
 *  Created on: 2010-09-24
 *       Autor: Mirosław Kardaś
 */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <inttypes.h>
#include <util/delay.h>

// Tutaj definiujemy jaki adres będzie emitował pilot IR
#define _ADDRESS_RC5 0		// TV = 0

// przydzielamy dowolne kody (command) do klawiszy 1-5

#define _CMD1_RC5 1
#define _CMD2_RC5 2
#define _CMD3_RC5 3
#define _CMD4_RC5 4
#define _CMD5_RC5 5
#define _CMD6_RC5 6
#define _CMD7_RC5 7

// definicje dla obsługi diody LED
#define LED_PORT PORTB
#define LED_PIN PINB
#define LED_DDR DDRB
#define LED_PIN_NR 2
#define LED (1<<LED_PIN_NR)

#define LED_OFF 	PORTB 	|= 	LED
#define LED_ON 		PORTB 	&= 	~LED


// definicje klawiszy
#define K_PORT PORTB
#define K_PIN PINB
#define K_DDR DDRB

#define KEY1 (1<<PB1)
#define KEY2 (1<<PB3)
#define KEY3 (1<<PB4)
#define KEY4 (1<<PB5)
#define KEY5 (1<<PB6)

#define KEYS_MASK (KEY1|KEY2|KEY3|KEY4|KEY5)

uint8_t address;
uint8_t command;

/**************** MAIN **********************/
int main(void) {

	// ****** DIODA LED i IR
	// ustawienie PORTB.2 (OC0A) jako wyjście
	LED_DDR 	|= 	(LED);
	LED_PORT	|=	(LED);

	// ******* KLAWISZE
	// ustawienie PORTB.2 , 3 , 4 i 5 jako wyjścia
	K_DDR 	|= 	(KEY1|KEY2|KEY3|KEY4|KEY5);
	// ustawienie stanu niskiego
	K_PORT 	&= 	~(KEY1|KEY2|KEY3|KEY4|KEY5);

	// kontrolne zapalenia diody LED na 255ms po włączeniu zasilania (włożeniu baterii do pilota)
	LED_ON;
	_delay_ms(255);
	LED_OFF;

	//OSCCAL = 0x66;


	// **************************************************************************************
	// TIMER0
	// - używany do generowania fali nośnej dla IR
	// załadowanie OCR0A wartością do generowania nośnej ok 36kHz = 110
	OCR0A =  110;
	// ustawienie Timer0 w tryb = 2 - CTC - CompareA
	TCCR0A |= (1<<WGM01);	// tryb CTC
	TCCR0B |= (1<<CS00);	// preskaler = 1
	//****************************************************************************************

	// Timer1 - służy do odmierzania opóźnień (z dokładnością wielokrotności 1us)
	// jego preskaler ustawiany jest na 8 podczas załączania
	// używana jest wtedy jeo flaga OCF0A
	// nie korzystamy z przerwań
	// ustawiamy Timer1 w tryb = 4 - CTC
	TCCR1B |= (1<<WGM12);

	// wyłączenie komparatora analogowego
	// konieczne ze względu na maksymalne obniżenie poboru prądu
	ACSR |= (1<<ACD);

	// Turn off WDT
	WDTCSR = 0x00;

	// ustawienie trybu POWER-DOWN
	MCUCR |= ((1<<SM0)|(1<<SM1));

	// ustawienie pinu PORTD.2 (INT0) jako wejście
	DDRD &= ~(1<<PD2);
	// podciągnięcie do 1
	PORTD |= (1<<PD2);
	// zezwolenie na przerwania INT0
	GIMSK |= (1<<INT0);
	// skasowanie flagi wystąpienia przerwania INT0
	EIFR |= (1<<INTF0);

	// globalne zezwolenie na przerwania
	sei();

	while (1) {
		// wprowadzenie procesora w tryb POWER-DOWN
		sleep_mode();
	}
}

//------------------------------------------------- RC5 - START
// dokładna pętla opóźniająca = wielokrotności 1us
// w oparciu o Timer1, taktowanie 8MHz, preskaler = 8
void czekaj_us(uint16_t usekundy) {
	OCR1A = usekundy;
	TIFR |= (1<<OCF1A);
	TCCR1B |= (1<<CS11);
	while ( !( TIFR & (1<<OCF1A) ) ) {};
	TCCR1B &= ~(1<<CS11);
}
// przesłanie bitu o wartości 1
void send_rc5_one() {
	czekaj_us(889);
	TCCR0A |= (1<<COM0A0);
	czekaj_us(889);
	TCCR0A &= ~(1<<COM0A0);
}
// przesłanie bitu o wartości 0
void send_rc5_zero() {
	TCCR0A |= (1<<COM0A0);
	czekaj_us(889);
	TCCR0A &= ~(1<<COM0A0);
	czekaj_us(889);
}

// przesłanie kompletnej ramki RC5
void send_rc5(uint8_t adr, uint8_t cmd, uint8_t tog) {
	uint16_t data = 0;
	uint8_t i=15;

	// Musimy uformować ramkę RC5
	// w tym celu przesuwamy bity do wysłania w lewą stronę
	data |= ( (1<<15)|(1<<14)|(tog<<13)|(adr<<8)|(cmd<<2) );
	/* data = 0bssTaaaaaccccccxx
	 *   	  	||||adr||cmd |
	 *   		|||
	 *   		||+-- bit TOGGLE
	 *			||
	 *			++--- 2 bity Startu
	*/

	// wysyłamy kolejno 14 bitów
	// 2-bity startu, 1-bit Toggle, 5-bitów adresu, 6-bitów komendy
	do {
		if ( !(data & ( 1 << i )) ) send_rc5_zero();
		else send_rc5_one();
	} while(--i>1);
}
//------------------------------------------------- RC5 - END


//*************** PRZERWANIE INT0 ***************************
ISR(INT0_vect) {

	uint8_t keys = PINB;
	static uint8_t toggle_bit;

	// tylko na czas przerwania INT0 - przestawiony zostaje
	// kierunek portów klawiszy. Zostają ustawione jako wejścia
	// natomiast pin PORTD.2 (INT0) jako wyjście ze stanem niskim
	// dzięki temu działa obsługa klawiszy

	// ustawienie PORTD.2 , 3 , 4 i 5 jako wejścia
	K_DDR 	&= 	~(KEY1|KEY2|KEY3|KEY4|KEY5);
	// podciągnięcie wejść do 1
	K_PORT 	|= 	(KEY1|KEY2|KEY3|KEY4|KEY5);

	// przestawienie PORTD.2 jako wyjście
	DDRD |= (1<<PD2);
	// ustawienie stanu niskiego - do obsługi klawiszy
	PORTD &= ~(1<<PD2);

	if( (keys & KEYS_MASK) != KEYS_MASK ) {	// sprawdzamy czy wciśnięty jakikolwiek klawisz
		_delay_ms(50);			// eliminacja drgań styków
		keys = PINB;
		if( (keys & KEYS_MASK) != KEYS_MASK ) {	// sprawdzamy czy wciśnięty jakikolwiek klawisz

			// przed wysłaniem kodu jakiegokolwiek klawisza zmiana
			// stanu bitu toggle
			toggle_bit ^= (1<<0);

			do {

				if( !(keys & KEY1) ) command = _CMD1_RC5;
				else
				if( !(keys & KEY2) ) command = _CMD2_RC5;
				else
				if( !(keys & KEY3) ) command = _CMD3_RC5;
				else
				if( !(keys & KEY4) ) command = _CMD4_RC5;
				else
				if( !(keys & KEY5) ) command = _CMD5_RC5;
				else if (!(keys & (KEY5 | KEY2))) command = _CMD6_RC5;

				address = _ADDRESS_RC5;
				send_rc5(address, command, toggle_bit);

				_delay_ms(115);	// gap

				keys = PINB;

			} while ( (keys & KEYS_MASK) != KEYS_MASK );	/* powtarzaj gdy wciśnięty */
		}


	}

	// przywracamy ustawienia

	// ustawienie pinu PORTD.2 (INT0) jako wejście
	DDRD &= ~(1<<PD2);
	// podciągnięcie do 1
	PORTD |= (1<<PD2);

	// ******* KLAWISZE
	// ustawienie PORTB.2 , 3 , 4 i 5 jako wyjścia
	K_DDR 	|= 	(KEY1|KEY2|KEY3|KEY4|KEY5);
	// ustawienie stanu niskiego
	K_PORT 	&= 	~(KEY1|KEY2|KEY3|KEY4|KEY5);

	EIFR |= (1<<INTF0);

}
[/code]

Awatar użytkownika
tom5555
Użytkownik
Posty: 621
Rejestracja: 23 sty 2008, 1:20
Lokalizacja: Zabrze
Kontakt:

Post autor: tom5555 » 06 gru 2012, 17:01

Jest to fizycznie nie możliwe. Co najwyżej jeżeli będziesz miał szczęście pilot będzie naprzemiennie wysyłał kody dwóch naciśniętych przycisków, wszystko zależy od elektroniki w pilocie. można to obejść tak, że np. klawisze 2,8,4,6 służą odpowiednio do poruszania się do przodu, tyłu, skrętu kuł w lewo i prawo, a przyciski 1,3,7,9, do jazdy do przodu i w tył z kołami skręconymi odpowiednio w lewo lub w prawo.

maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Post autor: maxxxior » 06 gru 2012, 17:06

no ale z dyskusji z kayron'em wynikało chyba że da się to zrealizować?

gomarko
-
Posty: 71
Rejestracja: 13 paź 2010, 21:20
Lokalizacja: Konin

Post autor: gomarko » 06 gru 2012, 17:27

no ale z dyskusji z kayron'em wynikało chyba że da się to zrealizować?
Pewnie, że się da.
Najprościej, to nie nadawać konkretnego kodu rozkazu od naciśniętego klawisza
tylko przesyłać cały stan klawiatury.
A w odbiorniku sprawdzać stan bitów (odzwierciedlających naciśnięte klawisze)
i podejmować odpowiednie działania.
Tyle ile bitów ma komenda, tyle można jednocześnie mieć klawiszy.
Jeżeli to za mało, to można modyfikować bity adresowe.
Ale widzę, że używasz tylko 5 przycisków a komenda ma 6 bitów
więc jeszcze jeden bit jest w zapasie.
Ostatnio zmieniony 06 gru 2012, 17:31 przez gomarko, łącznie zmieniany 1 raz.

Awatar użytkownika
kayron
Użytkownik
Posty: 2073
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 06 gru 2012, 17:29

UP Długo wam zajęło dojście do tego oczywistego rozwiązania. :grin:

ODPOWIEDZ