Как я программатор мастерил
Давненько я не публиковал ничего интересного, так что будем это исправлять. Сегодня я расскажу про процесс разработки программатора для калибровки магнитных датчиков угла на макбуках, так же известных как Lid Angle Sensor.
Пару недель назад некая мастерская в Германии открыла предзаказ на устройство nerd.tool.1 для калибровки этих самых датчиков, стоимостью всего в каких-то 169 EUR. При этом программатор состоит из контроллера ESP32, платы и трех разъёмов для подключения. После этой замечательной новости я спросил себя: "А чем собственно я хуже?" И решил запилить собственную версию данного девайса из подручных материалов.
Начнем с того, что такое эти датчики и с чем их едят.
На данный момент Эпл использует 2 разных решения для распознавания положения крышки. В первом случае они используют простые датчики, которые при приближении магнита в крышке к правильному месту на корпусе просто сажают логический уровень на землю. Во втором же случае распознавание текущего положения реализовано с помощью магнитного датчика угла на петле крышки и магнита, расположенного на ответной части. Соответственно второй тип датчика уже гораздо умнее и точнее, если в первом случае ноутбуку доступна только информация закрыта крышка или открыта, то во втором процессор получает уже точную информацию о положении в градусах. Если ставить датчик с донорского устройства проблем обычно не возникает т.к. на заводе Эпл в него уже были записаны нужные калибровки и произведена защита от дальнейшей записи. Проблема возникает тогда, когда ничего не подозревающий ремонтник заказывает у китайцев шлейф с датчиком, а при его получении обнаруживает что тот не работает. И дело не в том, что ему прислали нерабочий датчик, а в том, что этот датчик не откалиброван (Не будем задаваться лишними вопросами, такими как откуда китайцы берут новые шлейфа с датчиками) и попросту не знает как именно он должен работать. На этом введение в особенности датчиков закончено, приступим непосредственно к разработке.
Упоминание производителя этих датчиков уже проскакивало в инженерных чатах, поэтому найти даташит на похожую модель не составило большого труда. Оставалось только собрать всё в кучу. Сперва я варварски отпилил кусок платы с разъёмом от A2141, а затем присандалил на этот огрызок коннектор симлотка c 11 айфона, который по счастливому совпадению является тем же самым разъёмом, что используется на macbook air m2 A2681. После чего я зафиксировал плату с коннекторами на завалявшемся у меня контроллере Node MCU V3 и соединил стандартные SPI линии от контроллера до коннекторов. С распиновкой коннектора на Air пришлось повозиться, так как схемы на него у меня нет, но по аналогии с известными линиями от Proшек нужные пины были найдены путём прозвонки. На этом вся работа с железной частью была завершена, оставалось самое сложное и интересное - код. Сложное для меня, так как я ничего не смыслю в программировании микроконтроллеров, для тех, кто хорошо шарит в контроллерах всё покажется детскими играми. Исходя их сказанного выше для того, чтобы донести мои мысли до контроллера я воспользовался помощью Chat GPT. Инструмент крайне полезный, даже не представить страшно сколько времени он мне сэкономил, но при этом без доскональнейшей постановки конкретного вопроса пользы от него чуть больше чем никакой.
Сперва я разобрался в основах работы с SPI и все в общем и целом шло довольно гладко, пока я не наткнулся на проблему при записи одного из значений, отвечающего за установку направления вращения. Этот параметр просто не записывался в датчик, а без него невозможно было откалибровать сенсор для модели Air в виду особенности расположения датчика. Так как в имеющемся даташите я не нашел возможных причин появления этой проблемы это означало, что Эпл как всегда всё максимально усложняет. Судя по всему под себя они заказали другую модификацию с немного измененными параметрами. Попробовал написать производителю для получения дополнительной информации, но ожидаемо никакого ответа не получил. "Что ж, так еще интереснее" - подумал я и пошел пилить скрипт для брутфорса датчика чтобы понять как обойти защиту записи в этот конкретный регистр. И спустя какое-то время решение в виде записи определенного значения в определенный регистр было найдено. Хотелось бы конечно снять защиту от записи и с датчиков записанных Эпл, но к сожалению у меня пока ничего из этого не вышло (Да и скорее всего в принципе не выйдет, но поковырять в эту сторону еще стоит), так что имеем что имеем. Данный инструмент получил лишь возможность калибровать новые датчики, которые были скомунизжены у Эпл, но и это уже является большим успехом.
После того как все нюансы с записью были улажены оставалось лишь считать калибровки с оригинальных датчиков, выяснить какие параметры обязательны для переноса, запилить функцию установки правильного нулевого значения и сделать так, чтобы этим было удобно пользоваться.
В итоге программатор имеет 3 режима работы: первый для записи моделей Pro (A2141, A2442, A2485, A2779, A2780), второй для Air (A2681) , третий же для визуализации текущих показаний с датчика. Так же перед записью программатор проверят подключен ли вообще датчик и если он подключен то можно ли вообще в него что-либо записать. Конечно можно было сделать автоматический выбор режима в зависимости от того, в какой разъём вставлен датчик, тогда был бы всего один режим для записи, но у меня уже были прокинуты все линии, так что переделывать было лень.
Статью со всей нужной для самостоятельной сборки информацией и видосом демонстрации работы сей приблуды вы можете найти в справочнике по ремонту всякого разного:
https://logi.wiki/index.php/Macbook_Lid_Angle_Sensor_Calibra...
Вообще крайне полезный ресурс для мастеров, который содержит много интересной и полезной информации по свежим машинам и не только, крайне рекомендую сохранить у себя в заметках.
На этом я с вами прощаюсь, спасибо всем кто дочитал до конца этот поток сознания. Задать вопрос или высказать своё фи вы можете в комментариях.
До новых встреч.