Month: September 2017

Converting GPS Latitude and Longitude to 32 bits

/*
 * Convert Latitude in DMS (Degrees Minutes Seconds) to 32-bit integer
 * between -162000000 and 162000000
 */

#include < stdio.h>

int main(void)
{
    int degree;
    int min;
    double sec;
    double frac_sec;

    printf("Inform the latitude in this format XXº YY\' ZZ.ABCD\"\n");

    printf("Type the value of the Degree (XX): ");
    scanf("%d", &degree);

    if (degree < -90 || degree > 90)
      {
          printf("The Degree value needs to be between -90 and 90!\n");
          return -1;
      }

    printf("Type the value of the Minute (YY): ");
    scanf("%d", &min);

    if (min < 0 || min > 59)
      {
          printf("The Minute value needs to be between 0 and 59!\n");
          return -1;
      }

    printf("Type the value of the Seconds (ZZ.ABCD): ");
    scanf("%lf", &sec);

    if (sec < 0 || sec >= 60)
      {
          printf("The Seconds value needs to be between 0 e 59.9999!\n");
          return -1;
      }

    printf("%02dº %02d\' %02f\"\n", degree, min, sec);

    /* Convert everything to seconds and add fraction of seconds */

    frac_sec  = degree * 60 * 60;
    frac_sec += (min * 60);
    frac_sec += sec;

    /* Multiply by 500 because the unit is in 1/500 seconds */

    frac_sec = frac_sec * 500;

    printf("Value converted = %d => 0x%08X!\n", (int) frac_sec, (int) frac_sec);

    return 0;
}    

 

Example:

$ ./dmsto32b 
Inform the latitude in this format XXº YY' ZZ.ABCD"
Type the value of the Degree (XX): 30
Type the value of the Minute (YY): 15
Type the value of the Seconds (ZZ.ABCD): 57.1926
30º 15' 57.192600"
Value converted = 54478596 => 0x033F4704!

We can convert this value to Decimal Degrees dividing by 30000 (500 * 60) and then dividing by 60:

54478596 / 30000 = 1815,9532

1815,9532 / 60 = 30,265886667

Normally GPS position are represented on Decimal Degrees (as used by Google Maps), but these are the three most common options:

-27.587300, -48.437300 (DD)

-27° 35.238’, -48° 26.238’ (graus° minutos.Decimal’)

27° 35′ 14.28” S, 48° 26′ 14.28” W (DMS)

Testing RedBoard Duo board

Today I received my RedBoard Duo board! This board can communicate with the Particle.io cloud and in fact it came with its firmware.

The board is just a little bit bigger than Particle Photon board. I missed a label near the SETUP and RESET button, it could make our life easier!

I started with the “Duo: Out-of-Box Experience” reading:

https://github.com/redbear/Duo/blob/master/docs/out_of_box_experience.md

It suggest to install the DuoApp, then I did it:

$ adb install DuoApp_0.2.0.apk

After installing I didn’t find it in the Android application (I was expecting a RED BEAR), then I decided to list all installed applications using this command:

$ adb shell 'pm list packages -f'

Ok, it listed many packages, including the package:

package:/data/app/net.redbear.redbearduo-1/base.apk=net.redbear.redbearduo

Then I started it manually:

$ adb shell monkey -p net.redbear.redbearduo -c android.intent.category.LAUNCHER 1

The application expects you are connected to WiFi of your RedBear board (i.e. Duo-xxxx) then it scans for you router WiFi and ask your password. Finally it configures your RedBear automatically and connects it to Particle cloud, the LED starts glowing in Cyan. If configuration over WiFi fails you can enable the Bluetooth and it will try to configure it using BLE.

When the configuration is done it will show some informations, like the IP that RedBear got from your WiFi router. You can access this IP in the browser to turn-on or turn-off the Blue LED of your board.

Programming Smoothieboard V2 Mini

I’m testing the Smoothieboard V2 Mini

The JP10 (BOOT2) is in the position 0 (tied to ground) because I will program it using SWD instead using the LPCScript DFU/bootloader.

First we need to clone the repositories:

$ git clone https://github.com/Smoothieware/smoothie-nuttx
$ git clone https://github.com/Smoothieware/smoothie-v2

Enter inside “smoothie-nuttx” and compile the nuttx for smoothie v2 mini alpha:

$ cd smoothie-nuttx
$ cd nuttx
$ cd tools
$ ./configure.sh smoothiev2-mini-alpha/smoothiedev
$ cd ..
$ make export
...
CC:  lpc43_ostest.c
CC:  lpc43_autoleds.c
CC:  lpc43_timer.c
AR:   lpc43_boot.o lpc43_appinit.o lpc43_mmcsd.o lpc43_highpri.o lpc43_ostest.o lpc43_autoleds.o lpc43_timer.o 
make[2]: Leaving directory '/smoothie-nuttx/nuttx/configs/smoothiev2-mini-alpha/src'
make[1]: Leaving directory '/smoothie-nuttx/nuttx/arch/arm/src'

Just confirm the the file “nuttx-export.zip” was created correctly:

$ ls -l nuttx-export.zip 
-rw-rw-r-- 1 alan alan 2932905 Set  3 20:00 nuttx-export.zip

We need to copy this file to smoothie-v2 directory to compile the final firmware:

$ cp nuttx-export.zip ../../smoothie-v2/Firmware/

Then go to there and decompress the nuttx-export:

$ cd ../../smoothie-v2/Firmware/
$ unzip nuttx-export.zip
...
  inflating: nuttx-export/include/machine/_types.h  
  inflating: nuttx-export/include/machine/ieeefp.h  
  inflating: nuttx-export/include/math.h

Case you are using a version of gcc crosscompiler different from 6.3.1:

$ arm-none-eabi-gcc -v
...
Thread model: single
gcc version 6.3.1 20170620 (release) [ARM/embedded-6-branch revision 249437] (GNU Tools for ARM Embedded Processors 6-2017-q2-update) 

Then you need to export the variable the “ARMVERSION” with your version, see the Rakefile for more info.

We can compile the Unit Tests just executing:

$ rake testing=1
...
Compiling /tmp/smoothie-v2/Firmware/TestUnits/TEST_timer1.cpp for Bambino
Compiling /tmp/smoothie-v2/Firmware/TestUnits/main.cpp for Bambino
Linking for Bambino
   text	   data	    bss	    dec	    hex	filename
 394553	   1128	  11800	 407481	  637b9	smoothiev2_Bambino/smoothiev2.elf

Finally enter inside “smoothiev2_Bambino” and flash the firmware.

I’m using a STLink-v2 clone (low cost: about U$ 2.00) with only three pins: SWDIO, SWCLK and GND connected to JTAG header of the board:

$ cd smoothiev2_Bambino
$ sudo openocd -f interface/stlink-v2.cfg -f target/lpc4330.cfg -c init -c "reset halt" -c "flash write_image erase smoothiev2.bin 0x14000000"
Open On-Chip Debugger 0.10.0+dev-00172-g7719e96 (2017-08-24-16:57)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select '.
adapter speed: 500 kHz
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
Info : Unable to match requested speed 500 kHz, using 480 kHz
Info : Unable to match requested speed 500 kHz, using 480 kHz
Info : clock speed 480 kHz
Info : STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.270400
Info : lpc4350.m4: hardware has 6 breakpoints, 4 watchpoints
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x10402c40 msp: 0x10087ff0
auto erase enabled
Info : Found flash device 'win w25q64cv' (ID 0x001740ef)
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x10000154 msp: 0x10087ff0
target halted due to breakpoint, current mode: Thread 
xPSR: 0x61000000 pc: 0x10000198 msp: 0x10087ff0
wrote 458752 bytes from file smoothiev2.bin in 12.150717s (36.870 KiB/s)

Connect the USB/Serial 3.3V adapter to UART0 header pin and you will get:


Starting tests...
There are 35 registered tests...
  PlannerQueue-basic
  PlannerQueue-iteration
  ConfigTest-get_sections
  ConfigTest-load_section
  ConfigTest-load_sub_sections
  Dispatcher-check_callbacks
  Dispatcher-Remove_second_G1_handler
  Dispatcher-one_off_dispatch
  GCodeTest-basic
  GCodeTest-subcode
  GCodeTest-copy
  GCodeTest-Multiple_commands_on_line_no_spaces
  GCodeTest-Modal_G1_and_comments
  GCodeTest-Line_numbers_and_checksums
  MemoryTest-stats
  MemoryTest-AHBn
  Module-single_module
  Module-single_module_destructed
  Module-multi_module
  SDCardTest-mount
  SDCardTest-directory
  SDCardTest-write_read
  SDCardTest-read_config_init
  SDCardTest-unmount
  SlowTicker-test_20_hz
  SlowTicker-test_10_hz
  StreamsTest-stringstream
  StreamsTest-cout
  StreamsTest-OutputStream_null
  StreamsTest-OutputStream_sstream
  StreamsTest-OutputStream_fdstream
  StreamsTest-OutputStream_prependok
  StreamsTest-OutputStream_long_line
  TimeTest-delta_ik
  TimerTest-test_20_hz
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_PlannerQueue.cpp:7:PlannerQueue-basic:PAS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_PlannerQueue.cpp:53:PlannerQueue-iteratiS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_config.cpp:15:ConfigTest-get_sections:PAS
[(enable, false)]
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_config.cpp:31:ConfigTest-load_section:PAS
elapsed time 20000 us
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_config.cpp:51:ConfigTest-load_sub_sectioS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_dispatch.cpp:51:Dispatcher-check_callbacS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_dispatch.cpp:78:Dispatcher-Remove_secondS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_dispatch.cpp:91:Dispatcher-one_off_dispaS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:7:GCodeTest-basic:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:31:GCodeTest-subcode:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:52:GCodeTest-copy:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:80:GCodeTest-Multiple_commandsS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:100:GCodeTest-Modal_G1_and_comS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_gcode.cpp:118:GCodeTest-Line_numbers_andS
             total       used       free    largest
Mem:        191152      41840     149312     115232
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_mem.cpp:7:MemoryTest-stats:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_mem.cpp:16:MemoryTest-AHBn:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_module.cpp:18:Module-single_module:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_module.cpp:40:Module-single_module_destrS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_module.cpp:62:Module-multi_module:PASS
/home/alan/nuttxspace/SmoothieProject/smoothie-v2/Firmware/TestUnits/TEST_sdcard.cpp:26:SDCardTest-mount:FAIL: Exp1

-----------------------
20 Tests 1 Failures 0 Ignored 
FAIL
Done

Keeping your bitbucket repo in sync with upstream

I imported the NuttX repository to my bitbucket account with name nuttx_nyx (for NyX board). Then I want to keep it in sync with mainline/upstream without accessing the bitbucket page to click on “Sync” button.

So you just need to add the upstream remote:

$ git remote add upstream https://bitbucket.org/nuttx/nuttx

Then we have two remotes now:

$ git remote -v

origin	https://bitbucket.org/acassis/nuttx_nyx (fetch)
origin	https://bitbucket.org/acassis/nuttx_nyx (push)

upstream	https://bitbucket.org/nuttx/nuttx (fetch)
upstream	https://bitbucket.org/nuttx/nuttx (push)

Then when you fetch from upstream it will be putted on you origin/master:

$ git fetch upstream
From https://bitbucket.org/nuttx/nuttx
   afe137f..fe7d8c9  master     -> origin/master

Fine, now just do the default way:

$ git push origin master

You can create your local commit and rebase it with be on top of upstream and saved to your repository.