Second Milestone
For my second milestone, I had to finish the main project, this meant I had to get the 3 main electronic components of the tank done. They were: the Ps2 receiver, the motor driver, and the Arduino.
The Ps2 receiver is what allows me to use the Ps2 controller to connect the Arduino and thus the motor driver. The Ps2 controller has 9 total pins but only 6 are needed, the pins are, in no particular order, clock, data, command, power, ground, and attention. Clock and data send information from the master device to the slave, in this case, the master device is the Ps2 controller and the slave is the Ps2 receiver and by extension the Arduino. Command is what the Ps2 receiver uses to communicate with the master device. Power and ground are connected in the usual manner. Finally, attention is what the master uses to tell the slave that it is active.
The motor driver is, in essence, an H bridge. An H bridge allows current to be sent in the opposite direction or flip the polarity. This allows you to reverse the direction of a DC motor, this allows me to turn the tank.
The Arduino is the “brains” of the tank, the 2 main functions I used the Arduino for where debugging with the serial monitor and analyzing inputs from the Ps2 receiver then sending those outputs to the H bridge. Serial is a communication protocol used by to Arduino to transmit data one bit at a time one way. This allows for debugging using the “serial monitor”, the monitor allows you to view print statements in your code from the Arduino allowing you to debug your code. Secondly to receive inputs from the Ps2 controller I had to connect the Ps2 receiver to a few digital pins as well as ground and 3.3 volts. Pins on an Arduino are used to output 5 volts at 40 Ma, this allows you to choose when to power something or to receive an input. The other type of pin on an Arduino is an analog pin. Analog pins can send and receive analog inputs and outputs. The way the Arduino (a digital device) can send an analog signal is by Pulse Width Modulation or PWM, PWM is when an electrical signal is chopped into many smaller “packets” this is a very good imitation of an analog signal as well controlling motors as motors have inertia, therefore, won’t react as quickly to sudden current changes.
Although for my tank I decided to use an H bridge which is hooked up to the digital pins. Once an output is sent from the Ps2 controller to the Arduino the Arduino analyzes it and then activates the corresponding digital pins which activate a certain orientation of an H bridge which then sends power to the motors thus allowing the tank to move.
the bolded section of the code is the aspect that interacts with the motors and ps2 receiver #include <L298N.h> #define ENa 10 #define IN1 9 #define IN2 8 #define ENB 5 #define IN3 7 #define IN4 6 L298N motor1(ENa, IN1, IN2); L298N motor2(ENB, IN3, IN4); #include <PS2X_lib.h> //for v1.6 PS2X ps2x; // create PS2 Controller Class //right now, the library does NOT support hot pluggable controllers, meaning //you must always either restart your Arduino after you conect the controller, //or call config_gamepad(pins) again after connecting the controller. int error = 0; byte type = 0; byte vibrate = 0; void setup() { Serial.begin(57600); motor1.setSpeed(255); // an integer between 0 and 255 motor2.setSpeed(255); // an integer between 0 and 25 //CHANGES for v1.6 HERE!!! **************PAY ATTENTION************* error = ps2x.config_gamepad(13, 11, 4, 12, true, true); //setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error if (error == 0) { Serial.println("Found Controller, configured successful"); Serial.println("Try out all the buttons, X will vibrate the controller, faster as you press harder;"); Serial.println("holding L1 or R1 will print out the analog stick values."); Serial.println("Go to www.billporter.info for updates and to report bugs."); } else if (error == 1) Serial.println("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips"); else if (error == 2) Serial.println("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips"); else if (error == 3) Serial.println("Controller refusing to enter Pressures mode, may not support it. "); //Serial.print(ps2x.Analog(1), HEX); type = ps2x.readType(); switch (type) { case 0: Serial.println("Unknown Controller type"); break; case 1: Serial.println("DualShock Controller Found"); break; case 2: Serial.println("GuitarHero Controller Found"); break; } } void loop() { /* You must Read Gamepad to get new values Read GamePad and set vibration values ps2x.read_gamepad(small motor on/off, larger motor strenght from 0-255) if you don't enable the rumble, use ps2x.read_gamepad(); with no values you should call this at least once a second */ if (error == 1) //skip loop if no controller found return; if (type == 2) { //Guitar Hero Controller ps2x.read_gamepad(); //read controller // if (ps2x.ButtonPressed(GREEN_FRET)) Serial.println("Green Fret Pressed"); if (ps2x.ButtonPressed(RED_FRET)) Serial.println("Red Fret Pressed"); if (ps2x.ButtonPressed(YELLOW_FRET)) Serial.println("Yellow Fret Pressed"); if (ps2x.ButtonPressed(BLUE_FRET)) Serial.println("Blue Fret Pressed"); if (ps2x.ButtonPressed(ORANGE_FRET)) Serial.println("Orange Fret Pressed"); if (ps2x.ButtonPressed(STAR_POWER)) Serial.println("Star Power Command"); if (ps2x.Button(UP_STRUM)) //will be TRUE as long as button is pressed Serial.println("Up Strum"); if (ps2x.Button(DOWN_STRUM)) Serial.println("DOWN Strum"); if (ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed Serial.println("Start is being held"); if (ps2x.Button(PSB_SELECT)) Serial.println("Select is being held"); if (ps2x.Button(ORANGE_FRET)) // print stick value IF TRUE { Serial.print("Wammy Bar Position:"); Serial.println(ps2x.Analog(WHAMMY_BAR), DEC); } } else { //DualShock Controller ps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed if (ps2x.Button(PSB_START)) //will be TRUE as long as button is pressed Serial.println("Start is being held"); if (ps2x.Button(PSB_SELECT)) Serial.println("Select is being held"); if (ps2x.Button(PSB_PAD_UP)) { //will be TRUE as long as button is pressed Serial.print("Up held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC); } if (ps2x.Button(PSB_PAD_RIGHT)) { Serial.println("Right held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC); } if (ps2x.Button(PSB_PAD_LEFT)) { Serial.println("LEFT held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC); } if (ps2x.Button(PSB_PAD_DOWN)) { Serial.print("DOWN held this hard: "); Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC); } vibrate = ps2x.Analog(PSAB_BLUE); //this will set the large motor vibrate speed based on //how hard you press the blue (X) button if (ps2x.NewButtonState()) //will be TRUE if any button changes state (on to off, or off to on) { if (ps2x.ButtonPressed(PSB_L2)) { Serial.println("L2 pressed"); motor2.forward(); Serial.println("motor go"); } if (ps2x.ButtonPressed(PSB_R2 )) { Serial.println("R2 pressed"); motor1.forward(); Serial.println("motor go"); } if (ps2x.ButtonReleased(PSB_R2 )) { motor1.stop(); Serial.println("motor stop"); } if (ps2x.ButtonReleased(PSB_L2 )) { motor2.stop(); Serial.println("motor stop"); } if (ps2x.ButtonPressed(PSB_L1)) { motor2.backward(); Serial.println("motor go"); } if (ps2x.ButtonPressed(PSB_R1)) { motor1.backward(); Serial.println("motor go"); } if (ps2x.ButtonReleased(PSB_L1)) { motor2.stop(); Serial.println("motor stop"); } if (ps2x.ButtonReleased(PSB_R1)) { motor1.stop(); Serial.println("motor stop"); } delay(50); }
First Milestone
My first milestone was to be able to power the motors by the battery. To do this I had to make 3 main subassemblies, the gearbox, the chassis, and the wheels. The most complex part was the gearbox this was due to many different ways to build it. The variant I chose to build was variant C this gave me rpm 114.7 which gives me 115 rpm and 809-gram force cm. This is fairly in the middle in terms of both torque and rpm this will allow me to add more attachments later as I could still have enough torque to move the tank. The other parts where simple to assemble. Below are images of the tank
rc tank
testing internals
this is the main subassemblies of the tank are the chassis, wheels and the gearbox. the wheels are the orange wheels the chassis is the tan plate that everything is attached to. finally, the gearbox is the grey box with blue and yellow gears inside.