Intermediate
30 min

Make interactions more intuitive and responsive with Si1143 and PIC18F45K40

Where your presence sparks action

Proximity 10 Click with EasyPIC v8

Published Oct 17, 2023

Click board™

Proximity 10 Click

Dev Board

EasyPIC v8

Compiler

NECTO Studio

MCU

PIC18F45K40

We're dedicated to making proximity technology accessible and impactful, shaping the future of human-machine interaction

A

A

Hardware Overview

How does it work?

Proximity 10 Click is based on the SI1143, a photometric sensor for the ambient light and proximity detection from Silicon Labs. Among other sections, this IC contains a LED driver, used to drive an externally connected LED, which provides feedback for the SI1143 sensory sections. Therefore, the LED should be chosen so that its spectrum matches the spectral sensitivity of the on-chip light sensor. For this reason, the Click board™ is equipped with the narrow beam LED from Rohm Semiconductor with its spectral response characteristic peaking at 870nm, which is a perfect choice for this application. The proximity detection consists of sending a pulse to the LED while measuring the response of the reflected light. Most of the parameters are user configurable, such as the sampling frequency,

pulses duration, averaging parameters and more. More in-depth information about the registers can be found in the SI1143 datasheet. Aimed towards the low consumption market, the SI1143 uses a rather low voltage range, between 1.7V and 3.6V. Since the most of the MCUs use 3.3V, this click board™ is designed so that the SI1143 IC is directly interfaced with the mikroBUS™. Proximity 10 click offers an interrupt output pin that can be used to trigger an interrupt on the host MCU. The SI1143 IC interrupt engine allows several interrupt sources, which can be used to trigger a state change on the INT pin. These sources include proximity detection interrupts (proximity OFF and proximity ON), sample interrupts, and more. The INT pin itself is highly configurable, and when asserted, this pin triggers an MCU interrupt, informing it

that the configured interrupt event has occurred. The MCU can then read the desired register output, not having to poll it constantly, which saves both MCU cycles and power. The INT pin is routed via the level shifting IC to the mikroBUS™ INT pin. As already mentioned, detailed information on the SI1143 IC registers can be found in the datasheet. However, MikroElektronika provides a library that contains functions compatible with the MikroElektronika compilers, which can be used for simplified programming of the Proximity 10 click. The library also contains an example application, which demonstrates its use. This example application can be used as a reference for custom designs.

Proximity 10 Click top side image
Proximity 10 Click bottom side image

Features overview

Development board

EasyPIC v8 is a development board specially designed for the needs of rapid development of embedded applications. It supports many high pin count 8-bit PIC microcontrollers from Microchip, regardless of their number of pins, and a broad set of unique functions, such as the first-ever embedded debugger/programmer. The development board is well organized and designed so that the end-user has all the necessary elements, such as switches, buttons, indicators, connectors, and others, in one place. Thanks to innovative manufacturing technology, EasyPIC v8 provides a fluid and immersive working experience, allowing access anywhere and under any

circumstances at any time. Each part of the EasyPIC v8 development board contains the components necessary for the most efficient operation of the same board. In addition to the advanced integrated CODEGRIP programmer/debugger module, which offers many valuable programming/debugging options and seamless integration with the Mikroe software environment, the board also includes a clean and regulated power supply module for the development board. It can use a wide range of external power sources, including a battery, an external 12V power supply, and a power source via the USB Type-C (USB-C) connector.

Communication options such as USB-UART, USB DEVICE, and CAN are also included, including the well-established mikroBUS™ standard, two display options (graphical and character-based LCD), and several different DIP sockets. These sockets cover a wide range of 8-bit PIC MCUs, from the smallest PIC MCU devices with only eight up to forty pins. EasyPIC v8 is an integral part of the Mikroe ecosystem for rapid development. Natively supported by Mikroe software tools, it covers many aspects of prototyping and development thanks to a considerable number of different Click boards™ (over a thousand boards), the number of which is growing every day.

EasyPIC v8 horizontal image

Microcontroller Overview

MCU Card / MCU

PIC18F45K40

Architecture

PIC

MCU Memory (KB)

32

Silicon Vendor

Microchip

Pin count

40

RAM (Bytes)

2048

Used MCU Pins

mikroBUS™ mapper

NC
NC
AN
NC
NC
RST
NC
NC
CS
NC
NC
SCK
NC
NC
MISO
NC
NC
MOSI
Power Supply
3.3V
3.3V
Ground
GND
GND
NC
NC
PWM
Interrupt
RB0
INT
NC
NC
TX
NC
NC
RX
I2C Clock
RC3
SCL
I2C Data
RC4
SDA
NC
NC
5V
Ground
GND
GND
1

Take a closer look

Click board™ Schematic

Proximity 10 Click Schematic schematic

Step by step

Project assembly

EasyPIC v8 front image hardware assembly

Start by selecting your development board and Click board™. Begin with the EasyPIC v8 as your development board.

EasyPIC v8 front image hardware assembly
GNSS2 Click front image hardware assembly
MCU DIP 40 hardware assembly
EasyPIC v8 Access DIPMB 1 - upright/background hardware assembly
Necto image step 2 hardware assembly
Necto image step 3 hardware assembly
Necto image step 4 hardware assembly
NECTO Compiler Selection Step Image hardware assembly
NECTO Output Selection Step Image hardware assembly
Necto image step 6 hardware assembly
Necto DIP image step 7 hardware assembly
Necto image step 8 hardware assembly
Necto image step 9 hardware assembly
Necto image step 10 hardware assembly
Necto PreFlash Image hardware assembly

Track your results in real time

Application Output

1. Application Output - In Debug mode, the 'Application Output' window enables real-time data monitoring, offering direct insight into execution results. Ensure proper data display by configuring the environment correctly using the provided tutorial.

2. UART Terminal - Use the UART Terminal to monitor data transmission via a USB to UART converter, allowing direct communication between the Click board™ and your development system. Configure the baud rate and other serial settings according to your project's requirements to ensure proper functionality. For step-by-step setup instructions, refer to the provided tutorial.

3. Plot Output - The Plot feature offers a powerful way to visualize real-time sensor data, enabling trend analysis, debugging, and comparison of multiple data points. To set it up correctly, follow the provided tutorial, which includes a step-by-step example of using the Plot feature to display Click board™ readings. To use the Plot feature in your code, use the function: plot(*insert_graph_name*, variable_name);. This is a general format, and it is up to the user to replace 'insert_graph_name' with the actual graph name and 'variable_name' with the parameter to be displayed.

Software Support

Library Description

This library contains API for Proximity 10 Click driver.

Key functions:

  • proximity10_check_int_status - This function checks the desired interrupt flags status.

  • proximity10_send_command - This function allows user to execute a desired command and checks the response.

  • proximity10_param_set - This function sets the selected parameter to the desired value, and checks the response.

Open Source

Code example

The complete application code and a ready-to-use project are available through the NECTO Studio Package Manager for direct installation in the NECTO Studio. The application code can also be found on the MIKROE GitHub account.

/*!
 * \file 
 * \brief Proximity10 Click example
 * 
 * # Description
 * This application enables proximity sensor to detect objects from distance up to 20cm.
 *
 * The demo application is composed of two sections :
 * 
 * ## Application Init 
 * Initializes I2C serial interface and performs a device wake up, reset and 
 * all necessary configurations.
 * The device will wake up and performs measurements every 10 milliseconds.
 * 
 * ## Application Task  
 * Reads the proximity PS1 data value and sends result to the uart terminal.
 * If measured proximity value is greater than selected proximity threshold value, the interrupt will be generated and
 * the message will be showed on the uart terminal.
 * When interrupt is generated the Sound function will make an alarm sound with determined duration depending on the detected proximity value,
 * how much is object away or close from the sensor.
 * 
 * *note:* 
 * Additional Functions :
 * - checkResponse - Sends an error code message to the uart terminal if error code is detected in the response.
 * 
 * \author MikroE Team
 *
 */
// ------------------------------------------------------------------- INCLUDES

#include "board.h"
#include "log.h"
#include "proximity10.h"

// ------------------------------------------------------------------ VARIABLES

static proximity10_t proximity10;
static log_t logger;

// ------------------------------------------------------- ADDITIONAL FUNCTIONS

void check_response ( uint8_t cmd_resp )
{
    switch ( cmd_resp )
    {
        case PROXIMITY10_INVALID_CMD_ENCOUNT :
        {
            log_printf( &logger, "** Invalid Command Encountered during command processing **\r\n" );
            break;
        }
        case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_PS1 :
        {
            log_printf( &logger, "** ADC Overflow Encountered during PS1 measurement **\r\n" );
            break;
        }
        case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_PS2 :
        {
            log_printf( &logger, "** ADC Overflow Encountered during PS2 measurement **\r\n" );
            break;
        }
        case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_PS3 :
        {
            log_printf( &logger, "** ADC Overflow Encountered during PS3 measurement **\r\n" );
            break;
        }
        case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_ALS_VIS :
        {
            log_printf( &logger, "** ADC Overflow Encountered during ALS-VIS measurement **\r\n" );
            break;
        }
        case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_ALS_IR :
        {
            log_printf( &logger, "** ADC Overflow Encountered during ALS-IR measurement **\r\n" );
            break;
        }
        case PROXIMITY10_ADC_OVRFLOW_ENCOUNT_AUX :
        {
            log_printf( &logger, "** ADC Overflow Encountered during AUX measurement **\r\n" );
            break;
        }
        default :
        {
            break;
        }
    }
}

// ------------------------------------------------------ APPLICATION FUNCTIONS

void application_init ( void )
{
    log_cfg_t log_cfg;
    proximity10_cfg_t cfg;

    uint8_t w_temp;
    uint8_t cmd_resp;

    /** 
     * Logger initialization.
     * Default baud rate: 115200
     * Default log level: LOG_LEVEL_DEBUG
     * @note If USB_UART_RX and USB_UART_TX 
     * are defined as HAL_PIN_NC, you will 
     * need to define them manually for log to work. 
     * See @b LOG_MAP_USB_UART macro definition for detailed explanation.
     */
    LOG_MAP_USB_UART( log_cfg );
    log_init( &logger, &log_cfg );
    log_info( &logger, "---- Application Init ----" );

    //  Click initialization.

    proximity10_cfg_setup( &cfg );
    PROXIMITY10_MAP_MIKROBUS( cfg, MIKROBUS_1 );
    proximity10_init( &proximity10, &cfg );

    Delay_ms( 2000 );

    w_temp = PROXIMITY10_HW_KEY;
    proximity10_generic_write( &proximity10, PROXIMITY10_HW_KEY_REG, &w_temp, 1 );
    
    cmd_resp = proximity10_send_command( &proximity10, PROXIMITY10_NOP_CMD );
    check_response( cmd_resp );
    cmd_resp = proximity10_send_command( &proximity10, PROXIMITY10_RESET_CMD );
    check_response( cmd_resp );
    Delay_ms( 2000 );
    
    cmd_resp = proximity10_param_set( &proximity10, PROXIMITY10_CHLIST_PARAM, PROXIMITY10_EN_AUX | PROXIMITY10_EN_ALS_IR | PROXIMITY10_EN_ALS_VIS | PROXIMITY10_EN_PS1 );
    check_response( cmd_resp );
    cmd_resp = proximity10_param_set( &proximity10, PROXIMITY10_PSLED12_SEL_PARAM, PROXIMITY10_LED1_DRIVE_EN );
    check_response( cmd_resp );
    cmd_resp = proximity10_param_set( &proximity10, PROXIMITY10_PS_ADC_MISC_PARAM, PROXIMITY10_NORMAL_SIGNAL_RANGE | PROXIMITY10_NORMAL_PROX_MEAS_MODE );
    check_response( cmd_resp );
    cmd_resp = proximity10_param_set( &proximity10, PROXIMITY10_PS_ADC_GAIN_PARAM, PROXIMITY10_ADC_CLOCK_DIV_4 );
    check_response( cmd_resp );

    proximity10_default_cfg ( &proximity10 );

    cmd_resp = proximity10_send_command( &proximity10, PROXIMITY10_PS_AUTO_CMD );
    check_response( cmd_resp );
    
    //Sound_Init( &GPIOE_ODR, 14 );
    
    log_printf( &logger, "** Proximity 10 is initialized **\r\n" );
    log_printf( &logger, "**************************************\r\n" );
    Delay_ms( 1000 );
}

void application_task ( void )
{
    //  Task implementation.

    uint32_t proximity;
    uint8_t temp_read[ 2 ];
    uint8_t int_status;
    uint16_t alarm_dur;

    proximity10_generic_read( &proximity10, PROXIMITY10_PS1_DATA_REG, &temp_read, 2 );
    proximity = temp_read[ 1 ];
    proximity <<= 8;
    proximity |= temp_read[ 0 ];
    
    log_printf( &logger, "** Proximity PS1 : %u \r\n", proximity );
    
    int_status = proximity10_check_int_status( &proximity10, PROXIMITY10_PS1_INT_FLAG, PROXIMITY10_INT_CLEAR_DIS );
    
    if ( int_status == PROXIMITY10_PS1_INT_FLAG )
    {
        log_printf( &logger, "** Object is detected **\r\n" );
        
        alarm_dur = proximity / 100;
        alarm_dur = alarm_dur + 35;
        alarm_dur = ( float )( alarm_dur * 0.30928 );
        alarm_dur = 180 - alarm_dur;
        
        //Sound_Play( 1400, alarm_dur );
        Delay_ms( 1000 );
    }
    else
    {
        Delay_ms( 1000 );
    }
    log_printf( &logger, "**************************************\r\n" );
}

void main ( void )
{
    application_init( );

    for ( ; ; )
    {
        application_task( );
    }
}


// ------------------------------------------------------------------------ END

Additional Support

Resources

Love this project?

'Buy This Kit' button takes you directly to the shopping cart where you can easily add or remove products.