Go Down

Topic: Upgrade from Duemilanove to 16 Analog inputs (Read 3162 times) previous topic - next topic

MartinP

Hi
I have developed a working Analog Data Logger (6 Analog inputs) using VB6 and a Duemilanove. I run Arduino 019 and WinXP. I want to upgrade my Logger to 16 Analog inputs.
I could buy a ATMega2560 but I've seen a number of reports on software, bootloader and USB issues with this board.
I'm not sure how easy it would be to extend the on board software to the 2560.

I would like some advice on whether I should go for the ATMega2560 or another solution or Arduino Board for my upgrade.
Regards
Martin

Senso

You can always add an external ADC, like this one:
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010530

MartinP

Thanks Senso
How easy/difficult would it be to interface with my Duemilanove?
It's USB Serial output works really well for me. I wouldn't like to change too much if possible.
Martin

Senso

You use the SPI interface, and I would bet that there is already one lib to use this ADC with arduino.
The SPI interface uses the digital pin 13,12,11 and 10, you just read it and send the data via serial just like you do using the internal ADC and the analogRead() command.

Coding Badly


http://www.arduino.cc/playground/Learning/4051

MartinP

Thanks guys
I'll investigate your suggestions further. For anyone who's looking, I found this Code for an SPI interface with an 8 channel MCP3208.

http://www.arduino.cc/playground/Code/MCP3208

Regards
Martin

MartinP

Hi Coding Badly
I've succeeded in adapting the 4051 multiplexer solution into my Data Logging project. It works well.
Thanks a lot
Martin

robtillaart

#7
Dec 17, 2010, 05:42 pm Last Edit: Dec 17, 2010, 05:42 pm by robtillaart Reason: 1
Could you share code and how you did it?
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

MartinP

I'll put some code together over the weekend and post it

MartinP

I have not yet made a 16 channel version, but here is the code for a working 8 channel version. The code is an extension of the code found on:

http://www.arduino.cc/playground/Learning/4051

Details of the 4051 are available on that site:

I create a CSV data stream with 9 elements, 8 Analog values read in sequentially from the 4051 plus a digital value to read a push button on Digital Input 3. The output from the 4051 goes to Analog Input(0). When the button is pressed, data is loaded into a MSFlexgrid.
It should be easy to extend the software for a second 4051 feeding into Analog Input(1).

****** Arduino Code Ver 0019
/*
* codeexample for useing a 4051 * analog multiplexer / demultiplexer
* by david c. and tomek n.* for k3 / malm[ch65533] h[ch65533]gskola
*
* To read 8 Analog Values into a single Analog Input Pin on Arduino
* + read a single Button Input on a Digital Input
*/  

const int buttonPin = 3; //digital input 3 Pin 4
int led = 13;    //just an led
int r0 = 0;      //value select pin at the 4051 (s0)
int r1 = 0;      //value select pin at the 4051 (s1)
int r2 = 0;      //value select pin at the 4051 (s2)
int row = 0;     // storing the bin code
int count = 0;    // just a count
int  bin [] = {000, 1, 10, 11, 100, 101, 110, 111};//bin = bin[ch65533]r, some times it is so easy

void setup(){
 // initialize the serial port:
 pinMode(buttonPin, INPUT); //designate buttonPin as Input
 
 pinMode(7, OUTPUT);    // s0 //Output MUX code to 4051 pin 8
 pinMode(6, OUTPUT);    // s1  pin 7
 pinMode(5, OUTPUT);    // s2  pin 6
 digitalWrite(led, HIGH);
 
 Serial.begin(9600);
}

void loop () {

 for (count=0; count<=7; count++) {   //count through 8 MUX codes
   row = bin[count];      
   r0 = row & 0x01;
   r1 = (row>>1) & 0x01;
   r2 = (row>>2) & 0x01;
   digitalWrite(7, r0); //send MUX code to 4051
   digitalWrite(6, r1);
   digitalWrite(5, r2);
   //Serial.print(r0);  // used to include 4051 code in datastring
   //Serial.print(r1);
   //Serial.print(r2);
   //Serial.println();
   //Serial.print(",");
 
   // read the sensor into ch0
   int sensorReading = analogRead(0);  // Analog Input goes to Ch 0 (pin 6)  after each input of 4051 is selected
   // print its value out as an ASCII numeric string
   Serial.print(sensorReading, DEC);    
   Serial.print(",");  //add comma
   }
         
 //read digital input  and write to end of line
 int DigitalsensorReading = digitalRead(buttonPin);  //normally Hi. press for Lo
 Serial.print(DigitalsensorReading);  
 // after the sensors have been read,
 // print a newline and carriage return
 Serial.println();
   //delay (300);  //Optional
 }  

******  My VB6 code for a Test Program is:

Dim RowCounter As Integer

Private Sub Form_Load()

   RowCounter = 1
   Label1.BackColor = vbRed 'initial program run condition.
                               'to make the square box in red color.
End Sub

Private Sub CmdOpen_Click()  
   MSComm1.CommPort = 1
   MSComm1.Settings = "9600,N,8,1"   '9600=baud rate N=no parity 8bits 1 stop bit
   MSComm1.InputLen = 0
   MSComm1.PortOpen = True
   Label1.BackColor = vbGreen
End Sub

Private Sub Timer1_Timer()  'Timer.Interval = 150
   Dim DataValues() As String
   Dim DataString() As String
   Dim DataLines() As String
   Dim MsComStringData As String
   Dim HP, kmh As Single
   
   If MSComm1.InBufferCount > 0 Then
       
       MsComStringData = MSComm1.Input
       Text2.Text = MsComStringData
       MsComStringData = Replace(MsComStringData, Chr(13), "") 'replaces vbCr Carriage Return
                                                               'with null
       DataLines = Split(MsComStringData, Chr(10))  'Split MsComStringData
                                                    'at vbLf  Line Feed
       DataString = Split(DataLines(UBound(DataLines) - 1), ",") 'Split DataLines
                                                                 'at comma
               'for 8  channels MUX output from 4051
               
       If UBound(DataString) < 8 Then   '6 Then  ''for 6 channels
           Exit Sub
       End If
           txt0.Text = DataString(0)
           txt1.Text = DataString(1)
           txt2.Text = DataString(2)
           txt3.Text = DataString(3)
           txt4.Text = DataString(4)
           txt5.Text = DataString(5)
           txt6.Text = DataString(6)
           txt7.Text = DataString(7)
           txtButtonPin.Text = DataString(8)            
           If txtButtonPin = 1 Then txtButtonPin.BackColor = vbRed
                                               'Button not Pressed
           If txtButtonPin = 0 Then
               txtButtonPin.BackColor = vbWhite 'Button Pressed
               grdTable1.Row = RowCounter

               grdTable1.Col = 0
               grdTable1.Text = txt0.Text
               
               grdTable1.Col = 1
               grdTable1.Text = txt1.Text

              grdTable1.Col = 2
              grdTable1.Text = txt2.Text
               
               grdTable1.Col = 3
               grdTable1.Text = txt3.Text

               grdTable1.Col = 4
               grdTable1.Text = txt4.Text
               
               grdTable1.Col = 5
               grdTable1.Text = txt5.Text

grdTable1.Col = 0
               grdTable1.Text = txt0.Text
               
               grdTable1.Col = 1
               grdTable1.Text = txt1.Text


               RowCounter = RowCounter + 1
               
           End If
       
   End If
End Sub

Private Sub cmdClose_Click()
   MSComm1.PortOpen = False
   Label1.BackColor = vbRed
End Sub

Private Sub cmdExit_Click()
   End
End Sub

MartinP

The last section of my VB6 Code got scrambled. Here it is again

If txtButtonPin = 1 Then txtButtonPin.BackColor = vbRed
                                               'Button not Pressed
           If txtButtonPin = 0 Then
               txtButtonPin.BackColor = vbWhite 'Button Pressed

               grdTable1.Row = RowCounter

               grdTable1.Col = 0              
               grdTable1.Text = txt0.Text
               
               grdTable1.Col = 1
               grdTable1.Text = txt1.Text

      grdTable1.Col = 3              
               grdTable1.Text = txt3.Text
               
               grdTable1.Col = 4
               grdTable1.Text = txt4.Text

      grdTable1.Col = 5              
               grdTable1.Text = txt5.Text
               
               grdTable1.Col = 6
               grdTable1.Text = txt6.Text

      grdTable1.Col = 7              
               grdTable1.Text = txt7.Text                
               
               RowCounter = RowCounter + 1
               
           End If
       
   End If
End Sub

Private Sub cmdClose_Click()
   MSComm1.PortOpen = False
   Label1.BackColor = vbRed
End Sub

Private Sub cmdExit_Click()
   End
End Sub

robtillaart

#11
Dec 18, 2010, 12:27 pm Last Edit: Dec 18, 2010, 12:27 pm by robtillaart Reason: 1
Thanx,
Tip: when writing the CSV file you might need to add a time /date column
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Go Up