Resultados da busca - %E6%81%92%E8%BE%BE%E7%99%BB%E5%BD%95%E7%94%A8%E6%88%B7%E5%90%8D%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D%E3%80%90%E2%94%83%E5%A5%BD%E8%AE%A1%E5%88%922%E2%92%8F7%E2%92%8F01705%7B%EF%BC%B1%E3%80%91%E3%80%91
como sao 4 otoes, pode ocorrer 4 chamadas diferentes.
e pode acontecer de duas ,tres ou ate os quatro botoes estarem chamando.
fiz o seguinte, aperta um botao da o sinal 3 vezes como maquina chamando, logo fica alguns segundos em scroll para esquerda que essa maquina esta chamando.
O que acontece é que quando esta em scroll os outros botoes ficam bloqueados nao conseguem chamar.
Gostaria de que ficasse a mensagem aparecendo ate que se apertasse um botao de reset, e que enquanto estivesse uma mensagem ou mais em scroll liberasse para os outros poerem chamar, e iria incrementando as mensagens no scroll.
se alguem puder ajudar agradeço.
segue código.
#include
int luz = 11; //porta 11 para o led
int botao = 15; //porta A1 botao robo 1
int botao2 = 16; //porta A2 botao Marlene
int botao3 = 17; //porta A3 botao robo 2
int botao4 = 18; //porta A4 botao robo 3
int liberaLcd = true;
int liberaLcd2 = true;
int liberaLcd3 = true;
int liberaLcd4 = true;
LiquidCrystal lcd(8,9,4,5,6,7); //criando objeto da classe liquid
//cristal e definindo suas portas
void setup()
{
lcd.begin(16, 2); //inicia o lcd informando 16 linhas x 2 colunas
pinMode(luz,OUTPUT); // define o pino do led(11) como saida
pinMode(botao,INPUT); //define o pino botao(15) como entrada
pinMode(botao2,INPUT); //define o pino botao2 (16) como entrada
pinMode(botao3,INPUT); // define o pino botao3 (17) como entrada
pinMode(botao4, INPUT); //define o pino botao 4 (18) como entrada
}
void loop()
//fazendo leitura do pino botao
//se o valor do pino botao(15) for = a zero
{
if(digitalRead(botao) == LOW && liberaLcd == true)
{
delay(100);
// fara isso
lcd.setCursor(0,0);
lcd.print("ROBO 1");
lcd.setCursor(0,1);
lcd.print("CHAMANDO");
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
lcd.clear(); //limpa lcd
lcd.setCursor(0,0);
lcd.print("Robo 1 chamou...aguardando tecnico");
delay(1000);
//enquanto variavel i for menor que 100 faz scroll para esquerda
for (int i = 0; i < 100; i++) {
lcd.scrollDisplayLeft();
delay(300);
}
liberaLcd == true;
}
//quando o estado do botao for maior que zero
if (digitalRead (botao) == HIGH && liberaLcd == true)
{
delay(100);
// fara isso
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Aguardando");
lcd.setCursor(0,1);
lcd.print("chamado...");
digitalWrite(luz,LOW);
liberaLcd == true;
}
if (digitalRead(botao2) == LOW && liberaLcd2 == true)
{
delay(100);
lcd.setCursor(0,0);
lcd.print("MARLENE ");
lcd.setCursor(0,1);
lcd.print("CHAMANDO");
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
lcd.clear();
lcd.setCursor(1,1);
lcd.print("Marlene chamou...aguardando tecnico");
delay(1000);
for (int i = 0; i < 100; i++) {
lcd.scrollDisplayLeft();
delay(300);
}
liberaLcd2 == true;
}
if (digitalRead (botao2) == HIGH && liberaLcd2 == true)
{
delay(100);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Aguardando");
lcd.setCursor(0,1);
lcd.print("chamado...");
digitalWrite(luz,LOW);
liberaLcd2 == true;
}
if(digitalRead(botao3) == LOW && liberaLcd3 == true)
{
delay(100);
lcd.setCursor(0,0);
lcd.print("ROBO 2 ");
lcd.setCursor(0,1);
lcd.print("CHAMANDO");
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Robo 2 chamou...aguardando tecnico");
delay(1000);
for (int i = 0; i < 100; i++) {
lcd.scrollDisplayLeft();
delay(300);
}
liberaLcd3 == true;
}
if (digitalRead (botao3) == HIGH && liberaLcd3 == true)
{
delay(100);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Aguardando");
lcd.setCursor(0,1);
lcd.print("chamado...");
digitalWrite(luz,LOW);
liberaLcd3 == true;
}
if(digitalRead(botao4) == LOW && liberaLcd == true)
{
delay(100);
lcd.setCursor(0,0);
lcd.print("ROBO 3");
lcd.setCursor(0,1);
lcd.print("CHAMANDO");
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
lcd.clear();
lcd.setCursor(1,1);
lcd.print("Robo 3 chamou...aguardando tecnico");
delay(1000);
for (int i = 0; i < 100; i++) {
lcd.scrollDisplayLeft();
delay(300);
}
liberaLcd == true;
}
if (digitalRead (botao4) == HIGH && liberaLcd == true)
{
delay(100);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Aguardando");
lcd.setCursor(0,1);
lcd.print("chamado...");
digitalWrite(luz,LOW);
liberaLcd == true;
}
}…
como sao 4 otoes, pode ocorrer 4 chamadas diferentes.
e pode acontecer de duas ,tres ou ate os quatro botoes estarem chamando.
fiz o seguinte, aperta um botao da o sinal 3 vezes como maquina chamando, logo fica alguns segundos em scroll para esquerda que essa maquina esta chamando.
O que acontece é que quando esta em scroll os outros botoes ficam bloqueados nao conseguem chamar.
Gostaria de que ficasse a mensagem aparecendo ate que se apertasse um botao de reset, e que enquanto estivesse uma mensagem ou mais em scroll liberasse para os outros poerem chamar, e iria incrementando as mensagens no scroll.
se alguem puder ajudar agradeço.
segue código.
#include
int luz = 11; //porta 11 para o led
int botao = 15; //porta A1 botao robo 1
int botao2 = 16; //porta A2 botao Marlene
int botao3 = 17; //porta A3 botao robo 2
int botao4 = 18; //porta A4 botao robo 3
int liberaLcd = true;
int liberaLcd2 = true;
int liberaLcd3 = true;
int liberaLcd4 = true;
LiquidCrystal lcd(8,9,4,5,6,7); //criando objeto da classe liquid
//cristal e definindo suas portas
void setup()
{
lcd.begin(16, 2); //inicia o lcd informando 16 linhas x 2 colunas
pinMode(luz,OUTPUT); // define o pino do led(11) como saida
pinMode(botao,INPUT); //define o pino botao(15) como entrada
pinMode(botao2,INPUT); //define o pino botao2 (16) como entrada
pinMode(botao3,INPUT); // define o pino botao3 (17) como entrada
pinMode(botao4, INPUT); //define o pino botao 4 (18) como entrada
}
void loop()
//fazendo leitura do pino botao
//se o valor do pino botao(15) for = a zero
{
if(digitalRead(botao) == LOW && liberaLcd == true)
{
delay(100);
// fara isso
lcd.setCursor(0,0);
lcd.print("ROBO 1");
lcd.setCursor(0,1);
lcd.print("CHAMANDO");
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
lcd.clear(); //limpa lcd
lcd.setCursor(0,0);
lcd.print("Robo 1 chamou...aguardando tecnico");
delay(1000);
//enquanto variavel i for menor que 100 faz scroll para esquerda
for (int i = 0; i < 100; i++) {
lcd.scrollDisplayLeft();
delay(300);
}
liberaLcd == true;
}
//quando o estado do botao for maior que zero
if (digitalRead (botao) == HIGH && liberaLcd == true)
{
delay(100);
// fara isso
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Aguardando");
lcd.setCursor(0,1);
lcd.print("chamado...");
digitalWrite(luz,LOW);
liberaLcd == true;
}
if (digitalRead(botao2) == LOW && liberaLcd2 == true)
{
delay(100);
lcd.setCursor(0,0);
lcd.print("MARLENE ");
lcd.setCursor(0,1);
lcd.print("CHAMANDO");
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
lcd.clear();
lcd.setCursor(1,1);
lcd.print("Marlene chamou...aguardando tecnico");
delay(1000);
for (int i = 0; i < 100; i++) {
lcd.scrollDisplayLeft();
delay(300);
}
liberaLcd2 == true;
}
if (digitalRead (botao2) == HIGH && liberaLcd2 == true)
{
delay(100);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Aguardando");
lcd.setCursor(0,1);
lcd.print("chamado...");
digitalWrite(luz,LOW);
liberaLcd2 == true;
}
if(digitalRead(botao3) == LOW && liberaLcd3 == true)
{
delay(100);
lcd.setCursor(0,0);
lcd.print("ROBO 2 ");
lcd.setCursor(0,1);
lcd.print("CHAMANDO");
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Robo 2 chamou...aguardando tecnico");
delay(1000);
for (int i = 0; i < 100; i++) {
lcd.scrollDisplayLeft();
delay(300);
}
liberaLcd3 == true;
}
if (digitalRead (botao3) == HIGH && liberaLcd3 == true)
{
delay(100);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Aguardando");
lcd.setCursor(0,1);
lcd.print("chamado...");
digitalWrite(luz,LOW);
liberaLcd3 == true;
}
if(digitalRead(botao4) == LOW && liberaLcd == true)
{
delay(100);
lcd.setCursor(0,0);
lcd.print("ROBO 3");
lcd.setCursor(0,1);
lcd.print("CHAMANDO");
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
digitalWrite(luz,HIGH);
delay(500);
digitalWrite(luz,LOW);
delay(500);
lcd.clear();
lcd.setCursor(1,1);
lcd.print("Robo 3 chamou...aguardando tecnico");
delay(1000);
for (int i = 0; i < 100; i++) {
lcd.scrollDisplayLeft();
delay(300);
}
liberaLcd == true;
}
if (digitalRead (botao4) == HIGH && liberaLcd == true)
{
delay(100);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Aguardando");
lcd.setCursor(0,1);
lcd.print("chamado...");
digitalWrite(luz,LOW);
liberaLcd == true;
}
}…
e funcionou normalmente, só que eu preciso que o sensor fique a uma distancia de uns 5m do Arduino, então eu usei um cabo de rede, utilizei 4 fios do cabo, porem não funciona corretamente, penso que pode ser por conta do comprimento do cabo. Ai fiz uns testes e cheguei a conclusão que é no pino GND que esta ocorrendo o problema, porque eu testei um por um, usei o Vcc, Trig e Echo no cabo de rede e o GND no protoboard com um jumper e funcionou! Mas quando eu tiro o jumper e ligo no GND do cabo de rede não funciona. Da a entender que somente o pino GND não suporte um fio longo. Alguem pode me ajudar com esse fato?
Segue o código:
#include <LiquidCrystal.h>
//--> CONTROLE DE NÍVEL DE CAIXA D´AGUA <--////-------------------------------------------------//
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //=> DEFINE OS PINOS DO DISPLAY.
int led1 = A0; //-> LED VERDE ACESO IGUAL E ACIMA DE 50% DE ÁGUA. -----> NÍVEL ALTO.int led2 = A1; //-> LED AMARELO ACESO DE 30% ATÉ 50% DE ÁGUA. -----> NÍVEL ACEITÁVEL. //-> LED AMARELO PISCANDO DE 20% E 30% DE ÁGUA. -----> NÍVEL MÉDIO.int led3 = A2; //-> LED VERMELHO ACESO DE 10% E 20% DE ÁGUA. -----> NÍVEL BAIXO. //-> LED VERMELHO PISCANDO IGUAL OU ABAIXO DE 10% DE ÁGUA. -----> NÍVEL CRÍTICO.
int trig = 6; //-> DEFINE O PINO 6 COMO TRIGGER.int echo = 7; //-> DEFINE OPINO 7 COMO ECHO.
int tempoDelay = 2000; //-> TEMPO DE INTERVALO.
void setup() { lcd.begin(16, 2); Serial.begin(9600);
pinMode(trig, OUTPUT); pinMode(echo, INPUT); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT);}
void loop() {
digitalWrite(trig, 0);delayMicroseconds(2);digitalWrite(trig, 1);delayMicroseconds(10);digitalWrite(trig, 0);
long duration = pulseIn(echo, 1);long distancia = duration / 29 / 2;
long CONVcmMsec = map(distancia,0,63,99,0);long CONVlitros = map(distancia,0,63,2300,0);long CONValtura = map(distancia,0,63,63,0);
//-> INFORMAÇÕES NA SERIAL - ANÁLISE DOS DADOS <-//
Serial.print(" Nivel: ");Serial.print(CONVcmMsec);Serial.print(" % de agua");Serial.println();Serial.print(" Quanti ");Serial.print(CONVlitros);Serial.print(" Litros ");Serial.println();Serial.print(" Altura: ");Serial.print(CONValtura);Serial.print(" CM ");Serial.println();Serial.print(" ------------------------------------------------ ");Serial.println();
if(CONVcmMsec <= 0){ lcd.clear(); } else{
//-> EXIBIÇÃO DO NÍVEL NO DISPLAY <-//
lcd.setCursor(3,0); lcd.print("Nivel:"); lcd.setCursor(10,0); lcd.print(CONVcmMsec); lcd.setCursor(12,0); lcd.print("%");
//-> EXIBIÇÃO DO VOLUME NO DISPLAY <-//
lcd.setCursor(2,1); lcd.print("Litros:"); lcd.setCursor(10,1); lcd.print(CONVlitros); }
//-> ÁGUA EM NÍVEL ALTO <-//
if(CONVcmMsec > 50){ digitalWrite(led1, 1); digitalWrite(led2, 0); digitalWrite(led3, 0); delay(tempoDelay); }
//-> ÁGUA EM NÍVEL ACEITÁVEL <-//
if(CONVcmMsec > 30 && CONVcmMsec <= 50){ digitalWrite(led1, 0); digitalWrite(led2, 1); digitalWrite(led3, 0); delay(tempoDelay); }
//-> ÁGUA EM NÍVEL MÉDIO <-//
if(CONVcmMsec > 20 && CONVcmMsec <= 30){ digitalWrite(led1, 0); digitalWrite(led3, 0); digitalWrite(led2, 1); delay(tempoDelay); digitalWrite(led2, 0); delay(tempoDelay); }
//-> ÁGUA EM NÍVEL BAIXO <-//
if(CONVcmMsec > 10 && CONVcmMsec <= 20){ digitalWrite(led1, 0); digitalWrite(led2, 0); digitalWrite(led3, 1); delay(tempoDelay); }
//-> ÁGUA EM NÍVEL CRÍTICO <-//
if(CONVcmMsec <= 10){ digitalWrite(led1, 0); digitalWrite(led2, 0); digitalWrite(led3, 1); delay(tempoDelay); digitalWrite(led3, 0); delay(tempoDelay); }
}…
Adicionado por Jesio Costa ao 16:06 em 19 setembro 2017
e funcionou normalmente, só que eu preciso que o sensor fique a uma distancia de uns 5m do Arduino, então eu usei um cabo de rede, utilizei 4 fios do cabo, porem não funciona corretamente, penso que pode ser por conta do comprimento do cabo. Ai fiz uns testes e cheguei a conclusão que é no pino GND que esta ocorrendo o problema, porque eu testei um por um, usei o Vcc, Trig e Echo no cabo de rede e o GND no protoboard com um jumper e funcionou! Mas quando eu tiro o jumper e ligo no GND do cabo de rede não funciona. Da a entender que somente o pino GND não suporte um fio longo. Alguem pode me ajudar com esse fato?
Segue o código:
#include <LiquidCrystal.h>
//--> CONTROLE DE NÍVEL DE CAIXA D´AGUA <--////-------------------------------------------------//
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //=> DEFINE OS PINOS DO DISPLAY.
int led1 = A0; //-> LED VERDE ACESO IGUAL E ACIMA DE 50% DE ÁGUA. -----> NÍVEL ALTO.int led2 = A1; //-> LED AMARELO ACESO DE 30% ATÉ 50% DE ÁGUA. -----> NÍVEL ACEITÁVEL.//-> LED AMARELO PISCANDO DE 20% E 30% DE ÁGUA. -----> NÍVEL MÉDIO.int led3 = A2; //-> LED VERMELHO ACESO DE 10% E 20% DE ÁGUA. -----> NÍVEL BAIXO.//-> LED VERMELHO PISCANDO IGUAL OU ABAIXO DE 10% DE ÁGUA. -----> NÍVEL CRÍTICO.
int trig = 6; //-> DEFINE O PINO 6 COMO TRIGGER.int echo = 7; //-> DEFINE OPINO 7 COMO ECHO.
int tempoDelay = 2000; //-> TEMPO DE INTERVALO.
void setup() {lcd.begin(16, 2);Serial.begin(9600);
pinMode(trig, OUTPUT);pinMode(echo, INPUT);pinMode(led1, OUTPUT);pinMode(led2, OUTPUT);pinMode(led3, OUTPUT);}
void loop() {
digitalWrite(trig, 0);delayMicroseconds(2);digitalWrite(trig, 1);delayMicroseconds(10);digitalWrite(trig, 0);
long duration = pulseIn(echo, 1);long distancia = duration / 29 / 2;
long CONVcmMsec = map(distancia,0,63,99,0);long CONVlitros = map(distancia,0,63,2300,0);long CONValtura = map(distancia,0,63,63,0);
//-> INFORMAÇÕES NA SERIAL - ANÁLISE DOS DADOS <-//
Serial.print(" Nivel: ");Serial.print(CONVcmMsec);Serial.print(" % de agua");Serial.println();Serial.print(" Quanti ");Serial.print(CONVlitros);Serial.print(" Litros ");Serial.println();Serial.print(" Altura: ");Serial.print(CONValtura);Serial.print(" CM ");Serial.println();Serial.print(" ------------------------------------------------ ");Serial.println();
if(CONVcmMsec <= 0){lcd.clear(); }else{
//-> EXIBIÇÃO DO NÍVEL NO DISPLAY <-//
lcd.setCursor(3,0);lcd.print("Nivel:");lcd.setCursor(10,0);lcd.print(CONVcmMsec);lcd.setCursor(12,0);lcd.print("%");
//-> EXIBIÇÃO DO VOLUME NO DISPLAY <-//
lcd.setCursor(2,1);lcd.print("Litros:");lcd.setCursor(10,1);lcd.print(CONVlitros); }
//-> ÁGUA EM NÍVEL ALTO <-//
if(CONVcmMsec > 50){digitalWrite(led1, 1);digitalWrite(led2, 0);digitalWrite(led3, 0);delay(tempoDelay);}
//-> ÁGUA EM NÍVEL ACEITÁVEL <-//
if(CONVcmMsec > 30 && CONVcmMsec <= 50){digitalWrite(led1, 0);digitalWrite(led2, 1);digitalWrite(led3, 0);delay(tempoDelay);}
//-> ÁGUA EM NÍVEL MÉDIO <-//
if(CONVcmMsec > 20 && CONVcmMsec <= 30){digitalWrite(led1, 0);digitalWrite(led3, 0);digitalWrite(led2, 1);delay(tempoDelay);digitalWrite(led2, 0);delay(tempoDelay);}
//-> ÁGUA EM NÍVEL BAIXO <-//
if(CONVcmMsec > 10 && CONVcmMsec <= 20){digitalWrite(led1, 0);digitalWrite(led2, 0);digitalWrite(led3, 1);delay(tempoDelay);}
//-> ÁGUA EM NÍVEL CRÍTICO <-//
if(CONVcmMsec <= 10){digitalWrite(led1, 0);digitalWrite(led2, 0);digitalWrite(led3, 1);delay(tempoDelay);digitalWrite(led3, 0);delay(tempoDelay);}
}…
Adicionado por Jesio Costa ao 19:17 em 19 setembro 2017
.)
Inverno aqui e estou em férias (na verdade quase no fim... as férias), então intensifiquei o trabalho neste projeto.
Terminei as peças para o "pescoço" (sistema pan/tilt para a cabeça).
Também chegaram as últimas peças para finalizar o robô (fornecidas pela Makeblock). Então pude finalizar a montagem das esteiras e dos braços... e estou a caminho de finalizar a cabeça (na verdade neste momento fazendo alguns desenhos).
Comecei alguns testes com a "Pixy" (que ganhei em um "Call for Reviewers" no Let's Make Robots) usando a cabeça do protótipo de papelão.
Estou em dúvida em alguns aspectos para a cabeça: como unir todos os componentes sem torná-la grande demais. Pixy, mais uma câmera para FPV, duas matrizes de LED de 8X16 cada (para os olhos/expressões faciais) e um sensor ultrassônico. Estou pensando em começar com um modelo mais simples e ir aprimorando-o. Claro que cada modelo levará mais e mais horas de trabalho...
UPDATE @ 20/08/2016: chassi praticamente pronto; alguns detalhes adicionais; e visão geral do projeto
E aí garagistas! Bastante tempo desde a última atualização...
Trabalhando intensamente no projeto, mas com pouco tempo para postar (na verdade já havia postado esta atualização no site Let's Make Robots, que é onde mantenho o post original... mas agora segue aqui em português).
Os últimos três meses foram dedicados principalmente à construção do chassi. Você verá que o design mudou um pouco, comparado ao protótipo inicial de papelão. Acho que está muito melhor agora.
Então, hoje vou mostrar várias novas fotos do processo de produção. Estava ansioso para compartilhá-las. Espero que curtam! ;)
Johnny Five está sempre em minha mente. Então, desta vez, ele me influenciou no design do chassi. A principal parte/material do chassi é um tubo de PVC (75 mm de diâmetro).
Para formar uma estrutura de suporte, para unir o tronco ao chassi, usei um tubo de PVC de 50 mm. Uma conexão em "T" de PVC foi usada para ajudar a fazer um ângulo reto perfeito.
As partes de PVC foram unidas com adesivo instantâneo. Parafuso e porca na base, para reforçar, e também epóxi.
Detalhe estético (mas também serve para reforço da estrutura).
Fazendo entradas de ar, onde os motores de corrente contínua serão colocados.
Essas partes são para "segurar" as laterais (suportes para as esteiras).
A base do chassi é formada por cinco camadas de poliestireno de alto impacto de 2 mm de espessura, reforçado com perfis de alumínio. Essa parte vai acomodar a bateria e a placa para controle dos motores de corrente contínua.
Suporte para o mecanismo de pant/tilt e tronco.
O chassi também possui uma "parte superior", onde ficam a chave de ligar e desligar a alimentação geral, o cooler/fan para a placa de controle do motores de corrente contínua e um display para monitorar a tensão da bateria.
O robô é bem estável (em termos de distribuição do peso e equilíbrio). Mas para prevenir que ele caia para trás, fiz um rodízio ("roda boba") customizado. (Lamento pela falta de imagens dessa peça, mas pode ser vista melhor no vídeo.)
As laterais (suportes para as esteiras) também são formadas por cinco camadas de poliestireno de alto impacto de 2 mm de espessura, e também reforçadas com perfis de alumínio.
Ainda tem muitos detalhes para terminar. Também no tronco (o que há de novo nessa peça são as "entradas de ar").
Gostaria novamente de agradecer à Makeblock, pelas novas peças gentilmente fornecidas para este projeto, como as esteiras e mais polias e algum hardware adicional, e outras peças que eu vou mostrar conforme adiciono-as ao projeto.
Isso é tudo por enquanto. Ainda tenho uma centena de pequenos detalhes para terminar. A lixação (para dar um bom acabamento) é o que leva mais tempo.
Deem também uma olhada nos novos vídeos.
Até mais!
TERCEIRA PARTE @ 06/03/2016
Ae galera! Apenas uma breve atualização...
Já mostrei anteriormente essa peça... mas agora ela está pronta!
Apesar de ser pequena, ela é bem importante... pois possibilita que o tronco tenha dois movimentos e conecta o tronco à base.
Abaixo você pode ver todas as peças da Makeblock usadas nesta etapa do projeto.
1X D Shaft 4x56mm;
2X Timing Belt 112MXL - 140T;
8X Plastic Rivet R4120;
2X Socket Cap Screw M4x16 - Button Head;
14X Socket Cap Screw M4x14 - Button Head;
6X Socket Cap Screw M4x8 - Button Head;
2X Headless Screw M3x5;
3X MG995 Servo Hub;
1X Shaft Connector 4mm;
4X Timing Pulley Slice 90T-B;
2X Timing Pulley 90T;
1X Gear 48T;
1X Bracket U1;
3X Plane Bearing Turntable D34x24mm;
2X Timing Pulley 62T;
4X Timing Pulley Slice 62T-B;
1X Gear 16T.
Estou um pouco em dúvida sobre o "campo" do movimento de pan... com a redução de engrenagens ele está limitado a aproximadamente 90 graus. Preciso vê-lo em ação para decidir. Se eu quiser um "campo" mais largo terei que eliminar a limitação do servo motor e exteriorizar o potenciômetro. Bem, vamos ver...
SEGUNDA PARTE @ 27/02/2016
Gostaria de já ter terminado o tórax, mas ele sofreu um pequeno acidente... sim, caiu no chão quando eu estava preparando para aplicar o primer... mas já está reparado e bem agora!
Carreguei um vídeo do trabalho em Pepakura e outro mostrando vários passos do trabalho em fibra de vidro.
Agora o tórax está mais próximo do que nunca de estar pronto. E é super leve. Ainda preciso terminar alguns "detalhes estéticos" que serão feitos com folhas de poliestireno (de alto impacto). Quando estiver totalmente pronto, eu vou pesá-lo.
Abaixo você pode ver que utilizei poliestireno em algumas áreas planas. Certamente eu não conseguiria fazê-las tão planas com fibra de vidro. E as laterais acabaram ficando com um reforço conveniente, onde os braços são montados (3 camadas de 2mm).
Estava com dificuldades de encontrar bons motores DC para as esteiras, mas consegui uma boa opção com 25 kgf-cm e 233 RPM a 12 V por um preço razoável.
Pretendo terminar nos próximos dias o mecanismo de pan/tilt do tórax.
Até mais!
PRIMEIRA PARTE @ 27/01/2016
Ae garagistas!
Estou iniciando "o grande projeto" para este ano: MDi #4.
Será um robô com locomoção por esteiras com tronco e dois braços funcionais. Terá uma cabeça para expressar informações sobre suas interações com o ambiente.
Pretendo compartilhar cada passo do processo de construção deste projeto, por isso farei vários vídeos detalhando a produção de cada peça, e também adicionarei aqui nesta página fotos e informações sobre o desenvolvimento do projeto.
Para começar, segue um vídeo com especificações iniciais do projeto (vídeo em inglês, mas pretendo adicionar legendas em breve).
Também já comecei a trabalhar no tronco/peitoral e no mecanismo de inclinação do mesmo. Então aqui segue também uma prévia destas peças, que serão detalhadas nos próximos episódios.
Fico feliz em dizer que a Makeblock patrocinou várias peças para este projeto. Espero fazer um robô legal e forte com elas.
Fique ligado!
…
onhecimento).
Coloquei ainda no Loop para mostrar o resultado da monitoração após o recebimento de todas as repetições (aguarda 2 segundos sem receber transmissão).
Para mostrar o resultado, acrescentei um if e uma chamada à função millis() em todas as execuções da função loop. Isso simularia um pequeno overhead de processamento num programa real que faz alguma coisa além de simplesmente reconhecer código recebidos, as instruções dentro do if só são executadas quando não há transmissão.
#include <EEPROM.h>#define DUMP//# undef DUMP
const byte pinRF = 2; // Pin where RF Module is connected. If necessary, change this for your project
int lambda; // on pulse clock width (if fosc = 2KHz than lambda = 500 us)
struct rfControl //Struct for RF Remote Controls{ unsigned long addr; //ADDRESS CODE boolean btn1; //BUTTON 1 boolean btn2; //BUTTON 2 unsigned long milisecs; // quando terminou de reconhecer};#ifdef DUMP// buffer para armazenar os reconhecimentosunsigned int reg = 0;struct rfControl rfs[30];#endif
boolean ACT_HT6P20B_RX(struct rfControl &_rfControl){ static boolean startbit; //checks if start bit was identified static int counter; //received bits counter: 22 of Address + 2 of Data + 4 of EndCode (Anti-Code) static unsigned long buffer; //buffer for received data storage int dur0, dur1; // pulses durations (auxiliary) if (!startbit) {// Check the PILOT CODE until START BIT; dur0 = pulseIn(pinRF, LOW); //Check how long DOUT was "0" (ZERO) (refers to PILOT CODE) //If time at "0" is between 9200 us (23 cycles of 400us) and 13800 us (23 cycles of 600 us). if((dur0 > 9200) && (dur0 < 13800) && !startbit) { //calculate wave length - lambda lambda = dur0 / 23; //Reset variables dur0 = 0; buffer = 0; counter = 0; startbit = true; } }
//If Start Bit is OK, then starts measure os how long the signal is level "1" and check is value is into acceptable range. // ********** trocar o IF abaixo por WHILE para que o código na função LOOP não interfira no reconhecimento. // while (startbit && counter < 28) if (startbit && counter < 28) { ++counter; dur1 = pulseIn(pinRF, HIGH); if((dur1 > 0.5 * lambda) && (dur1 < (1.5 * lambda))) //If pulse width at "1" is between "0.5 and 1.5 lambda", means that pulse is only one lambda, so the data é "1". { buffer = (buffer 1) + 1; // add "1" on data buffer } else if((dur1 > 1.5 * lambda) && (dur1 < (2.5 * lambda))) //If pulse width at "1" is between "1.5 and 2.5 lambda", means that pulse is two lambdas, so the data é "0". { buffer = (buffer 1); // add "0" on data buffer } else { //Reset the loop startbit = false; } } //Check if all 28 bits were received (22 of Address + 2 of Data + 4 of Anti-Code) if (counter==28) { // Check if Anti-Code is OK (last 4 bits of buffer equal "0101") if ((bitRead(buffer, 0) == 1) && (bitRead(buffer, 1) == 0) && (bitRead(buffer, 2) == 1) && (bitRead(buffer, 3) == 0)) { counter = 0; startbit = false; //Get ADDRESS CODE from Buffer _rfControl.addr = buffer >> 6; //Get Buttons from Buffer _rfControl.btn1 = bitRead(buffer,4); _rfControl.btn2 = bitRead(buffer,5); #ifdef DUMP // armazena para conferência memcpy(&rfs[reg], &_rfControl, 10); // 4 + 1 + 1 + 4 rfs[reg++].milisecs = millis(); #endif //If a valid data is received, return OK return true; } else { //Reset the loop startbit = false; #ifdef DUMP //Get ADDRESS CODE from Buffer_rfControl.addr = buffer >> 6;//Get Buttons from Buffer_rfControl.btn1 = bitRead(buffer,4);_rfControl.btn2 = bitRead(buffer,5);
// armazena para conferência memcpy(&rfs[reg], &_rfControl, 10); // 4 + 1 + 1 + 4 rfs[reg++].milisecs = millis(); #endif } } //If none valid data is received, return NULL and FALSE values _rfControl.addr = NULL; _rfControl.btn1 = NULL; _rfControl.btn2 = NULL; return false;}
void setup(){ pinMode(pinRF, INPUT); pinMode(13, OUTPUT); reg = 0; Serial.begin(9600);}unsigned long lastrecon = 0;void loop(){ digitalWrite(13, digitalRead(pinRF)); //blink de onboard LED when receive something struct rfControl rfControl_1; //Set variable rfControl_1 as rfControl type if(ACT_HT6P20B_RX(rfControl_1)) { lastrecon = millis(); //If a valid data is received, print ADDRESS CODE and Buttons values Serial.print("Address: "); Serial.print(rfControl_1.addr, HEX); Serial.print(" B1: "); Serial.print(rfControl_1.btn1, BIN); Serial.print(" B2: "); Serial.println(rfControl_1.btn2, BIN); } // este trecho aproveita que não está reconhecendo nada no momento e mostra os dados dos erros // além disso, inclui um pouco de overhead de processamento quando está reconhecendo algo (uma chamada a millis() e um if simples) // no caso de trocar o if pelo while na rotina de reconhecimento, este overhead deixa de existir. #ifdef DUMP unsigned long now = millis(); if (now - lastrecon > 2000 && reg > 0) { // passou mais de 2 segundos do último reconhecimento, então acabaram as repetições automáticas da transmissão do código for (int i = 0; i < reg; i++) { Serial.print(rfs[i].addr, HEX); Serial.print(" "); Serial.print(rfs[i].btn1, BIN); Serial.print(rfs[i].btn2, BIN); Serial.print(","); Serial.print(rfs[i].milisecs); Serial.println(); } reg = 0; } #endif}
…
#include <Servo.h>
//Cria objeto para controlar o servo base
Servo servo_base;
//Cria objeto para controlar o servo inclinacao
Servo servo_inclinacao;
int pino_x = A4; //Pino ligado ao X do joystick
int pino_y = A5; //Pino ligado ao Y do joystick
int val_x; //Armazena o valor do eixo X
int val_y; //Armazena o valor do eixo Y
void setup()
{
//Define a porta a ser ligada ao servo base
servo_base.attach(7);
//Define a porta a ser ligada ao servo inclinacao
servo_inclinacao.attach(8);
}
void loop()
{
//Recebe o valor do joystick, eixo X
val_x = analogRead(pino_x);
//Converte o valor lido para um valor entre 1 e 180 graus
val_x = map(val_x, 0, 1023, 1, 180);
//Move o servo base para a posicao definida pelo joystick
servo_base.write(val_x);
//Recebe o valor do joystick, eixo Y
val_y = analogRead(pino_y);
//Converte o valor lido para um valor entre 1 e 180 graus
val_y = map(val_y, 0, 1023, 1, 180);
//Move o servo inclinacao para a posicao definida pelo joystick
servo_inclinacao.write(val_y);
//Aguarda a movimentacao do servo e reinicia a leitura
delay(15);
}
tem como fazer isso que tu falou nele?…