Criar um osciloscópio com Arduino

osciloscopio1

 

Hoje apresentamos aqui um projeto onde vamos “replicar” um osciloscópio a partir do Arduino.
Um osciloscópio tem como principal funcionalidade mostrar-nos qual o tipo de onda que um determinado circuito está a gerar e este projeto demonstra-se muito útil pois é uma maneira de substituir um osciloscópio no caso de não termos nenhum “à mão”.


Vamos ao que interessa!

Material:

1 potenciómetro de 10k;

Montagem:

montagem

Observação:

Antes de compilar o código, é preciso fazer download do arquivo ‘Osciloscópioe descompactá-lo no computador.
Depois da montagem e com o Arduino conectado ao computador abra o arquivo XOscillo, que abrirá a IDE com o código, logo após isto é necessário deverá gravá-lo no Arduino. Depois de gravar o código, abra o programa executável XOscillo. Com o programa aberto clique na aba ‘File’, ‘New Analog Arduino’ e já está. Gire o potenciómetro e irá ver a oscilação no respectivo programa.

hg_images_XOscillo_time

 

Código Arduino:


#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

#define BUILTINLED 13
#define PWM_GENERATOR 11
#define ledPin 13

unsigned char triggerVoltage = 0;
unsigned char lastADC = 0;
unsigned char triggered = 0;
unsigned int DataRemaining = 1500;
unsigned char channel=0;
unsigned char numChannels=1;

#define CMD_IDLE 0
#define CMD_RESET 175
#define CMD_PING '?'
#define CMD_READ_ADC_TRACE 170
#define CMD_READ_BIN_TRACE 171

void StartAnalogRead(uint8_t pin)
{

ADMUX = (DEFAULT << 6) | (pin & 0x07);

#if defined(__AVR_ATmega1280__)

ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#endif

sbi(ADCSRA, ADSC);
}

unsigned int EndAnalogRead()
{
uint8_t low, high;

while (bit_is_set(ADCSRA, ADSC));

low = ADCL;
high = ADCH;

return (high << 8) | low;
}

void setup()
{

sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;

pinMode( PWM_GENERATOR, OUTPUT );
analogWrite(PWM_GENERATOR, 128);

Serial.begin(115200);

for(int i=2;i<8;i++)
{
pinMode(i, INPUT);
digitalWrite(i, LOW);
}

//  Serial.begin(1000000);
//  Serial.begin(153600);
//  Serial.begin(9600);
}

unsigned char command = 0;

void ProcessSerialCommand( byte in )
{
if ( in == CMD_PING )
{
Serial.write( 79) ;
Serial.write( 67) ;
Serial.write( triggerVoltage) ;
Serial.write( DataRemaining>>8) ;
Serial.write( DataRemaining&0xff) ;
for (int i=0;i<2;i++)
{
Serial.write( triggerVoltage) ;
}
}
else if ( in == CMD_RESET )
{
command = CMD_IDLE;
Serial.print( "OK" ) ;
}
else if ( in == CMD_READ_ADC_TRACE )
{
while( Serial.available() < 8);

triggerVoltage = Serial.read();
DataRemaining = Serial.read()<<8;
DataRemaining |= Serial.read();

numChannels = Serial.read();
channel = 0;

analogWrite(PWM_GENERATOR, Serial.read());

for (int i=0;i<4;i++)
{
Serial.read();
}

Serial.write( 85 );

StartAnalogRead(0);
lastADC = (unsigned char)(EndAnalogRead()>>2);

triggered = 0;
StartAnalogRead(0);

digitalWrite(ledPin, HIGH);
command = CMD_READ_ADC_TRACE;
}
else if ( in == CMD_READ_BIN_TRACE )
{
while( Serial.available() < 3);
triggerVoltage = Serial.read();
DataRemaining = Serial.read()<<8;
DataRemaining |= Serial.read();

analogWrite(9, 64);
analogWrite(10, 128);
analogWrite(11, 192);

triggered = 0;
digitalWrite(ledPin, HIGH);
command = CMD_READ_BIN_TRACE;
Serial.write( 85 );
}
}

void loop()
{
if (Serial.available() > 0)
{
ProcessSerialCommand( Serial.read() );
}

if ( command == CMD_READ_ADC_TRACE )
{
unsigned char v = (unsigned char)(EndAnalogRead()>>2);

if ( triggered == 0  )
{
StartAnalogRead(0);

if ( ((v >= triggerVoltage) && ( lastADC < triggerVoltage )) || (triggerVoltage == 0) )
{
triggered = 1;
digitalWrite(ledPin, LOW);
channel = 0;
}
}
else
{
StartAnalogRead(channel++);
if ( channel == numChannels )
channel=0;

Serial.write(v);

DataRemaining--;
if ( DataRemaining == 0 )
{
command = CMD_IDLE;
}
}

lastADC = v;
}
else if ( command == CMD_READ_BIN_TRACE )
{
unsigned char v = PIND>>2;  // remove tx/rx lines

if ( triggered == 0  )
{
if ((lastADC & triggerVoltage) ==0)
{
if ((v & triggerVoltage) == triggerVoltage)
{
triggered = 1;
digitalWrite(ledPin, LOW);
}
}
}
else
{
Serial.write(v);

DataRemaining--;
if ( DataRemaining == 0 )
{
command = CMD_IDLE;
}
}

lastADC = v;
}

}

Agora pessoal, é só pegar no vosso arduino, dar uma vista de olhos a este tutorial e começar a desenvolver o vosso projecto! Se ainda não tiveres o material necessário para o projecto, encontra-o aqui na nossa loja Boxelectronica.

Comentários no Facebook