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@2:995d7426e3ba, 2020-02-11 (annotated)
- 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?
| 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 | 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 | } |