on Tuesday, July 31, 2012
Hello all,
I needed in one of my project to store data in a database, So as I only know Mysql I directly jump on it.
But my big problem was that I have to put all of the files in one package the thing that Mysql won't allow me to do, cause Mysql is a server database witch means that we can only connect to it and not integrate it in our application like this example . (correct me if I'm wrong please)
So I searched more and I found this little piece of jewellery System.data.sql.dll witch is a SQL based database direct link library that could be simply integrated in your C# application.
These are some tools I used to create and manage my database:
Some useful tutoriels:
using the sqlite function and send SQL queries. 
Gives a very useful class to manage data with dataGridView, inserting , updating and all those stuff
I added a method that can create data table:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Windows.Forms;

class SQLiteDatabase
{
    String dbConnection;

    /// <summary>
    ///     Default Constructor for SQLiteDatabase Class.
    /// </summary>
    public SQLiteDatabase()
    {
        dbConnection = "Data Source=REMOTES.s3db";
    }

    /// <summary>
    ///     Single Param Constructor for specifying the DB file.
    /// </summary>
    /// <param name="inputFile">The File containing the DB</param>
    public SQLiteDatabase(String inputFile)
    {
        dbConnection = String.Format("Data Source={0}", inputFile);
    }

    /// <summary>
    ///     Single Param Constructor for specifying advanced connection options.
    /// </summary>
    /// <param name="connectionOpts">A dictionary containing all desired options and their values</param>
    public SQLiteDatabase(Dictionary<String, String> connectionOpts)
    {
        String str = "";
        foreach (KeyValuePair<String, String> row in connectionOpts)
        {
            str += String.Format("{0}={1}; ", row.Key, row.Value);
        }
        str = str.Trim().Substring(0, str.Length - 1);
        dbConnection = str;
    }

    /// <summary>
    ///     Allows the programmer to run a query against the Database.
    /// </summary>
    /// <param name="sql">The SQL to run</param>
    /// <returns>A DataTable containing the result set.</returns>
    public DataTable GetDataTable(string sql)
    {
        DataTable dt = new DataTable();
        try
        {
            SQLiteConnection cnn = new SQLiteConnection(dbConnection);
            cnn.Open();
            SQLiteCommand mycommand = new SQLiteCommand(cnn);
            mycommand.CommandText = sql;
            SQLiteDataReader reader = mycommand.ExecuteReader();
            dt.Load(reader);
            reader.Close();
            cnn.Close();
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }
        return dt;
    }

    /// <summary>
    ///     Allows the programmer to interact with the database for purposes other than a query.
    /// </summary>
    /// <param name="sql">The SQL to be run.</param>
    /// <returns>An Integer containing the number of rows updated.</returns>
    public int ExecuteNonQuery(string sql)
    {
        SQLiteConnection cnn = new SQLiteConnection(dbConnection);
        cnn.Open();
        SQLiteCommand mycommand = new SQLiteCommand(cnn);
        mycommand.CommandText = sql;
        int rowsUpdated = mycommand.ExecuteNonQuery();
        cnn.Close();
        return rowsUpdated;
    }

    /// <summary>
    ///     Allows the programmer to retrieve single items from the DB.
    /// </summary>
    /// <param name="sql">The query to run.</param>
    /// <returns>A string.</returns>
    public string ExecuteScalar(string sql)
    {
        SQLiteConnection cnn = new SQLiteConnection(dbConnection);
        cnn.Open();
        SQLiteCommand mycommand = new SQLiteCommand(cnn);
        mycommand.CommandText = sql;
        object value = mycommand.ExecuteScalar();
        cnn.Close();
        if (value != null)
        {
            return value.ToString();
        }
        return "";
    }

    /// <summary>
    ///     Allows the programmer to easily update rows in the DB.
    /// </summary>
    /// <param name="tableName">The table to update.</param>
    /// <param name="data">A dictionary containing Column names and their new values.</param>
    /// <param name="where">The where clause for the update statement.</param>
    /// <returns>A boolean true or false to signify success or failure.</returns>
    public bool Update(String tableName, Dictionary<String, String> data, String where)
    {
        String vals = "";
        Boolean returnCode = true;
        if (data.Count >= 1)
        {
            foreach (KeyValuePair<String, String> val in data)
            {
                vals += String.Format(" {0} = '{1}',", val.Key.ToString(), val.Value.ToString());
            }
            vals = vals.Substring(0, vals.Length - 1);
        }
        try
        {
            this.ExecuteNonQuery(String.Format("update {0} set {1} where {2};", tableName, vals, where));
        }
        catch
        {
            returnCode = false;
        }
        return returnCode;
    }

    /// <summary>
    ///     Allows the programmer to easily delete rows from the DB.
    /// </summary>
    /// <param name="tableName">The table from which to delete.</param>
    /// <param name="where">The where clause for the delete.</param>
    /// <returns>A boolean true or false to signify success or failure.</returns>
    public bool Delete(String tableName, String where)
    {
        Boolean returnCode = true;
        try
        {
            this.ExecuteNonQuery(String.Format("delete from {0} where {1};", tableName, where));
        }
        catch (Exception fail)
        {
            MessageBox.Show(fail.Message);
            returnCode = false;
        }
        return returnCode;
    }

    /// <summary>
    ///     Allows the programmer to easily insert into the DB
    /// </summary>
    /// <param name="tableName">The table into which we insert the data.</param>
    /// <param name="data">A dictionary containing the column names and data for the insert.</param>
    /// <returns>A boolean true or false to signify success or failure.</returns>
    public bool Insert(String tableName, Dictionary<String, String> data)
    {
        String columns = "";
        String values = "";
        Boolean returnCode = true;
        foreach (KeyValuePair<String, String> val in data)
        {
            columns += String.Format(" {0},", val.Key.ToString());
            values += String.Format(" '{0}',", val.Value);
        }
        columns = columns.Substring(0, columns.Length - 1);
        values = values.Substring(0, values.Length - 1);
        try
        {
            this.ExecuteNonQuery(String.Format("insert into {0}({1}) values({2});", tableName, columns, values));
        }
        catch (Exception fail)
        {
            MessageBox.Show(fail.Message);
            returnCode = false;
        }
        return returnCode;
    }

    /// <summary>
    ///     Allows the programmer to easily delete all data from the DB.
    /// </summary>
    /// <returns>A boolean true or false to signify success or failure.</returns>
    public bool ClearDB()
    {
        DataTable tables;
        try
        {
            tables = this.GetDataTable("select NAME from SQLITE_MASTER where type='table' order by NAME;");
            foreach (DataRow table in tables.Rows)
            {
                this.ClearTable(table["NAME"].ToString());
            }
            return true;
        }
        catch
        {
            return false;
        }
    }

    /// <summary>
    ///     Allows the user to easily clear all data from a specific table.
    /// </summary>
    /// <param name="table">The name of the table to clear.</param>
    /// <returns>A boolean true or false to signify success or failure.</returns>
    public bool ClearTable(String table)
    {
        try
        {

            this.ExecuteNonQuery(String.Format("delete from {0};", table));
            return true;
        }
        catch
        {
            return false;
        }
    }
    public bool CreateTable(String TableName)
    {
        try
        {
            this.ExecuteNonQuery("CREATE TABLE IF NOT EXISTS " + TableName + " ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(100) NOT NULL);");
            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            return false;
        }
    }
}






on Friday, July 6, 2012
Hello,
you may want sometimes to save data that are too much to handle by your poor little pic, well you may thought of using an external eeprom to save all your data their,
In this tutoriel, I'm going to tell how to interface the 24LC256 eeprom with a 16F887 pic microcontroller.

I2C is a protocol that can allow multiple slaves and multiple masters to be connected in the same network, and that's pretty awsom ^^, most of the time there is only one master and many slaves, but in our case there will be one master (our PIC 16F887) and one slave our (24LC256 eeprom).
The master can communicate with only one slave at a time so how can he make a difference between his slaves?
well that's easy every slave has its unique address in the network for example our 24LC256 address has a 7 bit address that's equal to in binary 0B1010A1A2A3,
A master in a I2C network can read xor write it can't do both of them at the same time, so you may wonder how the slave would know if the master need to right or read from it,
well that's simple if the master want to write in the eeprom it sends 0XA0 and if it want to read it sends 0XA1, in other terms the LSB is the bit responsible for reading or writing.

wiring The 24LC256 EEPROM

A1 A2 and A3 are wired to the ground so our eeprom address is 0B1010000
Wp it's a bit for writing protection or read only, I'm not sur just wired to the ground.
SDA is the pin responsible for sending and receiving data,
SCK is the serial clock
We must use 2 pull up resistor for SDA and SCL (in proteus isis use the pull up resistor model)

Writing and reading from the EEPROM

we will store a data in a specific address then we are going to read data from that address.
unsigned char i = 0;
char txt[4];
void rc(){
     uart1_write(10);
     uarT1_write(13);
}
void main(){
  uart1_init(9600);
  I2C1_Init(100000);
  uart1_write_text("initialize I2C communication");rc();
  I2C1_Start();
  uart1_write_text("Start I2C communication");rc();
  I2C1_Wr(0xA0);
  delay_ms(10);
  uart1_write_text("write eeprom address");rc();
  I2C1_Wr(0x00);
  delay_ms(10);
  uart1_write_text("write low address");rc();
  I2C1_Wr(0x00);
   delay_ms(10);
   uart1_write_text("write high address");rc();
  I2C1_Wr(26); //donnée à écrire
  delay_ms(10);
  uart1_write_text("send to be stored");rc();
  I2C1_Stop();
  uart1_write_text("Stop I2C communication");rc();
  Delay_100ms();
  I2C1_Start();
  uart1_write_text("Start I2C communication");rc();
  I2C1_Wr(0xA0);
    delay_ms(10);
    uart1_write_text("write eeprom address");rc();
  I2C1_Wr(0x00);
     delay_ms(10);
     uart1_write_text("Start I2C communication");rc();
  I2C1_Wr(0X00);
  delay_ms(10);
  uart1_write_text("write low address");rc();
  I2C1_Repeated_Start();
  uart1_write_text("write high address");rc();
  I2C1_Wr(0xA1);
  delay_ms(10);
  uart1_write_text("read eeprom address");rc();
  i=I2C1_Rd(0);
  uart1_write_text("read stored data");rc();
  I2C1_Stop();
  uart1_write_text("Stop I2C communication");rc();
  bytetostr(i,txt);
  uart1_write_text(txt);rc();
}

I hope that was clear, don't stop sharing!!



on Friday, June 1, 2012
So here I am founding my self learning the NXT lego mindstorm kit for robotics to teach some robotic lessons to some kids with my friend Helmi.

I didn't play with lego when I was young and I didn't make any robot neither but I found that learning such things in early age is just great cause robotics include many disciplines like mathematics physics algorithms mechanics and even chemistry in some cases so for a child this is a great opportunity to boost his way of thinking perception searching for information and finding solutions without mentioning increasing his self confidence and sense of innovation and creation with such a simple tool simple tasks but with amazing results.
Sure I will post some of NXT robotics experience. Till that day keep sharing :)

on Tuesday, May 15, 2012

Meet,



Mr Proportional
a fat guy that eat too much his one and only issue is his stomach :pp





Mr Integrator

 a punctual guy and obsessed with time he can never be satisfied with something unless he finished it all.






Mr Derivator
an athlete that loves to run, sometimes slow and sometimes fast and he can make his colleagues run faster.








Mr P Mr I and Mr D can make a great combination to make any system work at his best withe all the energy that given by Mr P all the punctuality that is given by Mr I and all the speed that it's given by Mr D.


So PID Controller is a command law that controls a system to respond to a specific order.
Our objective to make a specific system respond to our command with the minimum possible error as fast as possible and with maintaining it's stabilité

So let's look to this system:
It can be controlled by two different way.
The first method is an open loop command  it's a very simple command we just put the command manually and the system will react according to that command BUT that means we don't have any idea about what's going on in the end and even that we can observe our system working we don't have an exact idea about his performance.

The second method is a close loop command that means we give a desired goal for example a specific position the system then will calculate the error = desired goal - output and create the command accordingly so in this case the command is generated automatically. 
here we can notice that the desired goal and the output must be with the same unity that means the desired goal must much the unity of the system output.

Where's the PID?

well PID regulator is the first one which meets the error calculated each time.


As we already saw Mr P, I and D are the 3 gentlemen who constitute the PID regulator.

Mr P is simply the error that we already talked about.
Mr I is the sum of all the errors calculated
Mr D present the Dynamic of the errors whether the error value are changed suddenly or smoothly we should consider that in out regulator.

How can I much this gentlemen with my specific system?

well here we need a little magic. You should know the exact amount of food to give to Mr P Let's called Kp. The exact sense of punctuality to Mr I (Ki) and the perfect body to Mr D (Kd).

Implementation:

If you want to implement your PID controller into a microcontroller you need to follow this steps;

1° Create a Timer interrupt (which represent the sampling time)
2° predefine your PID parameters
3° in the Timer routine calculate the 3 Mrs:
   MrP = target-output
-------------------------------
  MrI=MrP+LastMrI
 LastMr+=MrI
------------------------------
MrD=MrP-LastMrD
LastMrD=MrP
------------------------------
4°calculate the correction
 correction = Kp*Mrp+Ki*MrI+ Kd*MrD
5°Saturation:
correction mustn't exceed the maximum value the actuator would take so we need to do a saturation routine

N°: Sometimes "correction" have negative values so if we are dealing with motors that means turning in the other sens if we are dealing with a temperature regulation that means we should stop or cooling our system.
on Sunday, May 6, 2012
visual assistant is a wonderful tool that allows you to create complex image processing alghorithm with simple cliks

In this tutorial I'm using a PIC18F4550 with 48MHz crystal to communicate through usb with PC.
If you are using proteus ISIS I'm happy to tell you that there's a wonderful feature which create a virtual usb driver so you don't need any electronics to test your program.

I'm going to show you how to create a project that includes the usb HID (Human interface devices) library. So after this project you will be able to create your own HID devices with your product and vendor IDs.

First start by creating a new Projects with all the settings mentioned above and copy this code which is by the way the example code given by the Help.

unsigned char readbuff[64] absolute 0x500;   // Buffers should be in USB RAM, please consult datasheet
unsigned char writebuff[64] absolute 0x540;

char cnt;
char kk;

void interrupt(){
   USB_Interrupt_Proc();                   // USB servicing is done inside the interrupt
}

void main(void){
  ADCON1 |= 0x0F;                         // Configure all ports with analog function as digital
  CMCON  |= 7;                            // Disable comparators

  HID_Enable(&readbuff,&writebuff);       // Enable HID communication

  while(1){
    while(!HID_Read())
      ;

    for(cnt=0;cnt<64;cnt++)
      writebuff[cnt]=readbuff[cnt];

    while(!HID_Write(&writebuff,64))
      ;
  }
}
The code simply send back what he received ^^

Now Tools->HID terminal

Set your VID and PID your Vendor Name and Product Name as you want.
Then select the mikroC radio and save your descriptor file with your project files (not an obligation but recommended :p ).

Go to view-->project manager
right click on the "source" folder and choose "add files to project" to add the descriptor file you already created.

before compiling one last step:
go to edit project and set it like in the picture


Finally Compile your project. It should work fine if you are not using the demo version.