Serial interface for EiBotBoard (EBB)

I received the WaterColorBot last December (that I had ordered from EMSL through Kickstarter) and have been having fun using it in RoboPaint.

As I read more about the EBB board being used to drive the two stepper motors and the servo I was surprised to find out that serial over USB seemed to currently be the only way to connect to the PIC18 board.  So I decided to see if I could supplement the serial USB with a direct 3.3v UART interface. This would allow direct control of the EBB projects from other micro-controllers without having to store the motions in the EBB firmware.


I am currently reading through the firmware I downloaded from the EggBot google code repository, and have also been able to download the toolchain and flash the board with a modified firmware following instructions from here. This is also my first foray into PIC18 programming. I will update next when I some something more substantial than just an intention (unlike this time).

One of the first things I did here was to figure out how to connect to the EBB board over usb emulated serial. I had to read through the source code for robotpaint-rt to figure out the baud rate.

~ > -p /dev/ttyS2 -b 38400
--- Miniterm on /dev/ttyS2: 38400,8,N,1 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
--- local echo active ---
EBBv13_and_above EB Firmware Meow Version 2.2.3

Note that the version string above says “Meow” because I updated the firmware on the EBB board when I was testing the instruction I got from Brian Schmalz.

Link to EBB command reference, but it somehow does not mention the “V” version command.

I have figured out how to configure a second serial port on the board (see photos below) but have not updated the firmware to use it for commands yet.



Open Case for Jetson TK1 board

I was feeling a little uneasy about not having a case for the NVIDIA Jetson TK1 board as I was very frequently connecting and disconnecting to it.

So I decided to buy a few 4-40 standoffs and screws from Anchor Electronics and quickly put together an open case for the board using some scrap wood I had lying around.

The whole in the top plate in the following photo was from when I had used a hole saw on that scrap piece.

Jetson TK1 case

Considering how loud that fan is I would not be surprised if I end up putting the board in a box. I am anyway keeping it inside the closet to keep it as far away from my desk at home as possible.

What were they thinking putting such a loud fan on a board this small.

Flashing the rootfs on a NVIDIA Jetson TK1

I some how managed to mess up the file system on my Jetson TK1 within 2 days of receiving it and decided to start afresh by flashing back to the original rootfs.

NVIDIA provides a quick start guide on how to do this here on its Linux for Tegra R19 webpage. I am essentially paraphrasing those instructions so that I can get this done quicker the next time. Since the instructions are specific to release version it is possible that they could change for the next release.


You will need:

  1. A Linux host PC with enough free space on which you will prepare the file system before flashing it to the eMMC on the TK1 board over USB.
  2. micro USB to USB cable (should be included with the Jetson TK1 kit)

Download the following two files into the same folder:

  1. Jetson TK1 board support package aka BSP (called Tegra124_Linux_R19.2.0_armhf.tbz2) from here.
  2. Sample file system file (called Tegra_Linux_Sample-Root-Filesystem_R19.2.0_armhf.tbz2) from here.
mkdir tk1_reflash
cd tk1_reflash

Extract the BSP tarball:

sudo tar xpf Tegra124_Linux_R19.2.0_armhf.tbz2

Extract the FS tarball into a particular sub directory:

cd Linux_for_Tegra/rootfs
sudo tar xpf ../../Tegra_Linux_Sample-Root-Filesystem_R19.2.0_armhf.tbz2

Apply binaries:

cd ..
sudo ./

The following output will be seen:

Using rootfs directory of: /home/you/tk1_reflash/Linux_for_Tegra/rootfs
Extracting the NVIDIA user space components to /home/you/tk1_reflash/Linux_for_Tegra/rootfs
Extracting the NVIDIA gst test applications to /home/you/tk1_reflash/Linux_for_Tegra/rootfs
Extracting the configuration files for the supplied root filesystem to /home/you/tk1_reflash/Linux_for_Tegra/rootfs
Creating a symbolic link nvgstplayer pointing to nvgstplayer-0.10
Adding symlink -->
Extracting the firmwares and kernel modules to /home/you/tk1_reflash/Linux_for_Tegra/rootfs
Installing the board *.dtb files into /home/you/tk1_reflash/Linux_for_Tegra/rootfs/boot

Write to eMMC over usb:

  1. Put your system into “reset recovery mode” by holding down the “RECOVERY” button and press “RESET” button once on the main board.
  2. Ensure your Linux host system is connected to the target device through the USB cable for flashing.

Verify that board was connected by running:

lsusb | grep -i nvidia

You should see the following:

Bus 002 Device 004: ID 0955:7140 NVidia Corp.

Next run the following command. I think the eMMC is supposed to the 16GiB, but I just used the exact command from the NVIDIA readme assuming that I should be able to resize it later.

sudo ./ -S 8GiB jetson-tk1 mmcblk0p1

UPDATE: The above command will leave space unused as pointed in the comments. To use all of the eMMC use “-S 14580MiB” (from:

This should print something like the following and will take a loooong time:

copying dtbfile(/home/foobar/l4t/Linux_for_Tegra/kernel/dtb/tegra124-pm375.dtb) to tegra124-pm375.dtb... done.
Making system.img... 
 populating rootfs from /home/foobar/l4t/Linux_for_Tegra/rootfs... done.
 Sync'ing... done.
System.img built successfully. 
copying bctfile(/home/foobar/l4t/Linux_for_Tegra/bootloader/ardbeg/BCT/PM375_Hynix_2GB_H5TC4G63AFR_RDA_924MHz.cfg) to bct.cfg... done.
copying cfgfile(/home/foobar/l4t/Linux_for_Tegra/bootloader/ardbeg/cfg/gnu_linux_fastboot_emmc_full.cfg) to flash.cfg... done.
creating gpt(ppt.img)... 
*** GPT Parameters ***
device size -------------- 15766388736
bootpart size ------------ 8388608
userpart size ------------ 15758000128
Erase Block Size --------- 2097152
sector size -------------- 4096
Partition Config file ---- flash.cfg
Visible partition flag --- GP1
Primary GPT output ------- PPT->ppt.img
Secondary GPT output ----- GPT->gpt.img
Target device name ------- none
*** PARTITION LAYOUT(16 partitions) ***
[ BCT] BH 0 16383 8.0MiB 
[ PPT] UH 0 4095 2.0MiB ppt.img
[ PT] UH 4096 8191 2.0MiB 
[ EBT] UH 8192 16383 4.0MiB fastboot.bin
[ LNX] UH 16384 32767 8.0MiB boot.img
[ SOS] UH 32768 45055 6.0MiB 
[ GP1] UH 45056 49151 2.0MiB 
[ APP] UV 49152 16826367 8192.0MiB system.img
[ DTB] UV 16826368 16834559 4.0MiB tegra124-pm375.dtb
[ EFI] UV 16834560 16965631 64.0MiB 
[ USP] UV 16965632 16973823 4.0MiB 
[ TP1] UV 16973824 16982015 4.0MiB 
[ TP2] UV 16982016 16990207 4.0MiB 
[ TP3] UV 16990208 16998399 4.0MiB 
[ UDA] UV 16998400 30773247 6726.0MiB 
[ GPT] UH 30773248 30777343 2.0MiB gpt.img
copying bootloader(/home/foobar/l4t/Linux_for_Tegra/bootloader/ardbeg/fastboot.bin)... done.
Bootloader(/home/foobar/l4t/Linux_for_Tegra/bootloader/ardbeg/fastboot.bin) used as flasher.
Existing flash application(/home/foobar/l4t/Linux_for_Tegra/bootloader/nvflash) reused.
making zero initrd... 
Making Boot image... done
*** Flashing target device started. ***
./nvflash --bct bct.cfg --setbct --configfile flash.cfg --create --bl fastboot.bin --odmdata 0x6009C000 --go
Nvflash 4.13.0000 started
chip uid from BR is: 0x340010017408c1431c00000016018080
rcm version 0X400001
Skipping BoardID read at miniloader level
System Information:
 chip name: unknown
 chip id: 0x40 major: 1 minor: 1
 chip sku: 0x81
 chip uid: 0x000000017408c1431c00000016018080
 macrovision: disabled
 hdcp: enabled
 jtag: enabled
 sbk burned: false
 board id: 0
 warranty fuse: 0
 dk burned: true
 boot device: emmc
 operating mode: 3
 device config strap: 0
 device config fuse: 0
 sdram config strap: 3
RCM communication completed
BCT sent successfully
odm data: 0x6009c000
downloading bootloader -- load address: 0x80108000 entry point: 0x80108000
sending file: fastboot.bin
- 900492/900492 bytes sent
fastboot.bin sent successfully
waiting for bootloader to initialize
bootloader downloaded successfully
ML execution and Cpu Handover took 1 Secs
Partition backup took 0 Secs
setting device: 2 3
deleting device partitions
creating partition: BCT
creating partition: PPT
creating partition: PT
creating partition: EBT
creating partition: LNX
creating partition: SOS
creating partition: GP1
creating partition: APP
creating partition: DTB
creating partition: EFI
creating partition: USP
creating partition: TP1
creating partition: TP2
creating partition: TP3
creating partition: UDA
creating partition: GPT
sending file: ppt.img
\ 2097152/2097152 bytes sent
ppt.img sent successfully
padded 4 bytes to bootloader
sending file: fastboot.bin
- 900496/900496 bytes sent
fastboot.bin sent successfully
sending file: boot.img
\ 5912576/5912576 bytes sent
boot.img sent successfully
sending file: system.img
/ 8589934592/8589934592 bytes sent
system.img sent successfully
sending file: tegra124-pm375.dtb
- 34723/34723 bytes sent
tegra124-pm375.dtb sent successfully
sending file: gpt.img
\ 2097152/2097152 bytes sent
gpt.img sent successfully
Create, format and download took 1515 Secs
Time taken for flashing 1516 Secs
*** The target ardbeg has been flashed successfully. ***
Reset the board to boot from internal eMMC.
~/l4t/Linux_for_Tegra >

And thats it, we are all done!
Reboot your board and try not to mess up the file system again.

UPDATE: Added a short list of things I like to do post-install.

# verify that start stop restart works
sudo poweroff
sudo reboot

#got net?
sudo ping

# get correct time
sudo ntpdate

# setup timezone, select US/Pacific
sudo dpkg-reconfigure tzdata

# set sysclock, only if internet is down
#sudo date
#sudo date 050607002014

# check time on HW RTC
sudo hwclock --debug

# sync HW RTC to sysclock
sudo hwclock -w

# add automatic time update at startup and to crontab
sudo vi /etc/rc.local
# add the following lines
hwclock -w
# edit crontab for root
sudo crontab -e
# add following lines
5 * * * * ntpdate-debian
7 * * * * hwclock -w

# disable gui desktop and window manager
sudo mv /etc/init/lightdm.conf /etc/init/lightdm.conf.disabled
# from here:

# enable universe in the apt source list
sudo vi /etc/apt/sources.list

# update and upgrade
sudo apt-get update && sudo apt-get upgrade

# install useful packages
sudo apt-get install git screen tree tcsh vim-gtk

# misc cleanup
sudo apt-get autoclean & sudo apt-get clean

USB Wireless Pains on RaspberryPi

I had purchased the Miniature Wifi (802.11b/g/n) from adafruit for my raspberrypi, but I ended up having serious strange problems with that part and ended up returning it for a refund. Since this was based on a RealTek chipset I hastily decide to avoid anything RealTek based.

Picture 2

I then got the WiPi module from newark, which was based off a RALINK chip and claimed to be compatible by the seller. This worked great initially but would randomly disconnect if the connection got idle for too long and had trouble reconnecting. I ended up messing up my SD card FS twice because of these disconnection. Searching around this other people were facing the same problem.

More searching revealed that people were having better luck with the RealTek based AirLink101 USB adapters. So I then got an AirLink101 5099 from amazon, which has been working great for the last few days.

I am now seriously considering returning the WiPi back to Newark.

If you are considering buying a USB wireless adapter my suggestion would be to get one of the AirLink101 Realteks.

More information here:

SM5100B GSM/GPRS modem – useful AT commands

Latest version of this document can be found under source control here on github.

1) Reboot modem


+SIND: 1

+SIND: 10,”SM”,1,”FD”,1,”LD”,1,”MC”,1,”RC”,1,”ME”,1

+SIND: 11

+SIND: 3

+SIND: 4


2) save settings (whatever can be saved) to non-volatile memory


3) display error text instead of error code


4) enable local echo


5) date time (which will be incorrect)

check date time:


+CCLK: “14/03/15,00:12:18”


set date time:
total 17 chars formatted as – “yy/mm/dd, hh:mm:ss”


minicom trace

6) check misc status flags


+CIND: 0,19,1,0,1,0,0,0


The format is:

+CIND: <battery>, <signal level>, <service>, <sounder>, <message>, <call>,
<roam>, <smsfull>

<Descr> description
– battery Voltage of battery
– signal Strength of signal (0-31)
– service Availability of network (0-1) (value=1 means registered to network)
– sounder Stillness (0-1) (1=mute)
– message Whether receive short messages (0-1)
– call Existence of a call (0-1)
– roam Net status (0-1) (1=roam status)
– smsfull Short message memory storage has become full(1), or memory locations are available(0)

7) display sms in plain text



8) read sms at specified index (0 is invalid)

+CMGR: “REC READ”,0,”+14088494245″,”13/07/26,23:34:24+00″
Hello cellular prowl

+CMGR: “REC UNREAD”,0,”+14088494245″,”13/07/26,23:36:40+00″
Meow meow purrrr


9) delete sms at specified index (1 in this case)



+CMS ERROR: Invalid memory index

The format is:


<index>: index num of chosen memory <mem1>,which should be less than the maximum num item of <mem1>

<DelFlag> description
– 0 Delete an message according to index
– 1 Delete all readed messages
– 2 Delete all readed or sent messages
– 3 Delete all readed or sent or unsent messages
– 4 Delete all messages

10) list all sms

+CMGL: 2,0,”REC READ”,”+14088494245″,”13/07/26,23:36:40+00″
Meow meow purrrr


11) make a call


12) hang up a call (ringing or received)


13) answer a call


14) send sms


> hello kitty▒
+CMGS: 1


NOTE: That funny character above is ctrl+z; sending ctrl+z is equivalent to sending a single byte with the hex value: 0x1a

Passing serial data over I2C between two Arduino’s

Below you will find some arduino code for passing serial data over I2C between two Arduino’s. Parts of the following code were salvaged from various places around the internet.


This can also be used for:

1) General communication between two Arduino’s over I2C

2) Using a second Arduino to expand the peripherals, for example: add a a second serial port device, add a second arduino for dedicated monitoring of certain interfaces

I used this to communicate between a Diavolino@ 5V with a Arduino Pro @ 3.3V using the Sparkfun level converter TX lines. My attempts at trying to run this without the level converter using pullup registers tied to 3.3V did not work. I will reattempt that once I get a scope for debug.

I2C Master code:

#include <Wire.h>
// SCL - analog pin 5
// SDA - analog pin 4

int led = 13;
int debug = 0;

void setup() {
  pinMode(led, OUTPUT);     
  Wire.begin(); //join I2C as master
  Serial.begin(9600); //setup serial for input and output
  digitalWrite(led, HIGH);
  Serial.println("I2C MASTER 3.3V");
  delay(5000); // the master should be ready after the slave

void loop() {
  if (Serial.available()) {
    char inChar = (char); 
    if (debug) {
  else {
    if (debug) Serial.println("!serial");

  Wire.requestFrom(4, 1); // request 1 byte from slave device #4
  if (debug) Serial.println("waitOnReq");
  char d =;
  if (debug) {
    Serial.print(" reqData:");
  else { // ignore special character ?
    if (d != '?') Serial.print(d);

  if (debug) digitalWrite(led, HIGH);
  if (debug) delay(200);

I2C Slave code:

#include <Wire.h>

// SCL - analog pin 5
// SDA - analog pin 4
int led = 13;
int debug = 0;
void setup() {
    pinMode(led, OUTPUT);     
    Wire.begin(4);                // join i2c bus with address #4
    Wire.onReceive(receiveEvent); // register event
    Wire.onRequest(requestEvent); // register event
    Serial.begin(9600);           // start serial for input and output
    digitalWrite(led, HIGH);
    Serial.println("I2C SLAVE 5V");
    delay(2000); // the slave should become ready first

void loop() {

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
    if (debug) {
        char c =;
        if (debug) {
        else {

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void requestEvent() {
    if (debug) Serial.println("reqEvent");
    if (debug) digitalWrite(led, LOW);
    if (Serial.available()) {
        char inChar = '0'; 
        inChar = (char); 
        if (debug) {
    } else { //send some dummy data if no data is available from serial
        if (debug) Serial.println("!sent:");

RaspberryPi with SM5100b GSM GPRS cellular shield


I am going to try porting my PC python script for interfacing to the SM5100b directly to the RPi instead of converting it to an Arduino program.

UPDATE: Wow… it was easier than I thought it would be. I was able to quickly get to the same level of functionality as that previous post in less than an hour. Here is the push message posted to Prowl app using the cellular shield by a python script running on the Raspberry Pi.

Updates project files should show up on my github soon.