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

Exibições: 1021

Os comentários estão fechados para esta mensagem de blog

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço