ОЗУ из КОНДЕНСАТОРОВ — Делаем 1 БАЙТ оперативки из кондеров

Всем привет!

Я недавно увидел видос, как один чел в ютубе сделал 8 байт памяти на специальных магнитных колечках. Я придумал сделать память на конденсаторах, так как у меня есть много конденсаторов, всех по 10 штук.

Я взял конденсаторы с самой большой емкостью — по 220 микрофарад, 8 штук. А также 8 резисторов по 10 кОм, можно и на 1 кОм.

Конечно, этот вариант памяти просто для прикола и эксперимента. Эффективнее использовать готовый чип памяти — будет и больше памяти, и удобнее использовать.

ПОДКЛЮЧЕНИЕ

Нам понадобится 8 конденсаторов большой емкости и напряжение от 5 вольт, 8 резисторов 1-10 кОм, 8 проводов для заряда/разряда, 8 проводов для измерения заряда.

  1. Подключаем конденсаторы в линию, объединяем все минусы конденсаторов.
  2. К плюсам подключаем резисторы, через эти резисторы подключаем на 8 цифровых пинов, 1 пин на конденсатор. Либо можете использовать сдвиговый регистр для чтения сигнала.
  3. Также подключаем провода ДО РЕЗИСТОРОВ, напрямую к плюсам конденсаторов, и подключаем провода к 8 аналоговым пинам.
  4. Загружаем скетч и пробуем записать любое число от 0 до 255. Наша память может принимать 256 вариантов из единиц и нулей на 8 позициях.

СКЕТЧ

Скетч для управления оперативкой на конденсаторах в 1 байт

// Пины для управления (заряд/разряд) 
int chargePins[8] = {22, 23, 24, 25, 26, 27, 28, 29};
// Пины для чтения напряжения
int readPins[8] = {A0, A1, A2, A3, A4, A5, A6, A7};
// Время записи и очистки в миллисекундах, чем больше емкость конденсаторов, тем больше время. 
int writeTime = 1000; 

void setup() {
  Serial.begin(9600);
  // Ставим все управляющие пины в режим входа (чтобы не мешали)
  for (int i = 0; i < 8; i++) {
    pinMode(chargePins[i], INPUT);
  }
  
  Serial.println("==========================================");
  Serial.println("   ПАМЯТЬ НА КОНДЕНСАТОРАХ 220 мкФ");
  Serial.println("   Arduino Mega | 8 бит (1 байт)");
  Serial.println("==========================================");
  Serial.println();
  Serial.println("Команды:");
  Serial.println("  [число 0-255] - записать в память");
  Serial.println("  r             - прочитать и показать");
  Serial.println("  c             - очистить (записать 0)");
  Serial.println();
  Serial.println("Текущее состояние памяти:");
  printMemory();
  Serial.println();
  Serial.println("Ожидание команды...");
}

// -------- Запись одного бита --------
void writeBit(int index, int val) {
  int p = chargePins[index];
  pinMode(p, OUTPUT);
  
  if (val == 1) {
    digitalWrite(p, HIGH);
    delay(writeTime);
  } else {
    digitalWrite(p, LOW);
    delay(writeTime);
  }
  
  pinMode(p, INPUT); // Отключаем пин, чтобы заряд не утекал
}

// -------- Чтение одного бита --------
int readBit(int index) {
  int p = chargePins[index];
  int a = readPins[index];

  // Быстрая подзарядка (компенсируем утечку)
  pinMode(p, OUTPUT);
  digitalWrite(p, HIGH);
  delayMicroseconds(50);
  
  pinMode(p, INPUT);
  int voltage = analogRead(a);

  return (voltage > 512) ? 1 : 0;
}

// -------- Запись байта --------
void writeByte(byte val) {
  Serial.print("Запись числа ");
  Serial.print(val);
  Serial.print(" (");
  
  // Показываем бинарный вид
  for (int i = 0; i < 8; i++) {
    int bit = (val >> (7 - i)) & 1;
    Serial.print(bit);
  }
  Serial.println(") ...");
  
  // Записываем биты
  for (int i = 0; i < 8; i++) {
    int bit = (val >> (7 - i)) & 1;
    writeBit(i, bit);
  }
  
  Serial.println("Готово!");
}

// -------- Чтение байта --------
byte readByte() {
  byte result = 0;
  for (int i = 0; i < 8; i++) {
    int bit = readBit(i);
    result = (result << 1) | bit;
  }
  return result;
}

// -------- КРАСИВЫЙ ВЫВОД ПАМЯТИ --------
void printMemory() {
  byte data = readByte();
  
  Serial.print("  ");
  // Выводим 8 символов: # или _
  for (int i = 0; i < 8; i++) {
    int bit = (data >> (7 - i)) & 1;
    if (bit == 1) {
      Serial.print("#");
    } else {
      Serial.print("_");
    }
  }
  
  Serial.print("  =  ");
  Serial.print(data);
  Serial.println("  (0-255)");
}

// -------- Очистка памяти --------
void clearMemory() {
  Serial.println("Очистка памяти...");
  writeByte(0);
  Serial.println("Готово!");
}

// -------- ГЛАВНЫЙ ЦИКЛ --------
void loop() {
  if (Serial.available() > 0) {
    // Читаем команду
    String input = Serial.readStringUntil('\n');
    input.trim();
    
    if (input.length() == 0) return;
    
    char cmd = input.charAt(0);
    
    // ---- Команда: r (read) ----
    if (cmd == 'r' || cmd == 'R') {
      Serial.println();
      Serial.println("=== ЧТЕНИЕ ПАМЯТИ ===");
      printMemory();
      Serial.println();
      Serial.println("Ожидание команды...");
    }
    
    // ---- Команда: c (clear) ----
    else if (cmd == 'c' || cmd == 'C') {
      Serial.println();
      Serial.println("=== ОЧИСТКА ===");
      clearMemory();
      Serial.println();
      Serial.println("Новое состояние:");
      printMemory();
      Serial.println();
      Serial.println("Ожидание команды...");
    }
    
    // ---- Если введено число (0-255) ----
    else {
      int num = input.toInt();
      if (num >= 0 && num <= 255) {
        Serial.println();
        Serial.println("=== ЗАПИСЬ ===");
        writeByte((byte)num);
        Serial.println();
        Serial.println("Новое состояние:");
        printMemory();
        Serial.println();
        Serial.println("Ожидание команды...");
      } else {
        Serial.println("Ошибка! Введите число от 0 до 255 или команду r/c");
      }
    }
  }
}

Похожие записи

Добавить комментарий