Sunday, December 30, 2018

0.96" I2C 128X64 Blue OLED Display Module

I ordered a 0.96" I2C 128X64 Blue OLED Display Module from eBay for $2.85 (shipping included).   It claims: voltage 3-5V,  power consumption of full lit screen 80mW, SSD1306 driver IC, compatible with Arduino.  When it arrived about three weeks later, the circuit on the back looked a little different from the product pictures on eBay.

Notably there is no regulator IC that would generate 3.3V from 5V.   It also lacks the level shifters  that are on the similar product by adafruit.   I'm a little skeptical that it can run on 5V..  So we'll start with 3.3V supply.  The two I2C signals are pulled up with 10K resistors.

We will test it using esp32-pico-kit with Arduino on Linux.  The CP210x UART Bridge is mapped to /dev/ttyUSB0.  Adafruit SSD1306 library (along with GFX library) claims to be compatible with ESP32.  We will try the example sketch ssd1306_128x64_i2c.   We need to know the default I2C pins.  It took a while to poke around the ESP32 code to find the pin definition: SDA=21 and SCL=22.   We compile and upload the code.  We open the serial monitor (9600 baud) and see some output, but there is nothing on the display.

We'll try a different library, "ESP8266 and ESP32 Oled Driver for SSD1306 display".  After modifying the I2C pins, the example SSD1306SimpleDemo works nicely.  The current for the module is 4 - 12mA as the program runs through different screen drawings.


Sketch uses 166885 bytes (12%) of program storage space. Maximum is 1310720 bytes.
Global variables use 11444 bytes (3%) of dynamic memory, leaving 283468 bytes for local variables. Maximum is 294912 bytes.
esptool.py v2.1
Connecting........__
Chip is unknown ESP32 (revision 1)
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 8192 bytes to 47...

Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds (effective 7540.8 kbit/s)...
Hash of data verified.
Compressed 14128 bytes to 9213...

Writing at 0x00001000... (100 %)
Wrote 14128 bytes (9213 compressed) at 0x00001000 in 0.1 seconds (effective 818.5 kbit/s)...
Hash of data verified.
Compressed 168032 bytes to 92899...

Writing at 0x00010000... (16 %)
Writing at 0x00014000... (33 %)
Writing at 0x00018000... (50 %)
Writing at 0x0001c000... (66 %)
Writing at 0x00020000... (83 %)
Writing at 0x00024000... (100 %)
Wrote 168032 bytes (92899 compressed) at 0x00010000 in 1.6 seconds (effective 861.6 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 122...

Writing at 0x00008000... (100 %)
Wrote 3072 bytes (122 compressed) at 0x00008000 in 0.0 seconds (effective 4691.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting...
ets Jun  8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 188777542, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:956
load:0x40078000,len:0
load:0x40078000,len:13076
entry 0x40078ad0




Tuesday, December 4, 2018

LCR-T4 Transistor Tester Display Upgrade

I ended up with a  transistor tester lcr t4 with a damaged LCD display.  We'll try to replace the display with a 1.8" 128x160 TFT color LCD (which can be purchased for about $4).  We used a version of the display previously.  This version has a different (better) pinouts that separates out the SD card connections.  The display uses ST7735S controller chip that is supported by the tester software.

The first issue is the supply voltage.  The tester uses 5V and the display uses 3V.  The display has a regulator to generate 3V from 5V, but the I/Os have to be compatible.  There is no evidence that the input signals to the display are 5V tolerant.  So we'll insert 1-2K resistors in series to limit the current to about 1mA.  Then these is the issue of the backlight.  The display has the cathode grounded, incompatible with the tester connections.  The backlight LED has a forward voltage about 3V@20mA; the tester circuit seems to operate at about 5mA (2.6V).  We'll drive it with a 330-Ohm current limiting resistor from 5V.  The tester is turned on with a push of a button, but kept on with the current through the backlight LED.  So we'll insert a 4.7K resistor at the original LED connection, which would provide about 1mA base current.

We traced the tester's LCD pads,
  • SCK - PD2
  • SDA - PD3
  • A0 - PD1
  • RESET - PD0
  • CS - GND
1.8" TFT 128x160 LCD Module
LCR-T4 with 1.8" LCD
We updated the firmware.  The Flash is very close to full.  It might be hard to add any new features.
AVR Memory Usage
----------------
Device: atmega328p
Program:   32060 bytes (97.8% Full)
(.text + .data + .bootloader)
Data:        202 bytes (9.9% Full)
(.data + .bss + .noinit)
EEPROM:      882 bytes (86.1% Full)
(.eeprom)
When operating, the tester draws about 23mA.  It works to about 7V.



Sunday, November 4, 2018

Transistor Tester LCR-T4

The tester was originated here, and continued here.  I got a version of the tester, LCR-T4 for $6.39.  It was reviewed by Dave of EEVblog here.  It uses AVR ATmega328P (8MHz) with a 128x64 LCD with back light.  The closest schematics is one here.  78L05 regulates 9V battery to 5V and TL431 provides 2.5V reference.  One push button is used for user control and selection and the 14-slot ZIF socket is convenient for different pin spacing.

It can identify and measure a number of 2 or 3-terminal devices and gives reasonably accurate readings  Another attractive aspect is that it can be reprogrammed (through the 6-pin header).  The source code is available.  One issue is the variety of the boards with slight differences, especially the LCD interface.   It appears that this one uses 4-wire interface,
  • PD0 - RST, reset
  • PD1 - A0, command/data 
  • PD2 - SCL, serial clock 
  • PD3 - SI, serial data
Chip Select does not seem connected to any pin, probably grounded.

Install gcc-avr and avr-libc to build the code with the makefile in mega328_T4_v2_st7565.  avrdude is used to flash the microcontroller.  The old AVR ISP with RS232 interface is supported, choosing avrispv2 as the programmer type.  For AVR JTAGICE3, the programmer type is jtag3isp.   Press the button while flashing.   Also we can use an arduino board as a programmer when flashed with ArduinoISP.   The programmer type is avrisp.  The 6-pin programming header can be connected together except for the reset pin, which goes to D10.

See here for a list of software features.

Friday, August 31, 2018

New life on an old computer with Tinker Board

In 2003, I bought an HP/Compaq Presario 2100 laptop, not the best purchase that I made.  In this days of age, it is just not very useful even after I put in a solid-state hard drive and installed light-weight Linux desktop.  It just could not handle the very basic functions of web surfing.  But it seems such a waste to throw it out.

On the other hand, little single board computers, such as Raspberry Pi show  great potential.  They cost about 20 times less than what I paid for the laptop. But they do not come with a screen, keyboard/touchpad.  I recently acquired an Asus Tinker Board, which has pretty impressive performance.    With a fast microSD card, it can surf the web comfortably.   When they are networked together (but having to settle for 100Mbps Ethernet), the laptop just serves as a terminal for the Tinker Board by running VNC.  I found tigervnc to be the best. However, VNC does not pass audio.  One solution is to connect the audio output to the laptop microphone input and run loopback to the speaker (pactl load-module module-loopback latency_msec=1).  This arrangement proves to be quite usable even though the screen resolution is relatively low.  If an external monitor is attached through HDMI, synergy can be used to share the keyboard and pointer.


Sunday, August 19, 2018

TI Simplelink BLE

Here we try out TI SimpleLink Bluetooth Low Energy (BLE) CC2650MODA+MSP432P401R Launchpad bundle ($35).  MSP432P401R comes with an out-of-box demo with LEDs.  We install the latest CCS 8.1.0 and SimpleLink MSP432P4 SDK (v2.20.00.12).  From the SDK, we import outofbox_msp432p401r_MSP_EXP432P401R_tirtos_ccs and  compile and upload.  After that is successful, we download SimpleLink SDK BLE Plugin (simplelink_sdk_ble_plugin_1_40_00_42) and also BLE-Stack (ble_sdk_2_02_02_25). 

We import from SimpleLink SDK BLE Plugin project_zero_MSP_EXP432P401R_tirtos_ccs.   We compile and upload.   When the USB is connected to a PC, two serial ports are created.  On Linux they are /dev/ttyACM0 and ACM1.  Connect to the serial port at 115200 baud, the following message comes up.
--------- Project Zero Example ---------
Initializing the user task, hardware, BLE stack and services.
LEDService: Registered callbacks to application.
ButtonService: registered callbacks to application
DataService: Registered callbacks to application.
LEDService: Registered service, 1 attributes
ButtonService: Registered service, 2 attributes
DataService: Registered service, 2 attributes
Scanning for Bluetooth devices, "Project Zero" should come up.   TI Android App SimpleLink SDK Explorer can be used for testing; it has a Project Zero interface to control the LED, read buttons, and send text.  On Linux, we can use hcitool lescan to scan and gatttool to test
gatttool -b A0:E6:F8:BD:EB:02 -I
[A0:E6:F8:BD:EB:02][LE]> connect
Attempting to connect to A0:E6:F8:BD:EB:02
Connection successful
[A0:E6:F8:BD:EB:02][LE]> primary
attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0008, end grp handle: 0x0008 uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x0009, end grp handle: 0x001b uuid: 0000180a-0000-1000-8000-00805f9b34fb
attr handle: 0x001c, end grp handle: 0x001e uuid: f0001110-0451-4000-b000-000000000000
attr handle: 0x001f, end grp handle: 0x0025 uuid: f0001120-0451-4000-b000-000000000000
attr handle: 0x0026, end grp handle: 0xffff uuid: f0001130-0451-4000-b000-000000000000
[A0:E6:F8:BD:EB:02][LE]> char-write-req 0x001e ff00ff
Characteristic value was written successfully
[A0:E6:F8:BD:EB:02][LE]> char-read-hnd 0x001e
Characteristic value/descriptor: ff 00 ff
When both buttons are pressed, CC2650MODA is flashed.  However, note the default project includes cc2640r2lp_simple_np_uart_pm_sble hex, which does not work with CC2650.  We replace it with simple_np_cc2650bp_uart_pm_sbl_2_02_01_18a_merge.  If there is some problem flashing, install SmartRF Flash Programmer 2 (v1.7.5).

CC2650MODA draws about 160uA when idle, and 0.1uA when in reset.  There is a 100K pull up resistor on the reset pin, which could contribute to 30uA if the reset pin is pulled low.

Friday, July 13, 2018

Backup Camera

A backup camera with an LCD monitor can be purchased for about 30 USD.  Some camera by itself is sold for less than 4 USD.  The camera can be mounted at the rear license plate.  The camera runs on 12V and outputs NTSC analog video signal.  Nearly identical systems are marketed under various brand names.  The specs are similar: 648x488 pixels, 420 TV lines camera; 4.3" 480 x 272 LCD monitor.  The camera also comes with IR LEDs and light sensor.  The system draws about 200mA at 12V and 230mA with LEDs on.  The LCD monitor can take two video inputs; one of inputs takes priority.  A DPDT switch can be used to toggle between the inputs.

The video quality is actually surprisingly good.  The image sensor is claimed to be PC7070, but it is hard to find a data sheet.  The best guess is that the sensor comes from Korea's PixelPlus, but there is not exact part listed.   It could be similar to PC7080S: 648x488, 5.6um pixel, 1/4 inch optical format, power consumption 82mA/3.3V.  OmniVision produces OV7950, which also has similar functionalities and a more detailed datasheet is available: 656x492, 6um pixel, 1/4 inch optical format.

The camera draws 78mA/12V, with LED 124mA.  It can work down to 6V (5.6V with reduced video quality).    The current draw is constant up to 14V (upper rated voltage).  The LEDs only turn on when the voltage is greater than 10V, and draw more current as the voltage goes up (161mA/14V).  The lens FOV is not advertised 135 degrees, but only 75 degree horizontal (94 degree diagonal).

The LCD display draws 23mA/12V when there is no video input and 122mA/12V when displaying video.  The power seems switching regulated 104mA/14V, 166mA/9V and works down to about 6V (273mA).

The power input seems reverse polarity protected.

Although the world has gone digital, it is still appealing to run the analog video.  It just works without complicated settings or software.

I opened up the back up camera that I bought on eBay for $3.72.  The image quality is little poorer than the other one.   The 4 LEDs are white light.  After removing what appeared to be silicone gel and exposing the circuit board, I could see the imaging sensor and an EEPROM 24C08A, which is an I2C serial memory chip with 1Kx8 bits.  It does not appear enough memory to supply the overlay image.  So the OSD distance guideline displayed with the video is probably generated internally.  I would like to remove the OSD and flip the image so it can be used as a front view camera.

The EEPROM has the three address lines grounded, so the 7-bit address is 0x50.  The WP pin is  also grounded allowing read and write.  The I2C signals are pulled up to 3.3V with 4.7K.  I started by shorting pin 4 (SDA) and pin 5 (GND) of the EEPROM.    That probably forced the imager into the default state, but the default state enables the OSD with guidelines and a few extra numbers and letters and the exposure control seems a little different.  So I'll have to get dump of the memory and make mods.
I also came across a preliminary PC7070K datasheet, dated Oct. 2013.  It describes the wire-strapping function: the state of the I/O pins determines the chip mode.   The circuit board clearly has a few pull-up and pull-down resistors and un-populated footprints.   It only took a few guesses to find the pads to turn off guidelines and disable image mirroring.   Now it can be used for front view camera.   The focus is a little close (as it is intended as a backup camera).    The focus adjustment is fixed with epoxy, so it would take a little effort to make adjustment.

Friday, June 22, 2018

PX4 on STM32F4Discovery

We'll try to run the PX4 firmware on the STM32F4Discovery board.  Some documentation can be found here.   We'll try to run everything from Linux.

First, we build the PX4 bootloader for f4discovery.  There is a specific makefile target, make px4discovery_bl.  To flash the bootloader, we can use texane stlink, which we will build.  After installing it, we can run stlink-gui and download the bootloader through the mini USB port, detected as STMicroelectronics ST-LINK/V2.

Then we build the PX4 firmware with make px4-stm32f4discovery_default.  We connect to the micro USB port; it is detected as PX4 BL DISCOVERY and /dev/ttyACM0 port is created.  To flash, make px4-stm32f4discovery_default upload.

Connect a USB Serial adapter to PA3 (RX) and PA2 (TX), and run screen /dev/ttyUSB0 57600 to access NuttX terminal.  The boot message, 

sercon: Registering CDC/ACM serial driver
sercon: Successfully registered the CDC/ACM serial driver
HW arch: PX4_STM32F4DISCOVERY
FW git-hash: 7a82c777b28c49b3476be3da716984e6bdc987a9
FW version: 7.82.77 0 (122834176)
OS: NuttX
OS version: Release 7.22.0 (118882559)
OS git-hash: 63775322bf25adb406594f8e610122fe0cef2f7a
Build datetime: Jun 22 2018 22:25:57
Build uri: BUILD_URI
Toolchain: GNU GCC, 4.9.3 20150529 (prerelease)
MFGUID: 3138343532314719002e0034
MCU: STM32F???, rev. Z
UID: 2E0034:32314719:31383435
nsh: mount: mount failed: No such file or directory
nsh: tone_alarm: command not found
nsh: mkfatfs: mkfatfs failed: No such file or directory
nsh: tone_alarm: command not found
nsh: tune_control: command not found
nsh: mtd: command not found
INFO  [param] selected parameter default file /fs/microsd/params
ERROR [param] open '/fs/microsd/params' failed (2)
nsh: rgbled: command not found
nsh: blinkm: command not found
nsh: rgbled_pwm: command not found
  BAT_N_CELLS: curr: 0 -> new: 3
ERROR [param] Parameter SYS_USE_IO not found
ERROR [param] Parameter SYS_FMU_TASK not found
ERROR [param] Parameter MNT_MODE_IN not found
ERROR [param] Parameter MNT_MODE_OUT not found
nsh: dataman: command not found
nsh: gps: command not found
nsh: fmu: command not found
nsh: fmu: command not found
nsh: ms5611: command not found
nsh: ms5611: command not found
nsh: bst: command not found
nsh: adc: command not found
ERROR [param] Parameter SENS_EN_LL40LS not found
ERROR [param] Parameter SENS_EN_LL40LS not found
ERROR [param] Parameter SENS_EN_SF0X not found
ERROR [param] Parameter SENS_EN_SF1XX not found
ERROR [param] Parameter SENS_EN_MB12XX not found
ERROR [param] Parameter SENS_EN_TRANGER not found
ERROR [param] Parameter SENS_EN_TFMINI not found
ERROR [param] Parameter SENS_EN_LEDDAR1 not found
nsh: sensors: command not found
nsh: commander: command not found
nsh: send_event: command not found
nsh: load_mon: command not found
ERROR [param] Parameter UAVCAN_ENABLE not found
ERROR [param] Parameter SENS_EN_LL40LS not found
ERROR [param] Parameter TRIG_MODE not found
nsh: fmu: command not found
nsh: tune_control: command not found
nsh: mavlink: command not found
nsh: mavlink: command not found
ERROR [param] Parameter UAVCAN_ENABLE not found
nsh: mavlink: command not found
nsh: navigator: command not found
No autostart ID found
nsh: ekf2: command not found
nsh: tone_alarm: command not found
ERROR [param] Parameter MNT_MODE_IN not found
nsh: vmount: command not found
ERROR [param] Parameter SDLOG_MODE not found
ERROR [param] Parameter SDLOG_MODE not found
nsh: logger: command not found
nsh: mavlink: command not found

NuttShell (NSH)
nsh> ERROR [parameters] failed to open param file: /fs/microsd/params
ERROR [parameters] param save failed (-1)

nsh> help
help usage:  help [-v] [<cmd>]

  [           dirname     free        mkrd        rmdir       umount
  ?           date        help        mh          set         unset
  basename    dd          hexdump     mount       sh          usleep
  break       df          kill        mv          sleep       xd
  cat         echo        ls          mw          test
  cd          exec        mb          ps          time
  cp          exit        mkdir       pwd         true
  cmp         false       mkfatfs     rm          uname

Builtin Apps:
  cu
  bl_update
  config
  mixer
  nshterm
  param
  perf
  px4_simple_app
  reboot
  top
  uorb
  ver
  sercon
  serdis
nsh> ver all
HW arch: PX4_STM32F4DISCOVERY
FW git-hash: 7a82c777b28c49b3476be3da716984e6bdc987a9
FW version: 7.82.77 0 (122834176)
OS: NuttX
OS version: Release 7.22.0 (118882559)
OS git-hash: 63775322bf25adb406594f8e610122fe0cef2f7a
Build datetime: Jun 22 2018 22:25:57
Build uri: BUILD_URI
Toolchain: GNU GCC, 4.9.3 20150529 (prerelease)
MFGUID: 3138343532314719002e0034
MCU: STM32F???, rev. Z
UID: 2E0034:32314719:31383435
nsh>

Monday, June 11, 2018

Fan Speed Measurement

I have an application that requires the fan speed measurement.  We can use some photo detector and a light source between the fan blades as an encoder.

The CdS photoresistor cell does not have the speed.  A solar cell salvaged from a broken timer does respond adequately.

The solar cell is enclosed in a box with a small hole exposing the solar cell.  A LED flashlight is pointed at the solar cell through the hole.  The fan blades interrupts the light periodically.  The voltage generated by the solar cell is digitized and the variations are detected and measured to determine the rate.  The fan has 10 blades, at 1000RPM, the pulse rate is about 170Hz.  The scope captures the signal,

If we use a laser point, which has a small beam spot, we get,

Note the rising edge is faster, but the falling edge still has the long tail. 


Tuesday, February 6, 2018

ESP32-PICO-D4

ESP32-PICO-D4 is a SIP (System-In-Package) module; it is measured about 7 x 7 x 1 mm and looks like a regular IC chip in a 40-pin QFN package.  But it is actually packaged with ESP32, 4MB SPI Flash, 40MHz crystal, and passives.  A picture of the inside shows that the Flash memory die is stacked on the top of the ESP32 die.  Stacked die packaging has become a standard technique for miniaturization (5 dies can be stacked in 1.4mm package).
ESP32-PICO-KIT
The ESP32-PICO-KIT adds a USB to UART converter, 3.3V voltage regulator and a 2.4GHz antenna.  There are also two buttons for EN and BOOT(IO0); these two pins are also controlled by DTR and RTS respectively, so the Flash programming tool can force the device into the programming mode automatically.

Arduino can be used for development, same as the ESP-WROOM-32 module, using the board "ESP32 Dev Module", or adding a custom board definition to the board file.  The programmer toggles EN and BOOT to enter the Flash programming mode.  For pin assignments, see pins_arduino.h for the specific board.  In particular,
 TX = 1;
 RX = 3;
 SDA = 21;
 SCL = 22;
 SS = 5;
 MOSI = 23;
 MISO = 19;
 SCK = 18;
 DAC1 = 25;
 DAC2 = 26;
The two rows of header pins are documented here and here.

Wednesday, January 17, 2018

Bandgap Reference

Does the bandgap reference really have anything to do with the silicon bandgap voltage?

The basic idea of the bandgap reference is to obtain a low temperature coefficient voltage source by cancelling the negative temperature coefficient of the diode forward voltage with the positive temperature coefficient of differential $V_{be}$.   The difference of the $V_{be}$ of two different size but otherwise identical bipolar transistors is $k T /q \ln R$, where R is the current density ratio, k=1.38e-23, q=1.6e-19.  The diode voltage tempco is about -2mV/C; to match that, $k/q \ln R = 2m$, so differential Vbe = 600mV at the room temp.  And the diode voltage at the room temp is also about 600mV.  So the output is about 1.2V, which they say is close to the silicon bandgap voltage (1.166V at 0K).  But the essential scheme does not really seem to depend on it.