Quick demo video and current status

I just figured out that I always show my work in progress, but I never show the car when it is working. So here it is, a small video showing the car as its current status.

I totally rewrote the iOS application. I wanted to make some big changes with the software architecture, and I decided it was a good opportunity for me to learn deeply the Swift language. So I rewrote everything from Objective-C to Swift.

And for those who don’t want to read my previous post and want to know what I am talking about : I took a RC car, removed the radio part on the car, and replaced it by my own hardware. This now allows me to pilote the car with an iPhone or an iPad, and with a video feedback from the camera I installed on the car. And here is how it works :

  • a standard RC car I bought (not too cheap, it has to have standard components and connexions, like a standard servo motor and brushless motor). I removed the radio part and controls now directly the brushless motor and the servo motor for the direction.
  • a Raspberry Pi B+, running with Arch Linux OS, which is lighter than the Raspbian installed by default on a RPi.
  • on the top of the Raspberry Pi B+, a daughter board I conceived and made manufactured. On this board, there is :
    • power management : it take the 12V from the battery, makes +5V and +3,3V for the RPi, the servo power, and the PIC. It is done with a PWM power controller so there isn’t too much power loss from the battery, and not too much heat dissipation needed.
    • dsPIC33 : a 16 bits dsPIC which manages :
      • the control of the servo and the motor; it generated the 1ms to 2 ms pulse required
      • PID control of the motor: there is a sensor coming back from the motor to the PIC for that, but it is not yet implemented in software.
      • power monitoring : there is a divisor bridge on the +12V coming from the battery, and going to an ADC of the PIC so the battery level is monitored. This currently works but I am still calibrating it.
      • status leds : the PIC just blinks the status leds
    • Status leds :
      • 1 indicating if the hardware is powered
      • 1 indicating if the PIC is running
      • 1 indicating if the RPi is running and communicating with the PIC
  • A camera on the top of the car; it is the standard camera sold for the Raspberry Pi. The video streaming is made with GStreamer, it is an open source library made for video streaming. It is quite light, it has been ported on almost all possible OS (including Arch Linux and iOS for my needs); and most important it can achieve streaming with a very low latency.
  • a headlight at the front of the car. It is composed by a small PCB with 8 white leds. And it is here not only for fun, but when it test the car in low light conditions, it is very useful !
  • An iOS device. My Application works on both iPhone or iPad. Currenlty the application has the following features :
    • display the video streaming coming from the car, with a very low latency
    • allow to control the motor and the direction of the car. There is also a manual break, and a command to change the lights on the car, or even flash the headlights.
    • modify the motor cartography, this allows me to decrease the maximum speed of the car (which is too much powerful, especially when used inside), and to give a little more power when the starting the car. But for sure the possibilities are endless, the cartography is fully configurable.
  • A bluetooth gamepad, made for iOS, it is optional, but it is much more easy to control the car with rather than with the iOS device itself. I won such a device several month ago; it is a Mad Catz C.T.R.L.i gamepad, and it works great.

I thinks that’s it for now. So the only thing in the list above which does not work yet is the PID controller for the motor, everything else works. I also have to mention that each system (the Raspberry Pi, the iOS application and the PIC) has its own failure management, each of them is able to detect if it is still communicating with the other parts, and if there is a problem of communication, the car is stopped, and the servo and the motor are put in an idle position. The iOS application and the Linux software react in 1 second, and the PIC reacts in 200ms.

Sorry for the long post, and I don’t have any potato. Next step : the PID controller, stay in touch.

Video streaming and Bluetooth gamepad support

I haven’t posted on my RC car since a while; but I have made a lot of improvements :

  • Stability and security improvement
  • iOS app is now universal
  • Added support of game controller in iOS app.
  • Added video streaming from camera

DSC00416

Stability and security improvement

I improved a lot the stability on both side, and it is now much more secured; disconnection is detected on both car side and iOS side, and the car stops immediately.

iOS app is now universal

The iOS application is now universal and works on iPhone and iPad (but I almost only use it on iPhone now).

Support of game controller in iOS app

I added the support of bluetooth game controllers on the iOS app. I have a Mad Catz micro CTRL and I must say it changes everything; it is now very easy and natural to control the car with it.

Also thanks to Apple and its Game Controller framework, it took me only maybe 1h to add this feature in my app, it is very easy to use.

Video streaming from camera

And yes, after all I added the video streaming from the Raspberry Pi to the iOs app. This was a big challenge. First I tried to use vlc to stream from the RPi, but I add a terrible latency, something like 2 seconds, which was not acceptable to be able to control the car remotely ! So after some research, I found GStreamer, it is an open framework which offers lots of feature regarding video live streaming, and it can have a very low latency for streaming ! GStreamer is available on all OS (Linux, Windows, iOS, Androïd). So I have gstreamer on both side, one arch linux version on my RPi, and one iOS library on my app.

Unfortunately, the pre-build versions available are outdated a lot, so I had to build my own version for iOS. I won’t detail how to do so, this blog does it well : https://tausiq.wordpress.com/2014/12/11/ios-gstreamer-framework-custom-build/.  The only problem I still have with the iOS library is that it does not support iOS 8 sdk, it only support iOS 6, so I have to build my whole app for iOS 6, and this is not very convenient; I hope the gstreamer guys will fix this soon.

On the Raspberry Pi application, once the car is connected to an iOS app, I launch the gstreamer command line utility gst-launch (with execvp in a child process), with  rpicamsrc as a video source, it is a gstreamer plugin made to use the Raspberry Pi camera as a video source. So my parameter on the raspberry pi are (the host is the iOs app ip address and I change the port on every new connexion, so I never have troubles with disconnection/reconnections) :

gst-launch-1.0 rpicamsrc bitrate=2000000 preview=0 rotation=180 ! video/x-h264,width=640,height=480,framerate=48/1,profile=baseline ! queue ! h264parse ! rtph264pay config-interval=1 pt=96 ! udpsink host=192.168.1.xx port=xxxxx

On the iOS app, I use the gstreamer sdk; I won’t detail how I use it, I just did as in the tutorials and examples you can find on the web; but I just give my parameter to create the pipeline (because this was were I had to try lots of different configurations, so if anyone wants to do the same, you can use my parameters on both sides, it works well) :

udpsrc port=xxxxx ! application/x-rtp,encoding-name=H264,payload=96 ! rtph264depay ! h264parse ! avdec_h264 ! autovideosink sync=false

And this is it, the streaming works well, with a very low latency (and I am on a wifi connection !) and a quite good quality, it is enough to be able to drive the car with only the view from the camera !

More to come soon…

Yes, more to come soon (or at least I hope). I totally re-designed the hardware on the car.

  • I changed the power regulator from a linear to a pwm one, so I hope my battery will last a little bit more time.
  • I added a DSPIC33 on the board, it will manage the motor regulation loop (from the sensor I have for my brushless motor and I don’t use yet), and both the brushless motor and servomotor control. The communication with the RPi will be done by SPI.
  • I added a battery monitor; it is also connected to the DSPIC.
  • I added some LEDs on the board to be able to have a status without having to connect on ssh !
  • It is now a real dual layerPCB, not just a veroboard !

The PCB design is finished, I just sent it for manufacturing, and I might receive it in 3-4 weeks, so more news then …

I almost forgot, but if you are looking for a new (maybe longer) ribbon cable for the Raspberry Pi camera, there is a good chance you cannot easily find one with 15 contacts. In facts I found out those ribbon cables come from Würth Elektronik, you can find them here : http://katalog.we-online.de/en/em/686_7xx_xxx_001

And as usual, I didn’t detail everything, but if you are trying to do something similar to me, and are facing the same problems, do not hesitate to ask, I spend a lot of time on this project, so I would by glad that my experience can help someone else.