Устанавливаем первоначальное состояние нейрона.
Первоначальное состояние на входе и выходе нейрона.
Конфигурируем порты программы.
Устанавливаем скорость серийного порта 9600 бод а также подтягиваем две кнопки на внутреннее сопротивление командой INPUT_PULLUP и конфигурируем выход нейрона на 13 пин ардуино (можете назначить любой свободный порт также как входные нейроны).
Основная программа обработки сигналов в самом нейроне и формирование выходного ответа после получения входных данных.
Обработка сигналов на входе нейрона, в принципе поэкспериментировав с кодом, вы сможете подать сигналы с чего угодно, нейрону все равно какие данные вы подадите на вход.
Полный листинг приведен ниже, пользуйтесь и осваивайте. Сфера применения ограничена только вашей фантазией.
Старался максимально объяснить каждую строчку кода. Сам знаю как новичкам или даже опытным программистам разберётся с чужим кодом или пытаться его адаптировать под свой проект. В дальнейших статьях постараюсь показать где я его применяю на практике. Занимаюсь Нейросетями давно и буду выкладывать свои наработки по мере возможности и время. Вопросы и комментарии можете оставлять если будут какие то вопросы то постараюсь на них ответить.
// Вход нейрона
const int en1 = 12;//определяем вход нейрона
const int en2 = 11;//определяем вход нейрона
const int z_out = 13;//определяем выход нейрона
// Веса нейрона
float w1 = 0.5;//определяем веса нейрона
float w2 = 0.3;//определяем веса нейрона
float theta = 0.6;// сдиг нейрона для предотвращения переобучения
float z = 0;//начальное состояние нейрона
//Состояние входа и вихода нейрона
int x1 = 0;//определяем состояние на входе нейрона
int x2 = 0;//определяем состояние на входе нейрона
int zr = 0;//определяем состояние на выходе нейрона
void setup() {//Конфигурация портов програмы
Serial.begin(9600);//скорость роботы порта
pinMode(en1, INPUT_PULLUP);//вход первого порта
pinMode(en2, INPUT_PULLUP);//вход второго порта
pinMode(z_out, OUTPUT);//выходной порт
}
void loop() {//основной цикл програмы
neyron();//обработка сигналов в самом нейроне
z = ((x1 * w1) + (x2 * w2)) - theta;//перещитываем состояния на входе нейрона
if (z >= 0)//если состояние нейрона после перещета больше 0 то...
{
digitalWrite(z_out, HIGH);//на цыфровом пине устанавливаем состояние
zr = 1;//пишем выход нейрона как высокий
}
else//если нет то...
{
digitalWrite(z_out, LOW);//на цыфровом пине устанавливаем состояние
zr = 0;//пишем выход нейрона как низкий
}
Serial.print("x1 = ");//выводим в серийный порт надпись
Serial.print(x1);//выводим в серийный порт состояние первого входа
Serial.print("x2 = ");//выводим в серийный порт надпись
Serial.print(x2);//выводим в серийный порт состояние второго нейрона
Serial.print("zr = ");//выводим в серийный порт надпись
Serial.print(zr);//выводим состояние нейрона на выходе
delay(50);//утанавливаем задержку
}
void neyron()//обработка входных сигналов поступающих в нейрон
{
if (digitalRead(en1) == LOW)//если после считывание первого входа состояние низкое то ...
{
x1 = 1;//устанавливаем на первом входе нейрона 1
}
else//если нет то...
{
x1 = 0;//устанавливаем на первом входе нейрона 0
}
if (digitalRead(en2) == LOW)//если после считывание первого входа состояние низкое то ...
{
x2 = 1;//устанавливаем на втором входе нейрона 1
}
else//если нет то...
{
x2 = 0;//устанавливаем на первом входе нейрона 0
}
return x1, x2;//передаем состояние входов в основной цикл
}