elação ao midi de computador é a possibilidade de controlar efeitos como Reverb, Chorous, Ressonancia, Modulação etc ...
As notas são passadas em 3 parâmetros (Note, Key, Intensidade) o timbre em 4 parâmetros (Program_Change, Timbre, MSB, LSB) e os controles em 4 parâmetros (Controller, Tipo, MSB, LSB) enfim o padrão Midi compatível com Teclados Musicais. E a placa possui polifonia de 48 notas ou seja consegue executar 48 notas de forma simultânea.
Bom a minha pergunta não em relação ao midi e sim as entradas do Arduino e no caso do Arduino UNO possui apenas um total de 20 entradas e eu precisava de no mínimo 176 entradas apenas para as teclas do piano.
Já ou vi dizer que é possível fazer uma arquitetura em camadas de multiplexadores para resolver este problema. Gostaria de visualizar algum esquema que possibilitasse isso.
O piano possui 88 teclas então precisarem de 2 contatos para cada tecla assim conseguirem na programação prever a intensidade pressionada da tecla com base nos sinais recebidos entre o contato A e B de cada tecla. É como se eu precisasse de 176 botões que podem ser pressionados de forma individual ou simultâneo.
Já me falaram que não é tão difícil fazer isso e eu precisarei apenas de 2 multiplexadores. No primeiro tenho que capturar qual a tecla pressionada não importando em qual oitava estou ou seja o primeiro analisará qual o nome da tecla sem importar se é aguda ou grave.
O segundo analisará qual a oitava em que esta tecla foi pressionada. E ainda deverei usar diodos que permitam separar o sinal que vai para o primeiro multiplexador e o segundo.
Mas acredito que esta lógica ainda esteja errada porque quando estiver pressionando simultaneamente 2 teclas na oitava 1 e 1 tecla na oitava 3, segundo esta lógica o sistema poderia entender que está sendo executado 4 notas 2 na oitava 1 e 2 na oitava 3. Como resolver este problema?…
termino das aulas nos dois períodos (manha e tarde).
Materiais necessários para montar o projeto:
Arduino
Potenciômetro 10K
RTC DS1307
Relé 5V
Fonte externa para alimentação da sirene (Vai depender de qual sirene vai utilizar)
Sirene
O projeto pode ser montado com ou sem o LCD.
Este é o esquema completo do projeto:
Uma correção no esquema acima faltou a alimentação do arduino na protoboard!!!
Vamos iniciar montando o LCD (creditos da montagem do lcd para Felipe Flop - http://www.filipeflop.com/pd-6b7e4-display-lcd-16x2.html)
Aqui seguimos montando nosso RTC:
Para finalizar vou postar um pequeno video demonstrativo do projeto: https://youtu.be/TjPUANq9gwk
<code>
#include <Wire.h>#include "RTClib.h"#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pinsLiquidCrystal lcd(12, 11, 5, 4, 3, 2);RTC_DS1307 rtc;
int hora = 0;int minuto = 0;int segundo = 0;void setup () { Wire.begin(); rtc.begin();
// set up the LCD's number of columns and rows: lcd.begin(16, 2);
Serial.begin(9600); pinMode(13, OUTPUT); digitalWrite(13, LOW); pinMode(6, OUTPUT); digitalWrite(6, LOW); if (!rtc.isrunning()) { lcd.print("RTC parado, vou ajustar com a hora da compilacao..."); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); }}
void printnn(int n) { // imprime um numero com 2 digitos // acrescenta zero `a esquerda se necessario String digitos = String(n); if (digitos.length() == 1) { digitos = "0" + digitos; } lcd.print(digitos);}
void loop () { // Obtem a data e hora correntes e armazena em tstamp DateTime tstamp = rtc.now(); hora = (tstamp.hour()); minuto = (tstamp.minute()); segundo = (tstamp.second()); // Mostra no monitor serial a data e hora correntes lcd.setCursor(3, 0); printnn(tstamp.day()); lcd.print('/'); printnn(tstamp.month()); lcd.print('/'); lcd.print(tstamp.year(), DEC); lcd.setCursor(3, 1); lcd.print (' '); printnn(tstamp.hour()); lcd.print(':'); printnn(tstamp.minute()); lcd.print(':'); printnn(tstamp.second()); delay(1000); lcd.clear(); //lcd.println(); Serial.print (hora); Serial.print (":"); Serial.print (minuto); Serial.print (":"); Serial.println (segundo); // Periodo da manha if (hora == 7 && minuto == 35 && segundo == 0) { alarme(); } if (hora == 9 && minuto == 35 && segundo == 0) { alarme(); } if (hora == 9 && minuto == 50 && segundo == 0) { alarme(); } if (hora == 11 && minuto == 35 && segundo == 0) { alarme(); } //periodo da tarde if (hora == 13 && minuto == 20 && segundo == 0) { alarme(); } if (hora == 15 && minuto == 35 && segundo == 0) { alarme(); } if (hora == 15 && minuto == 50 && segundo == 0) { alarme(); } if (hora == 17 && minuto == 20 && segundo == 0) { alarme(); }}void alarme() { digitalWrite(13, HIGH); digitalWrite(6, HIGH); lcd.setCursor(6, 0); lcd.print ("CURSO"); lcd.setCursor(3, 1); lcd.print ("PROGRAMACAO"); delay(10000); digitalWrite(13, LOW); digitalWrite(6, LOW); lcd.clear();}
</code>…
o de automação que necessitou de ambos. Como já podem ter percebido é difícil encontrar um exemplo de programa (sem ser um navegador) acessando o web serve do Arduino , ainda mais em c#, o que me levou a muitas tentativas e erros, o que encontrei foi o seguinte: quando utilizasse uma conexão no shield do Arduino, para ele “perceber” que há uma conxao ele deve receber um byte qualquer, \n, ‘a’, oque seja, para ele passar dos teste de conexão(usando exemplo disponível na ide)
void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
...
while (client.connected()) {Serial.println("chegou aqui conctado!");
if (client.available()) {
Serial.println("chegou aqui!avaliable");
.... }
Como pode ver fiz alguns testes pra poder saber ate que ponto eu chegava no código, e so conseguir avançar quando enviava para Arduino um byte (0x00000001).
Feito isso conseguir acessar o arduino porem falta agora receber os dados no C#, não tenho certeza, diga-se de passagem, se é correto o que vou afirmar, mas pelo o que eu entendi o arduino não implementa a estrutura de sockets como o c#.
Depois de inúmeros testes o código básico no C# ficou assim ( esse é o código que usei durante os testes , infelizmente o código final envolve características do sistema que estou desenvolvendo, não posso compartilhar):
static byte[] d={0x00000001}; static byte[] inStream = new byte[16];
if(teste=="a") {
// endereço ip utilizado string strEnderecoIP = "192.168.0.51";
// IPEndPoint: estrutura que encapsula endereço ip, porta, tipo de protocolo,etc IPEndPoint ipEnd_cliente = new IPEndPoint(IPAddress.Parse(strEnderecoIP), 88);
// objeto socket iniciado com o IPEndPoint Socket clientSock_cliente = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); // inicia a conexao clientSock_cliente.Connect(ipEnd_cliente); if(clientSock_cliente.Connected){Console.WriteLine("conctou\n");}else{Console.WriteLine("nao\n");}
// envia um dados qualquer para o Arduino, no caso especifico do meu código o arduino prontamente responde com um conjunto de dados que são salvos em um array clientSock_cliente.Send(d); clientSock_cliente.Receive(inStream,15, SocketFlags.None); for(int i=0;i<inStream.Length;i++) { Console.WriteLine(""+inStream[i]); } clientSock_cliente.Close(); teste=null; } if(teste=="0")break;
Com esse código é possível iniciar o desenvolvimento, ainda estou trabalhando no código final, tornalo assíncrono, etc, mas da pra fazer estudos em cima dele e avaçar.
Novamente , reitero que não sou expert em Arduino e C#, mas consegui fazer funcionar assim, fique a vontade para fazer correções e sugestões.…
sando , NÃO sou expert em Arduino e/ou C#, mas recentemente me deparei com um projeto de automação que necessitou de ambos. Como já podem ter percebido é difícil encontrar um exemplo de programa (sem ser um navegador) acessando o web serve do Arduino , ainda mais em c#, o que me levou a muitas tentativas e erros, o que encontrei foi o seguinte: quando utilizasse uma conexão no shield do Arduino, para ele “perceber” que há uma conxao ele deve receber um byte qualquer, \n, ‘a’, oque seja, para ele passar dos teste de conexão(usando exemplo disponível na ide)
void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
...
while (client.connected()) {Serial.println("chegou aqui conctado!");
if (client.available()) {
Serial.println("chegou aqui!avaliable");
.... }
Como pode ver fiz alguns testes pra poder saber ate que ponto eu chegava no código, e so conseguir avançar quando enviava para Arduino um byte (0x00000001).
Feito isso conseguir acessar o arduino porem falta agora receber os dados no C#, não tenho certeza, diga-se de passagem, se é correto o que vou afirmar, mas pelo o que eu entendi o arduino não implementa a estrutura de sockets como o c#.
Depois de inúmeros testes o código básico no C# ficou assim ( esse é o código que usei durante os testes , infelizmente o código final envolve características do sistema que estou desenvolvendo, não posso compartilhar):
static byte[] d={0x00000001};static byte[] inStream = new byte[16];
if(teste=="a") {
// endereço ip utilizado string strEnderecoIP = "192.168.0.51";
// IPEndPoint: estrutura que encapsula endereço ip, porta, tipo de protocolo,etc IPEndPoint ipEnd_cliente = new IPEndPoint(IPAddress.Parse(strEnderecoIP), 88);
// objeto socket iniciado com o IPEndPoint Socket clientSock_cliente = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); // inicia a conexao clientSock_cliente.Connect(ipEnd_cliente); if(clientSock_cliente.Connected){Console.WriteLine("conctou\n");}else{Console.WriteLine("nao\n");}
// envia um dados qualquer para o Arduino, no caso especifico do meu código o arduino prontamente responde com um conjunto de dados que são salvos em um array clientSock_cliente.Send(d); clientSock_cliente.Receive(inStream,15, SocketFlags.None); for(int i=0;i<inStream.Length;i++) { Console.WriteLine(""+inStream[i]); } clientSock_cliente.Close(); teste=null; } if(teste=="0")break;
Com esse código é possível iniciar o desenvolvimento, ainda estou trabalhando no código final, tornalo assíncrono, etc, mas da pra fazer estudos em cima dele e avaçar.
Novamente , reitero que não sou expert em Arduino e C#, mas consegui fazer funcionar assim, fique a vontade para fazer correções e sugestões.…
uma variável usando a keypad.h , estou apanhando mais é assim mesmo , tem que ser humilde e pedi ajuda , tentei mais não deu hehehe , com apenas 1 algarismo eu consigo sem problema feito nesse exemplo abaixo que é parte do meu cod , só está faltando isso basicamente para eu finalizar. Exemplo: eu digito o numero 1 ai eu consigo armazenar esse numero 1 na variavel SelectedNumber até ai tudo bem está funcionando blz , só que eu quero digitar qualquer numero , 101 , 543 , 50 , 3 pra ficar mais claro e etc pois no meu cod estou limitado a apenas 10 numeros ou seja de 0 até 9 , não estou sabendo manipular , espero que algum amigo me ajude ai , como eu faço isso? abaixo apenas uma parte do meu cod que é o que interessa.
agradeço desde já a ajuda de algum amigo.
void loop()
{
char key; int SelectedNumber = 0; key = keypad.getKey(); if ( key == '0' || key == '1' || key == '2' || key == '3' || key == '4' || key == '5' || key == '6' || key == '7' || key == '8' || key == '9') { SelectedNumber = key -= 48 ; // apenas 1 numero funcionar sem problema. Serial.print("Numero da ID: "); Serial.println(SelectedNumber); delay(300); digitalWrite(led , 1); delay(1000); digitalWrite(led , 0); SendData ( Command_Enroll , SelectedNumber , 0 , CHECK_FINGER ); //Envia o camando de enroll (cadastrar) delay(100); }
}
///////////////////////////////////////////////////////////////////////////
já tentei assim também , mais não deu certo , quero digitar qualquer numero e ser armazenado na variavel SelectedNumber , o resultado é que ele armazena apenas o primeiro numero digitado e se eu colocar o millis() para que eu consiga digitar sem executar o outro comando acontece duplicidade do mesmo digito ou seja , ex: se eu digita 23 o resultado é 22 , 47------44 , 81------88 deu pra ficar claro , não estou conseguindo , por favor uma ajuda , valeu.
if (ptr == 2) ptr = 0; //retorna ao início temp[ptr++] = key;//usa ptr e armazena key em ptr e no final incrementa o ptr temp[ptr] = '\0'; //Coloca o caracter terminador o que torna o array temp numa string, SelectedNumber = atoi(temp);//Converte de string para int so que ja esta a converter apenas uma tecla!.Nao esta a fazer controle da segunda tecla ou mais (caso queiras 1111) Serial.print("Numero da ID: "); Serial.println(SelectedNumber); delay(300);…
São Paulo e contará com a seguinte programação:
Comunicação Serial com Microcontroladores: USART, I2C, SPI e Outros – Daniel Quadros
Teoria e prática das formas mais comuns de interligação serial de microcontroladores a periféricos e outros sistemas.
Resumo
Uma das formas mais tradicionais da interligação de microcontroladores a outros dispositivos é a comunicação serial (um bit por vez). Nesta palestra são apresentadas a comunicação serial assíncrona e os padrões I2C, SPI e MICROWIRE. Além da descrição teórica serão apresentados códigos exemplos para diversos microcontroladores.
Tópicos
-> Comunicação serial assíncrona. Exemplos: PIC, HCS08.
-> Padrões RS232, RS422 e RS485.
-> Comunicação a 2 fios (I2C). Exemplos: PIC com relógio PCF8583 e MSP430 com memória 24WC256.
-> Comunicação a 3 fios. Exemplo: PIC com relógio DS1302.
-> Comunicação a 4 fios (SPI, MICROWIRE). Exemplo: HCS08 com memória FM93C66.
Introdução ao Linux Embarcado – Eduardo Belloti
Linux Embarcado, suas aplicações e ferramentas de desenvolvimento
Resumo
Serão apresentados fundamentos do sistema Linux em aplicações embarcadas, abordando exemplos de aplicações, arquitetura do sistema, considerações de hardware, ferramentas de desenvolvimento e gerenciamento de imagens, ferramentas de depuração, pilha de software para o desenvolvimento de aplicações e considerações sobre comportamento real-time. A plataforma ARM receberá o foco principal e exemplos práticos ilustrando os conceitos apresentados serão desenvolvidos para a audiência.
Tópicos
-> Uso do Linux em sistemas embarcados
-> Anatomia de um sistema Linux
-> Plataformas de Hardware
-> Ambiente de desenvolvimento e ferramentas
-> Bibliotecas de software para aplicações
-> Atendendo a requisitos de tempo real
-> Exemplos práticos na plataforma ARM9 S3C2440 (mini2440).
Desenvolvendo software seguro em C – Sergio Prado
Técnicas de desenvolvimento de software seguro em linguagem C
Resumo
A quantidade de dispositivos e equipamentos eletrônicos que interagimos no dia-a-dia aumenta a cada ano. A maioria destes dispositivos ou equipamentos possui certa inteligência (leia-se software embarcado). Meios de comunicação, sistemas de controle aéreo, equipamentos médicos, todos dependem destes dispositivos, onde qualquer falha pode causar consequencias indesejáveis ou fatais. E grande parte da responsabilidade por estas falhas é o software embarcado nestes dispositivos. Todos os envolvidos nas atividades de desenvolvimento de software embarcado precisam conhecer as armadilhas da linguagem C e as técnicas de desenvolvimento de software seguro.
Tópicos
-> Segurança em Sistemas Embarcados
-> Linguagem C: uma faca de dois gumes
-> Começando certo com um design seguro
-> Alocação dinâmica - usar ou não usar
-> Indo além de ponteiros e buffers
-> Ouvindo o que as funções têm a dizer
-> Ultrapassando os limites de um inteiro
-> Vulnerabilidades em funções do sistema operacional
-> Outras técnicas recomendadas
C++ em sistemas embarcados: poder e responsabilidade – André Braga
Resumo
C++ é uma linguagem poderosa, que permite o uso de muitas técnicas e paradigmas de programação. Mesmo em sistemas embarcados, onde os recursos de processador e memória são mais limitados que em um computador, o C++ pode nos ajudar a programar de forma mais modular e eficiente.
Entretanto, essas vantagens podem virar um problema se não forem bem administradas pelo desenvolvedor. Nem todas as os recursos do C++ são devoradores de recursos do microcontrolador, mas também não se pode escrever um programa para sistema embarcado da mesma forma que se escreve um programa para PC.
Tópicos
-> Paradigmas de programação
-> Construções típicas do C++ e da orientação a objetos
-> Relação do programador com o compilador
-> Testes em uma linguagem de alto nível
-> Alguns mitos e algumas verdades
Para inscrições e maiores informações acessem:
http://www.temporealeventos.com.br/?area=118
Confira os vídeos das palestras das edições passadas; I Seminário e II Seminário
…
Adicionado por Diego Sueiro ao 11:26 em 13 outubro 2010
has Gcode para o Arquino com Grbl 0.8c, mantendo o buffer controlado.Minha idéia é que utilizando dois arduinos com Grbl em cada um é possível controlar 6 eixos, sendo que três podem ser para rotação dada em graus.Para isso é necessário entender a finalidade dos eixos de rotação A, B e C, porque para cada tipo de máquina as características podem mudar.Fiz um código simples para separar cada linha Gcode em duas partes, uma para o Arduino com Gcode para controlar os eixos X, Y e Z e a outra para controlar o outro Arduino para controlar os eixos A, B e C.O código segue abaixo e se os colegas puderem simplificar o código ou sugerir modificações, a ajuda será bem-vinda.
/*Desmembramento de linhas Gcode em eixos X, Y e Z e eixos A, B e C para expandir o firmware Grbl de 3 para 6 eixos. Versão 1.03 Código criado 07 de maio de 2013 por Milton Vilela*/
int aa;String isString;String isStringABC;int w_x;int w_y;int w_z;int xyz;int abc;int xyz2ABC;int numespXYZ; // número de espaçosint numespABC; // número de espaçosint w_len;uint32_t i; //contador
void setup(){Serial.begin(9600);}
void loop(){xyz = 0;abc = 0;isString = "";isStringABC = "";String stringTeste = String("G01 X28.5 Y13.75 Z10 A27 B35 C44 F450"); //crinado uma nova string
w_len = stringTeste.length();Serial.println(stringTeste);
for (i=0; i<=w_len; i++) // { aa = stringTeste.charAt(i); if ( (aa == 88) || (aa == 120) ) // X x { w_x = 1; xyz++; } if ( (aa == 89) || (aa == 121) ) // Y y { w_y = 1; xyz++; } if ( (aa == 90) || (aa == 122) ) // Z z { w_z = 1; xyz++; } if ( (aa == 65) || (aa == 97) ) // A a { abc++; xyz2ABC = 65; //(char)aa; } if ( (aa == 66) || (aa == 98) ) // B b { abc++; xyz2ABC = 66; //(char)aa; } if ( (aa == 67) || (aa == 99) ) // C c { abc++; xyz2ABC = 67; //(char)aa; } if (aa == 0x20) // espaço { xyz = 0; abc = 0; }//----------------------------------------------------------------------- if (xyz == 1) {//----------------------------------------------------------------- if (aa == 0x20) // espaço { numespXYZ++; if (numespXYZ == 1) { isString += (char)aa; // acumula os caracteres } } else { isString += (char)aa; // acumula os caracteres numespXYZ = 0; } }//----------------------------------------------------------------------- if (abc > 0) { if (abc == 1) { isStringABC += (char)xyz2ABC; // acumula os caracteres abc++; } else {//----------------------------------------------------------------- if (aa == 0x20) // espaço { numespABC++; if (numespABC == 1) { isStringABC += (char)aa; // acumula os caracteres } } else { isStringABC += (char)aa; // acumula os caracteres numespABC = 0; }//----------------------------------------------------------------- } }
if ((xyz == 0) && (abc == 0) ) {//----------------------------------------------------------------- if (aa == 0x20) // espaço { numespXYZ++; if (numespXYZ == 1) { isString += (char)aa; // acumula os caracteres } } else { isString += (char)aa; // acumula os caracteres numespXYZ = 0; }//----------------------------------------------------------------- if (aa == 0x20) // espaço { numespABC++; if (numespABC == 1) { isStringABC += (char)aa; // acumula os caracteres } } else { isStringABC += (char)aa; // acumula os caracteres numespABC = 0; }//------------------------------------------------------------------- }}Serial.println("");Serial.println("Gcode para Arduino com Grbl (X, Y e Z)");Serial.println(isString);Serial.println("");Serial.println("Gcode para Arduino com Grbl (A, B e C)");Serial.println(isStringABC);while(1);}…