AVR CAN Bus Project: Step 4 – LeafCAN: Nissan Leaf SOC Meter

I have implemented a SOC (State of Charge) meter for the Nissan Leaf. Many thanks to garygid and others from the MyNissanLeaf forums, for their help in decoding the Leaf CAN bus messages, and figuring out the pinouts.

The top line shows the SOC%, raw SOC value, and number of charge bars displayed in the dash.
The second line shows battery pack voltage and current in amps.

You can download the Eagle CAD schematic and AVR (Arduino) code from github:  lincomatic / LeafCAN
The Eagle schematic uses the Sparkfun library.

The schematic shows how to implement the entire circuit, without using the Olimex AT90CAN128 breakout board.

My original intent was to make a small PCB that directly attached to the LCD, and put it into a small case, but I never got it past the breadboard stage.  Unfortunately, I have gotten busy with other projects, so I am probably not going to do further development on this device nor finish the PCB layout, unless there is a large amount of interest. However, feel free to adapt it as you wish for your own CAN bus projects. Do bear in mind, however, that the design is licensed via the GPL, so if you use it for a commercial project, you must openly share your design.

Previous: AVR CAN Bus Project – Step 3: CANspy CAN Bus Monitor
Next: LeafCAN v1.1 Released

AVR CAN Bus Project – Step 3: CANspy CAN Bus Monitor

Sorry for the delay in posting the circuit and schematics from my AVR CAN Bus Project – Status Update 1.  The circuit for interfacing the Olimex AT90CAN128 Header Board is incredibly simple, and only requires 3 components.

Parts List
(1) .1uF ceramic capacitor
(1) 10K resistor
(1) Microchip MCP2551 CAN transceiver


If you’re going to connect it to a Nissan Leaf, the car has 3 different CAN buses accessible via the OBD-II connector. The pinouts can be found on MyNissanLeaf.com in this thread: Leaf CANbus Decoding (Open Discussion)

To communicate with the AT90CAN128 header board from my PC, I connected a USB to serial converter to USART0: TXD0 (pin 3) and RXD0 (pin 2).

Arduino Sketch

Below is my CANSpy sketch for monitoring the CAN bus via the serial port, as depicted in my Status Update 1.

Download: CANspy.zip

To compile the sketch, follow the instructions in AVR CAN Bus Project – Step 1: Programming AT90CAN128 with Arduino.

In my next update, I’ll show how to implement a SOC (State of Charge) meter for the Leaf using a LCD display.
Previous: AVR CAN Bus Project – Status Update 1
Next: AVR CAN Bus Project: Step 4 – Nissan Leaf SOC Meter

How to Fix a Broken GSM Signal Strength Meter in iOS 4.3.2

After using Sn0wBreeze 2.6 to update my iPhone from iOS 4.0.2 to 4.3.2, my GSM signal strength meter completely stopped working.  No matter how strong my cellular signal was, it would display no signal bars.  I suspected that the problem was that Sn0wbreeze preserved my 01.59.00 baseband from iOS 4.0.2, and that the old baseband was somehow incompatible with the signal strength meter in iOS 4.3.2.  I googled around, and sure enough, lots of people experiencing broken signal strength meters when using older basebands with iOS 4.3.x.  Fortunately, there’s an easy fix.  Installing djayb6‘s version of ultrasn0w fixer restores the functionality of the signal strength meter.  Hackstor has detailed instructions for installing ultrasn0w fixer via Cydia.  I’m not sure if the unlock works, because I don’t have another carrier’s SIM card to try, but I’m happy that I’m my signal strength meter is working again with my iOS 4.3.2/baseband 01.59.00 combination.

How to Restore Lost Contacts to Your iPhone

This article will tell you how to restore contacts which were lost/erased from iPhone, due to iTunes trashing them during a sync, especially after a firmware upgrade.  Restoration of your contacts is possible only if you either have an iTunes backup, or a copy of your AddressBook.sqlitedb.  It is particularly useful for people who lost their contacts after an upgrade to iOS 4.3.2, because iTunes refuses/fails to restore the contacts from a backup.  If you want to skip my rambling discourse, you can cut to the chase, and skip directly to the step-by-step instructions.

I’m always wary of updating my iPhone, because I’ve had many many problems with that over the years. But when the untethered jailbreak for iOS 4.3.2 came out this week, I felt it was time to finally upgrade from iOS 4.0.2. While the iPhone Dev Team has released redsn0w 0.9.6 rc 14, for this purpose, this tool isn’t appropriate for iPhone users who want to retain carrier unlocks, because it allows 4.3.2’s new baseband to be installed, for which there currently is no unlock.  In order to keep your phone unlocked, you need to use a tool which prevents your baseband from getting updated.  Luckily, iH8Sn0w has released Sn0wbreeze 2.6, which preserves your old baseband, thus allowing you to keep your unlock.

It’s important to make a backup of your iPhone via iTunes before doing any firmware updates.  Also, it’s a good idea to use iTunes to Transfer Purchases from your iPhone back to your computer.  For once, update went smoothly, and I thought I got off easy this time, because the phone booted right up after the Sn0wBreeze was done.  Little did I know that things are not always as they first appear.

The next step was to restore the phone from a backup that I’d made just prior to doing the firmware upgrade.  iTunes finished the restore without any complaints, but  when my phone rebooted, the first thing I noticed was that most of my apps were missing.  That was OK, I was able reinstall the apps via iTunes (and then had waste 1 hour rearranging my 200 apps back into folders).  When I went to use the phone, however, I discovered that all of my contacts were gone! Remember, I backed up my iPhone before doing the upgrade, so why didn’t %#$  iTunes restore my backed up contacts??? Ack! At this point, I knew that there was a high probability that I would be wasting a good part of my day getting my contacts back into the iPhone.

The contacts in iOS are stored in a file on the iPhone at /var/mobile/Library/AddressBook/AddressBook.sqlitedb.  The first step was to find where this file was backed up on my PC, and to see if it had my lost contacts in it.  I started searching my computer for the iTunes backup, and found a bunch of subfolders in C:\Users\<MyUserName>\AppData\Roaming\Apple Computer\MobileSync\Backup (Note: I’m using Windows 7).  Sure enough, there was a folder named 905279ef2efbc76bc402c0e411fc356d75ed95b0 with a timestamp around the time that I made the last backup.  Inside the folder are multitudes of files with hexadecimal filenames, as well as some .plist and .mdbx files.  Manifest.mbdb appears to be a a cross reference of the filenames to their path on the iPhone, but I didn’t want to waste time trying to find a program to decode it, so I simply opened up a Command Prompt, and grepped for a string that is unique to AddressBook.sqlitedb:

grep UpdatePersonLinkUponPersonUnlink *
Binary file 31bb7ba8914766d4ba40d6dfb6113c8b614be442 matches

Bingo!  I opened up 31bb7ba8914766d4ba40d6dfb6113c8b614be442 in GnuEmacs, and sure enough, it was an sqlite database, contained my the lost contacts from address book!  I’m curious to know if the same filename always maps to AddressBook.sqlitedb, or if the filename is random, so if any readers can verify this, please leave a comment below.  OK, it should be a piece of cake to restore the file, right?  First, I tried to fool iTunes into restoring the file for me.  I created a new backup via iTunes, and copied the old 31bb7ba8914766d4ba40d6dfb6113c8b614be442 into it and then tried to restore this hacked backup.  No dice.  iTunes noticed something was different, and complained that it couldn’t restore some of the files.

OK, how about renaming 31bb7ba8914766d4ba40d6dfb6113c8b614be442 to AddressBook.sqlitedb and then copying it to the proper location on the iPhone? Should be easy, right?  I downloaded the latest version of iFunBox, a great free utility that, among its many talents, allows you to drag and drop files in and out of any directory of a jailbroken iPhone.  Using iFunBox, I navigated to /var/mobile/Library/AddressBook, copied the AddressBook.sqlitedb from my PC over the file that was already in my iPhone.  Then, I rebooted the iPhone…. Still no contacts!  When I examined the contents of the iPhone again with iFunBox, I found that my new file had been overwritten.  The problem is that when you shut down the iPhone, it writes out the contacts from RAM, overwriting your substitute AddressBook.sqlitedb before it has a chance to read it!  How annoying!

I spent the next few hours trying various methods to get around the problem.   The most straightforward way would be to get the iPhone to crash, so that it wouldn’t have the chance to overwrite my AddressBook.sqlitedb, but I couldn’t figure out how to do that.  I tried using ssh to log into the iPhone and kill -9 random processes.  That didn’t work, but in the process, I found that a program that refreshes the AddressBook.sqlitedb:  /System/Library/PrivateFrameworks/DataAccess.framework.  The problem is, if you kill it, it immediately restarts before you have a chance to sneak your new file in. So how can one prevent that damn program from overwriting the new address book??  I tried changing the file access to readonly … it changes it back to read/write.  The process runs as a user named mobile, so I tried changing the file owner from mobile to root to prevent it from overwriting the file.  It just changes the owner back to mobile!  How frustrating!  Finally, I happened on the combination that works:  change the file owner to root, and disallow all access to the file! Eureka contacts restored!

Step by Step Procedure

Note:  This procedure requires a jailbroken iPhone.  This topic is too complicated to discuss here, and there are many tools available, but Sn0wbreeze is what I used time time round.

1. Extract AddressBook.sqlitedb from your iTunes backup

New Method:

A user has brought to my attention a cross platform program (Windows/OSX/Linux) which simplifies the extraction of AddressBook.sqlitedb from your iTunes backup. Download and launch iTunes Backup Extractor on your PC.  Click the Expert Mode button, and Navigate to and click the checkbox next to Library->AddressBook->AddressBook.sqlitedb, and click the Extract Selected button to copy the file to your PC.

Old Method:

If you already have a backup copy of AddressBook.sqlitedb from another source, skip this step. grep is a Unix command which doesn’t come with Windows.  If you don’t have a copy of it, you can download and install Gnu grep.  Find the directory containing the latest backup of your iPhone using the Windows Explorer:

Windows 7/Vista: c:\Users\USERNAME\AppData\Roaming\Apple Computer\MobileSync\Backup
Other versions of Windows: C:\Documents and Settings\USERNAME\Application Data\Apple Computer\MobileSync\Backup

Substitute your user name for USERNAME.  Find the newest subdirectory.  This is your latest backup.  Open up a Command (DOS) Prompt, and cd to the latest backup directory.  Find the file containing the backup of AddressBook.sqlitedb:

grep UpdatePersonLinkUponPersonUnlink *
Binary file 31bb7ba8914766d4ba40d6dfb6113c8b614be442 matches

Using Windows Explorer, copy the found file (in my case, it was named 31bb7ba8914766d4ba40d6dfb6113c8b614be442) and rename it to AddressBook.sqlitedb.


(Optional) If you want to verify the contacts before proceeding, you can view the contents of AddressBook.sqlitedb by using SQLite Database Browser.  Load AddressBook.sqlitedb into SQLite Database Browser, and select the table ABPerson from the Browse Data tab to see what names are contained in it.

Update 2011/05/19:  I have devised a simplified procedure which supercedes the remaining steps below: Restoring AddressBook.sqlitedb to iPhone – A Simplified Procedure

2. Install OpenSSH

Use Cydia to install OpenSSH on your iPhone.  You can find it by using Cydia’s search function.

3. ssh into your iPhone

Using an appropriate ssh client on your PC (I used PuTTY), ssh into your iPhone.  Your iPhone must be connected to the same WiFi network as your PC to do this.  To find your iPhone’s IP number,  go to Settings->Wi-Fi on the iPhone, and tap on the blue circled arrow next to the network you’re connected to.  Log in to your iPhone as user root, password alpine.

4. Copy your replacement AddressBook.sqlitedb to the iPhone

Download iFunBox and launch it.  Navigate to Raw File System->var->mobile->Library->AddressBook.  Drag and drop your replacement AddressBook.sqlitedb onto iFunBox to copy it to the iPhone.

5.  Change file owner and access of AddressBook.sqlitedb on the iPhone

Via ssh, type the following into the iPhone:

cd /var/mobile/Library/AddressBook
chown root AddressBook.sqlitedb
chmod 0 AddressBook.sqlitedb

Note:  the ‘o’ in “chmod o …” above is the number zero.

6. Reboot the iPhone and restore AddressBook.sqlitedb’s file attributes

Restart your iPhone.  It will act strangely because it can’t access your AddressBook.sqlitedb.  Mine was kept cycling from the boot up screen to the lock screen over and over again, and it was impossible to operate it.  Don’t worry, you can still ssh into it.  From your PC, ssh back into the iPhone and type the following commands:

cd /var/mobile/Library/AddressBook
chown mobile AddressBook.sqlitedb
chmod 644 AddressBook.sqlitedb

Your iPhone will reboot, and your contacts will be restored!  It’s a good idea to disable ssh when you’re done, or change the root password to prevent random hackers from hacking into your phone.


Related Articles:

Restoring AddressBook.sqlitedb to iPhone – A Simplified Procedure


Arduino-lite – A Lightweight Runtime for AVR

I just ran across Arduino-lite, a lightweight alternative runtime to Arduino, for programming AVR MCU’s.  This project is spearheaded by Robopeak Project.  It looks pretty cool.  It’s kind of halfway between Arduino, and coding directly with avr-gcc.  It supports the standard Arduinos, as well as:

  • Atmega8(A)
  • Atmega168(PA)
  • Atmega328(PA)
  • Atmega1280
  • Attiny2313
  • Attiny26
  • Atmega48(PA)
  • Atmega88(PA)

Not only does it support more MCU’s than Arduino, it also supports frequencies from 1-20MHz, unlike Arduino, which only supports 8 & 16MHz.

Furthermore, Robopeak claims that Arduino-lite’s binaries are 50% smaller than those produced by Arduino. An example on Robopeak’s Blog shows how Arduino-lite reduces the digitalWrite() function down to 1 AVR instruction.  It appears to make heavy use of macros, which is nice, because it eliminates function call overhead.  On the other hand, type checking and such is severely restricted.  I think it might be a great tool for projects that need to be compact, or run as fast as possible.  Also, it will greatly simplify coding for the ATtiny MCU’s.

It’s definitely not for n00bs, but if you’re comfortable with makefiles, give it a shot.  The download includes everything you need to get started.  You can download it for free from google code.

I just downloaded it, and am going to give it a whirl.  It almost sounds too good to be true.  If you have any experience with it, please leave a comment.

Download Arduino-lite: http://code.google.com/p/arduino-lite/

Lampduino – an 8×8 RGB Matrix Floor Lamp

This past weekend, I finally finished building my 8×8 RGB matrix floor lamp.  I call it Lampduino.  A Processing sketch running on a host computer controls Lampduino via a USB connection.  When turned on without a computer, it automatically displays a soothing plasma simulation. If you want to build one of your own, I wrote a step by step Instructable:

Lampduino – an 8×8 RGB Matrix Floor Lamp

Space Invaders


Related articles:

Reducing Arduino/FTDI FT232R Serial Latency

I’m working on a project in which a PC communicates with an Arduino (a Colorduino, to be exact) over a serial connection. It’s an 8×8 RGB LED matrix, which will be controlled by music. The ATmega168 MCU in my beta Colorduino has such small RAM that I can only buffer at most 2 screenfuls of data, even when I reduce the color resolution from 24-bits per pixel to 12-bits per pixel. I need to send the data down to the Colorduino very quickly. There needs to be very little latency, or the lights will lag the beats of the music. The serial communication speed is not much of a problem. Each data packet I’m sending is 100 bytes, so at . Besides the raw speed of communication, there is a built-in latency, due to buffering being done by the communications drivers. Luckily, FTDI’s Windows drivers provide a way to tune down the latency a bit.

Start the Windows Device Manager while your FTDI USB->Serial cable or Arduino Duemilanove is attached.  Look for its corresponding USB Serial Port under Ports (COM and LPT).

Right click on it, and select Properties from the popup menu.  Next, click the Port Settings tab, and click the Advanced… button.

In the dialog which pops up, lower the Latency Timer (msec) value from its default of 16 down to 1, and click OK.

After you disconnect/reconnect your device, the new Latency Timer value will take effect.

I am not sure if there are similar settings in OSX or Linux.  Hopefully, someone can dig up a similar IOCTL to achieve the same effect.

Colorduino Library for Arduino

I wrote a Colorduino library for Arduino.  It handles initialization and double-buffered drawing on ITead Studio’s Colorduino.  It is also compatible with Itead’s Arduino RGB Matrix driver shield. Included with the library is a sample sketch to show how to use it, ColorduinoPlasma, which draws a pretty plasma on an 8×8 RGB matrix.

To install the library, download the zip file (see below), and copy libraries/Colorduino to your arduino sketchbook/libraries/Colorduino. If you are already running the Arduino IDE, you must restart it before you can use the library. You can then run load ColorduinoPlasma.pde demo.

To include the Colorduino library in your own sketch, just

#include <Colorduino.h>

Then your setup() function needs to just call two functions for initialization:

void setup()
// compensate for relative intensity differences in R/G/B brightness
// array of 6-bit base values for RGB (0~63)
// whiteBalVal[0]=red
// whiteBalVal[1]=green
// whiteBalVal[2]=blue
unsigned char whiteBalVal[3] = {36,63,63}; // for LEDSEE 6x6cm round matrix

Colorduino.SetWhiteBal() is used to adjust the white balance. You can put


in your sketch to test the white balance by drawing a white screen.  Then adjust whiteBalVal until your screen approximates white.

The origin of the screen, (0,0) is at the bottom left corner. The off screen buffer can be accessed either pixel by pixel:


or by direct manipulation.  The screen buffer is arranged by row. For instance to set all of the pixels in the second row to the same color:

PixelRGB *p = GetPixel(0,1);
for (int x=0;x < ColorduinoScreenWidth;x++) {
p->r = red;
p->g = green;
p->b = blue;

After you finish updating your screen, make it live by swapping it with the currently display buffer:


The latest version of the Colorduino library can always be downloaded from github: https://github.com/lincomatic/Colorduino/archive/master.zip

jpegexifrot – Batch Rotate Your Digital Photos *FREE*

Do you find it irritating how many programs ignore the orientation EXIF tags in your photos? The photo viewer built into Windows, as well as my Panasonic TV both display photos using horizontal rotation, unless you rotate them one by one. This can be a tedious, time-wasting procedure when you shoot hundreds of photos. I wrote a Windows program, called jpegexifrot, to automatically read the orientation EXIF tags in your digital photos, and then rotate the JPG files automatically. Note that this will only work if your camera actually records the orientation EXIF tags into your files. I’ve tested it on the following cameras: Apple iPhone, Canon EOS 300D, 350D, 10D, Nikon D90, Panasonic TZ1. It runs on all flavors of Microsoft Windows.  jpegexifrot rotates your photos lossessly by using jpegtran, so it won’t degrade your images.

To use jpegexifrot, download jpegexifrot.zip and unzip it somewhere on your computer. Make sure that jpegexifrot.exe and jpegtran.exe are located in the same directory. Next, just drag and drop a directory on top of jpegexifrot.exe, and let it do its job. Note that you can’t drag individual files.. only whole directories. Don’t worry if you’ve already run jpegexifrot on some of the files before… it will ignore the files that it has already rotated.

If you prefer to use a command line, type:

jpegexifrot directory

where directory is the full path of the folder containing your photos.

Note that jpegexifrot is free for personal use. You may distribute it freely, as long as you don’t charge any money, or bundle it with any commercial software.

Download: jpegexifrot.zip