Resultados da busca - %E3%80%90%E2%94%83%E5%B8%82%E5%9C%BA%E9%83%A82%E2%92%8F7%E2%92%8F01705%5B%E6%89%A3%5D%E3%80%91%E3%80%91%E6%81%92%E8%BE%BE%E5%BD%A9%E7%A5%A8%E5%B9%B3%E5%8F%B0%E5%AE%98%E6%96%B9%E7%BD%91%E7%AB%99
omento da leitura do cartão, os dados lidos sejam gravados/armazenados em uma variável para utilização em outra parte do código que estou projetando.
No código atual, o sistema adotado faz a leitura dos dados através de um FOR e já exibi diretamente, tanto via serial como via LCD, sem serem armazenados em uma serial.
Segue o código abaixo para aqueles que puderem dar suas sugestões.
#include <LiquidCrystal.h> #include <SPI.h> #include <MFRC522.h>
//Pinos Reset e SS módulo MFRC522 #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(6, 7, 5, 4, 3, 2);
#define pino_botao_le A2 #define pino_botao_gr A3
MFRC522::MIFARE_Key key; int modo_le = 0;
void setup(){ pinMode(pino_botao_le, INPUT); pinMode(pino_botao_gr, INPUT); Serial.begin(9600); //Inicia a serial SPI.begin(); //Inicia SPI bus mfrc522.PCD_Init(); //Inicia MFRC522
//Inicializa o LCD 16x2 lcd.begin(16, 2); mensageminicial();
//Prepara chave - padrao de fabrica = FFFFFFFFFFFFh for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF; }
void loop() { //Verifica se o botao modo leitura foi pressionado int modo_le = digitalRead(pino_botao_le); if (modo_le != 0) { lcd.clear(); Serial.println("Modo leitura selecionado"); lcd.setCursor(2, 0); lcd.print("Modo leitura"); lcd.setCursor(3, 1); lcd.print("selecionado"); while (digitalRead(pino_botao_le) == 1) {} delay(3000); modo_leitura(); } //Verifica se o botao modo gravacao foi pressionado int modo_gr = digitalRead(pino_botao_gr); if (modo_gr != 0) { lcd.clear(); Serial.println("Modo gravacao selecionado"); lcd.setCursor(2, 0); lcd.print("Modo gravacao"); lcd.setCursor(3, 1); lcd.print("selecionado"); while (digitalRead(pino_botao_gr) == 1) {} delay(3000); modo_gravacao(); } } void mensageminicial() { Serial.println("Selecione o modo leitura ou gravacao..."); Serial.println(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Selecione o modo"); lcd.setCursor(0, 1); lcd.print("leitura/gravacao"); }
void mensagem_inicial_cartao() { Serial.println("Aproxime o seu cartao do leitor..."); lcd.clear(); lcd.print(" Aproxime o seu"); lcd.setCursor(0, 1); lcd.print("cartao do leitor"); }
void modo_leitura() { mensagem_inicial_cartao(); Serial.println(""); //Aguarda cartao while ( ! mfrc522.PICC_IsNewCardPresent()) { delay(100); } if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Mostra UID na serial Serial.print("UID da tag : "); String conteudo = ""; byte letra; for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); conteudo.concat(String(mfrc522.uid.uidByte[i], HEX)); } Serial.println();
//Obtem os dados do setor 1, bloco 4 = Nome byte sector = 1; byte blockAddr = 4; byte trailerBlock = 7; byte status; byte buffer[34]; byte size = sizeof(buffer);
//Autenticacao usando chave A status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } //Mostra os dados do nome no Serial Monitor e LCD <=================================== Serial.print("NOME: "); lcd.clear(); lcd.setCursor(0, 0); for (byte i = 0; i < 16; i++) { Serial.print(char(buffer[i])); // <= Mostra os dados do cartão RFID via serial lcd.write(char(buffer[i])); // <= Mostra os dados do cartão RFID via LCD // <= GRAVAR EM UMA VARÍAVEL os dados do cartão RFID via LCD } Serial.print(nome); Serial.println();
//Obtem os dados do setor 0, bloco 1 = Sobrenome sector = 0; blockAddr = 1; trailerBlock = 3;
//Autenticacao usando chave A status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.print(mfrc522.GetStatusCodeName(status)); return; } status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.print(mfrc522.GetStatusCodeName(status)); } //Mostra os dados do CPF no Serial Monitor e LCD <====================================== Serial.print("CPF: "); lcd.setCursor(0, 1); for (byte i = 0; i < 16; i++) { Serial.print(char(buffer[i])); // <= Mostra os dados do cartão RFID via serial lcd.write(char(buffer[i])); // <= Mostra os dados do cartão RFID via LCD // <= GRAVAR EM UMA VARÍAVEL os dados do cartão RFID via LCD }
// Halt PICC mfrc522.PICC_HaltA(); // Stop encryption on PCD mfrc522.PCD_StopCrypto1(); delay(3000); Serial.println(""); Serial.println(""); mensageminicial(); }
void modo_gravacao() { mensagem_inicial_cartao(); //Aguarda cartao while ( ! mfrc522.PICC_IsNewCardPresent()) { delay(100); } if ( ! mfrc522.PICC_ReadCardSerial()) return;
//Mostra UID na serial Serial.print(F("UID do Cartao: ")); //Dump UID for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } //Mostra o tipo do cartao Serial.print(F("\nTipo do PICC: ")); byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType));
byte buffer[34]; byte block; byte status, len;
Serial.setTimeout(20000L) ; Serial.println(F("Digite o CPF do USUARIO,em seguida o caractere: #")); lcd.clear(); lcd.print("Digite o CPF"); lcd.setCursor(0, 1); lcd.print("em seguida o #"); len = Serial.readBytesUntil('#', (char *) buffer, 16) ; for (byte i = len; i < 16; i++) buffer[i] = ' ';
block = 1; //Serial.println(F("Autenticacao usando chave A...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; }
//Grava no bloco 1 status = mfrc522.MIFARE_Write(block, buffer, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; }
block = 2; //Serial.println(F("Autenticacao usando chave A...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; }
//Grava no bloco 2 status = mfrc522.MIFARE_Write(block, &buffer[16], 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; }
Serial.println(F("Digite o NOME do USUARIO, em seguida o caractere #")); lcd.clear(); lcd.print("Digite o NOME e"); lcd.setCursor(0, 1); lcd.print("em seguida o #"); len = Serial.readBytesUntil('#', (char *) buffer, 16); for (byte i = len; i < 16; i++) buffer[i] = ' '; block = 4; //Serial.println(F("Autenticacao usando chave A...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; }
//Grava no bloco 4 status = mfrc522.MIFARE_Write(block, buffer, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; }
block = 5; //Serial.println(F("Authenticating using key A...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; }
//Grava no bloco 5 status = mfrc522.MIFARE_Write(block, &buffer[16], 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status));return; } else { Serial.println(F("Dados gravados com sucesso!")); lcd.clear(); lcd.print("Gravacao OK!"); }
mfrc522.PICC_HaltA(); // Halt PICC mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD delay(5000); mensageminicial(); };
Segue também o esquema de montagem…
Adicionado por RuyterCB ao 21:38 em 15 outubro 2016
IR, tem um LM35 para mostrar a temperatura no visor do celular e um dimmer para iluminação. No entanto, estou tendo problema com um ruido na serial que trava o funcionamento do programa. Este ruido só acontece se eu deixo todos os comandos que controlam o home theater ativos (linhas entre os comandos "M" e "X"). Se eu comentar as linhas de 2 comandos, quaisquer que sejam, o programa funciona perfeitamente. Exemplo: se eu colocar em comentário as linhas dos códigos "N" e "O" o programa funciona. Se eu "descomentar" as linhas "N" e "O" e comentar as linhas "X" e "Y", o programa também funciona. Se eu "descomentar" todas as linhas aparece um ruido na serial que trava a execução do programa. Estava usando o SoftwareSerial para comunicar com o bluetooth, mas o programa estava se perdendo quando plugava a placa na energia para a operação do dimmer. Descobri aqui no fórum que o SoftwareSerial utiliza interrupções que conflitam com a interrupção do dimmer para o zero-crossing. Por este motivo optei em utilizar os pinos RxTx do garagino. Também tentei colocar as variáveis como #define para verificar se o problema não era memória, mas também não funcionou. Os comandos entre "A" e "E", padrão NEC, não interferem no funcionamento, estando comentados ou não. Alguém saberia me explicar por que ao comentar algumas linhas do o programa funciona normalmente?
Grato.
#include <IRremote.h>
char caractere;
//definições dimmerint ZERO = 2; // pino de interrupçãoint AC_LOAD = 9; // Output para o Triacvolatile int dimming = 100; // Dimming level (0-128) 0 = ON, 128 = OFFString ValorDimmer;
//definições do Receptor IRIRsend irsend; //objeto para enviar IR const int led = 8; // pino do led de indicação de funcionamento const int ledIR = 3; //pino do emissor IR
// comando TV LG - padrão NECint freqNEC = 32;long int TvLiga = 0x2FD48B7; //Along int TvChL = 0x2FDF807; long int TvChH = 0x2FDD827;long int TvVolL = 0x2FD7887; //Blong int TvVolH = 0x2FD58A7; //Clong int TvTimer = 0x2FDA857; //Dlong int TvMute = 0x2FD08F7; //E
// Comandos Oi Tv - padrão RC6int freqRC6 = 32;long int CaboLiga = 0x8072260C; //Flong int CaboChL = 0x8072261F; //Glong int CaboChH = 0x8072261E; //Hlong int CaboVolL = 0x80722611; //I long int CaboVolH = 0x80722610; //J
long int CaboIdioma = 0x8072A6A1; //Klong int CaboLegenda = 0x8072264B; //L
// Comando HOME THEATER LG - RAWint compr = 67;int freq = 36;//Munsigned int LgHtLiga[] = {4600,4300,750,350,750,350,750,1450,750,1500,700,400,750,1500,700,400,700,400,700,400,700,400,700,1550,700,1500,700,400,650,1600,550,600,500,600,500,600,500,1700,550,1700,500,1700,500,1700,550,600,500,600,500,600,500,1700,550,550,550,600,500,600,500,600,500,1700,550,1700,500,1700,550};//Nunsigned int LgHtVolL[] = {4500,4450,500,600,500,600,550,1700,500,1700,500,600,550,1650,550,600,500,600,500,600,500,600,550,1650,550,1700,500,600,500,1700,550,550,550,600,500,600,500,1700,550,1650,550,600,500,1700,550,550,550,550,550,550,550,1700,500,600,550,550,550,1700,500,600,500,1700,550,1650,550,1700,500};//Ounsigned int LgHtVolH[] = {4450,4500,500,600,500,600,500,1700,550,1700,500,600,500,1700,550,550,550,550,550,600,500,600,500,1700,550,1700,500,600,500,1700,500,600,550,550,550,1700,500,1700,550,1650,550,600,500,1700,500,600,550,550,550,550,550,600,500,600,500,600,500,1700,550,550,550,1700,500,1700,550,1650,550};//Punsigned int LgHtInput[] = {4600,4350,600,500,600,550,550,1650,550,1650,550,600,500,1700,550,550,550,550,550,600,500,600,500,1700,550,1650,550,600,500,1700,500,600,550,550,550,600,500,1700,500,600,500,1700,550,600,500,600,500,600,500,1700,550,1700,500,600,500,1700,550,550,550,1700,500,1700,550,1650,550,600,500};//Qunsigned int LgHtOpen[] = {4450,4500,500,600,500,600,500,1700,550,1700,500,600,500,1700,550,550,550,550,550,600,500,600,500,1700,550,1700,500,600,500,1700,500,600,550,550,550,600,500,1700,500,600,500,1700,550,1700,500,600,500,600,550,1650,550,1700,500,600,500,1700,550,550,550,600,500,1700,500,1700,550,550,550};//Runsigned int LgHtChL[] = {4500,4450,500,600,550,550,550,1700,500,1700,550,550,550,1700,500,600,500,600,500,600,550,550,550,1700,500,1700,500,600,550,1650,550,600,500,600,500,600,500,600,550,550,550,1700,500,600,500,1700,550,550,550,1700,500,1700,550,1650,550,1700,500,600,500,1700,550,550,550,1700,500,600,500};//Sunsigned int LgHtChH[] = {4450,4500,500,600,500,600,500,1700,550,1700,500,600,500,1700,550,550,550,550,550,600,500,600,500,1700,550,1650,550,600,500,1700,500,600,550,550,550,1700,500,600,500,600,550,1650,550,550,550,1700,500,600,500,1700,550,600,500,1700,500,1700,550,550,550,1700,500,600,500,1700,550,550,550};//Tunsigned int LgHtEnter[] = {4450,4450,550,600,500,600,500,1700,550,1700,500,600,500,1700,550,550,550,550,550,600,500,600,500,1700,550,1650,550,600,500,1700,500,600,550,550,550,550,550,1700,500,600,550,1650,550,600,500,1700,500,600,500,1700,550,1700,500,600,500,1700,550,550,550,1700,500,600,500,1700,550,550,550};//Uunsigned int LgHtPlay[] = {4450,4450,550,600,500,600,500,1700,550,1650,550,600,500,1700,500,600,550,550,550,550,550,600,500,1700,500,1700,550,600,500,1700,500,600,500,600,550,550,550,600,500,1700,500,600,500,600,550,550,550,600,500,600,500,1700,550,1650,550,600,500,1700,500,1700,550,1700,500,1700,500,1700,550};//Vunsigned int LgHtPause[] = {4450,4500,500,600,500,600,500,1700,550,1700,500,600,500,1700,550,550,550,600,500,600,500,600,500,1700,550,1650,550,600,500,1700,550,550,550,550,550,1700,500,1700,550,1650,550,1700,500,600,500,600,550,1650,550,600,500,600,500,600,500,600,550,550,550,1700,500,1700,550,550,550,1700,500};//Xunsigned int LgHtSkpL[] = {4450,4500,500,600,500,600,550,1700,500,1700,500,600,550,1650,550,600,500,600,500,600,500,600,550,1700,500,1700,500,600,500,1700,550,550,550,600,500,600,500,1700,550,1700,500,600,500,600,500,600,500,600,550,550,550,1700,500,600,500,600,550,1650,550,1700,500,1700,550,1700,500,1700,500};//Zunsigned int LgHtSkpH[] = {4450,4500,500,600,500,600,500,1700,550,1700,500,600,500,1700,550,550,550,550,550,600,500,600,500,1700,550,1650,550,600,500,1700,550,550,550,550,550,1700,500,1700,550,1650,550,600,500,600,500,600,500,600,550,550,550,600,500,600,500,600,500,1700,550,1700,500,1700,500,1700,550,1650,550};
//variaveis do temporizadorint savedTime;int totalTime = 0;
//variaveis leitura serialString bufferSerial = "";int numero; //contador para alterar a potencia do dimmer
void setup(){ Serial.begin(9600); //ir pinMode(led, OUTPUT); // saida led pinMode(ledIR ,OUTPUT); // saída do infravermelho //dimmer pinMode(ZERO, INPUT); pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output attachInterrupt(0, zero_crosss_int, RISING); //zero-crossing - interrupção numero = dimming; //inicializa a leitura da serial com o mesmo valor do dimming //inicia temporizador que atualiza temperatura savedTime = millis();}
void loop(){
//atualiza temperatura no intervalo de "totaltime" int passedTime = millis() - savedTime; if (passedTime > totalTime) { //temperatura LM35 int sum=0; for (int i = 0; i < 50; i++) sum += analogRead(A5); int media = (sum * 0.48875855) / 50; Serial.print(media); savedTime = millis(); // Save the current time to restart the timer! totalTime = 5000; //Seta para 5seg }
bufferSerial = ""; while (Serial.available()>0) {char c = Serial.read(); // Lê byte do buffer serial; bufferSerial.concat(c); // Concatena valores delay(5);if (c == '@') break; // se leu o caracter @ sai do loop. Este caracter é enviado pelo comando do celular }
if (bufferSerial.length()>0 && bufferSerial.length()<2) { //verifica se informação que chegou esta entre 1 e 2 caracteres (para futuras implementações) digitalWrite(led, HIGH); //acende o led indicador de envio de IR / comando
if (bufferSerial == "A"){irsend.sendNEC(TvLiga, freqNEC);} // código que sera enviado a tv para ligar if (bufferSerial == "B"){irsend.sendNEC(TvVolL, freqNEC);} // código que sera enviado a tv para diminuir o volume if (bufferSerial == "C"){irsend.sendNEC(TvVolH, freqNEC);}// código que sera enviado a tv para aumentar o volume if (bufferSerial == "D"){irsend.sendNEC(TvTimer, freqNEC);}// código que sera enviado a tv para timer if (bufferSerial == "E"){irsend.sendNEC(TvMute, freqNEC);}// código que sera enviado a tv para mute // código que sera enviado a o HT para ligar/desligar if (bufferSerial == "M"){ for (int i = 0; i < 3; i++){ irsend.sendRaw(LgHtLiga, compr, freq); delay(50);}} // código que sera enviado a o HT para baixar o volume if (bufferSerial == "N"){ for (int i = 0; i < 3; i++){ irsend.sendRaw(LgHtVolL, compr, freq); delay(50);}} // código que sera enviado a o HT para aumentar o volume if (bufferSerial == "O"){ for (int i = 0; i < 3; i++) { irsend.sendRaw(LgHtVolH, compr, freq); delay(50);}} // código que sera enviado a o HT para selecionar o source if (bufferSerial == "P"){ for (int i = 0; i < 3; i++){ irsend.sendRaw(LgHtInput, compr, freq); delay(50);}} // código que sera enviado a o HT para abrir o deck if (bufferSerial == "Q"){ for (int i = 0; i < 3; i++){ irsend.sendRaw(LgHtOpen, compr, freq); delay(50);}} // código que sera enviado a o HT para mudar de estação / seleção - if (bufferSerial == "R"){ for (int i = 0; i < 3; i++){ irsend.sendRaw(LgHtChL, compr, freq); delay(50);}} // código que sera enviado a o HT para mudar de estação / seleção + if (bufferSerial == "S"){ for (int i = 0; i < 3; i++) { irsend.sendRaw(LgHtChH, compr, freq); delay(50);}} // código que sera enviado a o HT como enter if (bufferSerial == "T"){ for (int i = 0; i < 3; i++){ irsend.sendRaw(LgHtEnter, compr, freq); delay(50);}} // código que sera enviado a o HT como play if (bufferSerial == "U"){ for (int i = 0; i < 3; i++){ irsend.sendRaw(LgHtPlay, compr, freq); delay(50);}} // código que sera enviado a o HT como pause if (bufferSerial == "V"){ for (int i = 0; i < 3; i++){ irsend.sendRaw(LgHtPause, compr, freq); delay(50);}} // código que sera enviado a o HT como skip - if (bufferSerial == "X"){ for (int i = 0; i < 3; i++){ irsend.sendRaw(LgHtSkpL, compr, freq); delay(50);}} // código que sera enviado a o HT como skip + if (bufferSerial == "Y"){ for (int i = 0; i < 3; i++){ irsend.sendRaw(LgHtSkpH, compr, freq); delay(50);}} }
//se o comando possui mais de 2 caracteres então é para o dimmer if (bufferSerial.length()>2){ bufferSerial.trim(); //elimina possiveis espaços if (bufferSerial.substring(0,2) == "#L") numero = numero+5; //incrementa contador do dimmer para diminuir potencia if (bufferSerial.substring(0,2) == "#H") numero = numero-5; //decrementa contador do dimmer para aumentar potencia if (numero >= 15 && numero <= 128) //se contador estiver abaixo ou acima dos limites do dimmer mantém a ultima leitura {dimming=numero;}else{dimming=dimming;} }
digitalWrite(led, LOW); //apaga o led indicador de envio de IR / comando }
// função disparada pelo zero-crossingvoid zero_crosss_int() { int dimtime = (65*dimming); // For 60Hz =>65 delayMicroseconds(dimtime); // Off cycle digitalWrite(AC_LOAD, HIGH); // triac firing delayMicroseconds(8.33); // triac On propogation delay 10ms for 60Hz use 8.33) digitalWrite(AC_LOAD, LOW); // triac Off}…
Adicionado por Fernando Souza ao 17:44 em 3 novembro 2014
eralmente em paredes, etc. Preciso incluir uma rotina para ler 2 sensores-chaves (micro-swiches) tipo bigode-de-gato, para que o robô saia desse "encosto". Produzí e tentei várias rotinas (uma já veio com o kit do robô, mas usando apenas uma chave), sem sucesso: Ou funcionam os motores+ultrassom, ou as chaves. Testei colocar a minha rotina em vários pontos do sketch. Atualmente dividi essa rotina para ver se funcionavam os dois sensores (2 chaves e o ultrassom). Não deu certo.
Abaixo cópia do sketch mais atual. Este tem 4 páginas em A4, sem espaços entre linhas. Vou copiar aqui é o sketch mesmo, tirado da IDE, ok?
//--------------- Programa JABUTINO sketch 20140510 ----------- #include
#include
//Instancia o objeto referente aos motores DC AF_DCMotor motorEsquerdo(1); //Motor esquerdo na conexão "M1"
AF_DCMotor motorDireito(2); //Motor direito na conexão "M2"
//Definições de velocidade em PWM de 0 a 255 const char VEL_MAX = 255;
const char VEL_MIN = 0;
const char VEL_MED = 200;
//Pinos para controle do Ultrassom HC-SR04 //usar as portas analógicas A0 e A1 como digitais
const int pinoTrigger = 14; // A0 = 14
const int pinoEcho = 15; // A1 = 15
//Servo Motor Servo meuServo;
const int pinoServo = 10; //o pino 10 é o pino de sinal da conexão "SERVO_2"
//Define as posições de calibragem do servo //Valores para conseguir um melhor alinhamento do servo, cada motor responde de forma diferente.
//Os valores devem variar de 0 a 180 graus, ajuste de acordo com seu motor na tentativa e erro.
const int OLHA_ESQ = 180; const int OLHA_DIR = 0;
const int OLHA_FRT = 90;
// Pino em que o BUZZER está conectado: const int pinoBuzzer = 9;
// PINOS que vão conectar as 2 CHAVES (sensores de colisão): const int ChaveE = 18;
const int ChaveD = 19;
//Método obrigatório //Realiza as definições dos pinos e faz a inicialização da biblioteca de servo.
void setup(void) {
// Inicializa os motores com velocidade máxima
motorEsquerdo.setSpeed(VEL_MAX);
motorDireito.setSpeed(VEL_MAX);
//atribui os pinos do ultrassom pinMode(pinoTrigger, OUTPUT);
pinMode(pinoEcho, INPUT);
Serial.begin(9600); /* função provisória, para controle da rotina das chaves.*/ /* define os pinos como entrada ligando um resistor pullup a eles */
pinMode(ChaveE, INPUT_PULLUP); // MUITO IMPORTANTE
pinMode(ChaveD, INPUT_PULLUP);
//inicia o Servo meuServo.attach(pinoServo);
//Coloca o servo virado para posicao frontal
meuServo.write(OLHA_FRT);
} // fim do setup //================================================
//Corpo principal do programa, repete infinitamente
void loop()
{
// Inicia andando para frente
andarpFrente(VEL_MAX);
// Faz a leitura dos sensores de CHAVES = colisão: int lerChaveE = digitalRead(ChaveE);
int lerChaveD = digitalRead(ChaveD);
//Enquanto não encontrar um obstáculo a menos de 10cm while(medeDistancia() > 10)
{
delay(100); //Faz uma leitura da distancia a cada 0,1 segundo
}
{ //imprime o valor chave Esq: if (lerChaveE == HIGH)
{ Serial.println("Esquerda");
tone(pinoBuzzer, 840); //envia um sinal de 740Hz para o pino 9 delay(100); //aguarda 0,1 segundo
noTone(pinoBuzzer); //interrompe o som no pino 9
girarpDireita(VEL_MED);
delay(500); //aguarda 1 segundo
}
else
// if (lerChaveD != lidoAntD)
{ // imprime o valor da chave Direita:
if (lerChaveD == HIGH)
{ Serial.println("Direita");
tone(pinoBuzzer, 840); //envia um sinal de 840Hz para o pino 9 delay(100); //aguarda 0,1 segundo
noTone(pinoBuzzer); //interrompe o som no pino 9
girarpEsquerda(VEL_MED);
delay(500); //aguarda 0,5 segundo
}
}
//Se encontrou um obstáculo recua por 1 segundo e pára
andarpTras(VEL_MED);
delay(1000);
pararMotores();
//Verifica qual lado tem maior distância até um obstáculo int esquerda = 0, direita = 0;
meuServo.write(OLHA_ESQ); //vira o servo para a esquerda delay(500); //aguarda o servo completar o movimento
esquerda = medeDistancia(); //mede a distância na esquerda
meuServo.write(OLHA_DIR); //vira o servo para a direita
delay(500); //aguarda o servo completar o movimento
direita = medeDistancia(); //mede a distância na direita meuServo.write(OLHA_FRT); //olha pra frente novamente
delay(500); //aguarda o servo completar o movimento
if(esquerda > direita) /*se a distancia do obstáculo na esquerda for maior que na direita vira para esquerda */
{
girarpEsquerda(VEL_MAX);
}
else /* se a distância do obstáculo na direita for maior ou igual que na esquerda
vira para a direita */
{
girarpDireita(VEL_MAX);
}
//Aguarda alguns instantes para o robô virar
delay(500); //<< modifique esse tempo se desejar que ele vire por mais ou menos tempo // Fim da rotina de obstáculos // Inicio da rotina das CHAVES / colisão: // ==> tirado daqui e dividido, para tentar o funcionamento.
// armazena o valor lido para monitorar as próximas mudanças: // lidoAntE = lerChaveE;
// lidoAntD = lerChaveD;
// aguarda minimamente para eliminar ruidos: delay(5);
int lerChaveE = LOW; // Garante que a chave Esq estará em LOW.
int lerChaveD = LOW; // Garante que a chave Dir estará em LOW.
}
// final da rotina das CHAVES
} // Fim do LOOP
//Utiliza o sensor de Ultrassom HC-SR04 para medir a distância em centímetros int medeDistancia()
{
//Garante que o pino de Trigger está LOW
digitalWrite(pinoTrigger, LOW);
delayMicroseconds(2);
//cria um pulso de 5 microssegundos no Trigger
digitalWrite(pinoTrigger, HIGH);
delayMicroseconds(5);
digitalWrite(pinoTrigger, LOW);
//aguarda o echo long microssegundos = pulseIn(pinoEcho, HIGH);
// A velocidade do som é 340 m/s ou aproximadamente 29 microssegundos por centimetro.
// O pulso faz uma viagem de ida e volta do sensor até o obstáculo
// assim, para calcular a distancia temos que dividir esse tempo pela metade
// desta forma...
return int(microssegundos / 29 / 2);
} // Fim do CalcularDistancia
// ======== void's dos motores: =============
//Gira as duas rodas para frente //Como os motores estão virados para lados opostos eles devem
//girar em sentidos opostos para que as rodas girem na mesma direção
void andarpFrente(char velocidade) {
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(FORWARD);
motorDireito.run(BACKWARD);
}
//Gira as duas rodas para trás //Como os motores estão virados para lados opostos eles devem
//girar em sentidos opostos para que as rodas girem na mesma direção
void andarpTras(char velocidade)
{
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(BACKWARD);
motorDireito.run(FORWARD);
}
//Gira as duas rodas em sentido inverso, girando no próprio eixo void girarpEsquerda (char velocidade)
{
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(BACKWARD);
motorDireito.run(BACKWARD);
}
//Gira as duas rodas em sentido inverso, girando no próprio eixo void girarpDireita(char velocidade)
{
motorEsquerdo.setSpeed(velocidade);
motorDireito.setSpeed(velocidade);
motorEsquerdo.run(FORWARD);
motorDireito.run(FORWARD);
}
//Pára os motores definindo os dois pinos Enable em estado Low void pararMotores()
{
motorEsquerdo.run(RELEASE);
motorDireito.run(RELEASE);
}…
eralmente em paredes, etc. Preciso incluir uma rotina para ler 2 sensores-chaves (micro-swiches) tipo bigode-de-gato, para que o robô saia desse "encosto". Produzí e tentei várias rotinas (uma já veio com o kit do robô, mas usando apenas uma chave), sem sucesso: Ou funcionam os motores+ultrassom, ou as chaves. Testei colocar a minha rotina em vários pontos do sketch. Atualmente dividi essa rotina para ver se funcionavam os dois sensores (2 chaves e o ultrassom). Não deu certo. Abaixo cópia do sketch mais atual. Este tem 4 páginas em A4, sem espaços entre linhas. Vou copiar aqui é o sketch mesmo, tirado da IDE, ok?
//--------------- Programa JABUTINO sketch 20140510 ----------- #include #include
//Instancia o objeto referente aos motores DC AF_DCMotor motorEsquerdo(1); //Motor esquerdo na conexão "M1" AF_DCMotor motorDireito(2); //Motor direito na conexão "M2"
//Definições de velocidade em PWM de 0 a 255 const char VEL_MAX = 255; const char VEL_MIN = 0; const char VEL_MED = 200;
//Pinos para controle do Ultrassom HC-SR04 //usar as portas analógicas A0 e A1 como digitais const int pinoTrigger = 14; // A0 = 14 const int pinoEcho = 15; // A1 = 15
//Servo Motor Servo meuServo; const int pinoServo = 10; //o pino 10 é o pino de sinal da conexão "SERVO_2"
//Define as posições de calibragem do servo //Valores para conseguir um melhor alinhamento do servo, cada motor responde de forma diferente. //Os valores devem variar de 0 a 180 graus, ajuste de acordo com seu motor na tentativa e erro.
const int OLHA_ESQ = 180; const int OLHA_DIR = 0; const int OLHA_FRT = 90;
// Pino em que o BUZZER está conectado: const int pinoBuzzer = 9;
// PINOS que vão conectar as 2 CHAVES (sensores de colisão): const int ChaveE = 18; const int ChaveD = 19;
//Método obrigatório //Realiza as definições dos pinos e faz a inicialização da biblioteca de servo.
void setup(void) { // Inicializa os motores com velocidade máxima motorEsquerdo.setSpeed(VEL_MAX); motorDireito.setSpeed(VEL_MAX);
//atribui os pinos do ultrassom pinMode(pinoTrigger, OUTPUT); pinMode(pinoEcho, INPUT);
Serial.begin(9600); /* função provisória, para controle da rotina das chaves.*/ /* define os pinos como entrada ligando um resistor pullup a eles */ pinMode(ChaveE, INPUT_PULLUP); // MUITO IMPORTANTE pinMode(ChaveD, INPUT_PULLUP);
//inicia o Servo meuServo.attach(pinoServo); //Coloca o servo virado para posicao frontal meuServo.write(OLHA_FRT);
} // fim do setup //================================================ //Corpo principal do programa, repete infinitamente void loop() { // Inicia andando para frente andarpFrente(VEL_MAX);
// Faz a leitura dos sensores de CHAVES = colisão: int lerChaveE = digitalRead(ChaveE); int lerChaveD = digitalRead(ChaveD);
//Enquanto não encontrar um obstáculo a menos de 10cm while(medeDistancia() > 10) { delay(100); //Faz uma leitura da distancia a cada 0,1 segundo }
{ // chave Esq: if (lerChaveE == HIGH) { Serial.println("Esquerda");
tone(pinoBuzzer, 840); //envia um sinal de 740Hz para o pino 9 delay(100); //aguarda 0,1 segundo noTone(pinoBuzzer); //interrompe o som no pino 9 girarpDireita(VEL_MED); delay(500); //aguarda 1 segundo } else { // chave Direita: if (lerChaveD == HIGH) { Serial.println("Direita");
tone(pinoBuzzer, 840); //envia um sinal de 840Hz para o pino 9 delay(100); //aguarda 0,1 segundo noTone(pinoBuzzer); //interrompe o som no pino 9 girarpEsquerda(VEL_MED); delay(500); //aguarda 0,5 segundo } } //Se encontrou um obstáculo recua por 1 segundo e pára andarpTras(VEL_MED); delay(1000); pararMotores();
//Verifica qual lado tem maior distância até um obstáculo int esquerda = 0, direita = 0;
meuServo.write(OLHA_ESQ); //vira o servo para a esquerda delay(500); //aguarda o servo completar o movimento esquerda = medeDistancia(); //mede a distância na esquerda meuServo.write(OLHA_DIR); //vira o servo para a direita delay(500); //aguarda o servo completar o movimento
direita = medeDistancia(); //mede a distância na direita meuServo.write(OLHA_FRT); //olha pra frente novamente delay(500); //aguarda o servo completar o movimento
if(esquerda > direita) /*se a distancia do obstáculo na esquerda for maior que na direita vira para esquerda */ { girarpEsquerda(VEL_MAX); } else /* se a distância do obstáculo na direita for maior ou igual que na esquerda vira para a direita */ { girarpDireita(VEL_MAX); } //Aguarda alguns instantes para o robô virar delay(500); // modifique esse tempo se desejar que ele vire por mais ou menos tempo // Fim da rotina de obstáculos
// Inicio da rotina das CHAVES / colisão: // ==> tirado daqui e dividido, para tentar o funcionamento.
// aguarda minimamente para eliminar ruidos:
delay(5); int lerChaveE = LOW; // Garante que a chave Esq estará em LOW. int lerChaveD = LOW; // Garante que a chave Dir estará em LOW. } // final da rotina das CHAVES
} // Fim do LOOP
//Utiliza o sensor de Ultrassom HC-SR04 para medir a distância em centímetros int medeDistancia() { //Garante que o pino de Trigger está LOW digitalWrite(pinoTrigger, LOW); delayMicroseconds(2); //cria um pulso de 5 microssegundos no Trigger digitalWrite(pinoTrigger, HIGH); delayMicroseconds(5); digitalWrite(pinoTrigger, LOW);
//aguarda o echo long microssegundos = pulseIn(pinoEcho, HIGH); // A velocidade do som é 340 m/s ou aproximadamente 29 microssegundos por centimetro. // O pulso faz uma viagem de ida e volta do sensor até o obstáculo // assim, para calcular a distancia temos que dividir esse tempo pela metade // desta forma... return int(microssegundos / 29 / 2); } // Fim do CalcularDistancia
// ======== void's dos motores: =============
//Gira as duas rodas para frente //Como os motores estão virados para lados opostos eles devem //girar em sentidos opostos para que as rodas girem na mesma direção
void andarpFrente(char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(FORWARD); motorDireito.run(BACKWARD); }
//Gira as duas rodas para trás //Como os motores estão virados para lados opostos eles devem //girar em sentidos opostos para que as rodas girem na mesma direção void andarpTras(char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(BACKWARD); motorDireito.run(FORWARD); }
//Gira as duas rodas em sentido inverso, girando no próprio eixo void girarpEsquerda (char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(BACKWARD); motorDireito.run(BACKWARD); }
//Gira as duas rodas em sentido inverso, girando no próprio eixo void girarpDireita(char velocidade) { motorEsquerdo.setSpeed(velocidade); motorDireito.setSpeed(velocidade); motorEsquerdo.run(FORWARD); motorDireito.run(FORWARD); }
//Pára os motores definindo os dois pinos Enable em estado Low void pararMotores() { motorEsquerdo.run(RELEASE); motorDireito.run(RELEASE); }…
e PVC super leve e as partes internas das pinças possuem material antideslizante.
Especificações
Tensão nominal: 12V DC
Faixa de tensão operacional: 5V - 12V DC
Corrente nominal: 450mA
Corrente de "stall": 1700mA
Peso da garra: 0,05kg
Velocidade da garra (de fechada para totalmente aberta): 1 segundo
Carga máxima suportável: 0,6kg
Algumas informações foram obtidas da página oficial do produto e também da embalagem do mesmo.
Divertindo-se
Inicialmente fiz alguns testes usando o aplicativo da Makeblock rodando em um smartphone com Android, conectado via bluetooth à placa mCore, que é a controladora do robô mBot.
Para testar a garra de uma maneira mais divertida, fiz um braço simples com dois graus de liberdade mais a garra.
A montagem inclui uma base feita de MDF, perfis e suportes de alumínio e peças da Makeblock.
O braço é controlado por um controle sem fio de PlayStation 2 e uma placa Arduino.
Usarei este método para controlar remotamente o MDi #4.
Informações adicionais
http://mech-dickel.blogspot.com.br/2016/02/makeblock-robot-gripper-unboxing-and.html - Postagem em meu blog com o mesmo conteúdo, mas em inglês.…