lundi 12 décembre 2016

Digital Decimation Filter Using FPGA Board.

Our task is to describe in VHDL, Test, and implement a DSP circuit called Decimation Filter. This one has two main sections: the CIC section and the FIR section.
Even the CIC and the FIR filters are composed of many sections thats we are going to describe them one by one.
Both sections consist of N stages each. The exact structure of each stage, and the way of connecting all stages together are presented below in this article today.






So let's start by introducing a Decimation filter.
A Decimation Filter is one of the most used filters in signal processing and noise avoiding sustems.

Basically a decimator is a digital low pass filter, which also include the operation of sample rate reduction. He does operation of noise shaping and hence the noise is pushed to higher frequencies so that the decimation stage following the modulator can filter out this noise above the cutoff frequency.

The band limited signal can then be resampled by discarding X – 1 samples out of every X samples, where X being the oversampling ratio. By averaging X samples out of the quantized sigma-delta output.
The decimation filter achieves a high output resolution and also the frequency of the output data is at twice the input signal bandwidth which is the nyquist rate.
So to concluse how decimator filter work:

This is our input signal X(n):

   
We want to decimate this signal wiith decimation ratio R = 2.
This means thats we are going to generate a Y(n) decimation response of X(n) with the half frequency of X(n) = 0.5 Hz.

In digital signal processing, decimation is the process of reducing the sampling rate of a signal. Complementary to interpolation, which increases sampling rate, it is a specific case of sample rate conversion in a multi-rate digital signal processing system. Decimation utilises filtering to mitigate aliasing distortion, which can occur when simply downsampling a signal. A system component that performs decimation is called a decimator.

So Decimation filter is a low pass filter able to decrease sampling rate, it is composed by mixing a CIC Filter with a Fir Filter.

Cascaded integrator–comb filter :CIC Filter

A CIC filter consists of one or more integrator and comb filter pairs. In the case of a decimating CIC, the input signal is fed through one or more cascaded integrators, then a down-sampler, followed by one or more comb sections (equal in number to the number of integrators). An interpolating CIC is simply the reverse of this architecture, with the down-sampler replaced with a zero-stuffer (up-sampler).

{\begin{aligned}H(z)&=\left[\sum _{{k=0}}^{{RM-1}}z^{{-k}}\right]^{N}\\&=\left({\frac  {1-z^{{-RM}}}{1-z^{{-1}}}}\right)^{N}\end{aligned}}
Where:
R = decimation or interpolation ratio
M = number of samples per stage (usually 1 but sometimes 2)
N = number of stages in filter
Characteristics of CIC Filters
  1. Linear phase response;
  2. Utilize only delay and addition and subtraction; that is, it requires no multiplication operations

CIC Filter is composed by mixing integrators,comb blocks with frequency dividers.

Integrator:

A digital integrator block is a block who add the previous result with present input to generate present output so simply :
  Y(n) = Y(n-1) + X(n) 


To create this block in VHDL, you have to use an intelligent way in program who help you to control your input signal delayed and to avoid critical value who could generate incorrect result specially when we look for Y(0).

Comb:

 The principal function of a comb filter is mixing a delayed version of a signal to itself.

Y(n) = X(n) + X(n-RM)

When both R and M are positive constants:



CIC Filter is like i said before a collection of Integrator Filter equal to a collection of a Comb Filter when Integrators work inside a simple frequency and Comb Filters work inside the same frequency divided by the decimation ratio.



Here is the global RTL of our CIC filter:




We cant talk about CIC filter without mentioned a block named Frequency divider, this one is a generator of clock slower thant our initial clock.
In fact, he is no more than a simple circuit based on a simple  front counter.



Exactly like this Test bench here explain for every 4 initial clock (Red signal) we generate one clock slower edge(blue signal).

To build your own CIC Filter, all what you have to do is to :
  1.  Chose N : Filter ordre, (4 in my exemple)
  2.  Select R : Decimation ratio. (4 in my exemple)
  3.  Build your Integrator stages. 
  4.  Build your Comb stages.
  5.  Build your frequency Divider block.
  6.  build the top level CIC_Filter mapping all those blocks together.



Finite Impulse Response  :FIR Filter

Wikipedia define Fir Filter as a filter whose impulse response (or response to any finite length input) is of finite duration, because it settles to zero in finite time. This is in contrast to infinite impulse response (IIR) filters, which may have internal feedback and may continue to respond indefinitely (usually decaying).
The impulse response (that is, the output in response to a Kronecker delta input) of an Nth-order discrete-time FIR filter lasts exactly N + 1 samples (from first nonzero element through last nonzero element) before it then settles to zero.
FIR filters can be discrete-time or continuous-time, and digital or analog.  

We could simply define it as a low pass filter made using convolution of the inputs signals with their impulse response.

fir_filter_equation

where:
  • x[n] is the input signal,
  • y[n] is the output signal,
  • N is the filter order; a Nth-order filter has (N+1) terms on the right-hand side
  • bi is the value of the impulse response at the i’th instant for 0<= i <=N of a Nth-order FIR filter. If the filter is a direct form FIR filter then is also a coefficient of the filter 

So to implement this filter using VHDL all what you have to do is to follow this architecture here :




In your program you have to use an array when you will put inside it your inputs signals delayed to facilate program algorithme.



A simple test bench of our Fir filter give:




We could verify results value by putting somes inputs signals inside a Fir block in Labview or Matlab simulink and comparing it together.

Decimation Filter:

Now after bulding the CIC Filter and the FIR we have just to connect them together to have the final decimation filter.
Here is the top Level RTL of the global Work.


___________
___________






After bulding and mapping all those blocks together a final test bench give 



Top Level VHDL Code is :

----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date:    13:17:33 12/11/2016 
-- Design Name: 
-- Module Name:    Decimation_filter - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: 
--
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity Decimation_filter is
    Port ( Xin : in  STD_LOGIC_VECTOR (7 downto 0);
           Yout : out  STD_LOGIC_VECTOR (7 downto 0);
           clk : in  STD_LOGIC;
     h0: in std_logic_vector(7 downto 0);
     h1: in std_logic_vector(7 downto 0);
     h2: in std_logic_vector(7 downto 0);
     h3: in std_logic_vector(7 downto 0);
           rst : in  STD_LOGIC);
end Decimation_filter;

architecture Behavioral of Decimation_filter is
component FIR port 
(clk: in std_logic;
rst: in std_logic;
x: in std_logic_vector(7 downto 0);
h0: in std_logic_vector(7 downto 0);
h1: in std_logic_vector(7 downto 0);
h2: in std_logic_vector(7 downto 0);
h3: in std_logic_vector(7 downto 0);
y: out std_logic_vector(7 downto 0));
end component;
component comb2 port 
(rst : in  STD_LOGIC;
           clk : in  STD_LOGIC;
           x : in  STD_LOGIC_VECTOR (10 downto 0);
           y : out  STD_LOGIC_VECTOR (9 downto 0));
end component;
component comb3 port 
(rst : in  STD_LOGIC;
           clk : in  STD_LOGIC;
           x : in  STD_LOGIC_VECTOR (9 downto 0);
           y : out  STD_LOGIC_VECTOR (8 downto 0));
end component;
component comb4 port 
(rst : in  STD_LOGIC;
           clk : in  STD_LOGIC;
           x : in  STD_LOGIC_VECTOR (8 downto 0);
           y : out  STD_LOGIC_VECTOR (7 downto 0));
end component;
component comb port 
(rst : in  STD_LOGIC;
           clk : in  STD_LOGIC;
           x : in  STD_LOGIC_VECTOR (11 downto 0);
           y : out  STD_LOGIC_VECTOR (10 downto 0));
end component;
component first_integrator port 
(clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           x : in  STD_LOGIC_VECTOR (7 downto 0);
           y : out  STD_LOGIC_VECTOR (8 downto 0));
end component;
component second_integrator port 
(x : in  STD_LOGIC_VECTOR (8 downto 0);
           y : out  STD_LOGIC_VECTOR (9 downto 0);
           clk : in  STD_LOGIC;
           rst : in  STD_LOGIC);
end component;
component third_integrator port 
(clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           x : in  STD_LOGIC_VECTOR (9 downto 0);
           y : out  STD_LOGIC_VECTOR (10 downto 0));
end component;
component last_integrator port 
(clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           x : in  STD_LOGIC_VECTOR (10 downto 0);
           y : out  STD_LOGIC_VECTOR (11 downto 0));
end component;
component frequency_divider port 
(clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           clk_out : out  STD_LOGIC);
end component;


signal aymen1 : std_logic_vector(0 to 8);
signal aymen2 : std_logic_vector(0 to 9);
signal aymen3 : std_logic_vector(0 to 10);
signal aymen4 : std_logic_vector(0 to 11);
signal aymen5 : std_logic;
signal aymen6 : std_logic_vector(0 to 10);
signal aymen7 : std_logic_vector(0 to 9);
signal aymen8 : std_logic_vector(0 to 8);
signal aymen9 : std_logic_vector(0 to 7);
begin
v1:first_integrator port map (clk,rst,Xin,aymen1);
v2:second_integrator port map (aymen1,aymen2,clk,rst);
v3:third_integrator port map (clk,rst,aymen2,aymen3);
v4:last_integrator port map (clk,rst,aymen3,aymen4);
v5:frequency_divider port map (clk,rst,aymen5);
v6:comb port map (rst,aymen5,aymen4,aymen6);
v7:comb2 port map (rst,aymen5,aymen6,aymen7);
v8:comb3 port map (rst,aymen5,aymen7,aymen8);
v9:comb4 port map (rst,aymen5,aymen8,aymen9);
v10:FIR port map (aymen5,rst,aymen9,h0,h1,h2,h3,Yout);
end Behavioral;




If you want to have a copy of any block vhdl code just contact me, Just contact me.
                                                                   

                                                           See you Soon AYMEN LACHKHEM
  















  

samedi 20 août 2016

Stop Using Proteus ARES ✨ Here Is My EAGLE PCB Tutoriels Step By Step ✨

Stop Using Proteus ARES !! Here is my EAGLE PCB tutoriels

Hello dears followers, Today i came with a new idea completly different of my usually published articles. I m not going to talk about a MCU or a program style. My global idea today is just like it showed in article's title '' let's stop using proteus ARES to make our PCB".



I have been doing a fair bit of PCB design work of late, and I always used to use Proteus for schematic drawing, sometimes simulating and PCB design. So why not to use some other software more professional ? 

The idea was started with me since 3 years ago when i just noted that's there is a sofware named EAGLE Cadsoft more professional than Proteus specialy in making PCB Design.

Résultat de recherche d'images pour "eagle cadsoft"


So Today i m going to show you:
  1.  How to install Eagle Cadsoft, Patch it to make it professional.    
  2.  How to update library in Eagle.
  3.  How to make a simple project (schematic + PCB). 
  4.  How to make a advanced project (Schematic + Layout).
Before that let's just make a little comparison between Proteus and Eagle.


Proteus is an all in one product from schematics to board layout through to simulation on a high level. Eagle is schematics and board layout design software only, no practical simulation . They're very different products. Proteus is used in schools because somehow they've managed to sweetheart a deal for extremely low cost to free licensing on that level in hopes to net students into depending on it for their professional carers. Eagle is used because it uses industry standards, and although not as newbie friendly it is technically full featured, even the free version.


For it's function features and price, Eagle is the only real 'solution' out there. There are many other choices, all which will require a learning curve and design of new libraries for components.

There is a Lot of PCB creating Software, let's be honest and said that the big advantage of Proteus is Simulation part, but my article's title is about making pcb and here we have to be sure all of us that's Eagle is totaly better than Ares in this point.

Here is my graduation project 3 years ago maked using Eagle Cadsoft.




And here is the pcb



I m sure that's in making my PCB in ARES i found more than one problem specially when i search for component, many of them i was forced to created. Also library problem and, i could just in one word said thats ARES is LIMITED front of EAGLE.

Download and installing and patching Eagle.

All what you have to do is to click here to download your eagle professional version. CLICK ME.
A compressed file you will receive in few minutes.

  • Run eagle-win-6.5.0.exe. (same file from official website)
  • Click "Setup" and the installer will start.
  • Run the installation and then select to "Run as Freeware". Installation completes.
  • Start Cadsoft Eagle software. (Select "Run as Freeware" again if asked)

    You will see "Control Panel - EAGLE 6.5.0 Light" as the title of the window.
  • Open Cadsoft Eagle installtion directory and look for 'eagle.exe' (example: C:\Program Files (x86)\EAGLE-6.5.0\bin)
  • Make a copy of "cadsoft.eagle.professional.6.5.0-patch.exe" in the directory in which 'eagle.exe' was found.
  • Run "cadsoft.eagle.professional.6.5.0-patch.exe" as administrator.
  • Click 'Patch' and you're done! You will receive a message in the patch software saying "---PATCHING DONE---"
  • You can now delete "cadsoft.eagle.professional.6.5.0-patch.exe" from the Cadsoft Eagle installation directory.
  • Start Cadsoft Eagle.

    You will see "Control Panel - EAGLE 6.5.0 Professional" as the title of the window.
  
Here is a step by step video of how to download and to install it. Enjoy


Library Using and update.

I just put with my eagle a big library which include a big part of component, so when you open a new project and a new schematic inside it. Just click in Library and Click use and click all library included here:  (example: C:\Program Files (x86)\EAGLE-6.5.0\lbr). That's it.

Make your own simple project in Eagle.

I m going to make the most famous and easy circuit in electronic which is 5V Regulation


The Layout Design will look like:




And here is a step by step Video demonstrate how i did it:





This circuit like he is known give us a regular ready 5V from a 12V.

MAX/RS232 TTL To Serial Interface inside Eagle.

This Circuit is so used in interfacing MCU with external world, many of developpement board just include this one and here the schematic:



The Layout:


And here a video of how i did this circuit and layout step by step.



2 Motor Control with L293D

L293D is Circuit able to control two DC motor with a variation in speed and direction, he is strongly used in robotic world.
here is the schematic :
 


And here is the Layout: (you could make better i just wanted to show how is easy to use straps)



 Here the video:


Make an advanced PCB Project inside Eagle.



This is the advanced project thats i m going to do. In fact it include  an ATMEGA MCU, a connectors for all his digital pins, and a max232/rs232 interface, a motor control based in l293D so we could just said thats we are making a developpement board for our MCU.

and like always here a long video demonstrate how i did that.

Schematic

Layout



And here the video




See you soon, AYMEN LACHKHEM     

mardi 16 août 2016

Control Your Own Robot Using Labview

Control Your Own Robot Using Labview

Good morning dears Followers, Today i came with a new idea not far than my last article. I m going to control the same robot but using a different way to command. 
In my last article i showed how to control a Robot, Robotic Arm, Electronic system using C# and today i will demonstrate the same idea using one other software more professional in those kind of project which is in fact Labview.


Main Work

Like i mentionned in my last article, you have the choice to choose any MCU to make this project since the moment when this one contains UART.
My choice was selected in ATMEGA328, because i have a big part of the program ready from my last article. But even if you want to do this project using PIC or Arduino or STM32. The global fonctionnement is the same.

Let's take a look in our MCU.

This picture show that PIN 2 is the RX PIN and PIN 3 is the TX PIN and those two pin play the external interface given by the UART Module included in ATMEGA328.

So the Global idea of this project is : there is a graphic interface done in Labview who could communicate instantly and directly through serial port with an electronic circuit contains ATMEGA328.

This one every moment he receive  a data through his UART module he will convert it to an ordre and give it to L293D Circuits.
L293D Circuits will amplify those ordres and give them to the robot motor.

The electronic circuit resume the idea.





The program that you have to put it in the MCU is:


/*  Control your Robot Using Labview 
 *  Project done by : Aymen Lachkhem
 *  Aymenlachkem@gmail.com
 *  Blog site : letselectronic.blogspot.com
 */

void setup() {
         pinMode(A0, OUTPUT);
         pinMode(A1, OUTPUT);
         pinMode(A3, OUTPUT);
         pinMode(A4, OUTPUT);
         pinMode(2, OUTPUT);
         pinMode(3, OUTPUT);
         pinMode(4, OUTPUT);
         pinMode(5, OUTPUT);
         pinMode(6, OUTPUT);
         pinMode(7, OUTPUT);         
         pinMode(11, OUTPUT);
         pinMode(12, OUTPUT);
         digitalWrite(A0,LOW);
         digitalWrite(A1,LOW);
         digitalWrite(A3,LOW);
         digitalWrite(A4,LOW);
         digitalWrite(2,LOW);
         digitalWrite(3,LOW);
         digitalWrite(4,LOW);
         digitalWrite(5,LOW);
         digitalWrite(6,LOW);
         digitalWrite(7,LOW);
         digitalWrite(11,LOW);
         digitalWrite(12,LOW);
}

void loop() {       
  blinker();
  Serial.begin(9600);  
   if (Serial.available() > 0) {
    char a = Serial.read();
if ( a == '4'){robot_left(); }  
if ( a == '1'){robot_up();}
if ( a == '3'){robot_right();}
if ( a == '2'){robot_down();}
if ( a == '0'){robot_stop();}
}}

void blinker()
{ 
  digitalWrite(A3,HIGH);
  digitalWrite(A4,LOW);
  delay(100);
  digitalWrite(A3,LOW);
  digitalWrite(A4,HIGH);
  delay(100);
}  
void robot_left()
{
  digitalWrite(A1,HIGH);
  digitalWrite(A0,LOW);
  digitalWrite(2,HIGH);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,HIGH);
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
}
void robot_up()
{
  digitalWrite(A1,HIGH);
  digitalWrite(A0,LOW);
  digitalWrite(2,HIGH);
  digitalWrite(3,LOW);
  digitalWrite(4,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);  
}  
void robot_right()
{
  digitalWrite(A0,HIGH);
  digitalWrite(A1,LOW);
  digitalWrite(3,HIGH);
  digitalWrite(2,LOW);
  digitalWrite(4,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);  
}
void robot_down()
{
  digitalWrite(A0,HIGH);
  digitalWrite(A1,LOW);
  digitalWrite(3,HIGH);
  digitalWrite(2,LOW);
  digitalWrite(5,HIGH);
  digitalWrite(4,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(6,LOW);  
}

void robot_stop()
{
  digitalWrite(A0,LOW);
  digitalWrite(A1,LOW);
  digitalWrite(3,LOW);
  digitalWrite(2,LOW);
  digitalWrite(5,LOW);
  digitalWrite(4,LOW);
  digitalWrite(7,LOW);
  digitalWrite(6,LOW);  
}

Now Let's speak about the graphic interface done in Labview.
Before all, For those who dont Know Labview take a look here:
In the official site ni.com they defined Labview like a highly productive development environment for creating custom applications that interact with real-world data or signals in fields such as science and engineering.


LabVIEW itself is a software development environment that contains numerous components, several of which are required for any type of test, measurement, or control application.

One of the best part of labview is the programming way which is totaly graphic, all what the programmer have to do is to collect the block and make tham work together and here an exemple.

 

In our interface we HAVE to use VISA, so what is VISA ?

In the same officialy site they defined VISA like The Virtual Instrument Software Architecture (VISA)  a standard for configuring, programming, and troubleshooting instrumentation systems comprising GPIB, VXI, PXI, Serial, Ethernet, and/or USB interfaces. VISA provides the programming interface between the hardware and development environments such as LabVIEW, LabWindows/CVI, and Measurement Studio for Microsoft Visual Studio. NI-VISA is the National Instruments implementation of the VISA I/O standard. NI-VISA includes software libraries, interactive utilities such as NI I/O Trace and the VISA Interactive Control, and configuration programs through Measurement & Automation Explorer for all your development needs. NI-VISA is standard across the National Instruments product line. With NI-VISA, you can feel confident that your software development will not become obsolete as your instrumentation interface hardware needs evolve into the future.

Résultat de recherche d'images pour "visa labview"

One of the big part given by VISA is serial configuration.
Like i just said before the main idea of our project is based in serial communication.
So if you want to get it work you have just to be sure that's VISA driver is installed in your computer.

To make your own Graphic interface in Labview you have two panel to build, the design one and the programming one. and here is both of them.






Which make the global work inside Labview look like:



Using A virtuel Serial Port Driver you could test your work between ISIS and Labview and here is a demstrative Video.



And That's it, 


Software to Download:






Have a Good Day, See you Soon, Aymen Lachkhem


 


   

jeudi 11 août 2016

Automatic Wirless Voltage Acquisation

Wirless Voltage Acquisation

Dears Followers, Today i m coming with a new project based in Wirless Communication, As it is written in  the article's title i m going to follow instantly the voltage level in some where so far from where I m.





The idea was given to me by one of my best friend who ask me how he could know the voltage level in some where far from him, Which protocol he have to know and which electronic component he have to use to do those kind of project.

In fact, the idea is simple and easy based in UART protocol. The MCU that's i m going to use is the same ATMEGA 328p.
I have to make a double circuit, the first one is for sure the transmitter and the second is the receiver.


Like i said i m going to use ATMEGA 328p, the same way to communicate will be available if you are going to use one other MCU for exemple PIC, you have just to check thats he contains UART.   


Résultat de recherche d'images pour "atmega328"
ATMEGA 328p PINOUT
To make a wirless intelligent work we must use two MCU. One for the first circuit and the other for the receiver circuit.
The electronic component thats i m going to use is Xbee Pro. In those kind of projects (wirless) you could use Bluetooth or RF433 MHz but because the distance commanded and how much it is easy to interface it i m going to use Xbee.

Afficher l'image d'origine
Xbee Pro

Every circuit in this project will contains Xbee pro and ATMEGA 328p.

Let's start by the transmitter circuit:

In this circuit, We have to acquisate a voltage between 0 and 125V DC. Like we all know our MCU could only read a voltage between 0V and 5V. So the solution is to add a voltage devider able to convert 125V to 5V.




The rest is easy. We have just to use the adc module in our MCU and for that i put the output of the voltage devider in ADC0 (pin23).





If the test is validate with hyper terminal in Proteus ISIS you have to replace the hyper terminal by Xbee in reality.
Xbee work with 3.3 V so we have to add somes components to adapt it to the MCU.




The circuit is done, we have to add the program of the transmitter and here is it.
/*  Wirless Voltage Acquisation
 *  Project done by : Aymen Lachkhem
 *  Aymenlachkem@gmail.com
 *  Blog site : letselectronic.blogspot.com
 */
float voltage = 0;

void setup() {
  // put your setup code here, to run once:
pinMode(A0,INPUT);
pinMode(0,INPUT);
pinMode(1,OUTPUT);
Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:

 voltage = analogRead(A0);
float realvoltage = (voltage * 125) /1023;
delay(100);
Serial.print("VOLTAGE = ");
Serial.print(realvoltage);
Serial.print(" V");
Serial.println();
delay(100);}


Speaking now about the receiver circuit.

In fact, we have a xbee who will read instantly the voltage level, An MCU who will convert this level and make treatement and show it in 2X16 LCD module.

Here is the Circuit to make
  
Replace the COMPIM by the receiver xbee and put this program inside the receiver MCU.


/*  Wirless Voltage Acquisation
 *  Project done by : Aymen Lachkhem
 *  Aymenlachkem@gmail.com
 *  Blog site : letselectronic.blogspot.com
 */
// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.print("Wirless Voltage");
  lcd.println("Acquisation");
  delay(1000);
  // initialize the serial communications:
  Serial.begin(9600);
}

void loop() {
  // when characters arrive over the serial port...
  if (Serial.available()) {
    // wait a bit for the entire message to arrive
     delay(100);
    // clear the screen
    lcd.clear();
    // read all the available characters
    while (Serial.available() > 0) {
      // display each character to the LCD
      lcd.write(Serial.read());
    }
  }
}




And Thats it, all what we have to do is to run the transmitter circuit and the receiver one,  and to enjoy the work.




Dont forget to configure the Xbee's before make it work and here a good video showing how to do it.





Like it is demonstrated in this video, to configure 2 Xbee in reason to make the first the transmitter and the second the receiver we have to use X-CTU Software. Clik in the picture to download it.

Afficher l'image d'origine
  


If you want to make the displaying better, you could easly make your own Software using C# or Visual Basic or Labview.
I recommand Labview to do this because easly he can draw the voltage level in histogramme or in fonction of time.

Afficher l'image d'origine
                                                             


                                                                    See you Soon AYMEN LACHKHEM