![](/media/cache/profiles/6f0cdeedf664c24860cba8842e94b300.50x50_q85.jpg)
This project aims at hacking a remote controlled car by replacing the tx/rx and navigation systems. This project implements the car side.
Dependencies: mbed-rtos mbed ssWi
This project consists of a remote controller which pilots a car holding a video camera onboard. It is divided in two main parts:
- user side: the microcontroller reads the user input from the joystick (four potentiometers), elaborates them and then sends those commands through the wireless connection (using a XBee module);
- car side: the microcontroller receives the sent commands (using a XBee module), elaborates them and adjusts the main engine, the steering servomotor and the two servos which move the X-Y axis of the onboard video camera.
Here are a image of the hardware and a video I recorderd and edited.
Concerning the part related to the user side, the project is the following.
Import programrover_pc
This project aims at hacking a remote controlled car by replacing the tx/rx and navigation systems. This project implements the pc side.
The communication protocol I exploited to make the two parts communicate each other is ssWi.
Import libraryssWi
A simple wireless protocol to let my examples communicate each other. ssWi stands for Shared Slotted Wireless protocol
Revision 0:97d3a2b0ff58, committed 2013-03-12
- Comitter:
- mariob
- Date:
- Tue Mar 12 07:35:28 2013 +0000
- Commit message:
- rover project - car side; MB
Changed in this revision
diff -r 000000000000 -r 97d3a2b0ff58 carDrivers/Servo/servo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/carDrivers/Servo/servo.cpp Tue Mar 12 07:35:28 2013 +0000 @@ -0,0 +1,27 @@ +#include "servo.hpp" + + +Servo::Servo (PinName pwm, float min, float max, float center): _pwm(pwm) +{ + _pwm.period(0.02); + _min = min; + _max = max; + _center = center; + *this = 0.5; +} + +Servo &Servo::operator= (float angle) +{ + if (angle>1.0) + angle = 1.0; + else + if (angle<-1.0) + angle = -1.0; + _pwm.pulsewidth(_center+((_max-_min)*(angle/2.0))); + return *this; +} + +Servo::operator float() +{ + return _pwm.read(); +}
diff -r 000000000000 -r 97d3a2b0ff58 carDrivers/Servo/servo.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/carDrivers/Servo/servo.hpp Tue Mar 12 07:35:28 2013 +0000 @@ -0,0 +1,24 @@ +#ifndef __SERVO_HPP__ +#define __SERVO_HPP__ + + +#include "mbed.h" + + +class Servo +{ + PwmOut _pwm; + float _min; + float _max; + float _center; + +public: + Servo(PinName pwm, float min=0.001, float max=0.002, float center=0.0015); + + Servo& operator= (float speed); + + operator float(); + +}; + +#endif //__SERVO_HPP__
diff -r 000000000000 -r 97d3a2b0ff58 carDrivers/car.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/carDrivers/car.cpp Tue Mar 12 07:35:28 2013 +0000 @@ -0,0 +1,30 @@ +#include "car.hpp" + +Car::Car ( PinName pinCamX, PinName pinCamY, + PinName pinSteering, PinName pinMotor): + cameraX(pinCamX), cameraY(pinCamY), + steering(pinSteering), motor(pinMotor) +{ + angleX = 0; + angleY = 0; + cameraX = 0.0; + cameraY = 0.0; + steering = 0.0; + motor = 0.0; +} + +void Car::setSpeed (float s) +{ + motor = s; +} + +void Car::setSteering (float angle) +{ + steering = -angle; +} + +void Car::setCamera (float x, float y) +{ + cameraX = x; + cameraY = y; +}
diff -r 000000000000 -r 97d3a2b0ff58 carDrivers/car.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/carDrivers/car.hpp Tue Mar 12 07:35:28 2013 +0000 @@ -0,0 +1,34 @@ +#ifndef __CAR_HPP__ +#define __CAR_HPP__ + + +#include "servo.hpp" + + +#define CAMERA_ANGLE_STEP 0.1 + + +class Car +{ + //camera + int angleX; + int angleY; + Servo cameraX; + Servo cameraY; + + //motor + Servo steering; + Servo motor; + +public: + + Car (PinName pinCamX, PinName pinCamY, PinName pinSteering, PinName pinMotor); + + void setSpeed (float s); + void setSteering (float angle); + void setCamera (float x, float y); + +}; + + +#endif //__CAR_HPP__
diff -r 000000000000 -r 97d3a2b0ff58 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Mar 12 07:35:28 2013 +0000 @@ -0,0 +1,67 @@ +#include "mbed.h" +#include "rtos.h" + +#include "xbee.hpp" +#include "ssWiSocket.hpp" +#include "car.hpp" + + +#define PORT_MOTOR 20 +#define PORT_SERVO 30 +#define PORT_SERVO_CAMERA_X 40 +#define PORT_SERVO_CAMERA_Y 50 + +#define UPDATING_FUNCTION_MS 200 + + +ssWiSocket* socket_motor; +ssWiSocket* socket_servo; +ssWiSocket* socket_camera_x; +ssWiSocket* socket_camera_y; + +Car car(p23, p24, p25, p26); + + +void udateFunction (const void* arg); + + +int main() +{ + //Communication link connection + XBeeModule xbee(p9, p10, 102, 14); + xbee.setDstAddress(XBeeBroadcastAddress()); + xbee.init(-1, 5); + + //Socket creation + socket_motor = ssWiSocket::createSocket(PORT_MOTOR); + socket_servo = ssWiSocket::createSocket(PORT_SERVO); + socket_camera_x = ssWiSocket::createSocket(PORT_SERVO_CAMERA_X); + socket_camera_y = ssWiSocket::createSocket(PORT_SERVO_CAMERA_Y); + if (socket_motor==NULL || socket_servo==NULL || + socket_camera_x==NULL || socket_camera_y==NULL) + printf("Error: sockets\n\r"); + + //Timer setting + RtosTimer timer(udateFunction, osTimerPeriodic, NULL); + timer.start(200); + + //Infinite wait + Thread::wait(osWaitForever); +} + + +void udateFunction (const void* arg) +{ + static DigitalOut led(LED1); + static int var = 0; +// while(1) { + car.setSpeed((float)(socket_motor->read())/1000.0); + car.setSteering((float)(socket_servo->read())/1000.0); + float x = (float)socket_camera_x->read()/1000.0; + float y = (float)socket_camera_y->read()/1000.0; + car.setCamera(x, y); + led = var>=10?1:0; + var = var>=20?0:var+1; +// Thread::wait(UPDATING_FUNCTION_MS); +// } +}
diff -r 000000000000 -r 97d3a2b0ff58 mbed-rtos.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Tue Mar 12 07:35:28 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#9654a71f5a90
diff -r 000000000000 -r 97d3a2b0ff58 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Tue Mar 12 07:35:28 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/cd19af002ccc \ No newline at end of file
diff -r 000000000000 -r 97d3a2b0ff58 ssWi.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ssWi.lib Tue Mar 12 07:35:28 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mariob/code/ssWi/#b50c3b3b241c