Escolar Documentos
Profissional Documentos
Cultura Documentos
Hackatronics
Usando um
Escudo multifuncional do Arduino
Quando eu tinha uns 10 anos, meus pais compraram para mim um computador C64, e logo eu estava aprendendo
a conectar alguns componentes básicos e sensores ao seu joystick e portas paralelas para tentar fazer algumas
coisas interessantes. Isso foi em 1983. Em uma ocasião, consegui fritar este computador de £ 350 enquanto soldava
um fio que estava conectado a uma porta quando foi ligado.
Felizmente, consertei o C64 a um custo mínimo, mas não tente fazer algo assim sozinho.
Hoje, a linha de microcontroladores Raspberry Pi e Arduino é uma ótima maneira de começar a aprender a escrever código que se conecta
com o mundo exterior. Além disso, existem inúmeros add-ons eletrônicos com componentes já embutidos neles, prontos para serem
utilizados com um pouco de código. Um desses complementos é um escudo Arduino multifuncional disponível a baixo custo em
fornecedores da Internet, sendo um deles o Hobby Components:
E/S simples que geralmente são consideradas normais em PCs, como ler teclas pressionadas, enviar para
uma tela e soar um alarme, muitas vezes atrapalham o foco da tarefa principal ao desenvolver para microcontroladores.
É por esta razão que desenvolvi uma biblioteca para este escudo multifuncional que simplifica as operações de E/
S básicas e mundanas. Também forneço um conjunto de aplicativos do mundo real que fazem uso dessa biblioteca
como parte de uma série de codificação, para que os novatos em codificação no Arduino possam experimentá-
los e aprimorá-los. Bem, foi assim que aprendi a programar há tantos anos.
Presume-se alguma familiaridade com a plataforma Arduino, assim como a instalação do ambiente de
desenvolvimento Arduino . um vídeo de demonstração de alguns dos aplicativos do Arduino está disponível no meu
site.
Você pode baixar a biblioteca de escudos multifuncionais no link abaixo e instalá-la como uma biblioteca .zip,
consultando as instruções no link acima:
Se, por algum motivo, você não tiver conseguido instalar nenhuma das bibliotecas, faça o download deste pacote
de bibliotecas em vez disso, descompacte e copie para a pasta Documents\Arduino\libraries (se estiver
usando o Windows) ou sistema operacional equivalente. Embora façamos tudo para garantir que nossos
downloads estejam livres de vírus e malware, verifique se o software de verificação de vírus e malware está
atualizado com antecedência.
Devo salientar que, ao seguir a série Hackatronics, você concorda em fazê-lo por sua conta e risco e concorda em
assumir total responsabilidade por qualquer perda ou dano que possa incorrer em si mesmo ou em outros. Se você
é uma criança começando, certifique-se de ter a supervisão de um adulto responsável.
Página 3 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
2. Sensores de leitura 3.
Aplicações no mundo real
A Parte 1 demonstra a facilidade com que os botões multifuncionais, o bipe e o visor do escudo podem ser utilizados usando
a biblioteca de escudos, facilitando assim a concentração na lógica do aplicativo.
A Parte 2 demonstra como a biblioteca shield pode ser usada para ler valores de sensores externos, como temperatura, sonar e
sensores de movimento, e como processar pulsos eletrônicos de um sensor externo
fonte.
• Despertador de 24 horas •
Monitor cardíaco • – (requer sensor de pulso cardíaco)
Contador regressivo •
Cada um deles tem um escopo a ser construído e expandido, mas deixo isso para você.
Página 4 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
Esta é a primeira parte da série Applied Hackatronics para o escudo multifuncional do Arduino, que mostra como usar a
biblioteca de escudos para acessar os botões, campainha e visor do escudo multifuncional.
Se ainda não o fez, você precisará baixar o código-fonte e instalar as bibliotecas usando os links na introdução.
Ao seguir a série Hackatronics, você concorda em fazê-lo por sua conta e risco e concorda em assumir total
responsabilidade por qualquer perda ou dano que possa incorrer em si mesmo ou em outros.
void setup() {
// coloque seu código de configuração aqui, para executar uma vez:
Timer1.initialize();
MFS.initialize(&Timer1); // inicializa a biblioteca de escudo multifuncional
// OBSERVAÇÃO o controle de bipe é executado em segundo plano, ou seja, beep() não bloqueia.
atraso(1000);
void setup() {
Página 5 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
if (btn) {
Serial.print("BUTTON_");
Serial.write(buttonNumber + '0'); Serial.print("_");
if (buttonAction == BUTTON_PRESSED_IND) {
Serial.println("PRESSED");
Serial.println("SHORT_RELEASE");
Serial.println("LONG_PRESSED");
Serial.println("LONG_RELEASE");
}
}
}
void setup() {
// coloque seu código de configuração aqui, para executar uma vez:
Timer1.initialize();
MFS.initialize(&Timer1); // inicializa a biblioteca de escudo multifuncional
MFS.write("Olá");
atraso(2000);
MFS.write(-273);
atraso(2000);
MFS.write(3.141, 2); // exibe com 2 casas decimais. atraso(2000);
Página 6 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
MFS.write((int)counter); contador++;
} else if (!terminado) {
terminou = verdadeiro;
MFS.write("Fim");
MFS.blinkDisplay(DIGIT_ALL, ON);
} atraso(50);
}
void setup() {
// coloque seu código de configuração aqui, para executar uma vez:
Timer1.initialize();
MFS.initialize(&Timer1); // inicializa a biblioteca de escudo multifuncional
MFS.blinkLeds(LED_ALL, OFF);
MFS.writeLeds(LED_ALL, OFF);
}
void setup() {
// coloque seu código de configuração aqui, para executar uma vez:
Timer1.initialize();
Página 7 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
MFS.write(analogRead(POT_PIN));
atraso(100);
}
Todos os exemplos de código e aplicativos foram testados e funcionam. Se você tiver alguma dificuldade,
deixe um comentário e entrarei em contato com você o mais rápido possível.
Página 8 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
Esta é a segunda parte da série Applied Hackatronics para o escudo multifuncional do Arduino e mostra como
a biblioteca de escudo multifuncional pode ser usada para ler valores de sensores externos, como temperatura,
sonar e sensores de movimento, e como processar componentes eletrônicos pulsos de uma fonte externa. Se
ainda não o fez, você precisará baixar o código-fonte e instalar as bibliotecas usando os links na introdução.
Ao seguir a série Hackatronics, você concorda em fazê-lo por sua conta e risco e concorda em assumir total
responsabilidade por qualquer perda ou dano que possa incorrer em si mesmo ou em outros.
Contagem de pulsos
A biblioteca shield multifuncional tem suporte para contagem de pulsos (até 500 Hz) aplicados a um pino de
entrada do Arduino. A contagem de pulsos é gerenciada em segundo plano por meio de interrupções, o que
permite que seu aplicativo se concentre na execução de sua tarefa principal. Depois de carregar este esboço,
pressione repetidamente o botão 1 para gerar os pulsos e veja uma leitura da taxa de pressão no visor de dígitos.
void setup() {
// coloque seu código de configuração aqui, para executar uma vez:
Timer1.initialize();
MFS.initialize(&Timer1); // inicializa a biblioteca de escudo multifuncional
MFS.initPulseInCounter( BUTTON_1_PIN, //
use o botão 1 como meio de gerar pulsos. 1500, // o número de milissegundos para aguardar um pulso, antes
de redefinir o pulso no período para 0.
if (pulsePeriodMs == 0) {
MFS.write(0.0, 1);
} outro
{
MFS.write(1000.0 / pulsePeriodMs, 1); // calcula pulsos por segundo. Exibir até 1 casa decimal.
}
}
Página 9 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
// NOTA: certifique-se de que o jumper J1 foi removido da blindagem e que o LM35 foi inserido corretamente.
void setup() {
// coloque seu código de configuração aqui, para executar uma
vez: Timer1.initialize();
MFS.initialize(&Timer1); // inicializa a biblioteca de escudo multifuncional
void loop() { //
coloque seu código principal aqui, para executar repetidamente:
atraso(100);
}
Página 10 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
void setup() {
// coloque seu código de configuração aqui, para executar uma vez:
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
Timer1.initialize();
MFS.initialize(&Timer1); // inicializa a biblioteca de escudo multifuncional
void loop() { //
coloque seu código principal aqui, para executar repetidamente:
MFS.write((int)MFS.getSonarDataCm(TrigPin, EchoPin));
atraso(100);
}
#define _SOFTI2C_H
#include <SoftI2CMaster.h> #include
<Wire.h> #include
<TimerOne.h> #include
<MultiFuncShield.h>
#define SOFTWARE_I2C
MPU6050 MPU;
void displayHeading(modo byte);
void setup()
{ Serial.begin(9600);
Página 11 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
// Uno e Leonardo, use o pino 5 para SCL e 6 para SDA. Mega2560, use o pino A5 para
SDA.
SoftI2C1.initialize();
MPU.initialize(&SoftI2C1, MPU_DEFAULT_ADDRESS << 1); #else // Usa hardware I2C
Wire.begin(); I2C1.initialize(&Wire);
MPU.initialize(&I2C1,
MPU_DEFAULT_ADDRESS); #fim se
MFS.initialize(&Timer1); MFS.write("Acc");
exibirValues = !displayValues;
if (valores de exibição) {
displayHeading(displayMode);
} outro
{
MFS.write("Desligado");
}
}
if (valores de exibição) {
displayMode++;
if (displayMode == 3) {
displayMode = 0;
}
displayHeading(displayMode);
}
if (displayMode == 0) {
} else if (displayMode == 1) {
Página 12 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
Serial.print("\t");
Serial.print((float)MPU.gyro_Y_Raw / MPU.gyroScaleValue); Serial.print("\t");
Serial.print((float)MPU.gyro_Z_Raw /
MPU.gyroScaleValue); Serial.print("\t\n");
} else if (displayMode == 2) {
atraso(50);
}
if (modo == 0) {
} else if (modo == 1) {
} else if (modo == 2) {
}
}
Todos os exemplos de código e aplicativos foram testados e funcionam. Se você tiver alguma dificuldade,
deixe um comentário e entrarei em contato com você o mais rápido possível.
Página 13 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
Esta é a terceira parte da série Applied Hackatronics para o escudo multifuncional do Arduino e explora os aplicativos
de trabalho usando a biblioteca e o escudo multifuncional. Se ainda não o fez, você precisará baixar o código-fonte e instalar
as bibliotecas usando os links na introdução.
Para cada um dos aplicativos abaixo, há um vídeo on-line que acompanha, bem como um vídeo resumo.
Ao seguir a série Hackatronics, você concorda em fazê-lo por sua conta e risco e concorda em assumir total
responsabilidade por qualquer perda ou dano que possa incorrer em si mesmo ou em outros.
Este cronômetro de contagem regressiva é semelhante a um cronômetro de contagem regressiva que você pode encontrar
em um forno de micro-ondas. Você define o tempo, inicia a contagem regressiva e, quando chega a zero, o
alarme soa. Você pode pausar/continuar o cronômetro e redefinir para zero. Use os botões 2 e 3 do escudo multifuncional
para definir os minutos e os segundos. Um toque curto no botão 1 inicia ou para o cronômetro e um toque longo o redefine.
Possíveis melhorias para este aplicativo são ter um dispositivo ligado apenas enquanto o cronômetro está em contagem
regressiva.
enum CountDownModeValues
{
COUNTING_STOPPED,
CONTAGEM
};
void setup() {
// coloque seu código de configuração aqui, para executar uma vez:
Timer1.initialize();
MFS.initialize(&Timer1); MFS.write(0); // inicializa a biblioteca de escudo multifuncional
Serial.begin(9600);
}
// inicia o cronômetro
countDownMode = COUNTING;
Página 14 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
// redefine o cronômetro
décimos = 0;
segundos = 0;
minutos = 0;
MFS.write(minutos*100 + segundos);
minutos++; if
(minutos > 60) {
minutos = 0;
}
MFS.write(minutos*100 + segundos);
segundos += 10; if
(segundos >= 60) {
segundos = 0;
}
MFS.write(minutos*100 + segundos);
} quebrar;
CONTAGEM de casos:
if (btn == BUTTON_1_SHORT_RELEASE || btn == BUTTON_1_LONG_RELEASE) {
// para o cronômetro
countDownMode = COUNTING_STOPPED;
} outro
{
// continua contando décimos++;
if (décimos == 10) {
décimos = 0;
segundos--;
segundos = 59;
minutos--;
}
MFS.write(minutos*100 + segundos);
} atraso(100);
} quebrar;
}
}
Despertador 24 horas
Página 15 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
Este aplicativo demonstra um relógio digital com capacidade de alarme. Quando o Arduino é ligado, o
display do escudo multifuncional pisca até que o usuário defina a hora. Segure o botão 1 para definir a hora
ou o alarme. Ao definir a hora, use o botão 3 para definir a hora ou os minutos. Pressione o botão 2 para
visualizar a hora do alarme ou cancelar o alarme se estiver em andamento. Segurar o botão 3 ativa ou desativa
o alarme (LED1 indica que o alarme está ativado). Possíveis aprimoramentos para este aplicativo são ter um
recurso de soneca ou vários períodos de ligar/desligar durante o dia para um dispositivo.
/*
botão 1 : segure para definir a hora ou o alarme
botão 2 : pressione para ver a hora do alarme ou cancelar o alarme se estiver em andamento :
botão 3 incrementa hora / minuto ao definir a hora (de alarme). Segure para alternar
configuração de alarme.
enum displayModeValues {
MODE_CLOCK_TIME,
MODE_CLOCK_TIME_SET_HOUR,
MODE_CLOCK_TIME_SET_MINUTE,
MODE_ALARM_TIME,
MODE_ALARM_TIME_SET_HOUR,
MODE_ALARM_TIME_SET_MINUTE };
Timer1.initialize();
MFS.userInterrupt = clockISR;
MFS.initialize(&Timer1);
MFS.blinkDisplay(DIGIT_ALL); //
MFS.beep(500);
}
loop void() {
switch (displayMode) {
caso MODE_CLOCK_TIME:
displayTime(relógioHoras, relógioMinutos);
Página 16 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
if (btn == BUTTON_2_PRESSED) {
MFS.blinkDisplay(DIGIT_ALL, OFF);
MFS.blinkDisplay(DIGIT_1 | DIGIT_2); displayMode =
MODE_CLOCK_TIME_SET_HOUR; clockAtivado = false;
clockMilliSeconds = 0;
clockSegundos = 0;
alarmeTogglePressed = verdadeiro;
alarmEnabled = !alarmEnabled;
MFS.writeLeds(LED_1, alarmEnabled);
alarmeTogglePressed = false;
} quebrar;
caso MODE_CLOCK_TIME_SET_HOUR:
if (btn == BUTTON_1_PRESSED) {
clockHoras++; if
(relógioHoras >= 24) {
clockHoras = 0;
} displayTime(relógioHoras, relógioMinutos);
} quebrar;
clockMinutos++; if
(relógioMinutos >= 60) {
clockMinutos = 0;
} displayTime(relógioHoras, relógioMinutos);
} quebrar;
caso MODE_ALARM_TIME:
displayTime(alarmHours,alarmMinutes);
displayMode = MODE_CLOCK_TIME;
Página 17 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
MFS.blinkDisplay(DIGIT_ALL, OFF);
MFS.blinkDisplay(DIGIT_1 | DIGIT_2); displayMode =
MODE_ALARM_TIME_SET_HOUR; alarmeAtivado = false;
} quebrar;
caso MODE_ALARM_TIME_SET_HOUR:
if (btn == BUTTON_1_PRESSED) {
AlarmHours++; if
(alarmHours >= 24) {
horaalarme = 0;
} displayTime(alarmHours, alarmMinutes);
} quebrar;
alarmeMinutos++; if
(minutos de alarme >= 60) {
alarmeMinutos = 0;
} displayTime(alarmHours, alarmMinutes);
} quebrar;
}
}
tempo de char[5];
clockMilliSeconds++; if
(clockMilliSeconds >= 1000) {
clockMilliSeconds = 0;
clockSeconds++; if
(clockSeconds >= 60) {
clockSegundos = 0;
Página 18 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
clockMinutos++; if
(relógioMinutos >= 60) {
clockMinutos = 0;
clockHoras++; if
(relógioHoras >= 24) {
clockHoras = 0;
}
}
// Se a hora atual coincidir com a hora do alarme e o alarme estiver ativado, acione
o alarme.
if (alarmEnabled && (clockMinutes == alarmMinutes) && (clockHours == alarmHours)) {
MFS.beep(
10, // no período 5, // no
período off 4, // número de
ciclos 100, // número de ciclos de loop
50 // atraso entre os ciclos de loop );
}
}
}
}
}
Monitor cardíaco
Depois de ligar o Arduino, gentilmente, mas com firmeza, coloque o dedo indicador no sensor e aguarde o
visor começar a piscar. Isso indica que o sensor foi normalizado, após o que o visor do escudo mostrará as
batidas por minuto e o bipe soará. Se o display permanecer em 0 e não piscar após alguns segundos,
retire o dedo, espere um pouco e tente novamente. Certifique-se de que o dedo seja colocado com
pressão consistente.
A possível modificação para esta aplicação é ter uma luz de LED sincronizada com cada batimento cardíaco.
Página 19 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
void setup() {
// coloque seu código de configuração aqui, para executar uma vez:
Timer1.initialize();
MFS.initialize(&Timer1);
initializeSensorReading(); //Serial.begin(9600);
loop void() {
if (MFS.getTimer() == 0) {
initializeSensorReading();
}
} else if (sensorValue > (3 * 1024) / 5) // o valor está aumentando, então deve ser o início de um pulso. {
if (!pulseDetectado) {
pulsoDetetado = verdadeiro;
if (lastPulseTime == -1) {
lastPulseTime = MFS.getTimer();
} outro
{
int pulsePeriod = lastPulseTime - MFS.getTimer(); // calcula o tempo entre os pulsos em milissegundos.
lastPulseTime = MFS.getTimer();
se (bpm < 45 || bpm > 230) o buffer de // bpm está fora do intervalo aceitável, então claro
dados. {
initializeSensorReading();
} outro
{
// bpm está dentro do intervalo, mas ainda precisa calcular a média.
dados[dataIdx++] = bpm;
if (dataIdx >= 4) {
dataIdx = 0;
}
Página 20 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
if (data[0] && data[1] && data[2] && data[3]) // verifica se o buffer de dados
está cheio antes de calcular avg bpm.
{
int avgBpm = (dados[0] + dados[1] + dados[2] + dados[3]) / 4;
} outro
{
// buffer não está cheio, então pisque o display.
MFS.blinkDisplay(DIGIT_ALL, ON);
}
}
}
}
} else if (sensorValue < (1024 / 2)) // o valor está caindo, então deve ser o fim do pulso. {
//Serial.println(sensorValue); //atraso(10);
últimoPulseTime = 0;
dados[i] = 0;
}
MFS.write(0);
MFS.blinkDisplay(DIGIT_ALL, OFF);
}
O aplicativo indicador de inclinação de superfície usa o sensor de movimento MPU6050 para determinar o
ângulo de inclinação de uma superfície plana. Você precisará baixar o código-fonte completo antes de fazer o
upload para o Arduino. Como a aplicação utiliza software I2C, ao utilizar placas R3 Uno e Leonardo, utilize o
pino 5 para SCL e 6 para SDA. Para Mega2560, use o pino 5 para SCL e o pino A5 para SDA.
Depois de ligar o Arduino, coloque o sensor de movimento em uma superfície o mais nivelada possível e
pressione e segure o botão 1 no escudo multifuncional. O LED 1 pisca enquanto o sensor é calibrado.
Depois disso, colocando o sensor de movimento em superfícies inclinadas, o escudo exibirá o ângulo de
inclinação.
Atualmente, a inclinação é exibida apenas para um único eixo, mas o aplicativo pode ser modificado para
mostrar a inclinação para um eixo adicional.
Página 21 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
#define SOFTWARE_I2C
void calibrar();
MPU6050 MPU;
void setup() {
// coloque seu código de configuração aqui, para executar uma vez:
Timer1.initialize();
Wire.begin(); I2C1.initialize(&Wire);
MPU.initialize(&I2C1,
MPU_DEFAULT_ADDRESS,
ACCEL_FS_2, GYRO_FS_250, DLPF_BW_5); #fim se
MFS.initialize(&Timer1);
}
if (btn == BUTTON_1_LONG_PRESSED) {
calibrar();
}
MPU.getAccelRaw();
MPU.accel_X_Raw -= xOffset;
MPU.accel_Y_Raw -= yOffset;
ângulo de flutuação;
if (MPU.accel_Z_Raw == 0) {
ângulo = 90;
} outro
{
ângulo = atan((float)MPU.accel_Y_Raw / (MPU.accel_Z_Raw * zScaleOffset)) *
radToDeg; // calcula para o eixo y
//ângulo = atan((float)MPU.accel_X_Raw / (MPU.accel_Z_Raw * zScaleOffset)) * radToDeg; }
// calcula para o eixo X
Página 22 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
void calibrar() {
MFS.write(" ");
MFS.writeLeds(LED_1, ON);
MFS.blinkLeds(LED_1, ON);
MPU.getAccelRaw(); atraso(10);
MPU.getAccelRaw(); xValues[i]
= MPU.accel_X_Raw; yValues[i] =
MPU.accel_Y_Raw; zValues[i] =
MPU.accel_Z_Raw; atraso(300);
MFS.blinkLeds(LED_1, OFF);
// limpa o buffer do botão de entrada lendo-o e descartando o valor. for (int i=0; i<10; i++) {
MFS.getButton();
}
}
sonar ranger
O aplicativo sonar ranger usa o módulo de sonar HC SR04 para medir a distância entre o módulo e um
objeto sólido de até 5 metros de distância. Esta aplicação funciona de forma semelhante ao sensor de
obstáculos de alguns veículos para auxiliar o condutor nas manobras de estacionamento. Conforme um
obstáculo se aproxima do módulo do sonar, o bipe soa em intervalos cada vez mais curtos. O botão 1 do
escudo é usado para ativar ou desativar o módulo de sonar.
Os pinos de disparo e eco do módulo de sonar são conectados aos pinos 5 e 6 do Arduino, respectivamente,
que são expostos na blindagem multifuncional. Depois de ligar o Arduino, coloque um objeto sólido a
diferentes distâncias do módulo sonar.
enum sonarModeValues
{
MODE_SONAR_OFF,
MODE_SONAR_ON };
void setup()
Página 23 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
{
//Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
Timer1.initialize();
MFS.initialize(&Timer1); MFS.write("off");
loop void() {
switch (sonarMode) {
caso MODE_SONAR_OFF: if
(btn == BUTTON_1_PRESSED) {
sonarMode = MODE_SONAR_ON;
MFS.beep(5, 95, 1,0,0); MFS.write("em");
} quebrar;
case MODE_SONAR_ON: if
(btn == BUTTON_1_PRESSED) {
sonarMode = MODE_SONAR_OFF;
MFS.beep(0);
MFS.write("off");
MFS.blinkDisplay(DIGIT_ALL, OFF); MFS.initSonar();
} outro
{
int distância = MFS.getSonarDataCm(TrigPin, EchoPin);
if (offPeriod < 0) {
offPeríodo = 0;
}
MFS.write(distância);
MFS.setBeepOffPeriod(offPeriod);
} atraso(100);
} quebrar;
}
}
Velocímetro
O aplicativo velocímetro calcula a velocidade de uma roda (em quilômetros/hora) usando um imã e um reed
switch, que é conectado ao pino 5 do Arduino. Também deve ser possível fabricar seu próprio codificador
de roda usando um sensor de linha ou marca.
Depois de ligar o Arduino, pressione e segure o botão 1 do escudo multifuncional até que o display
pisque, então use os botões 2 e 3 para definir o diâmetro da roda em centímetros. Pressione o botão
1 novamente quando terminar. Gire a roda para ver a velocidade indicada na tela do escudo.
Página 24 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
Uma possível melhoria para este aplicativo é manter um registro da distância percorrida em quilômetros.
enum SpeedoModeValues {
SETUP_WHEEL,
CALCULATE_SPEED };
void setup() {
// coloque seu código de configuração aqui, para executar uma vez:
pinMode(5, INPUT_PULLUP);
Timer1.initialize();
MFS.initialize(&Timer1);
switch (speedoMode) {
caso SETUP_WHEEL: if
(btn == BUTTON_1_PRESSED) {
speedoMode = CALCULATE_SPEED;
MFS.blinkDisplay(DIGIT_ALL, OFF);
wheelCirmcumferenceCm = (wheelDiameterCm * 314) / 100;
rodaDiâmetroCm--;
rodaDiâmetroCm = 30;
}
MFS.write(rodaDiameterCm);
rodaDiâmetroCm++;
rodaDiâmetroCm = 100;
}
Página 25 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
MFS.write(rodaDiameterCm);
} quebrar;
speedoMode = SETUP_WHEEL;
MFS.write(rodaDiameterCm);
MFS.blinkDisplay(DIGIT_ALL, ON);
} outro
{
unsigned int pulsePeriodMs = MFS.getPulseInPeriod();
if (pulsePeriodMs == 0) {
MFS.write(0.0, 1);
} outro
{
MFS.write(SpeedKmh(wheelCirmcumferenceCm, pulsePeriodMs), 1);
}
} quebrar;
} atraso(100);
}
Todos os exemplos de código e aplicativos foram testados e funcionam. Se você tiver alguma dificuldade, por favor
poste um comentário, e eu entrarei em contato com você o mais rápido possível.
Página 26 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
Apêndices
Ajuda da biblioteca de escudos multifuncional
#define ON 1 #define
OFF 0
1
SMOOTHING_MODERATE #define
2
SMOOTHING_STRONG
classe MultiFuncShield {
public: //
Ponteiro para interrupção do usuário com frequência de 1khz. void (*interrupção do
usuário)() = NULL;
// Inicializa esta instância usando uma instância TimerOne. Uma interrupção de 1 khz está anexada. void inicializar(TimerOne *timer1);
Página 27 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
// Inicializa esta instância, mas os recursos baseados em interrupção não estão disponíveis. void inicializar();
// Inicia e espera até que o cronômetro de contagem regressiva de milissegundos chegue a 0. void wait(unsigned
long mileths);
// Ativa o bipe, que é gerenciado em segundo plano. O tempo do período está em 100º de segundo
void beep(unsigned int onPeriod = 20, unsigned int offPeriod = 0, byte cycles = 1,
unsigned int loopCycles = 1 /* 0=indefinidamente */, unsigned int loopDelayPeriod =0);
// Use isso para definir o período de desligamento enquanto o bipe estiver ativado, void
setBeepOffPeriod(unsigned int offPeriod);
// Enfileira uma ação de botão na fila de botões, por exemplo, BUTTON_1_PRESSED void queueButton (botão
byte);
// Ações curtas de pressionamento e liberação do botão Filas. Pressões longas de botão não são
suportados, e lançamentos longos são relatados como lançamentos curtos.
// Não deve ser usado enquanto recursos baseados em interrupção estiverem disponíveis. void manualButtonHandler();
// Inicializa o contador de pulsos. Usado para contar pulsos aplicados a um pino de entrada.
Frequência máxima de pulso 500Hz.
void initPulseInCounter(byte pin = BUTTON_1_PIN, unsigned int timeOut = 3000, // pino de entrada //
o número de milissegundos
para esperar por um pulso, antes de redefinir o pulso no período para 0.
disparador de byte = BAIXO // aciona o contador em qualquer um
borda ascendente ou descendente
);
// Obtém o período do pulso mais recente (em milissegundos). unsigned int getPulseInPeriod();
Página 28 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
// Define o pulso no tempo limite, que é o número de milissegundos para esperar por um pulso, antes de redefinir o pulso no período
para 0.
void setPulseInTimeOut(unsigned int timeOut);
// Inicializa o recurso de leitura do sonar. Precisa do módulo de sonar HC-SR04. void initSonar(nível de byte =
SMOOTHING_MODERATE); // nível 0=nenhum, 1=moderado, 2=forte.
// Obtém a distância medida em centímetros, usando o módulo de sonar HC-SR04. unsigned int getSonarDataCm(byte
triggerPin, byte echoPin);
// Inicializa o recurso de leitura de temperatura. Precisa do sensor LM35. Deve remover o jumper J1
de escudo.
void initLM35(nível de byte = SMOOTHING_MODERATE); // nível 0=nenhum, 1=moderado, 2=forte
};
Página 29 de 30
Machine Translated by Google
Hackatronics – Usando um escudo multifuncional Arduino cohesivecomputing.co.uk
Ajuda MPU6050
classe MPU6050 {
público:
int giroscópio_X_Raw;
int giroscópio_Y_Raw;
int giroscópio_Z_Raw;
int accelScaleValue; // divide a aceleração bruta por este valor para obter a leitura em g. float gyroScaleValue; // divide o giroscópio bruto
por este valor para obter graus/segundo de velocidade de rotação.
// escala de aceleração
#define ACCEL_FS_2 0x00 #define
ACCEL_FS_4 0x01 #define
ACCEL_FS_8 0x02 #define
ACCEL_FS_16 0x03
// escala do giroscópio
#define GYRO_FS_250 0x00 #define
GYRO_FS_500 0x01 #define
GYRO_FS_1000 0x02 #define
GYRO_FS_2000 0x03
// dlpf
#define DLPF_BW_256 0x00 #define
DLPF_BW_188 0x01 #define
DLPF_BW_98 0x02 #define
DLPF_BW_42 0x03 #define
DLPF_BW_20 0x04 #define
DLPF_BW_10 0x05 #define
DLPF_BW_5 0 x06
Página 30 de 30