Здравствуйте, сегодня мы хотим поделиться небольшим Кейсом нашего отдела поддержки по вопросу переноса проекта с Raspberry Pi на Repka Pi 3 и наверное этот Кейс будет больше не о Repka Pi или Raspberry Pi, и применим к большинству одноплатных мини компьютеров подобной категории имеющих GPIO и распиновку близкую к распиновке Raspberry Pi. Поговорим о схемотехнике и покажем на примере данного обращения как не желательно разрабатывать платы, работающие с I/O выходами подобных мини компьютеров.
История такая…
К нам в компанию обратились покупатели по вопросу работы и совместимости GPIO Raspberry Pi и Repka Pi, так как Repka Pi позиционирует себя как плата и по форм фактору и по GPIO совместимой с Raspberry Pi то проблем не должно было возникнуть если бы не одно «НО» о котором мы и хотим рассказать.
У покупателя уже была разработана и внедрена небольшая платы со следующими компонентами, 7 реле, 4 внешних датчиков и датчик DHT22. Всю схему мы раскрывать не будем, а покажем только проблемный участок и расскажем почему так лучше не делать.
И так имеем 7 пинов в режиме OUT, 4 пина в режиме IN и 1 пин для DHT22, и так задействовано 12 пинов
В момент тестирования Repka Pi на плате покупателя, выявилась проблема, не приходил сигнал с датчиков 1 и 2 (пин 27 и 28).
Схема участка платы выглядит так
напряжение то напряжение должно смениться на 0, но в данном случае 0.2В что означает низкий уровень (LOW) или логический ноль.
На Raspberry Pi данная схема и подход отрабатывает нормально, а на Repka Pi на пине всегда была логическая единица.
Давайте разберемся из-за чего так происходило, и посмотрим в начале распиновку Raspberry Pi
По схеме видно, что пин 27 и 28 у Raspberry Pi имеют второе назначении, I2C интерфейс.
Теперь посмотрим распиновку Repka Pi
Тоже видим, что помимо «IO» 27 и 28 пин имеют также I2C интерфейс.
И кажется все одинокого и должно работать, но у Repka Pi 3 как и положено интерфейсу i2c, данные пины имеют «железную» подтяжку к 3,3В через резистор 2кОм, а Raspberry Pi на пин 27 и 28 которые тоже являются вторым I2C интерфейсом имеет только внутри процессорную софтовую подтяжку. Кстати, а пин 3 и 5 также имеет «железную» подтяжку!
Способы решения
Первый способ
Убрать подтягивающие резисторы с пинов 27 и 28
Этот способ был выбран как основным вариантом решения данной задачи и поставлять покупателю Repka Pi без подтягивающих резисторов. Так же думаем убрать их и из базовой поставки, а подтяжку сделать через «дерево устройств»
Вариант второй
Давайте теперь посмотрим почему же оно не стало работать. Посмотрим какое напряжение возникает на участке цепи на пине 28 с подтяжкой к 3,3В и на пине 15 где нет подтяжки. Рассмотрим, как на Repka Pi 3 без изменений, так и на Raspberry Pi 3B. Все будет экспериментальным путем без законов Ома и резистивного деления напряжения
Как мы видим на 28 пине при открытии оптопары возникает напряжение 1.8В что является высоким уровнем (HIGH), теперь давайте уберем из цепи лишний делитель, резисторы R1 и R4 по 2кОм.
Теперь на пине 28 при открытии оптопары напряжение равное 0.5В и это уже будет нижний уровень (LOW) и на пине 15 0.2В что означает тоже нижний уровень (LOW).
Но в рассмотренных вариантах иногда проскакивает шум при запроси пина с задержкой 0,1 секунда, так же это мешает использовать метод add_event_detect библиотеки RepkaPi.GPIO в режиме BOTH. Аналогичное поведения и в Raspberry Pi при использовании библиотеки RPi.GPIO.
Давайте рассмотрим следующий пример.
Сразу хочу подметить что данная схема предназначена для работы с GPIO не имеющих не внешнюю не внутреннюю подтяжки.
Давайте чуть подробней рассмотрим схему, и так через оптопару пропускаем 5В, за место 3.3В которые были в предыдущей схеме так же добавлен PNP транзистор для управления логикой 3.3В. Таким простым способом мы гасим помехи возникающие в оптопаре.
Как видим теперь метод add_event_detect библиотеки RepkaPi.GPIO в режиме BOTH, ну и если делать опрос пина в цикле, то тоже нет плавающего значения.
Данная схема будет работать только при стабильных 5В на оптопаре и 3.3В на транзисторе, если напряжение будет даже 4.9В то значение будет плавать, т.к. транзистор откроется не полностью
Ну и в заключение, при работе с GPIO большую роль играет блок питания Repka Pi или любого аналогичного устройства. Блок питание при нагрузке должен держать напряжение не ниже 5В и иметь как можно меньше импульсов!
Схема (как отдельная так или в виде дополнения информации к уже имеющейся) по подтяжке pins по умолчанию (pull-up. pull-down) и их реализация (аппаратная, программная) давно напрашивается.
замеченные опечатки в тексте первого абзаца: исправления даны в скобках заглавными буквами
"Здравствуйте, сегодня мы хотим поделиться небольшим Кейсом нашего отдела поддержки по вопросу переноса проекта с Raspberry Pi на Repka Pi 3 и наверное этот Кейс будет больше не о Repka Pi или Raspberry Pi, и переменим(ПРИМЕНИМ) к большинству одноплатных мини компьютеров подобной категории имеющих GPIO и распиновку близкую к распиновки(РАСПИНОВКЕ) Raspberry Pi. Поговорим о схемотехники(СХЕМОТЕХНИКЕ) и покажем на примере данного обращения как не желательно разрабатывать платы, работающие с I/O выходами подобных мини компьютеров."