Continuously move ball on screen

For my 2D game, I want to move ball continuously on screen.
At present, I have following code to work.

public class BallMovement : MonoBehaviour
{
	private bool isStartMoving;
	private Vector3 direction;
	private float speed = 20f;

	void Start ()
	{
		InitializeValues ();
		ScaleUpAnimation ();
	}

	private void InitializeValues ()
	{
		float xDirection = Random.Range (0, 2) * 2 - 1;
		float yDirection = Random.Range (0, 2) * 2 - 1;
		direction = new Vector3 (xDirection * speed, yDirection * speed, 0f);
	}

	private void ScaleUpAnimation ()
	{
		iTween.ScaleTo (gameObject, iTween.Hash ("x", 2f, "y", 2f, "time", 1f, "delay", 0.5f, "oncomplete", "ScaleDownAnimation", 
		                                         "oncompletetarget", gameObject, "easetype", iTween.EaseType.linear));
	}

	private void ScaleDownAnimation ()
	{
		iTween.ScaleTo (gameObject, iTween.Hash ("x", 1f, "y", 1f, "time", 1f, "oncomplete", "ScaleDownComplete", 
		                                         "oncompletetarget", gameObject, "easetype", iTween.EaseType.linear));
	}

	private void ScaleDownComplete ()
	{
		rigidbody2D.velocity = direction;
		isStartMoving = true;
	}

	void FixedUpdate ()
	{
		if (isStartMoving) {
			rigidbody2D.velocity = direction * speed * Time.deltaTime;
		}
	}

	void OnCollisionEnter2D (Collision2D otherCollision)
	{
		Vector3 normal = otherCollision.contacts [0].normal;
		direction = Vector3.Reflect (direction, normal);
	}
}

Using above code, I can able to move ball continuous on screen but it showing some what jerk in its movement.
I want to use ball in collision detection also. If I use transform then it might possible that it didn’t reply correctly in collision detection.
Not looking smooth moving. I want some suggestions to move ball smoothly on screen.

Try using Update instead and tell us how it turns out (::

public class BallMovement : MonoBehaviour
 {
     private bool isStartMoving;
     private Vector3 direction;
     private float speed = 20f;
 
     void Start ()
     {
         InitializeValues ();
         ScaleUpAnimation ();
     }
 
     private void InitializeValues ()
     {
         float xDirection = Random.Range (0, 2) * 2 - 1;
         float yDirection = Random.Range (0, 2) * 2 - 1;
         direction = new Vector3 (xDirection * speed, yDirection * speed, 0f);
     }
 
     private void ScaleUpAnimation ()
     {
         iTween.ScaleTo (gameObject, iTween.Hash ("x", 2f, "y", 2f, "time", 1f, "delay", 0.5f, "oncomplete", "ScaleDownAnimation", 
                                                  "oncompletetarget", gameObject, "easetype", iTween.EaseType.linear));
     }
 
     private void ScaleDownAnimation ()
     {
         iTween.ScaleTo (gameObject, iTween.Hash ("x", 1f, "y", 1f, "time", 1f, "oncomplete", "ScaleDownComplete", 
                                                  "oncompletetarget", gameObject, "easetype", iTween.EaseType.linear));
     }
 
     private void ScaleDownComplete ()
     {
         rigidbody2D.velocity = direction;
         isStartMoving = true;
     }
 
     void Update ()
     {
         if (isStartMoving) {
             rigidbody2D.velocity = direction * speed * Time.deltaTime;
         }
     }
 
     void OnCollisionEnter2D (Collision2D otherCollision)
     {
         Vector3 normal = otherCollision.contacts [0].normal;
         direction = Vector3.Reflect (direction, normal);
     }
 }