18,7K подписчиков

Upgrade Arduino - увеличиваем оперативку (SRAM)

8K прочитали
Технологии
Больше по теме

Микроконтроллер ATmega328P на базе которого работают платы Arduino Nano и Arduino UNO обладает достаточно скромными характеристиками необходимой для реализации сложных проектов в плане оперативной (энергозависимой) памяти SRAM.

Микроконтроллер ATmega328P на плате Arduino
Микроконтроллер ATmega328P на плате Arduino

Можно поискать альтернативу на других мощных платформах, взять какой-нибудь 32-х битный STM - но цена вопроса будет уже другая ну и совсем не факт, что на другой платформе будут работать библиотеки предназначенные для Arduino. В каких ситуациях может не хватать оперативной памяти? - В первую очередь при работе с графическими дисплеями. Разберем пример:
У нас есть вот такой монохромный дисплей с разрешением 128х64.

1.3inch OLED (B)
1.3inch OLED (B)

Для работы с ним в оперативной памяти потребуется выделить буфер ( однобайтовый массив) размерностью
128х64/8 = 1024 байта
т.е. мы займем половину памяти Arduino - и в принципе Arduino с такой задачкой справится. А, что если взять вот такой дисплей, да еще и поработать с оттенками серого (4 цвета).

4.2inch e-Paper Module
4.2inch e-Paper Module

Нам уже потребуется
400х300/4 = 30000 байт оперативной памяти.
Разумеется, что такой объем данных не влезет в оперативную память
Arduino да и многих других Arduino подобных платформ.
Можно поискать подходящую платформу - а можно прикрутить внешнюю SRAM память. Для решения задачи я выбрал микросхему 23LC512 c интерфейсом SPI от производителя
Microchip

23LC512
23LC512

Объем памяти 512K bit / 8 = 64кб
После подключения, мы получаем дополнительные 65535 однобайтовых ячеек где можем хранить наши переменные. Память это энергозависимая то есть данные хранятся только пока у нас есть питание - за то мы не ограничены в количестве циклов записи/чтения. Работать с этой памятью не намного сложнее чем с обычным массивом - я даже не буду использовать библиотеки.
Схема тестового стенда:

23LC512 Test
23LC512 Test

Вместо платы Arduino я буду использовать Российскую платформу Iskra Nano Pro на микроконтроллере ATmega328PB. В отличии от оригинальной платы Arduino у нее есть 2-й аппаратный SPI. Работа с памятью будет производится без Ардуиновских библиотек на языке С - но в среде ArduinoIDE. В памяти выделяется область адресов для буфера (куда мы будем подгружать картинки и рисовать графические примитивы) для двух дисплеев, а после создания картинки будем переписывать содержимое памяти на дисплеи через 1-й аппаратный SPI. Такое решение даст минимизацию трудозатрат при редактировании существующих библиотек и позволит работать с дисплеями с высоким разрешением.

Впихнуть невпихуемое
Впихнуть невпихуемое

Разумеется что можно использовать и оригинальную плату Arduino на микроконтроллере ATmega328P - повесив память на ту же шину, что и дисплеи - но писать код будет несколько сложнее.

Весь код для записи и чтения байтов из внешней SRAM уместился на одной страничке:

Было создано 2 процедуры и  1 функция:
Инициализация SPI
Запись в память (адрес от 0....65535, значение 1 байт)
Чтение из памяти (адрес от 0....65535) - возвращает один байт
Работу стенда и дополнительные комментарии смотрите в этом видео.
Было создано 2 процедуры и 1 функция: Инициализация SPI Запись в память (адрес от 0....65535, значение 1 байт) Чтение из памяти (адрес от 0....65535) - возвращает один байт Работу стенда и дополнительные комментарии смотрите в этом видео.