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