NM500 / Mbed 2 deprecated NeuroShield_SimpleScript

Dependencies:   mbed NeuroShield

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?

UserRevisionLine numberNew 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 }