Увага! У неділю 15.06.25 - вихідний, відвантаженння товару не буде. У суботу 14.06.25 - відвантаження товару о 14:00
Каталог товарів
Клієнту
Тема сайту:
+38 (066) 305-77-25
Наша адреса
Харків, тимчасово - доставка тільки Новою Поштою, УкрПоштою, МістЕкспрес, ROZETKA Delivery
Телефони
Графік роботи
  • Пн-Пт: з 9 до 18
  • Сб: з 10 до 17
  • Нд: з 11 до 16
E-mail
Ми в соцмережах
Перейти до контактів
0 0
Каталог
Головна
Закладки
0
Порівняти
0
Контакти

Портативний міні-дебаггер I2C/SPI на Arduino Nano

Чи була корисною ця стаття?
Портативний міні-дебаггер I2C/SPI на Arduino Nano

Створюємо міні-дебаггер I2C/SPI на Arduino Nano

Коли твій I2C-датчик мовчить як партизан на допиті, а SPI-пристрій надсилає якісь дивні сигнали - час братися за серйозні інструменти!

Вступ

Привіт, електронні детективи! 🕵️‍♂️ Сьогодні ми створимо щось особливе - компактний дебаггер для шин I2C та SPI на базі Arduino Nano з крихітним OLED-дисплеєм. Так-так, саме на тому 0.42-дюймовому дисплеї, який настільки малий, що його можна сплутати з пікселем з Minecraft! Але не хвилюйтеся, ми змусимо цей малюк працювати на повну.

Fun fact: Знаєте, чому I2C називають "I squared C"? Тому що інженери, які його створювали, були надто ліниві щоб постійно говорити "Inter-Integrated Circuit". А ми, розробники, цінуємо лаконічність!

Arduino Nano з OLED

Практичне застосування дебаггера

1. Тестування I2C пристроїв
  • Пошук адрес пристроїв: Швидке визначення I2C адрес всіх підключених сенсорів, дисплеїв чи інших модулів
  • Виявлення конфліктів адрес: Якщо два пристрої використовують однакову адресу, наш дебаггер це покаже
  • Перевірка справності: Миттєве визначення проблем з пристроєм чи підключенням
2. Діагностика SPI комунікації
  • Аналіз даних: Перехоплення і аналіз обміну даними між мікроконтролером та SPI пристроями
3. Налагодження нових пристроїв
  • Тестування прототипів: Швидка перевірка роботи нових модулів
  • Налаштування адрес: Перевірка правильності налаштування програмованих адрес
4. Освітні цілі
  • Вивчення протоколів: Наочна демонстрація роботи I2C та SPI протоколів
  • Практичні експерименти: Можливість експериментувати з різними налаштуваннями

Що нам знадобиться

  • Arduino Nano з OLED 0.42" (наш міні-детектив)
  • Набір проводів (кольорових, щоб було веселіше)
  • Резистори підтяжки для I2C (4.7kΩ x 2)
  • Терпіння (багато!)
  • Чашка кави (без неї ніяк)

Схема підключення

схема підключення
SDA -> A4
SCL -> A5
MOSI -> D11
MISO -> D12
SCK -> D13
SS -> D10

Лайфхак: Якщо переплутаєте SDA і SCL - нічого страшного. Arduino просто буде дивитися на вас з легким розчаруванням через OLED-дисплей. 😅

Розробка інтерфейсу

Так, у нас всього 72x40 пікселів. Це як намагатися написати "Війну і мир" на поштовій марці! Але ми впораємося:

скріншоту інтерфейсу

Організація екрану:

  • Верхній рядок: статус шини і протокол
  • Середня частина: дані/адреси

Fun fact: Якщо вам здається, що 72x40 пікселів - це мало, згадайте, що перша гра Pong працювала всього з кількома пікселями. І нічого, люди навіть в чергу стояли, щоб пограти!

Програмний код

Ось серце нашого дебаггера:



#include <U8g2lib.h>
#include <Wire.h>
#include <SPI.h>

#define OLED_ADDRESS 0x3C
#define CS_PIN 10    // SS
#define MOSI_PIN 11  // MOSI
#define MISO_PIN 12  // MISO
#define SCK_PIN 13   // SCK

// Ініціалізація дисплея
U8G2_SSD1306_72X40_ER_F_HW_I2C u8g2(U8G2_R0);
bool showSPI = false;

void setup() {
    Wire.begin();
    Wire.setClock(100000); // 100kHz для стабільності
    
    // Налаштовуємо SPI піни
    pinMode(CS_PIN, OUTPUT);
    pinMode(MISO_PIN, INPUT_PULLUP);
    pinMode(MOSI_PIN, OUTPUT);
    pinMode(SCK_PIN, OUTPUT);
    
    digitalWrite(CS_PIN, HIGH);
    SPI.begin();
    
    u8g2.begin();
    u8g2.setContrast(255);
}

void scanI2C() {
    byte count = 0;
    byte devices[10];
    
    // Сканування шини
    for(byte address = 1; address < 127; address++) {
        if(address == OLED_ADDRESS) continue; // Пропускаємо адресу дисплея
        
        Wire.beginTransmission(address);
        byte error = Wire.endTransmission();
        
        if(error == 0 && count < 10) {
            devices[count] = address;
            count++;
        }
        delay(1);
    }
    
    // Оновлення дисплея
    u8g2.firstPage();
    do {
        u8g2.setFont(u8g2_font_7x13_tr);
        u8g2.drawStr(2, 9, "I2C:");
        
        u8g2.setFont(u8g2_font_9x15_tr);
        
        char buffer[12];
        for(byte i = 0; i < count && i < 2; i++) {
            sprintf(buffer, "0x%02X", devices[i]);
            u8g2.drawStr(5, 24 + (i * 15), buffer);
        }
        
        if(count == 0) {
            u8g2.drawStr(5, 25, "NONE");
        }
        
    } while(u8g2.nextPage());
}

void scanSPI() {
    // Робимо кілька замірів для надійності
    byte responses[5];
    for(byte i = 0; i < 5; i++) {
        digitalWrite(CS_PIN, LOW);
        delayMicroseconds(100);
        responses[i] = SPI.transfer(0xFF);
        delayMicroseconds(100);
        digitalWrite(CS_PIN, HIGH);
        delay(1);
    }
    
    // Перевіряємо, чи змінюються значення
    bool hasResponse = false;
    for(byte i = 1; i < 5; i++) {
        if(responses[i] != responses[0]) {
            hasResponse = true;
            break;
        }
    }
    
    u8g2.firstPage();
    do {
        u8g2.setFont(u8g2_font_7x13_tr);
        u8g2.drawStr(2, 9, "SPI:");
        
        u8g2.setFont(u8g2_font_9x15_tr);
        
        if(hasResponse) {
            u8g2.drawStr(5, 24, "ACTIVE");
            char buffer[12];
            sprintf(buffer, "0x%02X", responses[0]);
            u8g2.drawStr(5, 39, buffer);
        } else {
            u8g2.drawStr(5, 24, "NONE");
        }
        
    } while(u8g2.nextPage());
}

void loop() {
    showSPI = !showSPI;
    
    if(showSPI) {
        scanSPI();
    } else {
        scanI2C();
    }
    
    delay(3000); // Перемикаємо режим кожні 3 секунди
}


Порада: Не панікуйте, якщо спочатку побачите тільки дивні символи на екрані. Можливо, ви просто випадково написали новий діалект китайської!

працюючого дебаггера

Основні функції

  • ✓ Пошук всіх пристроїв на шині
  • ✓ Відображення знайдених адрес

Важливо: Якщо ваш дебаггер показує, що все працює правильно, а система все одно не працює - не засмучуйтеся. Можливо, це просто п'ятниця, 13-е!

Тестування

тестування з реальними пристроями
Для тестування використовуємо:
  • 1. I2C датчик температури
  • 2. SPI флеш-пам'ять
  • 3. Будь-який пристрій, який відмовляється працювати саме тоді, коли він терміново потрібен

Висновки

Наш міні-дебаггер готовий! Тепер ви можете:

  • ✓ Знаходити неслухняні I2C пристрої
  • ✓ Підглядати за SPI транзакціями
  • ✓ Вражати колег своїм професіоналізмом
  • ✓ Робити вигляд, що розумієте, що відбувається на шині

Останній факт: Знаєте, чому досвідчені розробники люблять налагоджувати I2C/SPI системи? Тому що це єдиний законний спосіб підглядати за чужим спілкуванням! 😉

© 2024 Мій Проект.Автор: Jazzzman. Використання матеріалів дозволено лише з посиланням на джерело.

Ardu-miha
09 грудня 2024 (23:10)
Виглядає не погано, але хотів би щоб на практиці показали як використовувати більш детально
Відповідь адміністратора
додамо інформацію
Рекомендовані товари
Схожі статті
Операція "Неприступна Шафа"
Операція "Неприступна Шафа"
Блог, Інструкції Підключення та Огляди, Цікаве та Корисне
06 квітня
Цей сайт використовує файли cookies для більш комфортної роботи користувача. Продовжуючи перегляд сторінок сайту, ви погоджуєтеся з політикою використання файлів cookies. Детальніше