From 56aeb7cd7e91f7f343e178b44c91f818054656b0 Mon Sep 17 00:00:00 2001 From: Aitor Mejias Date: Thu, 28 Jan 2016 10:12:19 +0100 Subject: [PATCH] Added Zolertia Zonik sound sensor test and drivers --- examples/zolertia/zoul/Makefile | 3 +- examples/zolertia/zoul/test-zonik.c | 123 +++++++++++++++++++ platform/zoul/dev/zonik.c | 184 ++++++++++++++++++++++++++++ platform/zoul/dev/zonik.h | 113 +++++++++++++++++ 4 files changed, 422 insertions(+), 1 deletion(-) create mode 100644 examples/zolertia/zoul/test-zonik.c create mode 100644 platform/zoul/dev/zonik.c create mode 100644 platform/zoul/dev/zonik.h diff --git a/examples/zolertia/zoul/Makefile b/examples/zolertia/zoul/Makefile index c4ad2affb..2b70773d9 100644 --- a/examples/zolertia/zoul/Makefile +++ b/examples/zolertia/zoul/Makefile @@ -5,10 +5,11 @@ CONTIKI_PROJECT += test-bmp085-bmp180 test-motion test-rotation-sensor CONTIKI_PROJECT += test-grove-light-sensor test-grove-loudness-sensor CONTIKI_PROJECT += test-weather-meter test-grove-gyro test-lcd test-iaq CONTIKI_PROJECT += test-pm10-sensor test-vac-sensor test-aac-sensor +CONTIKI_PROJECT += test-zonik CONTIKI_TARGET_SOURCEFILES += tsl2563.c sht25.c bmpx8x.c motion-sensor.c CONTIKI_TARGET_SOURCEFILES += adc-sensors.c weather-meter.c grove-gyro.c -CONTIKI_TARGET_SOURCEFILES += rgb-bl-lcd.c pm10-sensor.c iaq.c +CONTIKI_TARGET_SOURCEFILES += rgb-bl-lcd.c pm10-sensor.c iaq.c zonik.c all: $(CONTIKI_PROJECT) diff --git a/examples/zolertia/zoul/test-zonik.c b/examples/zolertia/zoul/test-zonik.c new file mode 100644 index 000000000..622b73291 --- /dev/null +++ b/examples/zolertia/zoul/test-zonik.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2016, Zolertia - http://www.zolertia.com + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup remote-examples + * @{ + * \defgroup remote-zonik-test Zolertia Zonik sonometer test application + * + * Example of Zonik board implementation and simple operation: Infinite loop + * enablinkg the sensor and rading few times, acquiring the dBA of sensor + * The first value acquired is invalid, because it's in hw init state awaiting + * a valid internal reading.Once the driver is initialized, posterior readings + * are valid.Finally in the loop disables the board with standard call and + * shows the error, and loop again enabling it. + * + * @{ + * \file + * RE-Mote test application of Zolertia Zonik sound sensor + * \author + * Aitor Mejias + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "zonik.h" +#include "dev/i2c.h" +#include "dev/leds.h" +#include +#include +/*---------------------------------------------------------------------------*/ +#define MAX_VALID_READINGS 10L +#define MAX_INVALID_READINGS 3L +/*---------------------------------------------------------------------------*/ +PROCESS(test_remote_zonik_process, "Test Zonik driver process"); +AUTOSTART_PROCESSES(&test_remote_zonik_process); +/*---------------------------------------------------------------------------*/ +static struct etimer et; +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(test_remote_zonik_process, ev, data) +{ + static int16_t zonik_val; + static uint8_t i; + + PROCESS_BEGIN(); + + printf("Initial status of sensor is: 0x%04X\n", + zonik.status(SENSORS_ACTIVE)); + + while(1) { + /* Configure Zonik and activate the internal process readings */ + SENSORS_ACTIVATE(zonik); + + printf("Initialized. Sensor status: 0x%04X\n", + zonik.status(SENSORS_ACTIVE)); + + /* Read sensor value dBA multiple times */ + for(i=0; i + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup remote-zonik + * @{ + * Driver for the RE-Mote Zonik sonometer board + * @{ + * \file + * Driver for the RE-Mote Zonik sound sensor (ZONIK) + * \author + * Aitor Mejias + */ +/*---------------------------------------------------------------------------*/ +#include +#include "contiki.h" +#include "dev/gpio.h" +#include "dev/i2c.h" +#include "zonik.h" +#include "sys/timer.h" +#include "sys/etimer.h" +#include "lib/sensors.h" +/*---------------------------------------------------------------------------*/ +#define DEBUG 0 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif +/*---------------------------------------------------------------------------*/ +#define ZONIK_INT1_PORT_BASE GPIO_PORT_TO_BASE(ZONIK_INT_PORT) +#define ZONIK_INT1_PIN_MASK GPIO_PIN_MASK(ZONIK_INT_PIN) +/*---------------------------------------------------------------------------*/ +static uint8_t zonik_buffer[ZONIK_FRAME_SIZE+1]; +static uint16_t zonik_status = ZONIK_DISABLED; +/*---------------------------------------------------------------------------*/ +static struct etimer et; +/*---------------------------------------------------------------------------*/ +PROCESS(zonik_stm_process, "Zonik process process handler"); +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(zonik_stm_process, ev, data) +{ + #if DEBUG + static int i; + #endif + PROCESS_EXITHANDLER(); + PROCESS_BEGIN(); + + while(1) { + /* Wait a process */ + etimer_set(&et, ZONIK_SECOND_INTERVAL); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); + + /* Control the interrupt for activate the sensor */ + GPIO_SET_OUTPUT(ZONIK_INT1_PORT_BASE, ZONIK_INT1_PIN_MASK); + GPIO_CLR_PIN(ZONIK_INT1_PORT_BASE, ZONIK_INT1_PIN_MASK); + clock_delay_usec(ZONIK_INITIAL_WAIT_DELAY); + i2c_master_enable(); + if(i2c_single_send(ZONIK_ADDR, ZONIK_CMD_READ) != I2C_MASTER_ERR_NONE) { + zonik_status = ZONIK_ERROR; + PRINTF("Zonik: Error in I2C Communication\n"); + } + GPIO_SET_PIN(ZONIK_INT1_PORT_BASE, ZONIK_INT1_PIN_MASK); + GPIO_SET_INPUT(ZONIK_INT1_PORT_BASE, ZONIK_INT1_PIN_MASK); + if(zonik_status != ZONIK_ERROR) { + etimer_set(&et, ZONIK_WAIT_ACQ); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); + clock_delay_usec(ZONIK_FINAL_WAIT_DELAY); + i2c_master_enable(); + if(i2c_burst_receive(ZONIK_ADDR, &zonik_buffer[0], ZONIK_FRAME_SIZE) != + I2C_MASTER_ERR_NONE) { + zonik_status = ZONIK_ERROR; + PRINTF("Zonik: Error in I2C Burst Mode Receive"); + } + #if DEBUG + PRINTF("\nZonik: "); + for(i=0; i + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + */ +/* -------------------------------------------------------------------------- */ +/** + * \addtogroup zoul-sensors + * @{ + * + * \defgroup remote-zonik Zonik sound sensor + * @{ + * + * \file + * Header file for the Zolertia Zonik sound sensor + */ +/* -------------------------------------------------------------------------- */ +#ifndef ZONIK_H_ +#define ZONIK_H_ +/* -------------------------------------------------------------------------- */ +#include +#include "lib/sensors.h" +#include "dev/zoul-sensors.h" +#include "i2c.h" +#include "sys/rtimer.h" +/* -------------------------------------------------------------------------- */ +/** \name ZONIK address and definitions + * @{ + */ +#define ZONIK_ADDR 0x68 +#define ZONIK_SENSOR "Zonik Sound Sensor" + +#define ZONIK_INITIAL_WAIT_DELAY 11000L +#define ZONIK_FINAL_WAIT_DELAY 22000L + +#ifndef ZONIK_INT_CONF_PORT +#define ZONIK_INT_PORT I2C_INT_PORT +#else +#define ZONIK_INT_PORT ZONIK_INT_CONF_PORT +#endif + +#ifndef ZONIK_INT_CONF_PIN +#define ZONIK_INT_PIN I2C_INT_PIN +#else +#define ZONIK_INT_PIN ZONIK_INT_CONF_PIN +#endif + +#define ZONIK_FRAME_SIZE 4 + +#define ZONIK_WAIT_ACQ (CLOCK_SECOND / 5) + +/* Zonik wait sensor delay: ~800ms */ +#define ZONIK_SECOND_INTERVAL 106 + +/** @} */ +/* -------------------------------------------------------------------------- */ +/** \name ZONIK error values and definitions + * @{ + */ +#define ZONIK_ACTIVE SENSORS_ACTIVE +#define ZONIK_HW_INIT SENSORS_HW_INIT +#define ZONIK_ENABLED 1 +#define ZONIK_VALUE_DEACTIVATE 0 +#define ZONIK_DISABLED 0xD1ED +#define ZONIK_ERROR (-1) +#define ZONIK_DBA_LEQ_VALUE 0x00 +#define ZONIK_COUNT_VALUE 0x01 +/** @} */ +/* -------------------------------------------------------------------------- */ +/** \name ZONIK command definitions + * @{ + */ +#define ZONIK_CMD_READ 0x01 +/** @} */ +/* -------------------------------------------------------------------------- */ +/** \name ZONIK sensor type + * @{ + */ +extern const struct sensors_sensor zonik; +/** @} */ +/* -------------------------------------------------------------------------- */ +#endif +/* -------------------------------------------------------------------------- */ +/** + * @} + * @} + */