NM500 / Mbed 2 deprecated NeuroShield_SimpleScript

Dependencies:   mbed NeuroShield

Committer:
nepes_ai
Date:
Tue Feb 11 00:55:05 2020 +0000
Revision:
2:995d7426e3ba
Parent:
1:2d0abf41b7a3
Release version 1.1.5

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 2:995d7426e3ba 4 * revision 1.1.5, 2020/02/11
nepes_ai 0:c56eb46c7bee 5 * Copyright (c) 2017 nepes inc.
nepes_ai 1:2d0abf41b7a3 6 *
nepes_ai 2:995d7426e3ba 7 * Please use the NeuroShield library v1.1.4 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 2:995d7426e3ba 22 uint8_t vector[NEURON_SIZE];
nepes_ai 2:995d7426e3ba 23 uint16_t vector16[NEURON_SIZE];
nepes_ai 2:995d7426e3ba 24 uint16_t dists[READ_COUNT], cats[READ_COUNT], nids[READ_COUNT];
nepes_ai 2:995d7426e3ba 25 uint16_t response_nbr, norm_lsup = 0;
nepes_ai 2:995d7426e3ba 26 uint16_t fpga_version;
nepes_ai 2:995d7426e3ba 27
nepes_ai 2:995d7426e3ba 28 void displayNeurons()
nepes_ai 2:995d7426e3ba 29 {
nepes_ai 2:995d7426e3ba 30 uint16_t nm_ncr, nm_aif, nm_cat;
nepes_ai 2:995d7426e3ba 31 uint16_t ncount = hnn.getNcount();
nepes_ai 2:995d7426e3ba 32 printf("Display the neurons, ncount = %d\n", ncount);
nepes_ai 2:995d7426e3ba 33 uint16_t temp_nsr = hnn.getNsr();
nepes_ai 2:995d7426e3ba 34 hnn.setNsr(0x0010);
nepes_ai 2:995d7426e3ba 35 hnn.resetChain();
nepes_ai 2:995d7426e3ba 36 for (int i = 1; i <= ncount; i++) {
nepes_ai 2:995d7426e3ba 37 nm_ncr = hnn.getNcr();
nepes_ai 2:995d7426e3ba 38 hnn.readCompVector(vector16, VECTOR_LENGTH);
nepes_ai 2:995d7426e3ba 39 nm_aif = hnn.getAif();
nepes_ai 2:995d7426e3ba 40 nm_cat = hnn.getCat();
nepes_ai 2:995d7426e3ba 41
nepes_ai 2:995d7426e3ba 42 printf("neuron#%d \tvector=", i);
nepes_ai 2:995d7426e3ba 43 for (int j = 0; j < VECTOR_LENGTH; j++) {
nepes_ai 2:995d7426e3ba 44 printf("%d, ", vector16[j]);
nepes_ai 2:995d7426e3ba 45 }
nepes_ai 2:995d7426e3ba 46 if (nm_cat & 0x8000) {
nepes_ai 2:995d7426e3ba 47 printf(" \tncr=%d \taif=%d \tcat=%d (degenerated)\n", nm_ncr, nm_aif, (nm_cat & 0x7FFF));
nepes_ai 2:995d7426e3ba 48 }
nepes_ai 2:995d7426e3ba 49 else {
nepes_ai 2:995d7426e3ba 50 printf(" \tncr=%d \taif=%d \tcat=%d\n", nm_ncr, nm_aif, nm_cat);
nepes_ai 2:995d7426e3ba 51 }
nepes_ai 2:995d7426e3ba 52 }
nepes_ai 2:995d7426e3ba 53 hnn.setNsr(temp_nsr);
nepes_ai 2:995d7426e3ba 54 }
nepes_ai 2:995d7426e3ba 55
nepes_ai 0:c56eb46c7bee 56 int main()
nepes_ai 0:c56eb46c7bee 57 {
nepes_ai 0:c56eb46c7bee 58 arduino_con = LOW;
nepes_ai 0:c56eb46c7bee 59 sdcard_ss = HIGH;
nepes_ai 0:c56eb46c7bee 60 wait(0.5);
nepes_ai 0:c56eb46c7bee 61
nepes_ai 0:c56eb46c7bee 62 if (hnn.begin() != 0) {
nepes_ai 1:2d0abf41b7a3 63 fpga_version = hnn.fpgaVersion();
nepes_ai 1:2d0abf41b7a3 64 if ((fpga_version & 0xFF00) == 0x0000) {
nepes_ai 1:2d0abf41b7a3 65 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 66 }
nepes_ai 1:2d0abf41b7a3 67 else if ((fpga_version & 0xFF00) == 0x0100) {
nepes_ai 1:2d0abf41b7a3 68 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 69 }
nepes_ai 1:2d0abf41b7a3 70 else {
nepes_ai 1:2d0abf41b7a3 71 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 72 }
nepes_ai 2:995d7426e3ba 73 printf("\nStart NM500 initialization...\n");
nepes_ai 2:995d7426e3ba 74 printf(" NM500 is initialized!\n");
nepes_ai 2:995d7426e3ba 75 printf(" There are %d neurons\n", hnn.total_neurons);
nepes_ai 0:c56eb46c7bee 76 }
nepes_ai 0:c56eb46c7bee 77 else {
nepes_ai 2:995d7426e3ba 78 printf("\n\nStart NM500 initialization...\n");
nepes_ai 2:995d7426e3ba 79 printf(" NM500 is not connected properly!!\n");
nepes_ai 2:995d7426e3ba 80 printf(" Please check the connection and reboot!\n");
nepes_ai 0:c56eb46c7bee 81 while (1);
nepes_ai 0:c56eb46c7bee 82 }
nepes_ai 0:c56eb46c7bee 83
nepes_ai 0:c56eb46c7bee 84 // if you want to run in lsup mode, uncomment below
nepes_ai 0:c56eb46c7bee 85 //norm_lsup = 0x80;
nepes_ai 0:c56eb46c7bee 86 hnn.setGcr(1 + norm_lsup);
nepes_ai 0:c56eb46c7bee 87
nepes_ai 0:c56eb46c7bee 88 // build knowledge by learning 3 patterns with each constant values (respectively 11, 15 and 20)
nepes_ai 2:995d7426e3ba 89 printf("\nLearning three patterns...\n");
nepes_ai 2:995d7426e3ba 90 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 91 vector[i] = 11;
nepes_ai 0:c56eb46c7bee 92 hnn.learn(vector, VECTOR_LENGTH, 55);
nepes_ai 2:995d7426e3ba 93 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 94 vector[i] = 15;
nepes_ai 0:c56eb46c7bee 95 hnn.learn(vector, VECTOR_LENGTH, 33);
nepes_ai 2:995d7426e3ba 96 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 97 vector[i] = 20;
nepes_ai 2:995d7426e3ba 98 hnn.learn(vector, VECTOR_LENGTH, 100);
nepes_ai 2:995d7426e3ba 99 displayNeurons();
nepes_ai 0:c56eb46c7bee 100
nepes_ai 2:995d7426e3ba 101 for (uint8_t value = 12; value < 16; value++) {
nepes_ai 2:995d7426e3ba 102 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 103 vector[i] = value;
nepes_ai 2:995d7426e3ba 104 printf("\nRecognizing a new pattern: ");
nepes_ai 2:995d7426e3ba 105 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 106 printf("%d, ", vector[i]);
nepes_ai 2:995d7426e3ba 107 printf("\n");
nepes_ai 0:c56eb46c7bee 108 response_nbr = hnn.classify(vector, VECTOR_LENGTH, READ_COUNT, dists, cats, nids);
nepes_ai 2:995d7426e3ba 109 for (int i = 0; i < response_nbr; i++) {
nepes_ai 2:995d7426e3ba 110 if (cats[i] & 0x8000) {
nepes_ai 2:995d7426e3ba 111 printf("Firing neuron#%d, category=%d (degenerated), distance=%d\n", nids[i], (cats[i] & 0x7FFF), dists[i]);
nepes_ai 2:995d7426e3ba 112 }
nepes_ai 2:995d7426e3ba 113 else {
nepes_ai 2:995d7426e3ba 114 printf("Firing neuron#%d, category=%d, distance=%d\n", nids[i], (cats[i] & 0x7FFF), dists[i]);
nepes_ai 2:995d7426e3ba 115 }
nepes_ai 0:c56eb46c7bee 116 }
nepes_ai 0:c56eb46c7bee 117 }
nepes_ai 0:c56eb46c7bee 118
nepes_ai 2:995d7426e3ba 119 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 120 vector[i] = 20;
nepes_ai 2:995d7426e3ba 121 printf("\nRecognizing a new pattern using KNN classifier: ");
nepes_ai 2:995d7426e3ba 122 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 123 printf("%d, ", vector[i]);
nepes_ai 2:995d7426e3ba 124 printf("\n");
nepes_ai 0:c56eb46c7bee 125 hnn.setKnnClassifier();
nepes_ai 0:c56eb46c7bee 126 response_nbr = hnn.classify(vector, VECTOR_LENGTH, READ_COUNT, dists, cats, nids);
nepes_ai 0:c56eb46c7bee 127 hnn.setRbfClassifier();
nepes_ai 2:995d7426e3ba 128 for (int i = 0; i < READ_COUNT; i++) {
nepes_ai 2:995d7426e3ba 129 if (cats[i] & 0x8000) {
nepes_ai 2:995d7426e3ba 130 printf("Firing neuron#%d, category=%d (degenerated), distance=%d\n", nids[i], (cats[i] & 0x7FFF), dists[i]);
nepes_ai 2:995d7426e3ba 131 }
nepes_ai 2:995d7426e3ba 132 else {
nepes_ai 2:995d7426e3ba 133 printf("Firing neuron#%d, category=%d, distance=%d\n", nids[i], (cats[i] & 0x7FFF), dists[i]);
nepes_ai 2:995d7426e3ba 134 }
nepes_ai 0:c56eb46c7bee 135 }
nepes_ai 0:c56eb46c7bee 136
nepes_ai 2:995d7426e3ba 137 printf("\nLearning a new example (13) falling between neuron1 and neuron2\n");
nepes_ai 2:995d7426e3ba 138 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 139 vector[i] = 13;
nepes_ai 2:995d7426e3ba 140 hnn.learn(vector, VECTOR_LENGTH, 100);
nepes_ai 2:995d7426e3ba 141 displayNeurons();
nepes_ai 2:995d7426e3ba 142 printf("=> Notice the addition of neuron 4 and the shrinking of the influence fields of neuron1 and 2\n");
nepes_ai 0:c56eb46c7bee 143
nepes_ai 2:995d7426e3ba 144 printf("\nLearning a same example (13) using a different category 77\n");
nepes_ai 2:995d7426e3ba 145 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 146 vector[i] = 13;
nepes_ai 2:995d7426e3ba 147 hnn.learn(vector, VECTOR_LENGTH, 77);
nepes_ai 2:995d7426e3ba 148 displayNeurons();
nepes_ai 2:995d7426e3ba 149 printf("=> Notice if the AIF of a neuron reaches the MINIF, the neuron will be degenerated\n");
nepes_ai 0:c56eb46c7bee 150
nepes_ai 2:995d7426e3ba 151 printf("\nLearning a new example (12) using context 5, category 200\n");
nepes_ai 2:995d7426e3ba 152 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 153 vector[i] = 12;
nepes_ai 0:c56eb46c7bee 154 hnn.setContext(5);
nepes_ai 2:995d7426e3ba 155 hnn.learn(vector, VECTOR_LENGTH, 200);
nepes_ai 0:c56eb46c7bee 156 hnn.setContext(1);
nepes_ai 2:995d7426e3ba 157 displayNeurons();
nepes_ai 0:c56eb46c7bee 158
nepes_ai 2:995d7426e3ba 159 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 160 vector[i] = 20;
nepes_ai 2:995d7426e3ba 161 printf("\nRecognizing a new pattern using context 5: ");
nepes_ai 2:995d7426e3ba 162 for (int i = 0; i < VECTOR_LENGTH; i++)
nepes_ai 0:c56eb46c7bee 163 printf("%d, ", vector[i]);
nepes_ai 2:995d7426e3ba 164 printf("\n");
nepes_ai 0:c56eb46c7bee 165 hnn.setContext(5);
nepes_ai 0:c56eb46c7bee 166 response_nbr = hnn.classify(vector, VECTOR_LENGTH, READ_COUNT, dists, cats, nids);
nepes_ai 0:c56eb46c7bee 167 hnn.setContext(1);
nepes_ai 2:995d7426e3ba 168 for (int i = 0; i < response_nbr; i++) {
nepes_ai 2:995d7426e3ba 169 if (cats[i] & 0x8000) {
nepes_ai 2:995d7426e3ba 170 printf("Firing neuron#%d, category=%d (degenerated), distance=%d\n", nids[i], (cats[i] & 0x7FFF), dists[i]);
nepes_ai 2:995d7426e3ba 171 }
nepes_ai 2:995d7426e3ba 172 else {
nepes_ai 2:995d7426e3ba 173 printf("Firing neuron#%d, category=%d, distance=%d\n", nids[i], (cats[i] & 0x7FFF), dists[i]);
nepes_ai 2:995d7426e3ba 174 }
nepes_ai 0:c56eb46c7bee 175 }
nepes_ai 2:995d7426e3ba 176 printf("=> Notice the neurons will not be recognize and shrink if the value of context is not equal\n");
nepes_ai 0:c56eb46c7bee 177 }