Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed NeuroShield
main.cpp@1:2d0abf41b7a3, 2018-01-25 (annotated)
- Committer:
- nepes_ai
- Date:
- Thu Jan 25 02:37:42 2018 +0000
- Revision:
- 1:2d0abf41b7a3
- Parent:
- 0:c56eb46c7bee
- Child:
- 2:995d7426e3ba
Release version 1.1.3
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| nepes_ai | 0:c56eb46c7bee | 1 | /****************************************************************************** |
| nepes_ai | 1:2d0abf41b7a3 | 2 | * NM500 NeuroShield Board SimpleScript |
| nepes_ai | 0:c56eb46c7bee | 3 | * Simple Test Script to understand how the neurons learn and recognize |
| nepes_ai | 1:2d0abf41b7a3 | 4 | * revision 1.1.3, 01/03, 2018 |
| nepes_ai | 0:c56eb46c7bee | 5 | * Copyright (c) 2017 nepes inc. |
| nepes_ai | 1:2d0abf41b7a3 | 6 | * |
| nepes_ai | 1:2d0abf41b7a3 | 7 | * Please use the NeuroShield library v1.1.3 or later |
| nepes_ai | 0:c56eb46c7bee | 8 | ******************************************************************************/ |
| nepes_ai | 0:c56eb46c7bee | 9 | |
| nepes_ai | 0:c56eb46c7bee | 10 | #include "mbed.h" |
| nepes_ai | 0:c56eb46c7bee | 11 | #include <NeuroShield.h> |
| nepes_ai | 0:c56eb46c7bee | 12 | #include <NeuroShieldSPI.h> |
| nepes_ai | 0:c56eb46c7bee | 13 | |
| nepes_ai | 0:c56eb46c7bee | 14 | #define VECTOR_LENGTH 4 |
| nepes_ai | 0:c56eb46c7bee | 15 | #define READ_COUNT 3 |
| nepes_ai | 0:c56eb46c7bee | 16 | |
| nepes_ai | 0:c56eb46c7bee | 17 | NeuroShield hnn; |
| nepes_ai | 0:c56eb46c7bee | 18 | |
| nepes_ai | 0:c56eb46c7bee | 19 | DigitalOut sdcard_ss(D6); // SDCARD_SSn |
| nepes_ai | 0:c56eb46c7bee | 20 | DigitalOut arduino_con(D5); // SPI_SEL |
| nepes_ai | 0:c56eb46c7bee | 21 | |
| nepes_ai | 0:c56eb46c7bee | 22 | int main() |
| nepes_ai | 0:c56eb46c7bee | 23 | { |
| nepes_ai | 0:c56eb46c7bee | 24 | int i, j; |
| nepes_ai | 0:c56eb46c7bee | 25 | uint8_t value; |
| nepes_ai | 0:c56eb46c7bee | 26 | uint8_t vector[NEURON_SIZE]; |
| nepes_ai | 1:2d0abf41b7a3 | 27 | uint16_t vector16[NEURON_SIZE]; |
| nepes_ai | 0:c56eb46c7bee | 28 | uint16_t ncr, cat, aif, ncount, minif, response_nbr, norm_lsup = 0; |
| nepes_ai | 0:c56eb46c7bee | 29 | uint16_t dists[READ_COUNT], cats[READ_COUNT], nids[READ_COUNT]; |
| nepes_ai | 1:2d0abf41b7a3 | 30 | uint16_t fpga_version; |
| nepes_ai | 0:c56eb46c7bee | 31 | |
| nepes_ai | 0:c56eb46c7bee | 32 | arduino_con = LOW; |
| nepes_ai | 0:c56eb46c7bee | 33 | sdcard_ss = HIGH; |
| nepes_ai | 0:c56eb46c7bee | 34 | wait(0.5); |
| nepes_ai | 0:c56eb46c7bee | 35 | |
| nepes_ai | 0:c56eb46c7bee | 36 | if (hnn.begin() != 0) { |
| nepes_ai | 1:2d0abf41b7a3 | 37 | fpga_version = hnn.fpgaVersion(); |
| nepes_ai | 1:2d0abf41b7a3 | 38 | if ((fpga_version & 0xFF00) == 0x0000) { |
| nepes_ai | 1:2d0abf41b7a3 | 39 | printf("\n\n#### NeuroShield Board (Board v%d.0 / FPGA v%d.0) ####\n", ((fpga_version >> 4) & 0x000F), (fpga_version & 0x000F)); |
| nepes_ai | 1:2d0abf41b7a3 | 40 | } |
| nepes_ai | 1:2d0abf41b7a3 | 41 | else if ((fpga_version & 0xFF00) == 0x0100) { |
| nepes_ai | 1:2d0abf41b7a3 | 42 | printf("\n\n#### Prodigy Board (Board v%d.0 / FPGA v%d.0) ####\n", ((fpga_version >> 4) & 0x000F), (fpga_version & 0x000F)); |
| nepes_ai | 1:2d0abf41b7a3 | 43 | } |
| nepes_ai | 1:2d0abf41b7a3 | 44 | else { |
| nepes_ai | 1:2d0abf41b7a3 | 45 | printf("\n\n#### Unknown Board (Board v%d.0 / FPGA v%d.0) ####\n", ((fpga_version >> 4) & 0x000F), (fpga_version & 0x000F)); |
| nepes_ai | 1:2d0abf41b7a3 | 46 | } |
| nepes_ai | 0:c56eb46c7bee | 47 | printf("\nNM500 is initialized!\n"); |
| nepes_ai | 0:c56eb46c7bee | 48 | printf("There are %d neurons\n", hnn.total_neurons); |
| nepes_ai | 0:c56eb46c7bee | 49 | } |
| nepes_ai | 0:c56eb46c7bee | 50 | else { |
| nepes_ai | 0:c56eb46c7bee | 51 | minif = hnn.getMinif(); |
| nepes_ai | 0:c56eb46c7bee | 52 | printf("\nread value = %d", minif); |
| nepes_ai | 0:c56eb46c7bee | 53 | printf("\nWarning!!! NM500 Shield board not properly responding!!"); |
| nepes_ai | 0:c56eb46c7bee | 54 | printf("\nCheck the connection and Reboot again!"); |
| nepes_ai | 0:c56eb46c7bee | 55 | while (1); |
| nepes_ai | 0:c56eb46c7bee | 56 | } |
| nepes_ai | 0:c56eb46c7bee | 57 | |
| nepes_ai | 0:c56eb46c7bee | 58 | // if you want to run in lsup mode, uncomment below |
| nepes_ai | 0:c56eb46c7bee | 59 | //norm_lsup = 0x80; |
| nepes_ai | 0:c56eb46c7bee | 60 | hnn.setGcr(1 + norm_lsup); |
| nepes_ai | 0:c56eb46c7bee | 61 | |
| nepes_ai | 0:c56eb46c7bee | 62 | // build knowledge by learning 3 patterns with each constant values (respectively 11, 15 and 20) |
| nepes_ai | 0:c56eb46c7bee | 63 | printf("\nLearning three patterns..."); |
| nepes_ai | 0:c56eb46c7bee | 64 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 65 | vector[i] = 11; |
| nepes_ai | 0:c56eb46c7bee | 66 | hnn.learn(vector, VECTOR_LENGTH, 55); |
| nepes_ai | 0:c56eb46c7bee | 67 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 68 | vector[i] = 15; |
| nepes_ai | 0:c56eb46c7bee | 69 | hnn.learn(vector, VECTOR_LENGTH, 33); |
| nepes_ai | 0:c56eb46c7bee | 70 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 71 | vector[i] = 20; |
| nepes_ai | 0:c56eb46c7bee | 72 | ncount = hnn.learn(vector, VECTOR_LENGTH, 100); |
| nepes_ai | 0:c56eb46c7bee | 73 | // display the content of the committed neurons |
| nepes_ai | 0:c56eb46c7bee | 74 | printf("\nDisplay the neurons, count = %d", ncount); |
| nepes_ai | 1:2d0abf41b7a3 | 75 | for (i = 1; i <= ncount; i++) { |
| nepes_ai | 1:2d0abf41b7a3 | 76 | hnn.readNeuron(i, vector16, &ncr, &aif, &cat); |
| nepes_ai | 1:2d0abf41b7a3 | 77 | printf("\nneuron#%d \tmodel=", i); |
| nepes_ai | 0:c56eb46c7bee | 78 | for (j = 0; j < VECTOR_LENGTH; j++) |
| nepes_ai | 1:2d0abf41b7a3 | 79 | printf("%d, ", vector16[j]); |
| nepes_ai | 0:c56eb46c7bee | 80 | if (cat & 0x8000) |
| nepes_ai | 0:c56eb46c7bee | 81 | printf("\tncr=%d \taif=%d \tcat=%d (degenerated)", ncr, aif, (cat & 0x7FFF)); |
| nepes_ai | 0:c56eb46c7bee | 82 | else |
| nepes_ai | 0:c56eb46c7bee | 83 | printf("\tncr=%d \taif=%d \tcat=%d", ncr, aif, (cat & 0x7FFF)); |
| nepes_ai | 0:c56eb46c7bee | 84 | } |
| nepes_ai | 0:c56eb46c7bee | 85 | |
| nepes_ai | 0:c56eb46c7bee | 86 | for (value = 12; value < 16; value++) { |
| nepes_ai | 0:c56eb46c7bee | 87 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 88 | vector[i] = value; |
| nepes_ai | 0:c56eb46c7bee | 89 | printf("\n\nRecognizing a new pattern: "); |
| nepes_ai | 0:c56eb46c7bee | 90 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 91 | printf("%d, ", vector[i]); |
| nepes_ai | 0:c56eb46c7bee | 92 | response_nbr = hnn.classify(vector, VECTOR_LENGTH, READ_COUNT, dists, cats, nids); |
| nepes_ai | 0:c56eb46c7bee | 93 | for (i = 0; i < response_nbr; i++) { |
| nepes_ai | 0:c56eb46c7bee | 94 | if (cats[i] & 0x8000) |
| nepes_ai | 0:c56eb46c7bee | 95 | printf("\nFiring neuron#%d, category=%d (degenerated), distance=%d", nids[i], (cats[i] & 0x7FFF), dists[i]); |
| nepes_ai | 0:c56eb46c7bee | 96 | else |
| nepes_ai | 0:c56eb46c7bee | 97 | printf("\nFiring neuron#%d, category=%d, distance=%d", nids[i], (cats[i] & 0x7FFF), dists[i]); |
| nepes_ai | 0:c56eb46c7bee | 98 | } |
| nepes_ai | 0:c56eb46c7bee | 99 | } |
| nepes_ai | 0:c56eb46c7bee | 100 | |
| nepes_ai | 0:c56eb46c7bee | 101 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 102 | vector[i] = 20; |
| nepes_ai | 0:c56eb46c7bee | 103 | printf("\n\nRecognizing a new pattern using KNN classifier: "); |
| nepes_ai | 0:c56eb46c7bee | 104 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 105 | printf("%d, ", vector[i]); |
| nepes_ai | 0:c56eb46c7bee | 106 | hnn.setKnnClassifier(); |
| nepes_ai | 0:c56eb46c7bee | 107 | response_nbr = hnn.classify(vector, VECTOR_LENGTH, READ_COUNT, dists, cats, nids); |
| nepes_ai | 0:c56eb46c7bee | 108 | hnn.setRbfClassifier(); |
| nepes_ai | 0:c56eb46c7bee | 109 | for (i = 0; i < READ_COUNT; i++) { |
| nepes_ai | 0:c56eb46c7bee | 110 | if (cats[i] & 0x8000) |
| nepes_ai | 0:c56eb46c7bee | 111 | printf("\nFiring neuron#%d, category=%d (degenerated), distance=%d", nids[i], (cats[i] & 0x7FFF), dists[i]); |
| nepes_ai | 0:c56eb46c7bee | 112 | else |
| nepes_ai | 0:c56eb46c7bee | 113 | printf("\nFiring neuron#%d, category=%d, distance=%d", nids[i], (cats[i] & 0x7FFF), dists[i]); |
| nepes_ai | 0:c56eb46c7bee | 114 | } |
| nepes_ai | 0:c56eb46c7bee | 115 | |
| nepes_ai | 0:c56eb46c7bee | 116 | printf("\n\nLearning a new example (13) falling between neuron1 and neuron2"); |
| nepes_ai | 0:c56eb46c7bee | 117 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 118 | vector[i] = 13; |
| nepes_ai | 0:c56eb46c7bee | 119 | ncount = hnn.learn(vector, VECTOR_LENGTH, 100); |
| nepes_ai | 0:c56eb46c7bee | 120 | // display the content of the committed neurons |
| nepes_ai | 0:c56eb46c7bee | 121 | printf("\nDisplay the neurons, count = %d", ncount); |
| nepes_ai | 1:2d0abf41b7a3 | 122 | for (i = 1; i <= ncount; i++) { |
| nepes_ai | 1:2d0abf41b7a3 | 123 | hnn.readNeuron(i, vector16, &ncr, &aif, &cat); |
| nepes_ai | 1:2d0abf41b7a3 | 124 | printf("\nneuron#%d \tmodel=", i); |
| nepes_ai | 0:c56eb46c7bee | 125 | for (j = 0; j < VECTOR_LENGTH; j++) |
| nepes_ai | 1:2d0abf41b7a3 | 126 | printf("%d, ", vector16[j]); |
| nepes_ai | 0:c56eb46c7bee | 127 | if (cat & 0x8000) |
| nepes_ai | 0:c56eb46c7bee | 128 | printf("\tncr=%d \taif=%d \tcat=%d (degenerated)", ncr, aif, (cat & 0x7FFF)); |
| nepes_ai | 0:c56eb46c7bee | 129 | else |
| nepes_ai | 0:c56eb46c7bee | 130 | printf("\tncr=%d \taif=%d \tcat=%d", ncr, aif, (cat & 0x7FFF)); |
| nepes_ai | 0:c56eb46c7bee | 131 | } |
| nepes_ai | 0:c56eb46c7bee | 132 | printf("\n=> Notice the addition of neuron 4 and the shrinking of the influence fields of neuron1 and 2"); |
| nepes_ai | 0:c56eb46c7bee | 133 | |
| nepes_ai | 0:c56eb46c7bee | 134 | printf("\n\nLearning a same example (13) using a different category 77"); |
| nepes_ai | 0:c56eb46c7bee | 135 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 136 | vector[i] = 13; |
| nepes_ai | 0:c56eb46c7bee | 137 | ncount = hnn.learn(vector, VECTOR_LENGTH, 77); |
| nepes_ai | 0:c56eb46c7bee | 138 | // display the content of the committed neurons |
| nepes_ai | 0:c56eb46c7bee | 139 | printf("\nDisplay the neurons, count = %d", ncount); |
| nepes_ai | 1:2d0abf41b7a3 | 140 | for (i = 1; i <= ncount; i++) { |
| nepes_ai | 1:2d0abf41b7a3 | 141 | hnn.readNeuron(i, vector16, &ncr, &aif, &cat); |
| nepes_ai | 1:2d0abf41b7a3 | 142 | printf("\nneuron#%d \tmodel=", i); |
| nepes_ai | 0:c56eb46c7bee | 143 | for (j = 0; j < VECTOR_LENGTH; j++) |
| nepes_ai | 1:2d0abf41b7a3 | 144 | printf("%d, ", vector16[j]); |
| nepes_ai | 0:c56eb46c7bee | 145 | if (cat & 0x8000) |
| nepes_ai | 0:c56eb46c7bee | 146 | printf("\tncr=%d \taif=%d \tcat=%d (degenerated)", ncr, aif, (cat & 0x7FFF)); |
| nepes_ai | 0:c56eb46c7bee | 147 | else |
| nepes_ai | 0:c56eb46c7bee | 148 | printf("\tncr=%d \taif=%d \tcat=%d", ncr, aif, (cat & 0x7FFF)); |
| nepes_ai | 0:c56eb46c7bee | 149 | } |
| nepes_ai | 0:c56eb46c7bee | 150 | printf("\n=> Notice if the AIF of a neuron reaches the MINIF, the neuron will be degenerated"); |
| nepes_ai | 0:c56eb46c7bee | 151 | |
| nepes_ai | 0:c56eb46c7bee | 152 | printf("\n\nLearning a new example (12) using context 5, category 200"); |
| nepes_ai | 0:c56eb46c7bee | 153 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 154 | vector[i] = 12; |
| nepes_ai | 0:c56eb46c7bee | 155 | hnn.setContext(5); |
| nepes_ai | 0:c56eb46c7bee | 156 | ncount = hnn.learn(vector, VECTOR_LENGTH, 200); |
| nepes_ai | 0:c56eb46c7bee | 157 | hnn.setContext(1); |
| nepes_ai | 0:c56eb46c7bee | 158 | // display the content of the committed neurons |
| nepes_ai | 0:c56eb46c7bee | 159 | printf("\nDisplay the neurons, count = %d", ncount); |
| nepes_ai | 1:2d0abf41b7a3 | 160 | for (i = 1; i <= ncount; i++) { |
| nepes_ai | 1:2d0abf41b7a3 | 161 | hnn.readNeuron(i, vector16, &ncr, &aif, &cat); |
| nepes_ai | 1:2d0abf41b7a3 | 162 | printf("\nneuron#%d \tmodel=", i); |
| nepes_ai | 0:c56eb46c7bee | 163 | for (j = 0; j < VECTOR_LENGTH; j++) |
| nepes_ai | 1:2d0abf41b7a3 | 164 | printf("%d, ", vector16[j]); |
| nepes_ai | 0:c56eb46c7bee | 165 | if (cat & 0x8000) |
| nepes_ai | 0:c56eb46c7bee | 166 | printf("\tncr=%d \taif=%d \tcat=%d (degenerated)", ncr, aif, (cat & 0x7FFF)); |
| nepes_ai | 0:c56eb46c7bee | 167 | else |
| nepes_ai | 0:c56eb46c7bee | 168 | printf("\tncr=%d \taif=%d \tcat=%d", ncr, aif, (cat & 0x7FFF)); |
| nepes_ai | 0:c56eb46c7bee | 169 | } |
| nepes_ai | 0:c56eb46c7bee | 170 | |
| nepes_ai | 0:c56eb46c7bee | 171 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 172 | vector[i] = 20; |
| nepes_ai | 0:c56eb46c7bee | 173 | printf("\n\nRecognizing a new pattern using context 5: "); |
| nepes_ai | 0:c56eb46c7bee | 174 | for (i = 0; i < VECTOR_LENGTH; i++) |
| nepes_ai | 0:c56eb46c7bee | 175 | printf("%d, ", vector[i]); |
| nepes_ai | 0:c56eb46c7bee | 176 | hnn.setContext(5); |
| nepes_ai | 0:c56eb46c7bee | 177 | response_nbr = hnn.classify(vector, VECTOR_LENGTH, READ_COUNT, dists, cats, nids); |
| nepes_ai | 0:c56eb46c7bee | 178 | hnn.setContext(1); |
| nepes_ai | 0:c56eb46c7bee | 179 | for (i = 0; i < response_nbr; i++) { |
| nepes_ai | 0:c56eb46c7bee | 180 | if (cats[i] & 0x8000) |
| nepes_ai | 0:c56eb46c7bee | 181 | printf("\nFiring neuron#%d, category=%d (degenerated), distance=%d", nids[i], (cats[i] & 0x7FFF), dists[i]); |
| nepes_ai | 0:c56eb46c7bee | 182 | else |
| nepes_ai | 0:c56eb46c7bee | 183 | printf("\nFiring neuron#%d, category=%d, distance=%d", nids[i], (cats[i] & 0x7FFF), dists[i]); |
| nepes_ai | 0:c56eb46c7bee | 184 | } |
| nepes_ai | 0:c56eb46c7bee | 185 | printf("\n=> Notice the neurons will not be recognize and shrink if the value of context is not equal"); |
| nepes_ai | 0:c56eb46c7bee | 186 | } |