I was working on a program and needed the user to be able to select from over 12 choices of pre-recorded patters.

I chose to use a absolute position rotary encoder that had 16 detents.

The particular one I chose was the Alps EC18AGB20401 Unfortunately the code that it returned was not quite binary so I had to use a look up table to go from 0-15.

int rotLUT[]={0,1,15,14,3,2,4,5,11,10,12,13,8,9,7,6};

Based on this table:

# #0 pin pin pin pin decodes as
4 3 2 1 dec
4 3 2 1 dec
1 0 0 0 0 0 0
2 1 0 0 0 1 1 clockwise
3 2 0 1 0 1 5
4 3 0 1 0 0 4
5 4 0 1 1 0 6
6 5 0 1 1 1 7
7 6 1 1 1 1 15
8 7 1 1 1 0 14
9 8 1 1 0 0 12
10 9 1 1 0 1 13
11 10 1 0 0 1 9
12 11 1 0 0 0 8
13 12 1 0 1 0 10
14 13 1 0 1 1 11
15 14 0 0 1 1 3
16 15 0 0 1 0 2

 

(more…)

bc – An arbitrary precision calculator language

Here is how to use bc to convert from one base to another.

bc -l

ibase=2;obase=A;1010001

81

Here the obase = A is in hex for 10.

 

Some times I like to have different versions of the Arduino IDE installed. I would also like them not to use the same preferences file and Sketchbook directory.

 

In the lib/preferences.txt file is hiddien this little piece of cryptic note:


# if you don't want settings to go into "application data" on windows
# and "library" on macosx, set this to the alternate location.
#settings.path=data

What that is trying to say… as it is not obvious. Is that if I want to store my preferences.txt file in a directory relative to the current IDE… uncomment that line.

This now allows me to keep all settings and sketchbooks relative to the IDE.

 

 

I am currently working on a project involving QR codes and a Raspberry Pi.

I have QR codes printed on business card size media. When the card is far enough away for the camera to see the whole code it was out of focus.

Luckily I had some cheap ($1.50) lenses that happen to have a 4.5″ focal length laying around from a previous project.  These worked perfectly for me as the distance from the card to the lens was ~4″. The nice thing about this mod is that it does not require modification of the original raspberry pi camera lens.

Before and After:

testk_nolense

 

These worked perfectly. I am now able to reliably read the QR code using the zbarimg program from the repository.

sudo apt-get install zbar-tools

With this step out of the way I can get back to my project.

mapping in the bc calculator taken from Arduino 
bc -l An arbitrary precision calculator language
define map(x,in_min,in_max,out_min,out_max) { (x-in_min)*(out_max-out_min)/(in_max-in_min)+out_min }
use:
map(10,0,1024,5,15)
gives 5.097…

I always forget how to make a poster using ghostscript.

the command is ‘poster’

sample usage:

poster -v -mletter -c5% -s1 input.ps -o output.ps

This will enlarge the original and put crop marks on the resulting pages.

 

I created a LibreOffice cheat sheet to help me quickly learn and recall the syntax.

It covers some very useful things:

 

Getting the Sheet

Getting A Cell

Iterate over a range of cells:

Getting Form Elements
Set a Cell to current timestamp

HTTP Method GET call and store data
Reading And Writing A File

 

Trying out a new category: Snippets

These will be tiny shell scripts or pieces of code.

The first one is how to have linux convert GPS NMEA text files to kml format.

 

#!/bin/sh
gpsbabel -i NMEA -f $1 -o openoffice -F test.csv
gpsbabel -i openoffice -f ./test.csv -o kml -F test.kml

 

Im sure there is a better way…but this one works and gives a .csv file as an intermediate.

 

 

Now that we live in he age of the Internet-of-Things (IOT), I find that these ‘things’ have to communicate to a normal web server at some point.

The problem of course is how best to send data to the server and make sure what was sent is what was received. My preferred method is to use ‘Method GET’ which means that the data is encoded in the URL. It is easy to implement on just about any platform from Arduino UNOs to Arm Cortex processors. Every platform that supports 802.11 or 802.3 will have an example of using ‘Method GET’ to fetch a URL. Which means that the opportunity to send data is as easy as getting a URL.

The next problem is how to send binary data. Since the URL schema has special characters like, ‘”/?& that have meaning you cant just send binary data in the url. To be completely safe in a 7bit ASCII world, one needs to encode that data into some format.

For example if you wanted to send a number of 0x31EAA5 via a URL you could do http://127.0.0.1/?q=3271333 easily enough. That would be converting the number to a integer represented by ASCII characters. This method becomes cumbersome when there are multiple values to send: ?q1=555&q2=444&q3=333&q2=222

My preferred method of late is to send the data as a byte stream. Doing this requires some sort of ASCII armor, such as BASE64 or UUENCODING. Originally I started using base64 which creates GET URLs like: ?q=SSBhbSBEQVRBCg== which decoded on the receiving server would be ‘I am DATA’. But for whatever reason the encoding uses special characters for some data. Namely / and + characters. So a few variants of base64 have sprung up to change these characters to more friendly to URL or other standards.

Not wanting to deal with the hassles of base64. I decided to give base 16 a try as the encoding. This has worked out rather well. Base16 encoding is easy to implement in any language. And many have built in encoders/decoders.

So in the above example of the data being ‘I am DATA’ it would render as

?q=4920616D2044415441

It uses exactly twice as many bytes as the original data, but is perfectly safe to transport binary data. So the sacrifice is size vs safety and ease of implementation. I will almost always chose ease of implementation over any other factor.

On to the code:
Full Examples

Arduino code snippet

char base16[16]={ '0','1','2','3','4', '5','6','7','8', '9','A','B','C', 'D','E','F' };
// this expects byte theData[len] and byte theEncodedData[len*2]
void base16encode()
{
  char b1,b2; // bytes 1 and 2 of the encoded data
  byte ev; // the value to encode
  for (int lop=0; lop<theDataLength; lop++)
  {
    ev=theData[lop]; 
    b1=base16[( (ev>>4) & 0x0F)];
    b2=base16[( (ev) & 0x0F)];
    theEncodedData[(lop*2)]=b1;
    theEncodedData[(lop*2)+1]=b2;
  }
}

PHP snippet

function base16decode($data)
{
  $retv="";
  $base16str="0123456789ABCDEF";
  for ($lop=0; $lop<strlen($data); $lop+=2)
  {
    $oneByte=$data[$lop];
    $twoByte=$data[$lop+1];
    $v1=strpos($base16str,$oneByte);
    $v2=strpos($base16str,$twoByte);
    $theValue=($v1*16)+$v2;
    $av=chr($theValue);
    //echo "ob[$oneByte]tb[$twoByte] v1[$v1]v2[$v2] tv[$theValue] av[$av]| \n";
    $retv.=$av;
  }
  return $retv;
}

These code examples are written with the goal of being easy to read and understand rather than being examples of a good coding style.

Over the last few days I have been Tweeting photos with location but I am unhappy with how the maps are displayed.  So I made a bookmarklet to extract the map links.

Grab the GPSCoords bookmarklet by following the link then dragging and dropping it from there.

Next Page »