LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: joaopedrocmp em 21 de Novembro de 2011, 19:29
-
Boas pessoal
Tenho andado a procura de um projecto que realmente fosse util para o dia a dia, depois de umas horas a pensar...
a pensar...
a pensar...
(não ainda nao pensei bem)
a pensar... a pensar... (lool)
Tive uma ideia algo interessante. Visto estar preste a mudar de casa, para uma com mais espaço e ja a pensar no futuro, resolvi pensar em personalizar a nova sala:
Com 2/3 candeeiros de parede RGB (feitos por mim)
Controlo remoto para controlar os candeeiros.
Hardware:
1- candeeiros
Os candeeiros sao constituídos por:
- Leds Vermelhos, azuis e verdes, ou RGB (depende dos preços)
-Transformador 230/12.
-Breaduino para descodificar os sinais da luminosidade e cor.
2- Comando
Para o comando vou usar um nokia 3310 (adoro o classico modelo)ou pelo menos o chassi, o display e o teclado.
Vou fazer uma pcb, com os contactos para o display, teclado, e bateria, e adiciono um led ir, e um receptor ir.
Software:
1- Candeeiros
O candeeiro recebe 11bits por ir em que , o 1º grupo de 4 é o endereço, e os restantes o valor.
O pmw e a cor varia de 0 a 100.
O transformador está ligado ao interruptor da iluminação da sala, ou seja, se desligado o consumo será 0.
2-Comando:
Ao iniciar o comando aparecerá uma mensagem de boas vindas.
Prime-se um numero de 1 a 9 para seleccionar o respectivo candeeiro, ou "0" para seleccionar todos.
Ao primir "OK" liga, e ao primir novaente "OK"desliga.
Ao utilizar as teclas para cima e para baixo, aumenta e diminui a luminusidade.
Ao primir a tecla c, as setas mudam a cor.
A qualquer momento pode-se primir outro numero para seleccionar outro candeeiro.
O comando tem um interruptor que corta totalmente a alimentação.
O comando tem um receptor ir para sincronizar os valores dos candeeiros, para imprimir no display, assim que volta a ligar.
Duvidas:
-Para ja ainda estou a pensar como vou transformar os tempos recolhidos pelo receptor IR, para linguagem binária.
- Terei que estudar a melhor maneira de ligar cerca de 15 led's a um pino do arduino, mas isso fica para depois.
Estou aberto a opiniões para melhorar e/ou ajudar na construção.
Estou também aberto a duvidas sobre o projecto.
Obrigado
-
Não era mais fácil usar um comando standard? Assim evitavas ter que andar a programar no lado do telemóvel (e mesmo aí não tens grande espaço para meter coisas lá no meio). Há bibliotecas para o arduino que já descodificam o sinal dos comandos de TV, podias por exemplo definir que quando carregavas num botão de canal de 1 a 3 estavas a seleccionar a componente da cor (RGB) para um dos candeeiros (podes usar 4 a 6 para um segundo candeeiro, etc.) e depois com Canal+ e Canal- (ou volume, conforme te der mais jeito) seleccionas o duty-cycle aplicado no PWM e com a tecla de menu desseleccionavas essa cor, assim podes ter 1000 combinações diferentes de cores para cada candeeiro!
-
Só uma coisa, se vais usar leds de 5mm, vais ter de usar uma carrada deles, provavelmente era melhor arranjar daqueles leds RGB de 3W que há na DX ou no eBay ao preço da chuva.
Pois, meter coisas dentro de um 3310 vai ser complicado a não ser que seja tudo SMD e mesmo assim não sei se consegues.
-
Pelas medida que tirei, cabe perfeitamente um "breaduino" smd e 4 pilhas aaa.
E tenho o beneficio de ter o display, que permite ver o estado das coisas.
Quanto as combinações de cores, basta adicionar mais um bit ao conjunto enviado, que me da essas combinações possiveis. o programar o comando é facil, cada tecla corresponde a um conjunto de bit's. o resto, tem que ser programado igual ao outro comando, o que muda é que no tlm posso usar os bit's que quiser,e no comando nao.
Obrigado pelas opnioes
-
Mas isso mais bit menos bit qual é a diferença?
É que basicamente selecionas o R,G ou B e envias um sinal para aumentar ou diminuir tal cor, só vejo vantagem sobre um comando de tv se quiseres enviar cores pré definidas.
Quanto ao candeeiro em si, eu usaria um TLC5940 para fazer o drive dos led's, tem fonte de corrente constante para cada canal,e suporta até 120mA por canal, com 16 canais podes ligar 5 leds RGB's, e sobra um canal, ou se usares led's discretos podes meter 2 ou 3 leds por canal e tens uma fartura de leds, tem tambem pwm de 12 bits.
-
tou a pensar usar a escala de 0 -100 % para reproduzir cores desde o vermelho ao azul. tipo isso:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.sfml-dev.org%2Fwiki%2F_media%2Ffr%2Fsources%2Fbasicscalecolor.png%3Fw%3D%26amp%3Bh%3D%26amp%3Bcache%3Dcache&hash=93c44a609a27dc2227a6476c99e077251bc79338)
em cima 100% em baixo 0%
no entanto se utilizasse mais um digito ficava com mais cores possiveis.
-
Não te estou a perceber de todo...
Se só usares um sinal para mais e outro para menos, que importa se o limite são 8 bits ou 12 bits? Nada...
Para além de que não vais notar essas cores todas num led, tenho aqui uma placa que fiz para testar o TLC, mas filmar isto é quase impossivel.
-
dá uma vista de olhos no blinkM, cada módulo tem um attiny85 que controla o led rgb e recebe os comandos por I2C através, por exemplo, de um arduino
penso que seja isso que tu queres...
-
Ah, desculpa, expliquei-me mal.
Eu tava a pensar em atribuir um valor de 0 a 100 as cores pré feitas, e o comando enviava o valor e nao o comando para adicionar ou subtrair a variavel da cor. ou seja, o comando envia "0", e fica vermelho, envia 50 e fica verde.
Mas se calhar é mesmo melhor o comando so enviar "comandos" e então o receptor fazer o resto. e assim ja nao faz diferença os bits
na quarta ja dou uma vista de olhos no tlc.
-
Viva,
Projecto interessante, já andei para fazer algo do género, mas sem as cores só a intensidade. No outro no dia ao vaguear na Toys'R'Us (qq loja de bricolage) vi um produto da philips que gostei (o preço nao!).
http://www.amazon.co.uk/Philips-LivingColors-Colour-Changing-Control/dp/B000VI7K4K (http://www.amazon.co.uk/Philips-LivingColors-Colour-Changing-Control/dp/B000VI7K4K)
Tem um comando sem fios e esses focos de luz, existem de mais formatos. existe ainda a versao em que o comando só controla a intensidade de umas lampadas que tem o receptor incorporado (as lampadas sao daquelas economizadoras).
Coloquei aqui estas informações, podem dar pelo menos para tirar ideias.
Cumps, Mauro.
-
Obrigado mauro.
Senso ,tive a pensar e se usar o "comando" para enviar apenas comandos tenho que o fazer actualizar com o candeeiro cada vez que carrego numa tecla, para actualizar os dados do display, por outro lado, se o comando enviar os valores de cada variavel cada vez que carrego numa tecla, ja nao necessito de actualizar o display via IR, e assim não ha probabilidades de falha a sincronizar.
Como vou desligar o comando depois de usar, ele sincroniza , pressionando uma tecla, e so depois mostra o menu.
O que achas?
-
Boas
comecei hoje a trabalhar no receptor que vai receber directamente os valores das variaveis, em vez de receber um "comando".
O codigo que tenho para ler os tempos dos impulsos é o seguinte:
#define MAXPULSE 65000// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define RESOLUTION 20
// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[100][2]; // pair is high and low pulse
uint8_t currentpulse = 0; // index for pulses we're storing
void setup(void) {
Serial.begin(9600);
Serial.println("Ready to decode IR!");
}
void loop(void) {
uint16_t highpulse, lowpulse; // temporary storage timing
highpulse = lowpulse = 0; // start out with no pulse length
while (IRpin_PIN & (1 << IRpin)) { // pin is still HIGH
highpulse++; // count off another few microseconds
delayMicroseconds(RESOLUTION);
if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
currentpulse=0;
return;
}
}
// we didn't time out so lets stash the reading
pulses[currentpulse][0] = highpulse;
// same as above
while (! (IRpin_PIN & _BV(IRpin))) {
// pin is still LOW
lowpulse++;
delayMicroseconds(RESOLUTION);
if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) {
currentpulse=0;
return;
}
}
pulses[currentpulse][1] = lowpulse;
// we read one high-low pulse successfully, continue!
currentpulse++;
(apaguei a função que escrevia os tempos no display)
Agora, para converter os tempos em bits acrescentei o seguinte código:
if (pulses['x'] > 2000){ // se o "pulses" x for maior que 2000 us (o bit que inicia a sequencia tem 2,5)
if((pulses['x + Y'] > 0,2) && (pulses['x + y'] <0,8)){ // o primeiro bit não interessa, se o 3 impulso for entre 0,2 e 0,8 ( 0,6 = lowbit)
Bit['z'] = 0;} // A variavel Bit'Z' é 0
if ((pulses['x + y'] =>1) && (pulses['x + y'] <1,9)){ // se for entre 1 e 1,9( 1,2 = HighBit)
Bit['z'] = 1;} // Bit'z' é 1.
y= y +2; // salta 2 impulsos ( para passar o low que não interessa)
z = z+1;} // muda para o 2º bit
if ('z' > 12){ // quando recolher 11Bit's muda de estado
state = compare;}
x = x+1; // analiza o proximo impulso
Mas a linha / if (pulses['x'] > 2000){ / contem um erro. como posso corrigir isto?
Obrigado por qualquer ajuda.
;)
-
Pois, o que estão as ' ' a fazer á volta das variaveis?
É que 'x' é o mesmo que dizer que queres o caracter ASCII x que tem o valor hexadecimal 0x78 ou 120 em decimal, se queres usar variaveis tira isso.
-
Pois, o que estão as ' ' a fazer á volta das variaveis?
É que 'x' é o mesmo que dizer que queres o caracter ASCII x que tem o valor hexadecimal 0x78 ou 120 em decimal, se queres usar variaveis tira isso.
Obrigado ;)
O erro que aparece é : ISO C++ forbids comparison between pointer and integer.
-
Tens um array bidimensional:
uint16_t pulses[100][2];
Mas estás a endereçar só a primeira parte, dai ele te dar esse erro, ou metes a segunda parte na comparação ou tiras da inicialização.