2014-01-11

2013-12-05

Adafruit (PCA9685) C Servo Controller (Raspberry Pi)

I've managed to change Georgi Todorovs C drivers for Adafruits Servo Controller and thought I could post the result here. I'm using it with my Raspberry Pi. For some more and initial information (setup, python code and i2cdrivers etc) please have a look at http://learn.adafruit.com/adafruit-16-channel-servo-driver-with-raspberry-pi/
Download source code here:

https://drive.google.com/file/d/0Bx4cA9PUHODLVDA0R0FrNlhZRE0/edit?usp=sharing

make and compile by executing the following on your raspberry pi
$ ./run.sh

Remember to make sure your LD_LIBRARY_PATH is set correctly, that you have configured the servo controller properly (use i2cdetect -y [0 or 1]) and that you run as root. 

2013-06-05

Gstreamer tee code example


This very simple example demonstrates how to use the tee element in Gstreamer, by outputting a video stream from a v4l2src to two xvimagesinks.


This example requiers Gstreamer-1.x.
To compile the code, try the following line:

$ g++ `pkg-config gstreamer-1.0 --cflags` tee.cpp -o tee_example `pkg-config gstreamer-1.0 --libs` -fPIC -I /usr/include -L /usr/lib

------
// (c) Tord Wessman 2013
// Feel free to do what you like with code.
// 
// This simple example demonstrates how to use the tee elements to
// display two xvimagesink windows containing one web-cam input (v4l2src).
// 


#include <cstdio>
#include <gst/gst.h>

static GMainLoop *loop;

static GstElement *bin,  // the containing all the elements
  *pipeline,    
  *src,  
  *csp,
  *tee,
  *q1,*q2,
  *testsink,
  *sink;

static GstBus *bus; //the bus element te transport messages from/to the pipeline

static gboolean bus_call(GstBus *bus, GstMessage *msg, void *user_data);

int init() {
 gst_init (NULL, NULL);

 GstCaps *caps;

 /* create the main loop */
 loop = g_main_loop_new(NULL, FALSE);

 pipeline = gst_pipeline_new ("video_pipeline");

 /* create the bus for the pipeline */
 bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));

 /* add the bus handler method */
 gst_bus_add_watch(bus, bus_call, NULL);

 gst_object_unref(bus);

 bin = gst_bin_new ("video_bin");
 
 //initializing elements
 src = gst_element_factory_make ("v4l2src", "src");
 sink = gst_element_factory_make ("xvimagesink", "xvimagesinkONE");
 testsink = gst_element_factory_make ("xvimagesink", "testsinkTWO");
 csp = gst_element_factory_make("videoconvert", "csp");
 tee = gst_element_factory_make ("tee", "videotee");
 q1 = gst_element_factory_make ("queue", "qone");
 q2 = gst_element_factory_make ("queue", "qtwo");

 if (src == NULL || sink == NULL  || testsink == NULL) {
  g_critical ("Unable to create src/sink elements.");
  return 0;
 } else  if (csp == NULL) {
  g_critical ("Unable to create csp");
  return 0;
 } else if (!q1 && !q2 && !tee) {
  g_critical ("Unable to create other elements");
  return 0;
 } 

 /* Add the elements to the pipeline prior to linking them */ 

 gst_bin_add_many(GST_BIN(pipeline), src, csp, tee, q1, sink, q2, testsink, NULL);

 /* Specify caps for the csp-filter (modify this if your hardware requires) */

 caps = gst_caps_new_simple("video/x-raw",
   "width", G_TYPE_INT, 640,
   "height", G_TYPE_INT, 480,
   NULL);

 /* Link the camera source and csp filter using capabilities
  * specified */

 if(!gst_element_link_many(src, csp, NULL))
 {
  gst_object_unref (pipeline);
  g_critical ("Unable to link src to csp ");
  return 0;
 }

 /* link the tee element */ 

 if(!gst_element_link_filtered(csp, tee, caps))
 {
  gst_object_unref (pipeline);
  g_critical ("Unable to link csp to tee. check your caps.");
  return 0;
 } 

 /* Link the first sink */
 if(!gst_element_link_many(q1, sink, NULL))
 {
  gst_object_unref (pipeline);
  g_critical ("Unable to link csp->tee->queue->sink for the queue 1");
  return 0;
 }



 /* Link the second sink */
 if(!gst_element_link_many(q2, testsink, NULL))
 {
  gst_object_unref (pipeline);
  g_critical ("Unable to link csp->tee->queue->sink for the queue 2.");
  return 0;
 }

 GstPadTemplate *tee_src_pad_template;
 GstPad *tee_q1_pad, *tee_q2_pad;
   GstPad *q1_pad, *q2_pad;

 /* Manually link the Tee, which has "Request" pads */
 if ( !(tee_src_pad_template = gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (tee), "src_%u"))) {
  gst_object_unref (pipeline);
  g_critical ("Unable to get pad template");
  return 0;  
 }
 
 /* Obtaining request pads for the tee elements*/
 tee_q1_pad = gst_element_request_pad (tee, tee_src_pad_template, NULL, NULL);
 g_print ("Obtained request pad %s for q1 branch.\n", gst_pad_get_name (tee_q1_pad));
 q1_pad = gst_element_get_static_pad (q1, "sink");

 tee_q2_pad = gst_element_request_pad (tee, tee_src_pad_template, NULL, NULL);
 g_print ("Obtained request pad %s for q2 branch.\n", gst_pad_get_name (tee_q2_pad));
 q2_pad = gst_element_get_static_pad (q2, "sink");

 /* Link the tee to the queue 1 */
 if (gst_pad_link (tee_q1_pad, q1_pad) != GST_PAD_LINK_OK ){
 
  g_critical ("Tee for q1 could not be linked.\n");
  gst_object_unref (pipeline);
  return 0;

 }
 
 /* Link the tee to the queue 2 */
 if (gst_pad_link (tee_q2_pad, q2_pad) != GST_PAD_LINK_OK) {

  g_critical ("Tee for q2 could not be linked.\n");
  gst_object_unref (pipeline);
  return 0;
 }

 gst_object_unref (q1_pad);
 gst_object_unref (q2_pad);

 return 1;

}


void start() {


 gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING);

 g_main_loop_run(loop);

 gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL);
}


void stop() {
 g_main_loop_quit(loop);
 gst_object_unref(GST_OBJECT(pipeline));
 g_main_loop_unref (loop);
}


static gboolean bus_call(GstBus *bus, GstMessage *msg, void *user_data)
{

 switch (GST_MESSAGE_TYPE(msg)) {
 case GST_MESSAGE_EOS: {

  g_main_loop_quit(loop);
  break;
 }
 case GST_MESSAGE_ERROR: {
  GError *err;
  gst_message_parse_error(msg, &err, NULL);
  //report error
  printf ("ERROR: %s", err->message);
  g_error_free(err);
  
  g_main_loop_quit(loop);
  
  break;
 } 
 case GST_MESSAGE_APPLICATION: {

  const GstStructure *str;
  str = gst_message_get_structure (msg);
   if (gst_structure_has_name(str,"turn_off"))
   {
    g_main_loop_quit(loop);
   }

  break;
 }
 default:
 
  break;
 }
  if (msg->type == GST_MESSAGE_STATE_CHANGED ) {
   GstState old, news, pending;
        gst_message_parse_state_changed (msg, &old, &news, &pending);
   printf ("State changed. Old: %i New: %i Pending: %i.\n", old, news, pending); 
  } else {
   printf("info: %i %s type: %i\n", (int)(msg->timestamp), GST_MESSAGE_TYPE_NAME (msg), msg->type);
  }

 return true;
}

int main (int argc, char** argv) {

 if (init()) {
  start ();
  stop();
 }
 else {
  printf ("unable to initialize");
  return -1;
 }
 
 return 0;
}

2012-11-15

Installing Gstreamer 1.0 from source


Gstreamer 1.02 installatio
n

Here goes some straight forwards instructions on how to install gstreamer-1.0 (or at least what I did) running Ubuntu 12.04 on a Macbook Air (2011, 4-2). Plugins presented for installation according to my needs and preferences.

$ sudo apt-get install libxv1 libxv-dev libxvidcore4 libxvidcore-dev faac faad  libfaac-dev libfaad-dev bison  libavl-dev yasm flex  zlib1g-dev  libffi-dev gettext

Install the latest version of glib (2.32 is required)

$ wget http://ftp.gnome.org/pub/gnome/sources/glib/2.34/glib-2.34.1.tar.xz
$ cd glib-2.34.1
$ ./configure --prefix=/usr
$ make
$ sudo make install


Install the packages and plugins
$ wget http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.0.2.tar.xz
$ tar xvf gstreamer-1.0.2.tar.xz
$ cd gstreamer-1.0.2
$ ./configure --prefix=/usr
$ make
$ sudo make install


Install coders and stuff
$ sudo apt-get install libtheora-dev libogg-dev libvorbis-dev  libasound2-dev libjack-dev
Install libvisual-0.4-dev for xvimagesink (if running X11)
$ sudo apt-get install libxv-dev
libvisual-0.4-dev 
 
Install base plugins

$ wget http://gstreamer.freedesktop.org/src/gstreamer/gst-plugins-base-1.0.2.tar.xz
$ tar xvf gst-plugins-base-1.0.2.tar.xz
$ cd 
gst-plugins-base-1.0.2  
$ ./configure --prefix=/usr
$ make
$ sudo make install


Install the "good" plugins
$ wget http://gstreamer.freedesktop.org/src/gstreamer/gst-plugins-good-1.0.2.tar.xz
$ tar xvf gst-plugins-good-1.0.2.tar.xz
$ cd
gst-plugins-good-1.0.2
I did for some reason have problem making the goom filter and did therefor exclude it with the --disable-goom
$ ./configure --prefix=/usr --disable-goom
$ make
$ sudo make install


If you by chance need the rtmp library
$ sudo apt-get install librtmp-dev

Install the "bad" plugins
$ wget http://gstreamer.freedesktop.org/src/gstreamer/gst-plugins-bad-1.0.2.tar.xz
$ tar xvf gst-plugins-bad-1.0.2.tar.xz
$ cd
gst-plugins-bad-1.0.2
$ ./configure --prefix=/usr
$ make
$ sudo make install


Install the "ugly" plugins
$ sudo apt-get install libmad0-dev libx264-dev
$ wget http://gstreamer.freedesktop.org/src/gstreamer/gst-plugins-ugly-1.0.2.tar.xz
$ tar xvf gst-plugins-ugly-1.0.2.tar.xz
$ cd
gst-plugins-ugly-1.0.2
$ ./configure --prefix=/usr
$ make
$ sudo make install

2012-01-21

Espeak Gstreamer Plugin

This is a tutorial on how to set up Espeak TTS as a GStreamer plugin under Linux/Ubuntu. You should  probably have installed the gstreamer libraries and headers previous to this step.

*) Download and install PortAudio and other required libraries and header files
$ sudo apt-get install portaudio19-dev libxml2

*) Download and install espeak sources from http://espeak.sourceforge.net/download.html (currently 1.46.02)
$ unzip espeak-1.46.02-source.zip
$ cd espeak-1.46.02-source/src
$ rm portaudio*

*) change the two files wavegen.cpp and wave.cpp by replacing
#include "portaudio.h"
with
#include "/usr/include/portaudio.h"
in each of the files.

*) Compile and install espeak
$ make
$ sudo make install

*) Download and install the espeak gst-plugin from Sugar Labs (http://download.sugarlabs.org/sources/honey/gst-plugins-espeak/ - currently version 0.3.5)
$ wget http://download.sugarlabs.org/sources/honey/gst-plugins-espeak/gst-plugins-espeak-0.3.5.tar.gz
$ tar xvf gst-plugins-espeak-0.3.5.tar.gz
$ cd gst-plugins-espeak-0.3.5
$ ./configure
$ make
$ sudo make install

Installing the ladspa plugin support
The ladspa gst-bad plugins contains a few cool filters. In my example, i use the "speed" filter to controll the pitch of the output voice. This part will cover how to make the ladspa filters working.

*) install the ladspa headers and the "gst-bad" plugins
$ sudo apt-get install ladspa-sdk gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse

*) download and install the latest ladspa sources from http://www.ladspa.org/download
$ wget http://www.ladspa.org/download/cmt_src.tgz
$ tar xvf cmt_src.tgz
$ cd cmt/src
$ make
$ sudo make install
$ cd ../..
$ wget http://www.ladspa.org/download/ladspa_sdk.tgz
$ tar xvf ladspa_sdk.tgz
$ cd ladspa_sdk/src
$ make
$ sudo make install

You might need to add the plug in path. Do it by adding this to your ~/.bashrc file:
export GST_PLUGIN_PATH=/usr/local/lib:/usr/lib/gstreamer-0.10

Example code can be found at: https://github.com/lastbil2000/Example/tree/master/Espeak

2012-01-17

Create USB boot disc under Linux

Well if you, like me, managed to destroy your boot sector, the following steps can be a solution; creating a bootable usb disk containing containing the contents of you grub installation.

*) Insert the usb-disk you want to erase/make bootable. Unmount the disk.
$ sudo umount /media/
*) Identify the name of your disk. It should be something like /dev/sdx1
$ ls /dev/sd*
*) Create file system on the drive you identified as your usb-disk
$ mkfs.vfat /dev/sdx1
*) create a folder, mount the disk on that folder, install grub and copy the boot files
$ sudo mkdir boot_disk
$ sudo mount /dev/sdx1 boot_disk
$ sudo grub-install --no-floppy --root-directory=boot_disk /dev/sdc
$ sudo cp -rf /boot/* boot_disk/boot/

Restart and boot. If it fails, your'e doomed.

2012-01-16

Festival as Gstreamer-plugin

One must have working gstreamer installation prior to this.

*) Install the packages:

$ sudo apt-get install festival festival-dev gstreamer-tools

*) Configure your /etc/festival.scm as such:

(Parameter.set 'Audio_Command "aplay -q -c 1 -t raw -f s16 -r $SR $FILE")
(Parameter.set 'Audio_Method 'Audio_Command)
(set! server_access_list '("localhost\\.localdomain" "localhost"))
;;; Command for Asterisk begin
(define (tts_textasterisk string mode)
(let ((wholeutt (utt.synth (eval (list 'Utterance 'Text string)))))
(utt.wave.resample wholeutt 8000)
(utt.wave.rescale wholeutt 5)
(utt.send.wave.client wholeutt)))
;;; Command for Asterisk end

*) Start the server

$ festival --server

*) Test your installation in another console window

$ echo 'Hello G-Streamer!' | gst-launch fdsrc fd=0 ! festival ! wavparse ! audioconvert ! alsasink