Introdução
No 'post' anterior a PicoBoard foi apresentada e foi mostrado o circuito e o layout da placa do PicoBoard Shield. Neste post vamos tratar da construção do protótipo e apresentar o código dos 'sketches' do Arduino usados para teste do hardware e como 'firmware' para o PicoBoard Shield.
Placa Protótipo
O protótipo do PicoBoard Shield foi feito em casa pelo método de transferência de 'toner'. Após a corrosão feita com percloreto a placa foi prateada e em seguida foi perfurada.
nota: apesar da sujeira que faz, o percloreto não produz gases e é muito mais seguro do que o banho com HCl+Água Oxigenada
Em seguida os componentes foram soldados, a começar pelos resistores, depois pelos soquetes de CI e em seguida os componentes mais altos.
Utilizando um multímetro, as ligações foram conferidas com o diagrama para verificar a existência de curtos ou de trilhas partidas. É sempre bom fazer isso pois nem sempre os defeitos da placa são visíveis a olho nu. Além disso esse procedimento permite detectar problemas com roteamento das trilhas que nem sempre são percebidos enquanto se produz o 'layout' no computador. Esse foi o caso de uma trilha que estava passando perto demais dos resistores (figura abaixo). O 'layout' disponível no final deste 'post' já tem essa correção.
Placa Protótipo Montada
A foto abaixo mostra a placa de protótipo depois de pronta.
Testes da placa
Por se tratar de um protótipo, foi necessário efetuar alguns testes na placa antes de se produzir o código final. O objetivo de fazer as coisas por etapas é diminuir a quantidade de incertezas e/ou de erros cometidos de uma só vez. Como exemplo cabe mencionar as trilhas que estavam em curto.
Os primeiros testes foram feitos a partir do exemplo 'AnalogInOutSerial' do Arduino, onde se alterou a linha abaixo de acordo com o pino do conversor A/D a ser utilizado. Para os quatro sensores analógicos basta variar o valor para A0, A1, A2, A3 conforme os sensores Resistance A, B, C, D (respectivamente)
const int analogInPin = A0; // Analog input pin that the potentiometer is attached to
Um par de potenciômetros de 100Kohms foi conectado foi soldado ao um plug P2 e inserido no 'jack' AB. Então o sketch 'AnalogInOutSerial' foi executado com os valores A0 e A1 para confirmar a operação destes 2 canais do Shield.
Se tudo estiver correto o valor lido deve variar aproximadamente entre 0 a 930 (o valor depende da relação exata entre o resistor de 10K e o valor do potenciômetro utilizado.
Em seguida o par de potenciômetros foi conectado ao 'jack' CD e o sketch foi executado com os valores A2 e A3
Em seguida o valor foi alterado para A5 e sketch foi executado, a fim de testar o potenciômetro da placa ('Slider'). Como o Slider não tem resistor em série, o valor obtido pode variar de 0 a 1023.
O próximo passo é testar se os sensores de luz e de som estão funcionando. Para isso a chave analógica deve ser eliminada (testes por etapas). Com o CI fora do soquete, os pinos 3 e 4 foram curto-circuitados, de forma a conectar a saída do sensor de luz à entrada A4 do Arduino.
A constante que define qual o ADC utilizado foi alterada para A4 e o sketch foi carregado e executado. Os valores obtidos vão depender do sensor de luz (foto transistor).
O próximo teste é com o sensor de som. Para isso os pinos 8 e 9 foram curto-circuitados (removeu-se antes o fio utilizado no teste anterior entre os pinos 3 e 4).
Tendo comprovado o funcionamento dos sensores de Luz e Som, deve-se retirar o curto e reinstalar o CD4066.
Para testar o chaveamento, foram incluídas as seguintes linhas na definição de constantes do 'AnalogInOutSerial'
// These constants won't change. They're used to give names
// to the pins used:
const int analogInPin = A0; // Analog input pin that the potentiometer is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to
E a função Setup() foram inseridas as seguintes linhas
pinMode(sound_sensor, OUTPUT);
pinMode(light_sensor, OUTPUT);
digitalWrite(sound_sensor, LOW);
digitalWrite(light_sensor, LOW);
O 'loop' principal foi praticamente duplicado, mas logo antes de cada leitura, seja de som ou de luz, o canal correspondente foi acionado por um tempo curto (10 microssegundos) logo antes da leitura
void loop() {
digitalWrite(sound_sensor, HIGH);
delayMicroseconds(10);
// read the analog in value:
sensorValue = analogRead(analogInPin);
// map it to the range of the analog out:
outputValue = map(sensorValue, 0, 1023, 0, 255);
// change the analog out value:
analogWrite(analogOutPin, outputValue);
digitalWrite(sound_sensor, LOW);
// print the results to the serial monitor:
Serial.print("Sound sensor = " );
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);
digitalWrite(light_sensor, HIGH);
delayMicroseconds(10);
// read the analog in value:
sensorValue = analogRead(analogInPin);
// map it to the range of the analog out:
outputValue = map(sensorValue, 0, 1023, 0, 255);
// change the analog out value:
analogWrite(analogOutPin, outputValue);
digitalWrite(light_sensor, LOW);
// print the results to the serial monitor:
Serial.print("Light sensor = " );
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(outputValue);
// wait 10 milliseconds before the next loop
// for the analog-to-digital converter to settle
// after the last reading:
delay(10);
}
Por último, o botão foi testado utilizando-se o sketch de exemplo "Button" do Arduino. Ao se pressionar o botão, o LED da placa do Arduino (no pino 13) deve apagar.
Sketch de Teste da placa
Com as partes testadas, o último passo é fazer um teste geral, com um sketch que engloba todos os sensores.
/*
PicoBoard Shield Test Application
Danjovic 2013
*/
/* Shield definitions */
// Discrete signals
#define Button 2
#define Enable_Sound_Channel 7
#define Enable_Light_Channel 6
// Analog Signals
#define ADC_Channel_Resistance_A 0
#define ADC_Channel_Resistance_B 1
#define ADC_Channel_Resistance_C 2
#define ADC_Channel_Resistance_D 3
#define ADC_Channel_SoundLight 4
#define ADC_Channel_Slider 5
unsigned int sensor_value=0;
void setup()
{
// initialize serial:
Serial.begin(38400);
// initialize discretes
pinMode(Button, INPUT);
pinMode(Enable_Sound_Channel, OUTPUT);
pinMode(Enable_Light_Channel, OUTPUT);
digitalWrite(Enable_Sound_Channel, LOW); // disable both ADC imputs
digitalWrite(Enable_Sound_Channel, LOW);
}
void loop()
{
// Testa Botão
if (digitalRead(Button)) {
sensor_value=0;
}
else {
sensor_value=0xffff;
}
Serial.print("Bt:");
Serial.print(sensor_value);
// Testa ADC canal A
sensor_value=analogRead(ADC_Channel_Resistance_A);
Serial.print(" Res A:");
Serial.print(sensor_value);
// Testa ADC canal B
sensor_value=analogRead(ADC_Channel_Resistance_B);
Serial.print(" Res B:");
Serial.print(sensor_value);
// Testa ADC canal C
sensor_value=analogRead(ADC_Channel_Resistance_C);
Serial.print(" Res C:");
Serial.print(sensor_value);
// Testa ADC canal D
sensor_value=analogRead(ADC_Channel_Resistance_D);
Serial.print(" Res D:");
Serial.print(sensor_value);
// Testa Potenciometro deslizante
sensor_value=analogRead(ADC_Channel_Slider);
Serial.print(" Pot:");
Serial.print(sensor_value);
// Testa Sensor de som
digitalWrite(Enable_Light_Channel, HIGH); // Switch ADC to Light sensor
delayMicroseconds(5);
sensor_value=analogRead(ADC_Channel_SoundLight);
digitalWrite(Enable_Light_Channel, LOW);
Serial.print(" Light:");
Serial.print(sensor_value);
// Testa Sensor de luz
digitalWrite(Enable_Sound_Channel, HIGH); // Switch ADC to Light sensor
delayMicroseconds(5);
sensor_value=analogRead(ADC_Channel_SoundLight);
digitalWrite(Enable_Sound_Channel, LOW);
Serial.print(" Sound:");
Serial.println(sensor_value);
delay(50);
}
O resultado pode ser visto na tela abaixo:
Sketch Final
O Sketch final foi feito a partir do exemplo "Serial Event" do Arduino, pois o protocolo de comunicação com o Scratch funciona da seguinte maneira:
- O Software Scratch envia um byte de valor igual a 0x01 para a placa.
- A placa responde uma sequência de bytes com os valores dos sensores (e um ID) com intervalo de 400us entre cada um.
Do firmware da Sparkfun, aproveitou-se a funções de formatação e envio, porém foi necessário substituir os 'printf's por Serial.write() do Arduino. O restante do código é basicamente o Sketch de teste.
O código da versão final está disponível no link abaixo. Ele deve compilar sem problemas na versão 1.0.x da IDE do Arduino:
https://dl.dropbox.com/u/100542440/PicoShield.ino
Teste final
O teste final foi feito em conjunto com o software Scratch. Depois de iniciar o programa, clique na aba 'Sensores'
Depois procure no fundo da janela pelo controle chamado "Sensor" e clique com o botão da direita sobre ele. No menu de contexto clique em "Mostrar Observador".
Com isso, vai aparecer uma caixa com os valores dos sensores junto do gatinho. Clique com o botão da direita nesta caixa e selecione a opção "Selecionar porta serial/usb". Vai aparecer uma outro menu com uma lista de portas seriais. Escolha a porta na qual está conectado o arduino.
Assim que a porta for selecionada os valores dos sensores serão exibidos na caixa.
Se quiser experimentar um pouquinho com os sensores monte uma estrutura como a do exemplo abaixo e veja o gatinho se movimentar na tela de acordo com os valores dos sensores.
Agora é só soltar a imaginação e se divertir bastante usando o PicoBoard Shield nos seus Scratches.
Nota: Este shield é um projeto derivado da "Scratch Sensor Board", cuja licença de uso pode ser encontrada aqui.. Maiores informações sobre o projeto original podem ser encontradas aqui.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por