Jetson TK1

A company on eBay is auctioning off pieces of an old supercomputer cluster someone had built from Jetson TK1s and Intel NUCs. The boards are old, but you get a bunch of them pretty cheap so I bought one since cheap SBCs are always handy.

The Jetsons are a nice platform for getting one’s feet wet with CUDA for vision and deep learning on a mobile (e.g. robotic) platform. You can always step up to newer modules (Nano, TX2, etc.) if you need more power, but the TK1 is a nice board with 2GB RAM and 16GB eMMC flash (11GB free) running Ubuntu 14.04 linux (you can upgrade to 16.04).

The boards arrive configured for network booting (PXE) and you need to change that if you want to boot into ubuntu from the internal eMMC disk. To do that, you’ll need to connect to the serial port using a null modem cable. The unit starts out running u-boot; you can interact with it using a serial terminal (PuTTY, TeraTerm, etc.) configured for 115kbps, 8 data bits, No parity, 1 stop bit. Press any key to stop the automatic boot within 3 seconds (it prompts you), then you’re at the u-boot prompt. You can change the boot target (default is pxe) using the following commands:

setenv boot_targets mmc0
saveenv
reset

Then when you boot, it will automatically launch ubuntu from the eMMC drive (mmc0) and you can interact with it using an HDMI monitor and USB keyboard/mouse. See here for more useful info on u-boot configuration. The default user name is ubuntu and the password is also ubuntu.

From what I’ve read, the fan is only needed when maxing out the CPU/GPU and in most cases, you can replace the fan with a heatsink.

NVidia has an active developer forum where you can find answers to almost anything. For information on the GPIO header see here and also the Jetduino project. Another great site is JetsonHacks.

To install the latest JetPack (integrates lots of CUDA/NVidia support) see here.

CurrentRanger

I’ve long relied on the uCurrent Gold to measure low currents (micro-amps, nano-amps) in the IoT devices I design, but it is no longer in production. So I recently purchased a CurrentRanger from Low Power Labs which offers the same ultra-low burden voltage measurement and adds several enhancements.

Current Ranger

Both devices use very low value current sense resistors to impose minimum burden voltage and use low noise, low offset gain stages to amplify the current into a proportional voltage that is presented on the output terminals and that you can measure with a multimeter. So, for example, if operating in the uA range, a 33uA current through the supply->load terminals will result in a 33mV output on the output terminals.

The CurrentRanger is improved over the uCurrent in several ways including:

  • Fast auto-ranging using an internal microcontroller allowing use of the device to monitor battery powered IoT devices which typically exhibit a very wide dynamic range of current consumption (often from nA or a few uA in sleep mode to hundreds of mA when transmitting).
  • An optional OLED display which provides a convenient way to monitor the current without having to connect a multimeter to the output terminals. (albeit limited by the ucontroller’s ADC input granularity and accuracy). This can save a lot of wiring clutter and bench space.
  • Powered by an internal rechargeable lithium polymer battery (that you must supply) which it can charge from the built-in micro-USB connector. This is handier than the coin cells that the uCurrent uses which tend to run out at inconvenient times and replacements aren’t always at hand. It can also be used with 3x AA batteries (you’ll need to supply the battery holder), but if so you must not have the batteries installed while the USB cable is connected (the USB connection powers the internal lithium battery charger which would damage AA cells).
  • Supports/suggests external data logging using a TTL serial interface or an optional HC-06 bluetooth module for electrically isolated data logging which also helps prevent cluttering your bench with more wires. The HC-06 is a class 2 bluetooth slave module that does transparent serial communications bridging. I’ll write another post regarding the HC-06 module, but you can see its datasheet here and buy them on amazon or AliExpress or eBay or a host of other sites (they are popular); there are also less expensive DX-BT18 modules (manual here) that claim to be compatible and supports BT4.2 including support for SPP and BLE. At least some versions are actually FCC certified (2ADMF-HC06 and 2AKS8DX-BT18)…I checked the FCC – which you should always do. There are many clones and compatible modules such as the JDY-08 (also here) and JDY-40 available for under $1 that are not FCC certified.

I tested the Current Ranger uA range with several precision resistors (100K, 470K, 1M) as fixed loads. The voltage output was spot on and the burden voltage was negligible. Compared with my much more expensive Advantest R6552 AC-powered bench meter, the Current Ranger offered slightly lower (better) burden voltage and slightly better accuracy. The only issue I noticed was that while the voltage output was spot-on, the OLED display read about 1uA too low across the uA range (i.e. it had a fixed offset, not a percentage error). This isn’t a big deal for me, but it’s worth noting. Overall I am quite pleased with the Current Ranger. The precision was excellent, it is well designed, very compact, and allows taking and logging current measurements across a wide dynamic consumption range, ideal for IoT devices.

EmBitz and STM32G0

I’ve been a fan of the STM32 micro-controllers for a long time and EmBitz by Gerard Zagema has been my preferred development environment. I am working on a project that needs a very low-cost microcontroller with fast PWM generation and the new STM32G0 family seems like a perfect fit with packages as small as SO8 and costs under $0.50 with a powerful 32-bit Cortex M0+ core and the same familiar peripheral set as their other uCs.

EmBitz is a light weight, lightning-fast IDE for C and C++ development; previously called Em::Blocks, it is a a fork of Code::Blocks that supports several micro-controller families including STM32 and integrates outstanding debug support. It is free,but I try to support such development and purchased a copy and recommend you do the same. The current version of EmBitz is 1.11; an impending 2.0 release has been announced but is not available yet.

EmBitz 1.11 doesn’t directly support the relatively new STM32G0 family, and many of the STM utilities don’t either (e.g. the latest STLinkUtility 4.5 doesn’t work with it). However, the EmBitz developer has already released an enhanced debugger that supports it and cleanly integrates with EmBitz 1.11. Here’s what I had to do to get STM32G0 development going under EmBitz:

  • Download and install EmBitz 1.11 (note that the site may be down if you can’t find a copy, email me for a copy)
  • Install EBlink
    • Download the zip file
    • Follow these instructions to install it in EmBitz. The instructions aren’t crystal clear:
      • unzip the EBlink-master.zip folder
      • copy the EBlink win32 folder contents into ${EMBITZ}\1.11\share\EBlink
      • copy the EBlink scripts folder into ${EMBITZ}\1.11\share\EBlink
      • Download the EBlink interface and extract it to ${EMBITZ}\share\EmBitz\debuggers\Interfaces\
  • Now, EBlink appears as a debug interface option under GDB Servers and you can use it to load software into your target and debug it in the IDE!
  • To create an STM32G0 project, I created an STM32L0 project (since it is also Cortex M0+) and replaced the template files with files I gathered (and somewhat modified) from other STMicroelectronics sources:
    • includes: stm32g0xx.h, stm32g031xx.h, system_stm32g0xx.h
  • In the project Build Options:
    • Under the Device tab, change the Policy to Use target settings
      • Device: cortex-m0plus
      • Linker script: ./stm32g031_flash.ld
      • Stack: 0x0100 (or whatever stack size you need)
    • Under the Compiler Settings #define tab, define STM32G031xx

Note that there is also a process for importing an STM32CubeMx project into EmBitz; see here.

Thank you testdisk!

I have a lot of my personal data (photos, music, etc.) stored on a RAID1 array (two drives that mirror each other so that if one drive dies the other has all of the data). Having my data on a RAID array gave me a lot of confidence that the data was secure…until it died last week. The RAID controller bit the dust, one of the two drives died, and the partition table of the other drive was corrupted. I couldn’t access the data using any windows utilities or fdisk, gdisk, gparted or ddrescue. I realized I hadn’t backed that storage up in more than a year.

It was starting to look grim, when I read about testdisk and gave it a try…and it worked like a champ. testdisk recognized the damaged partition and and gave me access to the NTFS file system. I was able to copy the data onto a good drive so all is good (and I’m going to be a lot better about backups). Thanks testdisk!

ATtiny

Every now and then you need an electronic component and there just isn’t a good match available…necessity is the mother of invention so why not make your own? The problem was I had a very tight cost budget, very little PCB space, and was behind schedule…I needed a cheap, tiny solution FAST. Fortunately, I found the ATtiny which is an 8-bit AVR micro-controller available in packages as small as SOT23-6 package (about the size of the head of a pin) that costs $0.28 in small quantity and the more powerful ATTiny13A that costs $0.35 and is available in SOIC8 and DIP8.

I needed to generate a 5V PWM output to drive a MOSFET for programmable closed-loop control of the speed of two types of DC motors in a very tiny space. There aren’t that many *really* small micro-controllers in packages that are reasonable to prototype with (I hate prototyping with QFN and BGA packages). I considered a few including the Microchip PIC10F322 (also SOT23-6) and the STM8 series (supports the great STLink debug environment). I eventually counted out the PIC because the development environment was so unfriendly (I’m done with expensive proprietary compilers) and counted out the STM8 because even though I’m quite experienced with the STM32, getting the peripherals programmed properly can be complex and I needed a solution fast, so I chose the ATTiny.

I used avr-gcc as the C compiler which is fast, familiar, and generates tight code (you can’t go wrong with gcc). Microchip has breadboard-friendly DIP-8 versions of the ATtiny13A and the pin-compatible ATTiny25/45/85, so I could rapidly prototype a solution. The documentation is excellent, the peripheral set is rich and easy to use (unlike ST uCs which are incredibly flexible but accordingly complex). It was so easy that I was able to get the code fully functional in just a few hours having never use AVR processors before. I understand you can even use Arduino to program it (I didn’t).

Useful tools:

It’s not going to replace the STM32 family for most of my applications, and the STM8 series is arguably better, but for those times I need a really cheap, really small solution, the ATtiny is a nice addition to the toolbox. You can even order them from Digikey with your software pre-installed for an additional ~$0.25/chip making them truly a custom hardware component!

Asus cheap ultrabook

In my never ending quest for the perfect portable computing platform, I’ve come a step closer. There are loads of good ultrabooks, but most of them are *expensive*. I don’t want to carry/drop/lose a 1K+ device; my ideal portable is in the $300 range. Thus far, I’ve been using modified chromebooks, but some standard laptop/ultrabooks are finally getting into the right price range.

The Asus Vivobook F510UA-AH51 is replacing chromebooks running windows as my new carry laptop. It has an 8th-gen quad-core i5 processor, 15.6″ full-HD display, comes with 8GB DDR4 (supports up to 32GB), WiFi, USB 2,3,C, fingerprint reader, and HDMI. It weighs only 3.7lbs, is thin, has a very small charger, and looks decent.



The battery life is 6-7 hours which is a little less than I’d like, but the main compromise Asus made with this laptop was an old-fashioned, slow 1TB HDD that cripples its speed. Fortunately, you can add an M.2 SATA SSD and turn it into a speedy little laptop. I installed a Crucial MX500 M.2 SATA drive ($40 on amazon) which pleasantly came with Acronis True Image that allowed me to clone Windows from the 1TB HDD onto the M.2 SSD. The result is windows running on the SSD and the 1TB HDD available for bulk storage.

Installing the SSD requires opening the back of the machine (lots of screws including two hidden under two of the rubber feet); you’ll want a proper pry tool (or a guitar pick) to release the thin plastic clips that retain the back once the screws are removed. YouTube has many videos showing how to open the case; and since it’s a bit of a pain, I installed another 8GB of memory ($32 on amazon) while it was open.

The net result, while costing closer to $400 than my target $300 is a fast, light ultrabook with loads of storage and most modern features. A touchscreen and longer battery life would be nice, but not a big deal and overall, this is a great value and suitable for all student/business/development needs!

More crooks from China: Shenzhen Enbar

eBay isn’t the only place where bad companies and individuals hang out. Regardless of the market, a lot of them are in China. Here’s some information about how to check for Chinese scam companies.

I bought 100 ER34615 lithium batteries with custom pigtail connectors from Shenzhen Enbar on Alibaba. Within a year, all of them were dead whether they had been used or not. This type of battery has a 20+ year shelf life. Taking the generically marked shrink-wrap off the failed batteries, there were numerous spot-weld marks on the battery anode where a different tab had been mounted.

I understand that every company occasionally has a bad batch so I reached out to them to analyze the failures, but they had no interest in that and suggested that I just buy more batteries from them! Their “engineer”: Eric Lee insisted that their batteries must be used within 6 months or they will be destroyed by passivation (the normal process of building up a thin oxidation layer that is precisely what gives the batteries their long storage life). He sent me a datasheet with the specs for their batteries that includes “Long Storage Life”…and complained that I had embarrassed him by bringing up the failures! They are obviously not a legitimate or reputable company.

It turns out that a common scam in China is to take batteries that have been sent for recycling, put new shrink-wrap on them and resell them as new (at a discount of course). Buyer beware.

I won’t be buying from Shenzhen Enbar again.

XL6009 Switching Converter – Warning

The XL6009 is a nifty, inexpensive switching voltage regulator from XLSemi. (see datasheet). There is also the XL6019 (see datasheet). They are great parts and operate over a wide input voltage range at high efficiency and their internal switch can deliver substantial current. They can operate in boost and SEPIC/Buck-Boost configurations

HOWEVER you need to be cautious when using the ENable pin (2): the datasheet indicates that EN is a TTL compatible input and considers anything over 1v4 as High (Enable) – that’s good. It also mentions that if left unconnected, the pin floats high (enabled) – that’s also fine.

What wasn’t apparent to me, and certainly isn’t spelled out in the datasheet, is that when the EN pin floats high, it is at Vin and can source enough current to do damage. So if you are using the converter to boost say 12V to 24V, you’d better not connect that EN pin directly to a microprocessor GPIO because the processor pin will be at 12V and will be destroyed! (as I learned the hard way)

The solution of course is simple, just use the processor GPIO to drive a transistor in an open drain/open-collector arrangement to disable the converter. A common 2N2222 or 2N3904 should work just fine over the full input range of the XL6009. Live and learn.

Acer Chromebook 15 Windows

As I’ve gotten older, small screens have increasingly become a problem. I love the real-estate of a full-HD (or bigger) screen, but when they’re smaller than 15.6″, the fonts are getting hard to read for these old eyes.

There aren’t many 15.6″ laptops that met my requirements (1080p, long battery life, 4GB or more, core i5 or better, light weight), especially when you want it to be inexpensive: I prefer not to carry something that costs more than around $200 because laptops get broken/stolen/lost/etc.

So I bought an Acer Chromebook 15 on eBay for $180 and so far, I like it a lot. I replaced the stock 32GB SSD with a KingSpec 256GB SSD (M.2 2242) bought on amazon for $34.15 and installed Windows 10 Pro 64-bit from SCDKey using coolstar.org replacement BIOS. It’s a bit over budget, but still pretty close to the $200 target and it is now a very serviceable Windows laptop with decent battery life, speed (core i5-5200), and a screen I can read. The battery is replaceable and widely available so when that run-time starts to decline, that’s fixable too.

It could be a little lighter and I would have liked more RAM, but it runs all of the software I use and is pretty snappy. Overall, Acer chromebooks continue to impress me!

Windows Programming in C???

I usually use Java when developing desktop software, but I recently had need to develop code that provided both a Windows GUI and also supported low-level interface with hardware connected to the PC. Java is great for developing GUIs and I still like the ancient Matisse GUI builder for Netbeans/Java Swing – I can knock out GUIs really fast with it…however, Java apps can be big and slow and interfacing Java with custom hardware is painful..so I looked into developing Windows native GUI apps in C to give really fast and small code that can interface easily to hardware…and have been pleasantly surprised.

Two things helped:

The Pelles tool is slick, fast, and provides wizards for anything you’d want to build for a Windows target. The tutorial provides loads of compact runnable examples showing how to use each widget and feature of the WinAPI. There are other good WinAPI tutorials as well such as The Forger’s tutorial.

Next: find a GUI builder like Matisse for WinAPI. Pelles includes a resource editor but not a full GUI builder.