NuMaker Brick I2C slave devices

Committer:
shliu1
Date:
Mon Oct 02 11:51:15 2017 +0800
Revision:
7:5b6936f0c99c
Parent:
2:48c6a70d121c
Child:
8:b60e846cae6a
modify main.cpp for M487

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ccli8 1:2fcc21a82c3b 1 /* mbed Microcontroller Library
ccli8 1:2fcc21a82c3b 2 * Copyright (c) 2016 ARM Limited
ccli8 1:2fcc21a82c3b 3 *
ccli8 1:2fcc21a82c3b 4 * Licensed under the Apache License, Version 2.0 (the "License");
ccli8 1:2fcc21a82c3b 5 * you may not use this file except in compliance with the License.
ccli8 1:2fcc21a82c3b 6 * You may obtain a copy of the License at
ccli8 1:2fcc21a82c3b 7 *
ccli8 1:2fcc21a82c3b 8 * http://www.apache.org/licenses/LICENSE-2.0
ccli8 1:2fcc21a82c3b 9 *
ccli8 1:2fcc21a82c3b 10 * Unless required by applicable law or agreed to in writing, software
ccli8 1:2fcc21a82c3b 11 * distributed under the License is distributed on an "AS IS" BASIS,
ccli8 1:2fcc21a82c3b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ccli8 1:2fcc21a82c3b 13 * See the License for the specific language governing permissions and
ccli8 1:2fcc21a82c3b 14 * limitations under the License.
ccli8 1:2fcc21a82c3b 15 */
ccli8 1:2fcc21a82c3b 16
ccli8 1:2fcc21a82c3b 17 #include "mbed.h"
ccli8 1:2fcc21a82c3b 18 #include "nubrick.h"
ccli8 1:2fcc21a82c3b 19
ccli8 1:2fcc21a82c3b 20 #if defined(TARGET_NUMAKER_PFM_NUC472)
ccli8 1:2fcc21a82c3b 21 I2C i2c(D14, D15);
ccli8 1:2fcc21a82c3b 22
ccli8 1:2fcc21a82c3b 23 #elif defined(TARGET_NUMAKER_PFM_M453)
ccli8 1:2fcc21a82c3b 24 I2C i2c(D14, D15);
ccli8 1:2fcc21a82c3b 25
shliu1 7:5b6936f0c99c 26 #elif defined(TARGET_NUMAKER_PFM_M487)
shliu1 7:5b6936f0c99c 27 I2C i2c(D14, D15); // in M487 D14 is SDA, D15 is SCL
ccli8 1:2fcc21a82c3b 28 #endif
ccli8 1:2fcc21a82c3b 29
ccli8 1:2fcc21a82c3b 30 /** Connect to one NuBrick slave via NuBrick master object
ccli8 1:2fcc21a82c3b 31 */
ccli8 2:48c6a70d121c 32 #define NUBRICK_CONNECT(MASTER, NAME) \
ccli8 2:48c6a70d121c 33 do { \
ccli8 2:48c6a70d121c 34 printf("\r\n\r\n"); \
ccli8 2:48c6a70d121c 35 if (! MASTER.connect()) { \
ccli8 2:48c6a70d121c 36 printf("Connect to NuBrick:\t\t"NAME" failed\r\n\r\n"); \
ccli8 2:48c6a70d121c 37 return; \
ccli8 2:48c6a70d121c 38 } \
ccli8 2:48c6a70d121c 39 else { \
ccli8 2:48c6a70d121c 40 printf("Connect to NuBrick:\t\t"NAME" OK\r\n\r\n"); \
ccli8 2:48c6a70d121c 41 MASTER.print_device_desc(); \
ccli8 2:48c6a70d121c 42 } \
ccli8 1:2fcc21a82c3b 43 } while (0);
ccli8 1:2fcc21a82c3b 44
ccli8 1:2fcc21a82c3b 45 /** Define NuBrick master objects to communicate with NuBrick slave devices
ccli8 1:2fcc21a82c3b 46 */
ccli8 1:2fcc21a82c3b 47 NuBrickMasterBuzzer master_buzzer(i2c, true);
ccli8 1:2fcc21a82c3b 48 NuBrickMasterLED master_led(i2c, true);
ccli8 1:2fcc21a82c3b 49 NuBrickMasterAHRS master_ahrs(i2c, true);
ccli8 1:2fcc21a82c3b 50 NuBrickMasterSonar master_sonar(i2c, true);
ccli8 1:2fcc21a82c3b 51 NuBrickMasterTemp master_temp(i2c, true);
ccli8 1:2fcc21a82c3b 52 NuBrickMasterGas master_gas(i2c, true);
ccli8 1:2fcc21a82c3b 53 NuBrickMasterIR master_ir(i2c, true);
ccli8 1:2fcc21a82c3b 54 NuBrickMasterKeys master_keys(i2c, true);
ccli8 1:2fcc21a82c3b 55
ccli8 1:2fcc21a82c3b 56 /** Test NuBrick slave devices
ccli8 1:2fcc21a82c3b 57 */
ccli8 1:2fcc21a82c3b 58 void test_nubrick_buzzer(void);
ccli8 1:2fcc21a82c3b 59 void test_nubrick_led(void);
ccli8 1:2fcc21a82c3b 60 void test_nubrick_ahrs(void);
ccli8 1:2fcc21a82c3b 61 void test_nubrick_sonar(void);
ccli8 1:2fcc21a82c3b 62 void test_nubrick_temp(void);
ccli8 1:2fcc21a82c3b 63 void test_nubrick_gas(void);
ccli8 1:2fcc21a82c3b 64 void test_nubrick_ir(void);
ccli8 1:2fcc21a82c3b 65 void test_nubrick_keys(void);
ccli8 1:2fcc21a82c3b 66
ccli8 1:2fcc21a82c3b 67 int main() {
ccli8 1:2fcc21a82c3b 68
ccli8 1:2fcc21a82c3b 69 // Test all supported NuBrick slave devices
ccli8 1:2fcc21a82c3b 70 test_nubrick_buzzer();
ccli8 1:2fcc21a82c3b 71 test_nubrick_led();
ccli8 1:2fcc21a82c3b 72 test_nubrick_ahrs();
ccli8 1:2fcc21a82c3b 73 test_nubrick_sonar();
ccli8 1:2fcc21a82c3b 74 test_nubrick_temp();
ccli8 1:2fcc21a82c3b 75 test_nubrick_gas();
ccli8 1:2fcc21a82c3b 76 test_nubrick_ir();
ccli8 1:2fcc21a82c3b 77 test_nubrick_keys();
ccli8 1:2fcc21a82c3b 78
ccli8 1:2fcc21a82c3b 79 return 0;
ccli8 1:2fcc21a82c3b 80 }
ccli8 1:2fcc21a82c3b 81
ccli8 1:2fcc21a82c3b 82 void test_nubrick_buzzer(void) {
ccli8 1:2fcc21a82c3b 83
ccli8 1:2fcc21a82c3b 84 NUBRICK_CONNECT(master_buzzer, "Buzzer");
ccli8 1:2fcc21a82c3b 85
ccli8 1:2fcc21a82c3b 86 // Configure the Buzzer
ccli8 1:2fcc21a82c3b 87 master_buzzer.pull_feature_report();
ccli8 1:2fcc21a82c3b 88 master_buzzer["feature.sleep_period"].set_value(100);
ccli8 1:2fcc21a82c3b 89 master_buzzer["feature.volume"].set_value(60); // Volume in %
ccli8 1:2fcc21a82c3b 90 master_buzzer["feature.tone"].set_value(196); // Tone in Hz
ccli8 1:2fcc21a82c3b 91 master_buzzer["feature.song"].set_value(0); // 0 (mono), 1 (Bee)
ccli8 1:2fcc21a82c3b 92 master_buzzer["feature.period"].set_value(200); // Period in ms
ccli8 1:2fcc21a82c3b 93 master_buzzer["feature.duty"].set_value(30); // Duty in %
ccli8 1:2fcc21a82c3b 94 master_buzzer["feature.latency"].set_value(3); // Alarm for time secs
ccli8 1:2fcc21a82c3b 95 master_buzzer.push_feature_report();
ccli8 1:2fcc21a82c3b 96
ccli8 1:2fcc21a82c3b 97 // The NuBrick I2C device may not respond in time. Add delay here.
ccli8 1:2fcc21a82c3b 98 wait_ms(50);
ccli8 1:2fcc21a82c3b 99
ccli8 1:2fcc21a82c3b 100 // Start sounding the buzzer
ccli8 1:2fcc21a82c3b 101 master_buzzer["output.start_flag"].set_value(1);
ccli8 1:2fcc21a82c3b 102 master_buzzer["output.stop_flag"].set_value(0);
ccli8 1:2fcc21a82c3b 103 master_buzzer.push_output_report();
ccli8 1:2fcc21a82c3b 104 }
ccli8 1:2fcc21a82c3b 105
ccli8 1:2fcc21a82c3b 106 void test_nubrick_led(void) {
ccli8 1:2fcc21a82c3b 107
ccli8 1:2fcc21a82c3b 108 NUBRICK_CONNECT(master_led, "LED");
ccli8 1:2fcc21a82c3b 109
ccli8 1:2fcc21a82c3b 110 // Configure the LED
ccli8 1:2fcc21a82c3b 111 master_led.pull_feature_report();
ccli8 1:2fcc21a82c3b 112 master_led["feature.sleep_period"].set_value(100);
ccli8 1:2fcc21a82c3b 113 master_led["feature.brightness"].set_value(30); // Brightness in %
ccli8 1:2fcc21a82c3b 114 master_led["feature.color"].set_value(0xF0); // 0x0F: full blue, 0xF0: full green, 0x0F00: full red
ccli8 1:2fcc21a82c3b 115 master_led["feature.blink"].set_value(0); // Blink method: 0: blink to setting, 1: blink to the song Bee
ccli8 1:2fcc21a82c3b 116 master_led["feature.period"].set_value(500); // Blink period in ms
ccli8 1:2fcc21a82c3b 117 master_led["feature.duty"].set_value(30); // Blink duty in %
ccli8 1:2fcc21a82c3b 118 master_led["feature.latency"].set_value(1); // Blink for time in secs
ccli8 1:2fcc21a82c3b 119 master_led.push_feature_report();
ccli8 1:2fcc21a82c3b 120
ccli8 1:2fcc21a82c3b 121 // The NuBrick I2C device may not respond in time. Add delay here.
ccli8 1:2fcc21a82c3b 122 wait_ms(50);
ccli8 1:2fcc21a82c3b 123
ccli8 1:2fcc21a82c3b 124 // Start blinking the LED
ccli8 1:2fcc21a82c3b 125 master_led["output.start_flag"].set_value(1);
ccli8 1:2fcc21a82c3b 126 master_led["output.stop_flag"].set_value(0);
ccli8 1:2fcc21a82c3b 127 master_led.push_output_report();
ccli8 1:2fcc21a82c3b 128 }
ccli8 1:2fcc21a82c3b 129
ccli8 1:2fcc21a82c3b 130 void test_nubrick_ahrs(void) {
ccli8 1:2fcc21a82c3b 131
ccli8 1:2fcc21a82c3b 132 NUBRICK_CONNECT(master_ahrs, "AHRS");
ccli8 1:2fcc21a82c3b 133
ccli8 1:2fcc21a82c3b 134 master_ahrs.pull_feature_report();
ccli8 1:2fcc21a82c3b 135 // Prescaled vibration alarm threshold
ccli8 2:48c6a70d121c 136 printf("Prescaled vibration alarm threshold\t\t%d\r\n", master_ahrs["feature.pre_vibration_AT"].get_value());
ccli8 1:2fcc21a82c3b 137
ccli8 1:2fcc21a82c3b 138 master_ahrs.pull_input_report();
ccli8 1:2fcc21a82c3b 139 // Detected vibration
ccli8 2:48c6a70d121c 140 printf("Detected vibration\t\t\t\t%d\r\n", master_ahrs["input.vibration"].get_value());
ccli8 1:2fcc21a82c3b 141 }
ccli8 1:2fcc21a82c3b 142
ccli8 1:2fcc21a82c3b 143 void test_nubrick_sonar(void) {
ccli8 1:2fcc21a82c3b 144
ccli8 1:2fcc21a82c3b 145 NUBRICK_CONNECT(master_sonar, "Sonar");
ccli8 1:2fcc21a82c3b 146
ccli8 1:2fcc21a82c3b 147 master_sonar.pull_feature_report();
ccli8 1:2fcc21a82c3b 148 // Distance alarm threshold in cm
ccli8 2:48c6a70d121c 149 printf("Distance alarm threshold\t\t%d\r\n", master_sonar["feature.distance_AT"].get_value());
ccli8 1:2fcc21a82c3b 150
ccli8 1:2fcc21a82c3b 151 master_sonar.pull_input_report();
ccli8 1:2fcc21a82c3b 152 // Detected distance in cm
ccli8 2:48c6a70d121c 153 printf("Detected distance\t\t\t%d\r\n", master_sonar["input.distance"].get_value());
ccli8 1:2fcc21a82c3b 154 }
ccli8 1:2fcc21a82c3b 155
ccli8 1:2fcc21a82c3b 156 void test_nubrick_temp(void) {
ccli8 1:2fcc21a82c3b 157
ccli8 1:2fcc21a82c3b 158 NUBRICK_CONNECT(master_temp, "Temperature & Humidity");
ccli8 1:2fcc21a82c3b 159
ccli8 1:2fcc21a82c3b 160 master_temp.pull_feature_report();
ccli8 1:2fcc21a82c3b 161 // Temp. alarm threshold in Celsius
ccli8 2:48c6a70d121c 162 printf("Temp. alarm threshold\t\t%d\r\n", master_temp["feature.temp_AT"].get_value());
ccli8 1:2fcc21a82c3b 163 // Hum. alarm threshold in %
ccli8 2:48c6a70d121c 164 printf("Hum. alarm threshold\t\t%d\r\n", master_temp["feature.hum_AT"].get_value());
ccli8 1:2fcc21a82c3b 165
ccli8 1:2fcc21a82c3b 166 master_temp.pull_input_report();
ccli8 1:2fcc21a82c3b 167 // Detected temp in Celsius
ccli8 2:48c6a70d121c 168 printf("Detected temp.\t\t\t%d\r\n", master_temp["input.temp"].get_value());
ccli8 1:2fcc21a82c3b 169 // Detected hum. in %
ccli8 2:48c6a70d121c 170 printf("Detected hum.\t\t\t%d\r\n", master_temp["input.hum"].get_value());
ccli8 1:2fcc21a82c3b 171 }
ccli8 1:2fcc21a82c3b 172
ccli8 1:2fcc21a82c3b 173 void test_nubrick_gas(void) {
ccli8 1:2fcc21a82c3b 174
ccli8 1:2fcc21a82c3b 175 NUBRICK_CONNECT(master_gas, "Gas");
ccli8 1:2fcc21a82c3b 176
ccli8 1:2fcc21a82c3b 177 master_gas.pull_feature_report();
ccli8 1:2fcc21a82c3b 178 // Gas alarm threshold in %.
ccli8 2:48c6a70d121c 179 printf("Gas alarm threshold\t\t%d\r\n", master_gas["feature.gas_AT"].get_value());
ccli8 1:2fcc21a82c3b 180
ccli8 1:2fcc21a82c3b 181 master_gas.pull_input_report();
ccli8 1:2fcc21a82c3b 182 // Detected gas in %. 80% above for normal.
ccli8 2:48c6a70d121c 183 printf("Gas\t\t\t\t%d\r\n", master_gas["input.gas"].get_value());
ccli8 1:2fcc21a82c3b 184 }
ccli8 1:2fcc21a82c3b 185
ccli8 1:2fcc21a82c3b 186 void test_nubrick_ir(void) {
ccli8 1:2fcc21a82c3b 187
ccli8 1:2fcc21a82c3b 188 NUBRICK_CONNECT(master_ir, "IR");
ccli8 1:2fcc21a82c3b 189
ccli8 1:2fcc21a82c3b 190 master_ir.pull_feature_report();
ccli8 2:48c6a70d121c 191 printf("Number of learned data\t\t%d\r\n", master_ir["feature.num_learned_data"].get_value());
ccli8 2:48c6a70d121c 192 printf("Using data type\t\t\t%d\r\n", master_ir["feature.using_data_type"].get_value());
ccli8 2:48c6a70d121c 193 printf("Index of original data to send\t%d\r\n", master_ir["feature.index_orig_data_to_send"].get_value());
ccli8 2:48c6a70d121c 194 printf("Index of learned data to send\t%d\r\n", master_ir["feature.index_learned_data_to_send"].get_value());
ccli8 1:2fcc21a82c3b 195
ccli8 1:2fcc21a82c3b 196 master_ir.pull_input_report();
ccli8 2:48c6a70d121c 197 printf("Has received data flag\t\t%d\r\n", master_ir["input.received_data_flag"].get_value());
ccli8 1:2fcc21a82c3b 198 }
ccli8 1:2fcc21a82c3b 199
ccli8 1:2fcc21a82c3b 200 void test_nubrick_keys(void) {
ccli8 1:2fcc21a82c3b 201
ccli8 1:2fcc21a82c3b 202 NUBRICK_CONNECT(master_keys, "Key");
ccli8 1:2fcc21a82c3b 203
ccli8 1:2fcc21a82c3b 204 // Detect 8 keys
ccli8 1:2fcc21a82c3b 205 master_keys.pull_input_report();
ccli8 1:2fcc21a82c3b 206 uint16_t key_state = master_keys["input.key_state"].get_value();
ccli8 1:2fcc21a82c3b 207 unsigned i = 0;
ccli8 1:2fcc21a82c3b 208 for (i = 0; i < 8; i ++) {
ccli8 1:2fcc21a82c3b 209 if (key_state & (1 << i)) {
ccli8 2:48c6a70d121c 210 printf("KEY%d PRESSED\r\n", i + 1);
ccli8 1:2fcc21a82c3b 211 }
ccli8 1:2fcc21a82c3b 212 else {
ccli8 2:48c6a70d121c 213 printf("KEY%d RELEASED\r\n", i + 1);
ccli8 1:2fcc21a82c3b 214 }
ccli8 1:2fcc21a82c3b 215 }
ccli8 1:2fcc21a82c3b 216 }