Wednesday, September 21, 2016

How to find a package in debian / ubuntu

Here are three different command I use to look for a linux package.
  • apt-cache search <regex>
  • apt-show-versions | egrep <regex>
  • dpkg -l | egrep -i <regex>
The first one is super verbose, but it lists all sub-packages.

The second one is a command to install via ''sudo apt-get install apt-show-versions''. I use it often as it also lists whether the package is already installed or not.

The last one I forget all the time. It will show which packages are, or were, installed on your system. It is concise and it lists the architecture (32/64 bits versions).

For example, here are the three output when looking for SDL dev (which stands for "simple direct media layer", a lightweight and cross-platform framework to develop graphics and access to low-level resources).

''
[11:35][jeremie@alpha:~] apt-cache search 'sdl.*-dev'
libsdl1.2-dev - Simple DirectMedia Layer development files
erlang-esdl-dev - Erlang bindings to the SDL (development files)
libalien-sdl-dev-perl - helper  to build  Perl program using SDL libraries
libghc-sdl-dev - Haskell SDL binding for GHC
libghc-sdl-gfx-dev - Haskell SDL gfx binding for GHC
libghc-sdl-image-dev - Haskell SDL Image binding for GHC
libghc-sdl-mixer-dev - Haskell SDL Mixer binding for GHC
libghc-sdl-ttf-dev - Haskell SDL TTF binding for GHC
libsdl-console-dev - Console that can be added to any SDL application, development files
libsdl-gfx1.2-dev - development files for SDL_gfx
libsdl-image1.2-dev - Image loading library for Simple DirectMedia Layer 1.2, development files
libsdl-mixer1.2-dev - Mixer library for Simple DirectMedia Layer 1.2, development files
libsdl-net1.2-dev - Network library for Simple DirectMedia Layer 1.2, development files
libsdl-ocaml-dev - OCaml bindings for SDL - development files
libsdl-pango-dev - text rendering with Pango in SDL applications (development)
libsdl-sge-dev - extension of graphic functions for the SDL multimedia, development files
libsdl-sound1.2-dev - Sound library for Simple DirectMedia Layer 1.2, development files
libsdl-stretch-dev - development files for SDL_stretch library
libsdl-ttf2.0-dev - TrueType Font library for Simple DirectMedia Layer 1.2, development files
libsdl2-dev - Simple DirectMedia Layer development files
libsdl2-gfx-dev - development files for SDL2_gfx
libsdl2-image-dev - Image loading library for Simple DirectMedia Layer 2, development files
libsdl2-mixer-dev - Mixer library for Simple DirectMedia Layer 2, development files
libsdl2-net-dev - Network library for Simple DirectMedia Layer 2, development files
libsdl2-ttf-dev - TrueType Font library for Simple DirectMedia Layer 2, development files
libtaoframework-sdl-cil-dev - Tao CLI binding for SDL - development files

[11:35][jeremie@alpha:~] apt-show-versions |egrep sdl.*-dev
libsdl-image1.2-dev:amd64/xenial 1.2.12-5build2 uptodate
libsdl-image1.2-dev:i386 not installed
libsdl1.2-dev:amd64/xenial 1.2.15+dfsg1-3 uptodate
libsdl1.2-dev:i386 not installed

[11:36][jeremie@alpha:~] dpkg -l | egrep -i 'sdl.*-dev'
ii  libsdl-image1.2-dev:amd64  1.2.12-5build2  amd64  Image loading library for Simple DirectMedia Layer 1.2, development files
ii  libsdl1.2-dev              1.2.15+dfsg1-3  amd64  Simple DirectMedia Layer development files
''
Thge ''ii'' flags mean here "currently installed", i.e. I already have them. You can read about other installation status flags here.

Thursday, September 15, 2016

Lightweight video streaming from a Raspberry with h264_v4l2_rtspserver

VLC adds 330Mo to a raspbian distribution just to stream video to the network. This is huge!
Instead there is a smaller solution, with adds "only" a few dozens megabytes of buliding tools (mainly).

It just interfaces the nice standard V4L2 driver and streams it to a RTSP feed (i.e. Real Time Streaming Protocol). This is also very efficient as minimum buffering is done locally, which means faster response time (time lag is "only" 2 seconds, which is decent).

From this answer.
''
sudo modprobe -v bcm2835-v4l2
git clone https://github.com/mpromonet/h264_v4l2_rtspserver.git
cd h264_v4l2_rtspserver
sudo apt-get install libopus-dev libexpat1-dev libssl-dev libasound2-dev libudev-dev libavahi-client-dev libcurl4-openssl-dev libjs-jquery
cmake .
sudo make install
h264_v4l2_rtspserver
''
Then, the RTSP video stream can be accessed from anywhere with:
''
vlc rtsp://<raspberry>:8554/unicast
''

Note that ''h264_v4l2_rtspserver'' has a few options to optimize your bandwidth (reducing the network buffering helps also achieving a faster response time):
''
h264_v4l2_rtspserver --network-caching 300 -H <height> -W <width> -F <fps>
''

BTW some additional/alternative info for the Raspberry can be found here.

Wednesday, August 31, 2016

Optimize a C program by visually checking the profiling data

You need ''gprof2dot.py'' (specific standalone tool) and the regular package ''dot'' (from graphviz).

''
g++ -pg -g myproc.cpp myproc
myproc myarg1 myarg2
gprof myproc | gprof2dot.py -s | dot -Tpng -o profiler.png
''

Note that the ''-g'' debugging option is required.

Note also that any code optimization flag, like ''-o3'' (aggressive speed optimization), will significantly impact the code layout, and it will be much harder to recognize the profiled sections.  It is much easier to read when most optimizations are tuned off (''-o1'' or ''-o0'').

But there is a nasty trade-off... Without optimization, the overall program will certainly behave differently than in production. It will not spend the same time in the same routines. Reciprocally, with full optimization you are closer to the real program you want to probe... but it will be sometimes just impossible to recognize the source code and unrolled functions that the profiler points to.

Monday, July 18, 2016

Why sending garbage is required before radio transmission (aka preamble for AGC radio receivers)

Sometimes there is a trade-off doing it "low level", but how much I learn everyday!

I eventually discovered, the hard way, why radio receivers with automatic gain control (AGC) do need compulsory seemingly "useless" preambles for them to adjust their volume properly, for the real data to come.

First: send a calibrating preamble (alternating zeros/ones)

No signal? The gain is adjusted to get one. So we read radio noise!
By the way, this radio module took about 30ms to fully adjust its gain.
Once I re-think about it, it is plain obvious... a receiver does not know whether someone is really transmitting or not. So when nothing is transmitted, it acts just as anybody on a audio system who wants to check if the source is plugged or not: the receiver increases the volume (gain) until it catches something. But when nobody really is transmitting, increasing gain eventually ends up amplifying noise, i.e. seemingly random 0s and 1s. As humans, we know we are hearing static and the input device is not transmitting. But the receiver is not able to know.

Without proper calibration, the start of real data then gets buried in the noise, until the receiver manages to set its gain, back to actual transmission levels (i.e. it reduces the amplification until signal is just below saturation -- again, like a human who quickly turns the volume down after the source is plugged).

Sunday, July 17, 2016

Power IoT devices with solar energy, the $1.50 cheap way!

Had to find an easy solution to power some of my low-power device, like the one on the right (it is a minimalist 433MHz receiver).

A long time ago I bought a bunch of solar flashlight keyrings specifically for scavenging the parts.

They proved to be better than my expectations, with a very convenient 37×22×1.1mm solar cell which gives 7V unloaded, and up to 8mA for tested loads of 1 and 100 ohms (it "rains fire" as we often say here in summer: specs are only 5.2mA~6.3mA at 3.4V~4.5V loaded).

Admittedly, it is not much, but it is enough for a great lot of IoT devices, and given the size, it is just GREAT.

Measuring tiny currents to assess power consumption

The original EEVblog ĀµCurrent (David Jones).
Way cheaper than real industrial probes,
but still too expensive for my needs ($80+)
Optimizing power needs requires power tools that can read tiny currents (nano or pico amperes)...

Nothing happened like I wanted to the last N days and had to work on unexpected stuff, like a remote water level alarm for our swimming pool after more leakages (the liner is 14 year old). So I made an RF alarm, which is powered by a small ultracapacitor (0.47F) backed by a tiny 3x2cm solar panel I scavenged from a led keychain.

I wanted it to be small, so I can duplicate the project and put sensors all around (I should end up at around 3x2x2 cm all included). But small means low power.




Friday, July 15, 2016

Tool to program an ATtiny85 AVR in situ in a minimalist configuration (ICSP)

Programming the chip, directly on the PCB (i.e. ICSP), via its shoulders.
Note how the pogo pins compensate for approximate placements!


Retractable pogo pins (top) and
regular 3x2 headers (bottom)

A long time ago, I made this little tool to help me upload code to Attiny85 AVR microcontrollers directly on the PCB (ICSP, i.e. in-circuit serial programming), but without even the need for a connector.

It plugs into regular 6 pin adapters of USB ASP programmers, and it relies on so-called elastic/retractable "pogo pins" to make contact with the DIP8 chip.