Friday 25 May 2018

EV3 Banner Printer

We have developed an EV3 Banner Printer based on the instructions given here. We developed a Java (LeJOS) program to make it operate according to our requirements. Below is a small clip which will demonstrate the printing of various characters. We have also posted the gist of Java program which we developed. This Java program has an array called "myString" which stores the entire set of characters that we want to print. 

Let me give you a brief introduction of this array. The main objective of the program was to operate with the help of a Infrared beacon (For Example: Print "P" when beacon is on mode-3 and button-4). However, testing frequently with the help of beacon was quite time consuming. Hence we have put the entire list of beacon characters in "myString" array. 

NOTE: Below is the gist of how "myString" array looks like
myString[0][0] = 2;  // This is the mode number of the first character
myString[0][1] = 4;  // This is the button number of the first character
myString[1][0] = 2;  // This is the mode number of the second character
myString[1][1] = 1;  // This is the button number of the second character
and so on ... 

Once the string is stored inside the array, we can iterate it over the while loop and start printing the characters one by one. The job of printing any characters is very simple. Rotate the three motors as per requirements. In our case, Large Motor C is doing the job of moving paper as the characters get printed. Large Motor A is doing the job of moving the pen up and down. Medium motor is doing the job of moving the pen from bottom to top of the paper and vice-versa. 

Some key points to remember:
  • Each character is printed 180 degrees apart from each other horizontally, where 180 degrees is the rotation of large motor C. The motor C is responsible for the horizontal movement along the paper's length
  • Each character is printed within 90 degrees to 270 degrees rotation of medium motor D. The medium motor D is responsible for the vertical movement of the pen along the paper's breadth. Here, motor's rotation to 90 degrees correspond to bottom most position along the paper's breadth and 270 degrees correspond to topmost position along the paper's breadth 
  • When the large motor A is rotated through 160 degrees, the pen touches the paper and the character starts printing. And when the motor is rotated through 360 degrees, the pen is lifted up and the printing gets disabled  
Now let me explain the way we print the letter A as an example:
  • The character begins at the position begin = (character - 1) x 180 degrees. The motor C is rotated to this position with the statement ev3lmotorC.rotateTo(begin)
  • Medium motor D is placed at its lowest position on the paper by rotating the medium motor through 90 degrees. This is achieved by the statement ev3mMotorD.rotateTo(90)
  • Large motor A is rotated through 160 degrees by the statement ev3lmotorA.rotateTo(160). This brings us to position A of the character A (based on the below figure)
  • Then comes the drawing of slanting edges of the letter A. The drawing of slanting edge is achieved by incremental movement of motors C and D which move the pen horizontally and vertically respectively. As a result, if you closely observe, the letter A looks like in the below image

 
  • There are total 10 increments through which the motors move and draw the edges. The motor D is moved through increments of 18 degrees vertically, that helps it reach the maximum of 270 degrees of character height in 10 increments. While motor C is moved through increments of 5 degrees that will help it reach 45 degrees horizontally, when it is at the character height. A similar principle is applied when the downward slanting edge is drawn. This exercise brings us from point A to B to C   
  • Now it is the time to draw the horizontal middle line of the letter A. But before jumping into drawing the line, we have to know where we are, with respect to the entire drawing of letter A. We are at point C. At this point we have to lift the pen, by rotating the motor through 360 degrees. We lift the pen so that nothing gets printed unless we want it
  • We then bring the pen at the position M, by rotating the motor C horizontally through an angle begin + 90 - 68. Also we need to rotate the motor D vertically by 180 to reach the point M
  • Now rotate the motor A through 160 degrees, to get the pen in contact with the paper. Then rotate the motor C horizontally through an angle begin + 90 - 23. This will bring the pen at position N. 
  • The next steps are to wrap up the printing of the character, by brining the pen from position N to position C.  
    • Lift the pen up by rotating the motor A through 360 degrees
    • Rotate the motor C through begin + 90 degrees and motor D through 90 degrees to reach the point C. With respect to point C, the next character will be drawn. 
For us, it was a lot of joy to work on this printer. Hope you will also enjoy reading the article and also building it. 


Monday 7 May 2018

Our Pet Spik3r

Below is a story of our pet Spik3r, which we have captured in the form of a small video clip. Our Spik3r was moving on as usual and we were about to give it some food (the bug). However, our Spik3r sensed some danger at that point of time and shot the bug. It started running backwards and stopped after some time. Enjoy the visual. (The Java program is also shared along with the visual).

Based on the mechanical assembly of the Spik3r, the large motor D is used to drive the robot forward. Another large motor A, is used to implement the sting. While the medium motor is used to implement the claw to catch the food (the bugs). The IR sensor is mounted on the front part of the robot in order to sense the existence of any danger. 

The program to drive the robot Spik3r consists of a single class, Spik3r2. It has a main method, which initializes all the three motors and the IR sensor in Distance mode. When the ESCAPE button is un-pressed and the IR Sensor does not find any object (danger) in front of it in a range of 20 cm, the robot keeps moving forward with the large motor D (which rotates with a speed of 400 degrees per seconds) and it also keeps moving its claw to catch the bug. The claw movement is done by rotating the medium motor through 220 to -220 degrees. The IR Sensor distance samples are fetched continuously while moving forward.  

If the robot locates a danger (our hand which is placing the bug in front of the robot) in less than 20 cm distance, it starts running backwards with a speed of 990 degrees per seconds. While running backwards, it stings the dangerous object (in the case of Spiker, it shoots a ball towards the dangerous object). The sting is caused by setting the large motor A at a speed of 640 degrees per second and rotating it through 600 degrees. The IR Sensor keeps fetching the Distance samples and as soon as the dangerous object goes out of sight, the robot starts moving forward again (unfortunately this forward movement at a later stage has not gotten captured in the video).





Tuesday 17 April 2018

EV3 Track3r Line Follower

This is a post for EV3 Track3r line follower. Track3r has an attached color sensor which helps the track3r to follow the black line on the white surface. For the track3r to function, calibration of white and black color has to be done (which is not captured in this video.) The actual algorithm to follow the line is influenced by Jacek Fedorynski's Line Follower NXC program. The LeJOS (Java) program has one class EV3LF. This class initializes the color sensor and calibrates the sensor for Black and White values. This class has the algorithm to follow the line - given the calibrated black and white values and the light intensity at any given point in time.

The detail process of calibrating Black and White values is as follows. We can hear two beeps and the robot waits for press and release of ESCAPE button. While the robot is waiting, we have to manually adjust the color sensor such that the red light emitted by the color sensor will be focused over the white surface. Then press and release the ESCAPE button. This is the instant when the robot will fetch a sample from the color sensor. This sample will act as the threshold value for white color, which will be printed on the screen. 

Then, we can hear two beeps again and the robot waits for press and release of ESCAPE button. While the robot is waiting, we have to manually adjust the color sensor such that the red light emitted by the color sensor will be focused over the black line. Then press and release the ESCAPE button. This is the instant when the robot will fetch a sample from the color sensor. This sample will act as the threshold value for black color, which will be printed on the screen. 

We then initialize the motors B and C which will drive the robot forward. We power the large motors such that the power of each motor is a function of average light ((white + black)/2), instantaneous value of light (color[0]), white threshold and black threshold. We use this power to drive the motors forward. Let's analyze the formulae to calculate the power for the two large motors in detail. 






  • The polarity of the second term is opposite for both the motors to calculate the speed requirements (as indicated by the RED circles). Due to the opposite polarity, the cSpeed and bSpeed function in opposite manner. That means, when cSpeed is positive, bSpeed is negative and vice-versa. Hence when the robot is on the black surface, it gets pushed on to white surface and when the robot is on white surface, it gets pushed on to black surface. Thus the robot moves in a zig-zag manner along the line. However, since the zig-zag movement is very subtle, it appears to be smooth. 
  • The defaultPower is set to a constant value, which can be tuned based on the speed requirements.
  • The multiplyingFactor is set to a constant value, which can be tuned such that cSpeed and bSpeed will function in opposite manner. 












Thursday 12 April 2018

Dinor3x

Dinor3x is a creation from Lego Mindstorms EV3 Fan robots which we attempted to program. This robot is a four legged robot. It starts walking as soon as it is powered on. When an object comes along its way (as detected by infrared sensor), it opens its mouth and acknowledges its presence. Please find the below code as well as a small video clip to see the performance of the robot.


This program consists of two classes. Dinor3x and OpenMouth. Let me explain the functionality of both the classes. Dinor3x is the class which has the main method. This method starts a thread OpenMouth. It also initializes both the large motors which control the legs of the Dinor3x. Based on the assembly of the Dinor3x, it looks like when I move the motors backwards, the Dinor3x moves forward. The Dinor3x moves forward, until ESCAPE button is un-pressed and the turnFlag is OFF (turnFlag represents the condition when there is an obstacle in front of the Dinor3x. I will explain it in detail while explaining the OpenMouth class). When the turnFlag is ON, that means when the Dinor3x mouth is open, both the large motors stop. As a result, the Dinor3x stops. 

Let's talk about the OpenMouth class now. Based on the assembly of the robot, we know that the medium motor controls the opening and closing action of the mouth. Also, the IR sensor in the front part of the Dinor3x activates the opening and closing action of the mouth. When we keep an obstacle (our hand) in the path of the robot, the IR sensor captures the presence of the obstacle. To capture this, the IR sensor has to be in Distance mode. The IR sensor then fetches a single sample of the distance (the distance of the obstacle in front of the robot). If this sample is of distance less than 20 cm, we make the Dinor3x open and close the mouth by moving the motor through 45 and -45 degrees respectively. If you carefully observe the movement of the mouth, the mouth quivers a little after closing. This phenomenon is achieved by rotating the medium motor through 2 and -2 degrees for 4 times. Once the object goes out of site, the medium motor is reinitialized to an angle of 45 degrees and the thread ends. 
 
Meanwhile, the turnFlag is turned on as soon as the object is sensed and it is turned off as soon as the object goes out of site (with more than 20cm distance). This is the same turnFlag which we use in the main method of Dinor3x class to stop the Dinor3x from walking when the object gets sensed.
 
      



We have also implemented the Dinor3x revolving around itself. The video of the revolving process is posted below. However, we have not posted the LeJOS code for the revolving Dinor3x. We suggest you to take this as an assignment. Believe us, it is going to be an interesting program!